Implement pipes in userspace (XCC)
[akaros.git] / Makefile
index aafc046..1fb54ba 100644 (file)
--- a/Makefile
+++ b/Makefile
 #
 #      - There are a few other TODOs sprinkled throughout the makefile.
 
+# Allow people to override our setting of the --no-print-directory option in
+# their Makelocal. This is useful, for example, to allow emacs to find the
+# correct file when errors are encountered using its builtin 'M-x compile'
+# command.
+VERSION = 0
+PATCHLEVEL = 1
+SUBLEVEL = 0
+EXTRAVERSION =
+VERNAME = Nanwan
+
+KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
+
+export KERNELVERSION VERNAME
+
+NO_PRINT_DIRECTORY ?= --no-print-directory
+
 # Save the ability to export the parent's original environment for future use
 export_parent_env := $(shell export | sed 's/$$/;/')
 
 # Save the ability to clear the current environment for future use
 clear_current_env := for c in $$(env | cut -d '=' -f 1); do unset $$c; done;
 
+define export_user_variables
+       CROSS_COMPILE="$(CROSS_COMPILE)"\
+       CROSS_INCLUDE="$(XCC_TARGET_INCLUDE)"\
+       ROS_CFLAGS="$(CFLAGS_USER)"\
+       ROS_LDFLAGS="$(LDFLAGS_USER)"
+endef
+
 # Define a set of commands to reset the environment to the parent's environment
 # and then run a local make target
 define make_as_parent
        $(clear_current_env)\
        $(export_parent_env)\
-       $(MAKE) --no-print-directory $(1)
+       $(call export_user_variables)\
+       $(MAKE) $(NO_PRINT_DIRECTORY) $(1)
 endef
 
 # Do not:
 # o  use make's built-in rules and variables
 #    (this increases performance and avoids hard-to-debug behaviour);
 # o  print "Entering directory ...";
-MAKEFLAGS += -rR --no-print-directory
+MAKEFLAGS += -rR $(NO_PRINT_DIRECTORY)
 
 # That's our default target when none is given on the command line
 # This can be overriden with a Makelocal
@@ -69,6 +93,10 @@ export AKAROS_ROOT
 # generate for non-kbuild targets
 OBJDIR ?= obj
 
+# Don't need to export these, since the Makelocal is included.
+KERNEL_OBJ := $(OBJDIR)/kern/akaros-kernel
+CMP_KERNEL_OBJ := $(KERNEL_OBJ).gz
+
 # Symlinks
 # =========================================================================
 # We have a few symlinks so that code can include <arch/whatever.h>.  This
@@ -94,7 +122,7 @@ endif
 
 PHONY += symlinks clean_symlinks
 clean_symlinks: objclean
