summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile11
-rw-r--r--lib/Makefile.mk3
-rw-r--r--lib/arm/Makefile.mk3
-rw-r--r--lib/i386/Makefile.mk3
-rw-r--r--lib/ppc/Makefile.mk3
-rw-r--r--lib/x86_64/Makefile.mk3
-rw-r--r--make/config.mk5
-rw-r--r--make/subdir.mk68
-rw-r--r--make/util.mk12
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.