diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-01-18 06:48:33 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-01-18 06:48:33 +0000 |
commit | faf0150036689985ecea64e78f2637093857cd7b (patch) | |
tree | c73207e736ba2d380094d9b6c51e921578d2d26e /make | |
parent | f5722759b8fd2ae65042fe6f87908e3569dbfdf0 (diff) |
Simplify subdirectory makefiles, and be more robust by checking that they define the appropriate variables.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@93714 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'make')
-rw-r--r-- | make/config.mk | 5 | ||||
-rw-r--r-- | make/subdir.mk | 68 | ||||
-rw-r--r-- | make/util.mk | 12 |
3 files changed, 76 insertions, 9 deletions
diff --git a/make/config.mk b/make/config.mk index 485119186..903424d01 100644 --- a/make/config.mk +++ b/make/config.mk @@ -11,7 +11,8 @@ ProjObjRoot := $(ProjSrcRoot) Configs := Debug Release Profile # The full list of architectures we support. -Archs := i386 ppc x86_64 armv6 armv7 +Archs := i386 ppc x86_64 +# armv6 armv7 # If TargetArch is defined, only build for that architecture (and don't use # -arch). @@ -66,7 +67,7 @@ LIPO := lipo CP := cp VERBOSE := 0 -DEBUGMAKE := 0 +DEBUGMAKE := ### # Automatic and derived variables. diff --git a/make/subdir.mk b/make/subdir.mk index 81e295820..ccde0dc8d 100644 --- a/make/subdir.mk +++ b/make/subdir.mk @@ -1,13 +1,20 @@ # This file is intended to be included from each subdirectory makefile. +# +# Subdirectory makefiles must define: +# SubDirs - The subdirectories to traverse. +# ObjNames - The objects available in that directory. +# Target - The library configuration the objects should go in (Generic or +# Optimized) +# Dependencies - Any dependences for the object files. +# +# Subdirectory makefiles may define: +# OnlyArchs - Only build the objects for the listed archs. +# OnlyConfigs - Only build the objects for the listed configurations. ifeq ($(Dir),) $(error "No Dir variable defined.") endif -ifeq ($(DEBUGMAKE),1) - $(info MAKE: $(Dir): Processing subdirectory) -endif - # Expand template for each configuration and architecture. # # FIXME: This level of logic should be in primary Makefile? @@ -35,13 +42,60 @@ $(foreach config,$(ConfigsToTraverse), \ ### # Include child makefile fragments +# The list of variables which are intended to be overridden in a subdirectory +# makefile. +RequiredSubdirVariables := SubDirs ObjNames Target Dependencies +OptionalSubdirVariables := OnlyArchs OnlyConfigs + +# Template: subdir_traverse_template subdir +define subdir_traverse_template +$(call Set,Dir,$(1)) +ifneq ($(DEBUGMAKE),) + $$(info MAKE: $(Dir): Processing subdirectory) +endif + +# Reset subdirectory specific variables to sentinel value. +$$(foreach var,$$(RequiredSubdirVariables) $$(OptionalSubdirVariables),\ + $$(call Set,$$(var),UNDEFINED)) + +# Get the subdirectory variables. +include $(1)/Makefile.mk + +ifeq ($(DEBUGMAKE),2) +$$(foreach var,$(RequiredSubdirVariables) $(OptionalSubdirVariables),\ + $$(if $$(call strneq UNDEFINED,$$($$(var))), \ + $$(info MAKE: $(Dir): $$(var) is defined), \ + $$(info MAKE: $(Dir): $$(var) is undefined))) +endif + +# Check for undefined required variables, and unset sentinel value from optional +# variables. +$$(foreach var,$(RequiredSubdirVariables),\ + $$(if $$(call strneq UNDEFINED,$$($$(var))), \ + $$(error $(Dir): variable '$$(var)' was not undefined))) +$$(foreach var,$(OptionalSubdirVariables),\ + $$(if $$(call strneq UNDEFINED,$$($$(var))),, \ + $$(call Set,$$(var),))) + +# Recurse. +include make/subdir.mk + +# Restore directory variable. +$$(call Set,Dir,$(1)) + +ifneq ($(DEBUGMAKE),) + $$(info MAKE: $$(Dir): Done processing subdirectory) +endif +endef + # Evaluate this now so we do not have to worry about order of evaluation. SubDirsList := $(SubDirs:%=$(Dir)/%) ifeq ($(SubDirsList),) else - ifeq ($(DEBUGMAKE),1) + ifneq ($(DEBUGMAKE),) $(info MAKE: Descending into subdirs: $(SubDirsList)) endif - $(foreach subdir,$(SubDirsList),$(eval include $(subdir)/Makefile.mk)) -endif + $(foreach subdir,$(SubDirsList),\ + $(eval $(call subdir_traverse_template,$(subdir)))) +endif diff --git a/make/util.mk b/make/util.mk index 4f6579084..2ce9a46a2 100644 --- a/make/util.mk +++ b/make/util.mk @@ -3,6 +3,18 @@ ### # Utility functions +# Function: streq LHS RHS +# +# Return "true" if LHS == RHS, otherwise "". +# +# LHS == RHS <=> (LHS subst RHS is empty) and (RHS subst LHS is empty) +streq = $(if $(1),$(if $(subst $(1),,$(2))$(subst $(2),,$(1)),,true),$(if $(2),,true)) + +# Function: strneq LHS RHS +# +# Return "true" if LHS != RHS, otherwise "". +strneq = $(if $(call streq,$(1),$(2)),,true) + # Function: Set variable value # # Set the given make variable to the given value. |