-       @rm -f kern/include/arch kern/boot user/parlib/include/arch
+       @rm -f kern/include/arch kern/boot user/parlib/include/parlib/arch
 
 arch-link := $(notdir $(shell readlink kern/include/arch))
 valid-arches := $(notdir $(wildcard kern/arch/*))
@@ -112,7 +140,7 @@ symlinks: clean_symlinks
        @echo Making symlinks...
        $(Q)ln -fs ../arch/$(ARCH) kern/include/arch
        $(Q)ln -fs arch/$(ARCH)/boot kern/boot
-       $(Q)ln -fs $(ARCH) user/parlib/include/arch
+       $(Q)ln -fs $(ARCH) user/parlib/include/parlib/arch
        $(Q)$(MAKE) -f $(srctree)/Makefile clean
 
     else
@@ -332,7 +360,7 @@ CFLAGS_KERNEL += -O2 -pipe -MD
 CFLAGS_KERNEL += -std=gnu99 -fgnu89-inline
 CFLAGS_KERNEL += -fno-strict-aliasing -fno-omit-frame-pointer
 CFLAGS_KERNEL += -fno-stack-protector
-CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused
+CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused -Werror
 CFLAGS_KERNEL += -DROS_KERNEL 
 CFLAGS_KERNEL += -include include/generated/autoconf.h -include include/common.h
 CFLAGS_KERNEL += -fplan9-extensions
@@ -361,7 +389,8 @@ export CFLAGS_KERNEL AFLAGS_KERNEL
 export NOSTDINC_FLAGS XCC_TARGET_ROOT XCC_TARGET_LIB XCC_TARGET_INCLUDE
 export KBUILD_BUILTIN KBUILD_CHECKSRC
 
-CFLAGS_USER += -O2 -std=gnu99 -fno-stack-protector -fgnu89-inline
+CFLAGS_USER += -O2 -std=gnu99 -fno-stack-protector -fgnu89-inline \
+               -Wsystem-headers
 CXXFLAGS_USER += -O2
 CFLAGS_USER_LIBS += -fPIC -static -fno-omit-frame-pointer -g
 
@@ -374,9 +403,8 @@ export CFLAGS_USER CXXFLAGS_USER CFLAGS_USER_LIBS
 # kernel build output.  Right now, it's only passed down to tests/
 dummy-1 := $(shell mkdir -p $(OBJDIR)/kern/)
 
-# Don't need to export these, since the Makelocal is included.
-KERNEL_OBJ := $(OBJDIR)/kern/akaros-kernel
-CMP_KERNEL_OBJ := $(KERNEL_OBJ).gz
+# Machinery to create the kernel build info source
+export BUILD_INFO_FILE
 
 # Since we're doing this outside of the dot-config part, some targets, such as
 # clean, won't read in our .config/auto.conf, and won't know about the
@@ -389,8 +417,9 @@ kfs-paths := kern/kfs
 endif
 
 FIRST_KFS_PATH = $(firstword $(kfs-paths))
+ABS_KFS_PATH = $(abspath $(FIRST_KFS_PATH))
 
-export OBJDIR FIRST_KFS_PATH
+export OBJDIR FIRST_KFS_PATH ABS_KFS_PATH
 
 # Avoiding implicit rules
 $(srctree)/Makelocal: ;
@@ -558,25 +587,27 @@ endif #ifeq ($(mixed-targets),1)
 # List all userspace directories here, and state any dependencies between them,
 # such as how pthread depends on parlib.
 
-user-dirs = parlib pthread benchutil iplib ndblib vmm
+user-dirs = parlib pthread benchutil iplib ndblib vmm perfmon
 benchutil: parlib
 pthread: parlib benchutil
 iplib: parlib
 ndblib: iplib
+vmm: parlib
 
 PHONY += install-libs $(user-dirs)
 install-libs: $(user-dirs) symlinks cc-exists
 
 $(user-dirs):
-       @cd user/$@ && $(MAKE) DEPLIBS="$^" && $(MAKE) install
+       @$(MAKE) -C user/$@ DEPLIBS="$^" && $(MAKE) -C user/$@ install
 
+user: $(user-dirs)
 
 PHONY += userclean $(clean-user-dirs)
 clean-user-dirs := $(addprefix _clean_user_,$(user-dirs))
 userclean: $(clean-user-dirs) testclean utestclean
 
 $(clean-user-dirs):
-       @cd user/$(patsubst _clean_user_%,%,$@) && $(MAKE) clean
+       @$(MAKE) -C user/$(patsubst _clean_user_%,%,$@) clean
 
 tests/: tests
 tests: install-libs
@@ -584,13 +615,13 @@ tests: install-libs
 
 PHONY += utest
 utest: $(user-dirs)
-       @cd user/$@ && $(MAKE) 
+       @$(MAKE) -C user/$@
 
 testclean:
        @$(MAKE) -f tests/Makefile clean
 
 utestclean:
-       @cd user/utest && $(MAKE) clean
+       @$(MAKE) -C user/utest clean
 
 # KFS related stuff
 PHONY += fill-kfs unfill-kfs
@@ -603,17 +634,17 @@ $(OBJDIR)/.dont-force-fill-kfs:
        @echo "Cross Compiler 'so' files removed from KFS"
        @$(MAKE) -f tests/Makefile uninstall
        @echo "Apps from /test removed from KFS"
-       @cd user/utest && $(MAKE) uninstall
+       @$(MAKE) -C user/utest uninstall
        @echo "User space tests removed from KFS"
        @touch $(OBJDIR)/.dont-force-fill-kfs
 
-fill-kfs: $(OBJDIR)/.dont-force-fill-kfs install-libs
+fill-kfs: $(OBJDIR)/.dont-force-fill-kfs install-libs tests
        @mkdir -p $(FIRST_KFS_PATH)/lib
        $(Q)cp -uP $(xcc-so-files) $(FIRST_KFS_PATH)/lib
        @echo "Cross Compiler 'so' files installed to KFS"
        @$(MAKE) -f tests/Makefile install
        @echo "Apps from /test installed to KFS"
-       @cd user/utest && $(MAKE) install
+       @$(MAKE) -C user/utest install
        @echo "User space tests installed to KFS"
 
 # Use doxygen to make documentation for ROS (Untested since 2010 or so)
@@ -639,13 +670,28 @@ realclean: userclean mrproper doxyclean objclean
 # Bundled apps
 # =========================================================================
 
-PHONY += apps-install
-apps-install:
+app-dirs = tools/apps/snc
+tagged-app-dirs := $(subst /,__,$(app-dirs))
+app-dirs-install := $(addprefix _install_,$(tagged-app-dirs))
+app-dirs-clean := $(addprefix _clean_,$(tagged-app-dirs))
+
+PHONY += $(app-dirs-install) $(app-dirs-clean)
+
+$(app-dirs-install):
+       @$(MAKE) -C $(patsubst _install_%,%,$(subst __,/,$@)) install
+
+$(app-dirs-clean):
+       @$(MAKE) -C $(patsubst _clean_%,%,$(subst __,/,$@)) clean
+
+PHONY +=  apps-install
+apps-install: $(app-dirs-install)
        @$(call make_as_parent, -C tools/apps/busybox)
+       @$(call make_as_parent, -C tools/profile/perf install)
 
 PHONY += apps-clean
-apps-clean:
+apps-clean: $(app-dirs-clean)
        @$(call make_as_parent, -C tools/apps/busybox clean)
+       @$(call make_as_parent, -C tools/profile/perf clean)
 
 # Cross Compiler
 # =========================================================================