summaryrefslogtreecommitdiff
path: root/make/lib_platforms.mk
diff options
context:
space:
mode:
Diffstat (limited to 'make/lib_platforms.mk')
-rw-r--r--make/lib_platforms.mk82
1 files changed, 82 insertions, 0 deletions
diff --git a/make/lib_platforms.mk b/make/lib_platforms.mk
new file mode 100644
index 00000000..55573747
--- /dev/null
+++ b/make/lib_platforms.mk
@@ -0,0 +1,82 @@
+# compiler-rt Configuration Support
+#
+# This should be included following 'lib_util.mk'.
+
+# The simple variables configurations can define.
+PlainConfigVariables := Configs UniversalArchs Description
+PerConfigVariables := 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))))