83 lines
3.0 KiB
Makefile
83 lines
3.0 KiB
Makefile
|
# 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))))
|