Add useful XCC targets to top level makefile
authorKevin Klues <>
Wed, 15 Jul 2015 01:00:53 +0000 (18:00 -0700)
committerKevin Klues <>
Wed, 15 Jul 2015 22:20:48 +0000 (15:20 -0700)
All of the valid XCC subcmd and clean targets are automatically made
available for the current ARCH via calls to 'make xcc-*'. Tab complete
them out to see the full list.  The standalone 'xcc' target will build
the cross compiler for the configured architecture and install it (e.g.
the same as running 'make x86_64', etc. down in the xcc directory as we
used to have to do).

One thing to point out here is the settings we have to mess with for the
environment passed to our recursive make calls. All of the exports in
the top level Makefile, mess with the settings of the xcc Makefile (and
busybox's Makefile) when we do a recursive make.  The two lines:

export_parent_env := $(shell export | sed 's/$$/;/')
clear_current_env := for c in $$(env | cut -d '=' -f 1); do unset $$c; done;

make it so that later on I can just clear out the current environment
and restore the environment of the parent just before making my
recursive make calls. It's easier than manually going through and
'unexporting' everything that the Makefile exported. It also keeps us
from having to keep these exports in sync with unexporting them
somewhere else.  At the end of the day, it boils down to the fact that
our xcc make wants the environment set up in our shell, not the one set
up in the top level makefile. Having these commands available makes it
easier to set this up.

I have also added a 'make_as_parent' define so that we can more easily
execute local make targets as if they were invoked from the parent.


index 107d256..2ea10e0 100644 (file)
--- a/Makefile
+++ b/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)
 # Do not:
 # o  use make's built-in rules and variables
 #    (this increases performance and avoids hard-to-debug behaviour);
@@ -622,6 +636,37 @@ objclean:
 realclean: userclean mrproper doxyclean objclean
+# Cross Compiler
+# =========================================================================
+xcc_build_dir := tools/compilers/gcc-glibc
+xcc_target := $(ARCH)
+ifeq ($(xcc_target),x86)
+    xcc_target := $(xcc_target)_64
+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)
+       @target="$(patsubst xcc-%,%,$(@))";\
+       $(call make_as_parent, -C $(xcc_build_dir) $${target})
+PHONY += $(xcc_subcmd_goals)
+       @subcmd="$(patsubst xcc-%,%,$(@))";\
+       target="$(xcc_target) $${subcmd}";\
+       $(call make_as_parent, -C $(xcc_build_dir) $${target})
 # Cleaning
 # =========================================================================
 # This is mostly the Linux kernel cleaning.  We could hook in to the userspace