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