148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# compiler-rt Configuration Support
248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar#
348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# This should be included following 'lib_util.mk'.
448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# The simple variables configurations can define.
606f38e5fc22bbeadabc1be11eb77f6d27cd3140cDaniel DunbarPlainConfigVariables := Configs Description
706f38e5fc22bbeadabc1be11eb77f6d27cd3140cDaniel DunbarPerConfigVariables := UniversalArchs Arch $(AvailableOptions)
848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel DunbarRequiredConfigVariables := Configs Description
948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
1048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar###
1148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Load Platforms
1248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
1348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Template: subdir_traverse_template subdir
1448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbardefine load_platform_template
1548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$(call Set,PlatformName,$(basename $(notdir $(1))))
1648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarifneq ($(DEBUGMAKE),)
1748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(info MAKE: $(PlatformName): Loading platform)
1848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarendif
1948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
2048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Construct the variable key for this directory.
2148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$(call Set,PlatformKey,Platform.$(PlatformName))
2248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$(call Append,PlatformKeys,$(PlatformKey))
2348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$(call Set,$(PlatformKey).Name,$(PlatformName))
2448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$(call Set,$(PlatformKey).Path,$(1))
2548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
2648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Reset platform specific variables to sentinel value.
2748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(foreach var,$(PlainConfigVariables) $(PerConfigVariables),\
2848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(call Set,$$(var),UNDEFINED))
2948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(foreach var,$(PerConfigVariables),\
3048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(foreach config,$$(Configs),\
3148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(call Set,$$(var).$$(config),UNDEFINED)))
3248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(foreach var,$(PerConfigVariables),\
3348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(foreach arch,$(AvailableArchs),\
3448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(call Set,$$(var).$$(arch),UNDEFINED)))
3548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
3648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Get the platform variables.
3748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarinclude make/options.mk
3848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarinclude $(1)
3948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
4048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Check for undefined required variables.
4148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(foreach var,$(RequiredConfigVariables),\
4248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(if $$(call strneq,UNDEFINED,$$($$(var))),, \
4348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar	$$(error $(Dir): variable '$$(var)' was not undefined)))
4448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
4548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Check that exactly one of UniversalArchs or Arch was defined.
4648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(if $$(and $$(call strneq,UNDEFINED,$$(UniversalArchs)),\
4748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar             $$(call strneq,UNDEFINED,$$(Arch))),\
4848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(error '$(1)': cannot define both 'UniversalArchs' and 'Arch'))
4948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(if $$(or $$(call strneq,UNDEFINED,$$(UniversalArchs)),\
5048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar            $$(call strneq,UNDEFINED,$$(Arch))),,\
5148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(error '$(1)': must define one of 'UniversalArchs' and 'Arch'))
5248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
5348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Collect all the platform variables for subsequent use.
5448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(foreach var,$(PlainConfigVariables) $(PerConfigVariables),\
5548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(if $$(call strneq,UNDEFINED,$$($$(var))),\
5648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(call CopyVariable,$$(var),$(PlatformKey).$$(var))))
5748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$$(foreach var,$(PerConfigVariables),\
5848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(foreach config,$$(Configs),\
5948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(if $$(call strneq,UNDEFINED,$$($$(var).$$(config))),\
6048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar      $$(call CopyVariable,$$(var).$$(config),$(PlatformKey).$$(var).$$(config))))\
6148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(foreach arch,$(AvailableArchs),\
6248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(if $$(call strneq,UNDEFINED,$$($$(var).$$(arch))),\
6348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar      $$(call CopyVariable,$$(var).$$(arch),$(PlatformKey).$$(var).$$(arch))))\
6448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(foreach config,$$(Configs),\
6548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar    $$(foreach arch,$(AvailableArchs),\
6648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar      $$(if $$(call strneq,UNDEFINED,$$($$(var).$$(config).$$(arch))),\
6748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar        $$(call CopyVariable,$$(var).$$(config).$$(arch),\
6848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar                $(PlatformKey).$$(var).$$(config).$$(arch))))))
6948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
7048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarifneq ($(DEBUGMAKE),)
7148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $$(info MAKE: $(PlatformName): Done loading platform)
7248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarendif
7348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarendef
7448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
7548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Evaluate this now so we do not have to worry about order of evaluation.
7648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel DunbarPlatformFiles := $(wildcard make/platform/*.mk)
7748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarifneq ($(DEBUGMAKE),)
7848464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar $(info MAKE: Loading platforms: $(PlatformFiles))
7948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbarendif
8048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
8148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar$(foreach file,$(PlatformFiles),\
8248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $(eval $(call load_platform_template,$(file))))
83