177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# This file is intended to be included from each subdirectory makefile.
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Subdirectory makefiles must define:
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#   SubDirs - The subdirectories to traverse.
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#   ObjNames - The objects available in that directory.
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#   Implementation - The library configuration the objects should go in (Generic or
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#                    Optimized)
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#   Dependencies - Any dependences for the object files.
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Subdirectory makefiles may define:
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#   OnlyArchs - Only build the objects for the listed archs.
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#   OnlyConfigs - Only build the objects for the listed configurations.
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoifeq ($(Dir),)
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(error "No Dir variable defined.")
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoendif
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao###
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Include child makefile fragments
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# The list of variables which are intended to be overridden in a subdirectory
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# makefile.
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoRequiredSubdirVariables := SubDirs ObjNames Implementation Dependencies
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoOptionalSubdirVariables := OnlyArchs OnlyConfigs
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Template: subdir_traverse_template subdir
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodefine subdir_traverse_template
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$(call Set,Dir,$(1))
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoifneq ($(DEBUGMAKE),)
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(info MAKE: $(Dir): Processing subdirectory)
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoendif
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Construct the variable key for this directory.
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$(call Set,DirKey,SubDir.$(subst .,,$(subst /,__,$(1))))
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$(call Append,SubDirKeys,$(DirKey))
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$(call Set,$(DirKey).Dir,$(Dir))
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Reset subdirectory specific variables to sentinel value.
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$$(foreach var,$$(RequiredSubdirVariables) $$(OptionalSubdirVariables),\
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(call Set,$$(var),UNDEFINED))
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Get the subdirectory variables.
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoinclude $(1)/Makefile.mk
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoifeq ($(DEBUGMAKE),2)
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$$(foreach var,$(RequiredSubdirVariables) $(OptionalSubdirVariables),\
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(if $$(call strneq,UNDEFINED,$$($$(var))), \
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	$$(info MAKE: $(Dir): $$(var) is defined), \
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	$$(info MAKE: $(Dir): $$(var) is undefined)))
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoendif
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Check for undefined required variables, and unset sentinel value from optional
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# variables.
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$$(foreach var,$(RequiredSubdirVariables),\
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(if $$(call strneq,UNDEFINED,$$($$(var))),, \
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	$$(error $(Dir): variable '$$(var)' was not undefined)))
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$$(foreach var,$(OptionalSubdirVariables),\
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(if $$(call strneq,UNDEFINED,$$($$(var))),, \
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	$$(call Set,$$(var),)))
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Collect all subdirectory variables for subsequent use.
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$$(foreach var,$(RequiredSubdirVariables) $(OptionalSubdirVariables),\
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(call Set,$(DirKey).$$(var),$$($$(var))))
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Recurse.
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoinclude make/subdir.mk
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Restore directory variable, for cleanliness.
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao$$(call Set,Dir,$(1))
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoifneq ($(DEBUGMAKE),)
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $$(info MAKE: $$(Dir): Done processing subdirectory)
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoendif
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoendef
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Evaluate this now so we do not have to worry about order of evaluation.
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSubDirsList := $(strip \
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(if $(call streq,.,$(Dir)),\
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(SubDirs),\
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(SubDirs:%=$(Dir)/%)))
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoifeq ($(SubDirsList),)
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoelse
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  ifneq ($(DEBUGMAKE),)
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    $(info MAKE: Descending into subdirs: $(SubDirsList))
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  endif
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(foreach subdir,$(SubDirsList),\
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao	$(eval $(call subdir_traverse_template,$(subdir))))
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoendif
91