# This file is intended to be included from each subdirectory makefile.
#
# Subdirectory makefiles must define:
#   SubDirs - The subdirectories to traverse.
#
# Subdirectory makefiles may define:
#   ModuleName - The library name for objects in that directory.
#   ObjNames - The objects available in that directory.
#   Implementation - The library configuration the objects should go in (Generic
#                    or Optimized)
#   Dependencies - Any dependences for the object files.
#   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

###
# Include child makefile fragments

# The list of variables which are intended to be overridden in a subdirectory
# makefile.
RequiredSubdirVariables := SubDirs 
OptionalSubdirVariables := ModuleName OnlyArchs OnlyConfigs \
	ObjNames Implementation Dependencies

# Template: subdir_traverse_template subdir
define subdir_traverse_template
$(call Set,Dir,$(1))
ifneq ($(DEBUGMAKE),)
  $$(info MAKE: $(Dir): Processing subdirectory)
endif

# Construct the variable key for this directory.
$(call Set,DirKey,SubDir.$(subst .,,$(subst /,__,$(1))))
$(call Append,SubDirKeys,$(DirKey))
$(call Set,$(DirKey).Dir,$(Dir))

# 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),)))

# Collect all subdirectory variables for subsequent use.
$$(foreach var,$(RequiredSubdirVariables) $(OptionalSubdirVariables),\
  $$(call Set,$(DirKey).$$(var),$$($$(var))))

# Recurse.
include make/subdir.mk

# Restore directory variable, for cleanliness.
$$(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 := $(strip \
  $(if $(call streq,.,$(Dir)),\
       $(SubDirs),\
       $(SubDirs:%=$(Dir)/%)))
ifeq ($(SubDirsList),)
else
  ifneq ($(DEBUGMAKE),)
    $(info MAKE: Descending into subdirs: $(SubDirsList))
  endif

  $(foreach subdir,$(SubDirsList),\
	$(eval $(call subdir_traverse_template,$(subdir))))
endif
