Simplify subdirectory makefiles, and be more robust by checking that they define the appropriate variables.

llvm-svn: 93714
This commit is contained in:
Daniel Dunbar
2010-01-18 06:48:33 +00:00
parent 40d6f65ae1
commit 56e0eb9fc9
9 changed files with 85 additions and 26 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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.