1# Library Utility Functions
2#
3# This should be included following 'lib_info.mk'.
4
5# Function: GetCNAVar variable-name platform-key config arch
6#
7# Get a per-config-and-arch variable value.
8GetCNAVar = $(strip \
9  $(or $($(2).$(1).$(3).$(4)), \
10       $($(2).$(1).$(3)), \
11       $($(2).$(1).$(4)), \
12       $($(2).$(1))))
13
14# Function: SelectFunctionDir config arch function-name optimized
15#
16# Choose the appropriate implementation directory to use for 'function-name' in
17# the configuration 'config' and on given arch.
18SelectFunctionDir = $(strip \
19  $(call Set,Tmp.SelectFunctionDir,$(call SelectFunctionDirs,$(1),$(2),$(3),$(4)))\
20  $(if $(call streq,1,$(words $(Tmp.SelectFunctionDir))),\
21       $(Tmp.SelectFunctionDir),\
22       $(error SelectFunctionDir: invalid function name "$(3)" ($(strip\
23               $(if $(call streq,0,$(words $(Tmp.SelectFunctionDir))),\
24                    no such function,\
25                    function implemented in multiple directories!!!))))))
26
27# Helper functions that select the entire list of subdirs where a function is
28# defined with a certain specificity.
29SelectFunctionDirs_Opt_ConfigAndArch = $(strip \
30  $(foreach key,$(AvailableIn.$(3)),\
31    $(if $(and $(call streq,Optimized,$($(key).Implementation)),\
32               $(call contains,$($(key).OnlyConfigs),$(1)),\
33               $(call contains,$($(key).OnlyArchs),$(2))),$(key),)))
34SelectFunctionDirs_Opt_Config = $(strip \
35  $(foreach key,$(AvailableIn.$(3)),\
36    $(if $(and $(call streq,Optimized,$($(key).Implementation)),\
37               $(call contains,$($(key).OnlyConfigs),$(1))),$(key),)))
38SelectFunctionDirs_Opt_Arch = $(strip \
39  $(foreach key,$(AvailableIn.$(3)),\
40    $(if $(and $(call streq,Optimized,$($(key).Implementation)),\
41               $(call contains,$($(key).OnlyArchs),$(2))),$(key),)))
42SelectFunctionDirs_Gen = $(strip \
43  $(foreach key,$(AvailableIn.$(3)),\
44    $(if $(call streq,Generic,$($(key).Implementation)),$(key))))
45
46# Helper function to select the right set of dirs in generic priority order.
47SelectFunctions_Gen = \
48  $(or $(call SelectFunctionDirs_Gen,$(1),$(2),$(3)),\
49       $(call SelectFunctionDirs_Opt_ConfigAndArch,$(1),$(2),$(3)), \
50       $(call SelectFunctionDirs_Opt_Config,$(1),$(2),$(3)), \
51       $(call SelectFunctionDirs_Opt_Arch,$(1),$(2),$(3)))
52
53# Helper function to select the right set of dirs in optimized priority order.
54SelectFunctions_Opt = \
55  $(or $(call SelectFunctionDirs_Opt_ConfigAndArch,$(1),$(2),$(3)), \
56       $(call SelectFunctionDirs_Opt_Config,$(1),$(2),$(3)), \
57       $(call SelectFunctionDirs_Opt_Arch,$(1),$(2),$(3)), \
58       $(call SelectFunctionDirs_Gen,$(1),$(2),$(3)))
59
60# Helper function to select the right set of dirs (which should be exactly one)
61# for a function.
62SelectFunctionDirs = \
63  $(if $(call streq,1,$(4)),\
64       $(call SelectFunctions_Opt,$(1),$(2),$(3)),\
65       $(call SelectFunctions_Gen,$(1),$(2),$(3)))
66