# compiler-rt Configuration Support
#
# This should be included following 'lib_util.mk'.
# The simple variables configurations can define.
PlainConfigVariables := Configs Description
PerConfigVariables := UniversalArchs Arch $(AvailableOptions)
RequiredConfigVariables := Configs Description
###
# Load Platforms
# Template: subdir_traverse_template subdir
define load_platform_template
$(call Set,PlatformName,$(basename $(notdir $(1))))
ifneq ($(DEBUGMAKE),)
$$(info MAKE: $(PlatformName): Loading platform)
endif
# Construct the variable key for this directory.
$(call Set,PlatformKey,Platform.$(PlatformName))
$(call Append,PlatformKeys,$(PlatformKey))
$(call Set,$(PlatformKey).Name,$(PlatformName))
$(call Set,$(PlatformKey).Path,$(1))
# Reset platform specific variables to sentinel value.
$$(foreach var,$(PlainConfigVariables) $(PerConfigVariables),\
$$(call Set,$$(var),UNDEFINED))
$$(foreach var,$(PerConfigVariables),\
$$(foreach config,$$(Configs),\
$$(call Set,$$(var).$$(config),UNDEFINED)))
$$(foreach var,$(PerConfigVariables),\
$$(foreach arch,$(AvailableArchs),\
$$(call Set,$$(var).$$(arch),UNDEFINED)))
# Get the platform variables.
include make/options.mk
include $(1)
# Check for undefined required variables.
$$(foreach var,$(RequiredConfigVariables),\
$$(if $$(call strneq,UNDEFINED,$$($$(var))),, \
$$(error $(Dir): variable '$$(var)' was not undefined)))
# Check that exactly one of UniversalArchs or Arch was defined.
$$(if $$(and $$(call strneq,UNDEFINED,$$(UniversalArchs)),\
$$(call strneq,UNDEFINED,$$(Arch))),\
$$(error '$(1)': cannot define both 'UniversalArchs' and 'Arch'))
$$(if $$(or $$(call strneq,UNDEFINED,$$(UniversalArchs)),\
$$(call strneq,UNDEFINED,$$(Arch))),,\
$$(error '$(1)': must define one of 'UniversalArchs' and 'Arch'))
# Collect all the platform variables for subsequent use.
$$(foreach var,$(PlainConfigVariables) $(PerConfigVariables),\
$$(if $$(call strneq,UNDEFINED,$$($$(var))),\
$$(call CopyVariable,$$(var),$(PlatformKey).$$(var))))
$$(foreach var,$(PerConfigVariables),\
$$(foreach config,$$(Configs),\
$$(if $$(call strneq,UNDEFINED,$$($$(var).$$(config))),\
$$(call CopyVariable,$$(var).$$(config),$(PlatformKey).$$(var).$$(config))))\
$$(foreach arch,$(AvailableArchs),\
$$(if $$(call strneq,UNDEFINED,$$($$(var).$$(arch))),\
$$(call CopyVariable,$$(var).$$(arch),$(PlatformKey).$$(var).$$(arch))))\
$$(foreach config,$$(Configs),\
$$(foreach arch,$(AvailableArchs),\
$$(if $$(call strneq,UNDEFINED,$$($$(var).$$(config).$$(arch))),\
$$(call CopyVariable,$$(var).$$(config).$$(arch),\
$(PlatformKey).$$(var).$$(config).$$(arch))))))
ifneq ($(DEBUGMAKE),)
$$(info MAKE: $(PlatformName): Done loading platform)
endif
endef
# Evaluate this now so we do not have to worry about order of evaluation.
PlatformFiles := $(wildcard make/platform/*.mk)
ifneq ($(DEBUGMAKE),)
$(info MAKE: Loading platforms: $(PlatformFiles))
endif
$(foreach file,$(PlatformFiles),\
$(eval $(call load_platform_template,$(file))))