Add signal support to our basic thread0 scheduler
[akaros.git] / Makefile
index 5a9191b..27eb77a 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.
+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 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);
 # 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
@@ -310,8 +330,9 @@ KERNEL_LD ?= kernel.ld
 gcc-lib := $(shell $(CC) -print-libgcc-file-name 2>/dev/null)
 NOSTDINC_FLAGS += -nostdinc -isystem \
                   $(shell $(CC) -print-file-name=include 2>/dev/null)
-XCC_TARGET_ROOT := $(dir $(shell which $(CC) 2> /dev/null))../$(patsubst %-,%,\
-                                                               $(CROSS_COMPILE))
+XCC_TARGET_ROOT := $(shell $(CC) --print-sysroot 2> /dev/null)
+XCC_TARGET_LIB := $(XCC_TARGET_ROOT)/usr/lib/
+XCC_TARGET_INCLUDE := $(XCC_TARGET_ROOT)/usr/include/
 
 CFLAGS_KERNEL += -O2 -pipe -MD
 CFLAGS_KERNEL += -std=gnu99 -fgnu89-inline
@@ -343,13 +364,15 @@ KBUILD_CHECKSRC := 0
 export AKAROSINCLUDE CROSS_COMPILE
 export CC CPP AS AR LD OBJCOPY OBJDUMP NM STRIP
 export CFLAGS_KERNEL AFLAGS_KERNEL
-export NOSTDINC_FLAGS XCC_TARGET_ROOT
+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
 
-export CFLAGS_USER CXXFLAGS_USER
+export CFLAGS_USER CXXFLAGS_USER CFLAGS_USER_LIBS
 
 # Akaros include stuff (includes custom make targets and user overrides)
 # =========================================================================
@@ -394,7 +417,7 @@ $(srctree)/Makelocal: ;
 # We have all-arch-dirs and all-dirs, so that we can still clean even without
 # an arch symlink.
 
-core-y += kern/src/ kern/drivers/ $(AKAROS_EXTERNAL_DIRS)
+core-y += kern/src/ kern/drivers/ kern/lib/ $(AKAROS_EXTERNAL_DIRS)
 arch-y += kern/arch/$(ARCH)/
 
 akaros-dirs     := $(patsubst %/,%,$(filter %/, $(core-y) $(arch-y)))
@@ -454,8 +477,10 @@ $(kern_cpio) initramfs: $(kern_initramfs_files)
         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
@@ -540,17 +565,18 @@ 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 bsd
+user-dirs = parlib pthread benchutil iplib ndblib vmm
+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
 
 $(user-dirs):
-       @cd user/$@ && $(MAKE) && $(MAKE) install
+       @$(MAKE) -C user/$@ DEPLIBS="$^" && $(MAKE) -C user/$@ install
 
 
 PHONY += userclean $(clean-user-dirs)
@@ -558,7 +584,7 @@ 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
@@ -566,34 +592,36 @@ tests: install-libs
 
 PHONY += utest
 utest: $(user-dirs)
-       @cd user/$@ && $(MAKE) 
+       @$(MAKE) -C user/$@
 
 testclean:
        @$(MAKE) -f tests/Makefile clean
 
 utestclean:
-       @$(MAKE) -f user/utest/Makefile clean
+       @$(MAKE) -C user/utest clean
 
 # KFS related stuff
 PHONY += fill-kfs unfill-kfs
-XCC_SO_FILES = $(addprefix $(XCC_TARGET_ROOT)/lib/, *.so*)
+xcc-gcc-libs = $(XCC_TARGET_ROOT)/../lib/
+xcc-so-files = $(addprefix $(XCC_TARGET_LIB), *.so*) \
+               $(addprefix $(xcc-gcc-libs), *.so*)
 
 $(OBJDIR)/.dont-force-fill-kfs:
-       $(Q)rm -rf $(addprefix $(FIRST_KFS_PATH)/lib/, $(notdir $(XCC_SO_FILES)))
+       $(Q)rm -rf $(addprefix $(FIRST_KFS_PATH)/lib/, $(notdir $(xcc-so-files)))
        @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
+       $(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)
@@ -616,6 +644,63 @@ 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