From faf0150036689985ecea64e78f2637093857cd7b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 18 Jan 2010 06:48:33 +0000 Subject: 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 --- Makefile | 11 ++++++-- lib/Makefile.mk | 3 --- lib/arm/Makefile.mk | 3 --- lib/i386/Makefile.mk | 3 --- lib/ppc/Makefile.mk | 3 --- lib/x86_64/Makefile.mk | 3 --- make/config.mk | 5 ++-- make/subdir.mk | 68 ++++++++++++++++++++++++++++++++++++++++++++------ make/util.mk | 12 +++++++++ 9 files changed, 85 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 7941f106f..cb964ce26 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,8 @@ help: help-hidden: help @echo "Debugging variables:" - @echo " DEBUGMAKE=1: enable some Makefile logging [default=0]" + @echo " DEBUGMAKE=1: enable some Makefile logging [default=]" + @echo " =2: enable more Makefile logging" @echo @echo "Debugging targets:" @echo " make-print-FOO: print information on the variable 'FOO'" @@ -201,7 +202,8 @@ endef ### # Include child makefile fragments -$(foreach subdir,$(SubDirs),$(eval include $(subdir)/Makefile.mk)) +Dir := . +include make/subdir.mk ### # Determine the actual inputs for an optimized library. @@ -223,3 +225,8 @@ endef $(foreach config,$(Configs), \ $(foreach arch,$(Archs), \ $(eval $(call Final_CNA_template,$(config),$(arch))))) + +ifneq ($(DEBUGMAKE),) + $(info MAKE: Done processing Makefile) + $(info ) +endif diff --git a/lib/Makefile.mk b/lib/Makefile.mk index 70ccbeb00..ee04e0fec 100644 --- a/lib/Makefile.mk +++ b/lib/Makefile.mk @@ -7,7 +7,6 @@ # #===------------------------------------------------------------------------===# -Dir := lib SubDirs := i386 ppc x86_64 arm Sources := $(foreach file,$(wildcard $(Dir)/*.c),$(notdir $(file))) @@ -16,5 +15,3 @@ Target := Generic # FIXME: use automatic dependencies? Dependencies := $(wildcard $(Dir)/*.h) - -include make/subdir.mk diff --git a/lib/arm/Makefile.mk b/lib/arm/Makefile.mk index ac08a61a3..d3c3cb4f3 100644 --- a/lib/arm/Makefile.mk +++ b/lib/arm/Makefile.mk @@ -7,7 +7,6 @@ # #===------------------------------------------------------------------------===# -Dir := lib/arm SubDirs := OnlyArchs := armv6 armv7 @@ -18,5 +17,3 @@ Target := Optimized # FIXME: use automatic dependencies? Dependencies := $(wildcard lib/*.h $(Dir)/*.h) - -include make/subdir.mk diff --git a/lib/i386/Makefile.mk b/lib/i386/Makefile.mk index 3ed4dc80b..7ab112d6e 100644 --- a/lib/i386/Makefile.mk +++ b/lib/i386/Makefile.mk @@ -7,7 +7,6 @@ # #===------------------------------------------------------------------------===# -Dir := lib/i386 SubDirs := OnlyArchs := i386 @@ -18,5 +17,3 @@ Target := Optimized # FIXME: use automatic dependencies? Dependencies := $(wildcard lib/*.h $(Dir)/*.h) - -include make/subdir.mk diff --git a/lib/ppc/Makefile.mk b/lib/ppc/Makefile.mk index 34c93722c..41ccdba38 100644 --- a/lib/ppc/Makefile.mk +++ b/lib/ppc/Makefile.mk @@ -7,7 +7,6 @@ # #===------------------------------------------------------------------------===# -Dir := lib/ppc SubDirs := OnlyArchs := ppc @@ -18,5 +17,3 @@ Target := Optimized # FIXME: use automatic dependencies? Dependencies := $(wildcard lib/*.h $(Dir)/*.h) - -include make/subdir.mk diff --git a/lib/x86_64/Makefile.mk b/lib/x86_64/Makefile.mk index 950f2fc8c..df72156c4 100644 --- a/lib/x86_64/Makefile.mk +++ b/lib/x86_64/Makefile.mk @@ -7,7 +7,6 @@ # #===------------------------------------------------------------------------===# -Dir := lib/x86_64 SubDirs := OnlyArchs := x86_64 @@ -18,5 +17,3 @@ Target := Optimized # FIXME: use automatic dependencies? Dependencies := $(wildcard lib/*.h $(Dir)/*.h) - -include make/subdir.mk 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. -- cgit v1.2.3