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