diff options
Diffstat (limited to 'make/lib_util.mk')
-rw-r--r-- | make/lib_util.mk | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/make/lib_util.mk b/make/lib_util.mk new file mode 100644 index 000000000..768558b4e --- /dev/null +++ b/make/lib_util.mk @@ -0,0 +1,56 @@ +# Library Utility Functions +# +# This should be included following 'lib_info.mk'. + +# Function: SelectFunctionDir config arch function-name optimized +# +# Choose the appropriate implementation directory to use for 'function-name' in +# the configuration 'config' and on given arch. +SelectFunctionDir = $(strip \ + $(call Set,Tmp.SelectFunctionDir,$(call SelectFunctionDirs,$(1),$(2),$(3),$(4)))\ + $(if $(call streq,1,$(words $(Tmp.SelectFunctionDir))),\ + $(Tmp.SelectFunctionDir),\ + $(error SelectFunctionDir: invalid function name "$(3)" ($(strip\ + $(if $(call streq,0,$(words $(Tmp.SelectFunctionDir))),\ + no such function,\ + function implemented in multiple directories!!!)))))) + +# Helper functions that select the entire list of subdirs where a function is +# defined with a certain specificity. +SelectFunctionDirs_Opt_ConfigAndArch = $(strip \ + $(foreach key,$(AvailableIn.$(3)),\ + $(if $(and $(call streq,Optimized,$($(key).Target)),\ + $(call contains,$($(key).OnlyConfigs),$(1)),\ + $(call contains,$($(key).OnlyArchs),$(2))),$(key),))) +SelectFunctionDirs_Opt_Config = $(strip \ + $(foreach key,$(AvailableIn.$(3)),\ + $(if $(and $(call streq,Optimized,$($(key).Target)),\ + $(call contains,$($(key).OnlyConfigs),$(1))),$(key),))) +SelectFunctionDirs_Opt_Arch = $(strip \ + $(foreach key,$(AvailableIn.$(3)),\ + $(if $(and $(call streq,Optimized,$($(key).Target)),\ + $(call contains,$($(key).OnlyArchs),$(2))),$(key),))) +SelectFunctionDirs_Gen = $(strip \ + $(foreach key,$(AvailableIn.$(3)),\ + $(if $(call streq,Generic,$($(key).Target)),$(key)))) + +# Helper function to select the right set of dirs in generic priority order. +SelectFunctions_Gen = \ + $(or $(call SelectFunctionDirs_Gen,$(1),$(2),$(3)),\ + $(call SelectFunctionDirs_Opt_ConfigAndArch,$(1),$(2),$(3)), \ + $(call SelectFunctionDirs_Opt_Config,$(1),$(2),$(3)), \ + $(call SelectFunctionDirs_Opt_Arch,$(1),$(2),$(3))) + +# Helper function to select the right set of dirs in optimized priority order. +SelectFunctions_Opt = \ + $(or $(call SelectFunctionDirs_Opt_ConfigAndArch,$(1),$(2),$(3)), \ + $(call SelectFunctionDirs_Opt_Config,$(1),$(2),$(3)), \ + $(call SelectFunctionDirs_Opt_Arch,$(1),$(2),$(3)), \ + $(call SelectFunctionDirs_Gen,$(1),$(2),$(3))) + +# Helper function to select the right set of dirs (which should be exactly one) +# for a function. +SelectFunctionDirs = \ + $(if $(call streq,1,$(4)),\ + $(call SelectFunctions_Opt,$(1),$(2),$(3)),\ + $(call SelectFunctions_Gen,$(1),$(2),$(3))) |