Add epoll_server test
[akaros.git] / Makefile
index ef48311..8beb41e 100644 (file)
--- a/Makefile
+++ b/Makefile
 #
 #      - There are a few other TODOs sprinkled throughout the makefile.
 
 #
 #      - There are a few other TODOs sprinkled throughout the makefile.
 
+# 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 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)
+endef
+
 # Do not:
 # o  use make's built-in rules and variables
 #    (this increases performance and avoids hard-to-debug behaviour);
 # Do not:
 # o  use make's built-in rules and variables
 #    (this increases performance and avoids hard-to-debug behaviour);
@@ -456,8 +470,10 @@ $(kern_cpio) initramfs: $(kern_initramfs_files)
         cd $$OLDPWD; \
     done;
 
         cd $$OLDPWD; \
     done;
 
-ld_emulation = $(shell $(OBJDUMP) -i | grep -v BFD | grep ^[a-z] |head -n1)
-ld_arch = $(shell $(OBJDUMP) -i | grep -v BFD | grep "^  [a-z]" | head -n1)
+ld_emulation = $(shell $(OBJDUMP) -i 2>/dev/null | \
+                       grep -v BFD | grep ^[a-z] | head -n1)
+ld_arch = $(shell $(OBJDUMP) -i 2>/dev/null |\
+                  grep -v BFD | grep "^  [a-z]" | head -n1)
 
 # Our makefile doesn't detect a change in subarch, and old binary objects that
 # don't need to be updated won't get rebuilt, but they also can't link with the
 
 # Our makefile doesn't detect a change in subarch, and old binary objects that
 # don't need to be updated won't get rebuilt, but they also can't link with the
@@ -542,12 +558,12 @@ endif #ifeq ($(mixed-targets),1)
 # List all userspace directories here, and state any dependencies between them,
 # such as how pthread depends on parlib.
 
 # 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 bsd
+user-dirs = parlib pthread benchutil iplib ndblib vmm
 benchutil: parlib
 pthread: parlib benchutil
 iplib: parlib
 ndblib: iplib
 benchutil: parlib
 pthread: parlib benchutil
 iplib: parlib
 ndblib: iplib
-bsd: parlib iplib
+vmm: parlib
 
 PHONY += install-libs $(user-dirs)
 install-libs: $(user-dirs) symlinks cc-exists
 
 PHONY += install-libs $(user-dirs)
 install-libs: $(user-dirs) symlinks cc-exists
@@ -592,7 +608,7 @@ $(OBJDIR)/.dont-force-fill-kfs:
        @echo "User space tests removed from KFS"
        @touch $(OBJDIR)/.dont-force-fill-kfs
 
        @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"
        @mkdir -p $(FIRST_KFS_PATH)/lib
        $(Q)cp -uP $(xcc-so-files) $(FIRST_KFS_PATH)/lib
        @echo "Cross Compiler 'so' files installed to KFS"
@@ -621,6 +637,63 @@ objclean:
 
 realclean: userclean mrproper doxyclean objclean
 
 
 realclean: userclean mrproper doxyclean objclean
 
+# Bundled apps
+# =========================================================================
+
+PHONY += apps-install
+apps-install:
+       @$(call make_as_parent, -C tools/apps/busybox)
+
+PHONY += apps-clean
+apps-clean:
+       @$(call make_as_parent, -C tools/apps/busybox clean)
+
+# Cross Compiler
+# =========================================================================
+
+xcc_build_dir := tools/compilers/gcc-glibc
+xcc_target := $(ARCH)
+ifeq ($(xcc_target),x86)
+    xcc_target := $(xcc_target)_64
+endif
+xcc_cleans := $(shell $(MAKE) -C $(xcc_build_dir) -pn |\
+                      grep "VALID_CLEANS := " |\
+                      sed -e 's/VALID_CLEANS := //')
+xcc_subcmds := $(shell $(MAKE) -C $(xcc_build_dir) -pn |\
+                       grep "VALID_SUBCMDS := " |\
+                       sed -e 's/VALID_SUBCMDS := //')
+xcc_clean_goals := $(patsubst %, xcc-%, $(xcc_cleans))
+xcc_subcmd_goals := $(patsubst %, xcc-%, $(xcc_subcmds))
+
+PHONY += xcc
+xcc: xcc-build
+
+PHONY += $(xcc_clean_goals)
+$(xcc_clean_goals):
+       @target="$(patsubst xcc-%,%,$(@))";\
+       $(call make_as_parent, -C $(xcc_build_dir) $${target})
+
+PHONY += $(xcc_subcmd_goals)
+$(xcc_subcmd_goals):
+       @subcmd="$(patsubst xcc-%,%,$(@))";\
+       target="$(xcc_target) $${subcmd}";\
+       $(call make_as_parent, -C $(xcc_build_dir) $${target})
+
+PHONY += xcc-upgrade
+xcc-upgrade: xcc
+       @$(MAKE) userclean
+       @$(MAKE) install-libs
+       @$(MAKE) testclean utestclean
+       @$(MAKE) tests utest
+       @$(call make_as_parent, apps-clean)
+       @$(call make_as_parent, apps-install)
+       @$(MAKE) fill-kfs
+       @$(MAKE) akaros-kernel
+
+PHONY += xcc-upgrade-from-scratch
+xcc-upgrade-from-scratch: xcc-clean xcc-uninstall
+       @$(call make_as_parent, xcc-upgrade)
+
 # Cleaning
 # =========================================================================
 # This is mostly the Linux kernel cleaning.  We could hook in to the userspace
 # Cleaning
 # =========================================================================
 # This is mostly the Linux kernel cleaning.  We could hook in to the userspace