xref: /optee_os/mk/checkconf.mk (revision c8a2a6529dc3ff609281ef4fe5c5bc949c805b5c)
1fe52b1f5SJerome Forissier# Generate/check/update a .h file to reflect the values of Makefile
2fe52b1f5SJerome Forissier# variables
3fe52b1f5SJerome Forissier#
4fe52b1f5SJerome Forissier# Example usage (by default, check-conf-h will consider all CFG_*
55ef74e73SJerome Forissier# and _CFG_* variables plus PLATFORM_*):
6fe52b1f5SJerome Forissier#
7fe52b1f5SJerome Forissier# path/to/conf.h: FORCE
8fe52b1f5SJerome Forissier#	$(call check-conf-h)
9fe52b1f5SJerome Forissier#
10fe52b1f5SJerome Forissier# Or, to include only the variables with the given prefix(es):
11fe52b1f5SJerome Forissier#
12fe52b1f5SJerome Forissier# path/to/crypto_config.h: FORCE
13fe52b1f5SJerome Forissier#	$(call check-conf-h,CFG_CRYPTO_ CRYPTO_)
14fe52b1f5SJerome Forissierdefine check-conf-h
15fe52b1f5SJerome Forissier	$(q)set -e;						\
1662428631SJens Wiklander	$(cmd-echo-silent) '  CHK     $@';			\
17bef37b8bSJerome Forissier	cnf='$(strip $(foreach var,				\
18fe52b1f5SJerome Forissier		$(call cfg-vars-by-prefix,$1),			\
19bef37b8bSJerome Forissier		$(call cfg-make-define,$(var))))';		\
20*c8a2a652SRasmus Villemoes	guardpath="$(patsubst $(out-dir)/%,%,$@)"		\
21*c8a2a652SRasmus Villemoes	guard="_`echo "$${guardpath}" | tr -- -/.+ _`_";	\
22fe52b1f5SJerome Forissier	mkdir -p $(dir $@);					\
23fe52b1f5SJerome Forissier	echo "#ifndef $${guard}" >$@.tmp;			\
24fe52b1f5SJerome Forissier	echo "#define $${guard}" >>$@.tmp;			\
25fe52b1f5SJerome Forissier	echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp;	\
26fe52b1f5SJerome Forissier	echo "#endif" >>$@.tmp;					\
273354f9b2SJerome Forissier	$(call mv-if-changed,$@.tmp,$@)
28fe52b1f5SJerome Forissierendef
29fe52b1f5SJerome Forissier
30b924c494SJens Wiklanderdefine check-conf-cmake
31b924c494SJens Wiklander	$(q)set -e;						\
32b924c494SJens Wiklander	$(cmd-echo-silent) '  CHK     $@';			\
33b924c494SJens Wiklander	cnf='$(strip $(foreach var,				\
34b924c494SJens Wiklander		$(call cfg-vars-by-prefix,$1),			\
35b924c494SJens Wiklander		$(call cfg-cmake-set,$(var))))';		\
36b924c494SJens Wiklander	mkdir -p $(dir $@);					\
37b924c494SJens Wiklander	echo "# auto-generated TEE configuration file" >$@.tmp; \
38b924c494SJens Wiklander	echo "# TEE version ${TEE_IMPL_VERSION}" >>$@.tmp; \
39b924c494SJens Wiklander	echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp;	\
40b924c494SJens Wiklander	$(call mv-if-changed,$@.tmp,$@)
41b924c494SJens Wiklanderendef
42b924c494SJens Wiklander
433354f9b2SJerome Forissierdefine check-conf-mk
44dde0e235Setienne carriere	$(q)set -e;						\
4562428631SJens Wiklander	$(cmd-echo-silent) '  CHK     $@';			\
46bef37b8bSJerome Forissier	cnf='$(strip $(foreach var,				\
47dde0e235Setienne carriere		$(call cfg-vars-by-prefix,CFG_),		\
48bef37b8bSJerome Forissier		$(strip $(var)=$($(var))_nl_)))';		\
49dde0e235Setienne carriere	mkdir -p $(dir $@);					\
50dde0e235Setienne carriere	echo "# auto-generated TEE configuration file" >$@.tmp; \
51b5569a68SPascal Brand	echo "# TEE version ${TEE_IMPL_VERSION}" >>$@.tmp; \
52dde0e235Setienne carriere	echo "ARCH=${ARCH}" >>$@.tmp;				\
53dde0e235Setienne carriere	echo "PLATFORM=${PLATFORM}" >>$@.tmp;			\
54dde0e235Setienne carriere	echo "PLATFORM_FLAVOR=${PLATFORM_FLAVOR}" >>$@.tmp; 	\
55dde0e235Setienne carriere	echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp;	\
563354f9b2SJerome Forissier	$(call mv-if-changed,$@.tmp,$@)
573354f9b2SJerome Forissierendef
583354f9b2SJerome Forissier
59fe52b1f5SJerome Forissierdefine cfg-vars-by-prefix
60fe52b1f5SJerome Forissier	$(strip $(if $(1),$(call _cfg-vars-by-prefix,$(1)),
615ef74e73SJerome Forissier			  $(call _cfg-vars-by-prefix,CFG_ _CFG_ PLATFORM_)))
62fe52b1f5SJerome Forissierendef
63fe52b1f5SJerome Forissier
64fe52b1f5SJerome Forissierdefine _cfg-vars-by-prefix
65fe52b1f5SJerome Forissier	$(sort $(foreach prefix,$(1),$(filter $(prefix)%,$(.VARIABLES))))
66fe52b1f5SJerome Forissierendef
67fe52b1f5SJerome Forissier
68fe52b1f5SJerome Forissier# Convert a makefile variable to a #define
69fe52b1f5SJerome Forissier# <undefined>, n => <undefined>
70fe52b1f5SJerome Forissier# y              => 1
71fe52b1f5SJerome Forissier# <other value>  => <other value>
72fe52b1f5SJerome Forissierdefine cfg-make-define
73fe52b1f5SJerome Forissier	$(strip $(if $(filter y,$($1)),
74bef37b8bSJerome Forissier		     #define $1 1_nl_,
75fe52b1f5SJerome Forissier		     $(if $(filter xn x,x$($1)),
76bef37b8bSJerome Forissier			  /* $1 is not set */_nl_,
77bef37b8bSJerome Forissier			  #define $1 $($1)_nl_)))
78fe52b1f5SJerome Forissierendef
790a7f95b9SJerome Forissier
80b924c494SJens Wiklander# Convert a makefile variable to a cmake set statement
81b924c494SJens Wiklander# <undefined>, n => <undefined>
82b924c494SJens Wiklander# <other value>  => <other value>
83b924c494SJens Wiklanderdefine cfg-cmake-set
84b924c494SJens Wiklander	$(strip $(if $(filter xn x,x$($1)),
85b924c494SJens Wiklander		  # $1 is not set _nl_,
86b924c494SJens Wiklander		  set($1 $($1))_nl_))
87b924c494SJens Wiklanderendef
88b924c494SJens Wiklander
899e8c816aSJerome Forissier# Returns 'y' if at least one variable is 'y', 'n' otherwise
900a7f95b9SJerome Forissier# Example:
910a7f95b9SJerome Forissier# FOO_OR_BAR := $(call cfg-one-enabled, FOO BAR)
929e8c816aSJerome Forissiercfg-one-enabled = $(if $(filter y, $(foreach var,$(1),$($(var)))),y,n)
930a7f95b9SJerome Forissier
94b2a75cd4SJerome Forissier# Returns 'y' if all variables are 'y', 'n' otherwise
950a7f95b9SJerome Forissier# Example:
960a7f95b9SJerome Forissier# FOO_AND_BAR := $(call cfg-all-enabled, FOO BAR)
97b2a75cd4SJerome Forissiercfg-all-enabled = $(if $(strip $(1)),$(if $(call _cfg-all-enabled,$(1)),y,n),n)
98b2a75cd4SJerome Forissier_cfg-all-enabled =                                                             \
990a7f95b9SJerome Forissier    $(strip                                                                    \
1000a7f95b9SJerome Forissier        $(if $(1),                                                             \
1010a7f95b9SJerome Forissier            $(if $(filter y,$($(firstword $(1)))),                             \
102b2a75cd4SJerome Forissier                $(call _cfg-all-enabled,$(filter-out $(firstword $(1)),$(1))), \
1030a7f95b9SJerome Forissier             ),                                                                \
1040a7f95b9SJerome Forissier            y                                                                  \
1050a7f95b9SJerome Forissier         )                                                                     \
1060a7f95b9SJerome Forissier     )
1070a7f95b9SJerome Forissier
1080a7f95b9SJerome Forissier# Disable a configuration variable if some dependency is disabled
1090a7f95b9SJerome Forissier# Example:
1100a7f95b9SJerome Forissier# $(eval $(call cfg-depends-all,FOO,BAR BAZ))
1119ffea7b4SJerome Forissier# Will set FOO to 'n' if it is initially 'y' and BAR or BAZ are not 'y'
1120a7f95b9SJerome Forissiercfg-depends-all =                                                           \
1130a7f95b9SJerome Forissier    $(strip                                                                 \
1140a7f95b9SJerome Forissier        $(if $(filter y, $($(1))),                                          \
115b2a75cd4SJerome Forissier            $(if $(filter y,$(call cfg-all-enabled,$(2))),                  \
1160a7f95b9SJerome Forissier                ,                                                           \
1170a7f95b9SJerome Forissier                $(warning Warning: Disabling $(1) [requires $(strip $(2))]) \
1189ffea7b4SJerome Forissier                    override $(1) := n                                      \
1190a7f95b9SJerome Forissier             )                                                              \
1200a7f95b9SJerome Forissier         )                                                                  \
1210a7f95b9SJerome Forissier     )
1220a7f95b9SJerome Forissier
1230a7f95b9SJerome Forissier# Disable a configuration variable if all dependencies are disabled
1240a7f95b9SJerome Forissier# Example:
1250a7f95b9SJerome Forissier# $(eval $(call cfg-depends-one,FOO,BAR BAZ))
1269ffea7b4SJerome Forissier# Will set FOO to 'n' if it is initially 'y' and both BAR and BAZ are not 'y'
1270a7f95b9SJerome Forissiercfg-depends-one =                                                                    \
1280a7f95b9SJerome Forissier    $(strip                                                                          \
1290a7f95b9SJerome Forissier        $(if $(filter y, $($(1))),                                                   \
1309e8c816aSJerome Forissier            $(if $(filter y,$(call cfg-one-enabled,$(2))),                           \
1310a7f95b9SJerome Forissier                ,                                                                    \
1320a7f95b9SJerome Forissier                $(warning Warning: Disabling $(1) [requires (one of) $(strip $(2))]) \
1339ffea7b4SJerome Forissier                    override $(1) := n                                               \
1340a7f95b9SJerome Forissier             )                                                                       \
1350a7f95b9SJerome Forissier         )                                                                           \
1360a7f95b9SJerome Forissier     )
137a8224611SJames Kung
138a8224611SJames Kung
139a8224611SJames Kung# Enable all depend variables
140a8224611SJames Kung# Example:
141a8224611SJames Kung# $(eval $(call cfg-enable-all-depends,FOO,BAR BAZ))
142a8224611SJames Kung# Will enable BAR and BAZ if FOO is initially 'y'
143a8224611SJames Kungcfg-enable-all-depends =                                                                   \
144a8224611SJames Kung    $(strip                                                                                \
145a8224611SJames Kung        $(if $(2),                                                                         \
146a8224611SJames Kung            $(if $(filter y, $($(1))),                                                     \
147a8224611SJames Kung                $(if $(filter y,$($(firstword $(2)))),                                     \
148a8224611SJames Kung                    ,                                                                      \
149a8224611SJames Kung                    $(warning Warning: Enabling $(firstword $(2)) [required by $(1)])      \
150c8212ba7SJerome Forissier                        $(eval override $(firstword $(2)) := y)                            \
151a8224611SJames Kung                 )                                                                         \
152a8224611SJames Kung                 $(call cfg-enable-all-depends,$(1),$(filter-out $(firstword $(2)),$(2))), \
153a8224611SJames Kung             )                                                                             \
154a8224611SJames Kung             ,                                                                             \
155a8224611SJames Kung        )                                                                                  \
156a8224611SJames Kung     )
157dffb0049SJerome Forissier
158c20f0d11SJerome Forissier# Check if a configuration variable has an acceptable value
159c20f0d11SJerome Forissier# Example:
160c20f0d11SJerome Forissier# $(call cfg-check-value,FOO,foo bar)
161c20f0d11SJerome Forissier# Will do nothing if $(CFG_FOO) is either foo or bar, and error out otherwise.
162c20f0d11SJerome Forissiercfg-check-value =                                                          \
163c20f0d11SJerome Forissier    $(if $(filter-out $(2),$(CFG_$(1))),                                   \
164c20f0d11SJerome Forissier        $(error CFG_$(1) is set to '$(CFG_$(1))', valid values are: $(2)))
165c20f0d11SJerome Forissier
16610b7925cSJerome Forissier# Set a variable or error out if it was previously set to a different value
16710b7925cSJerome Forissier# The reason message (3rd parameter) is optional
168dffb0049SJerome Forissier# Example:
16910b7925cSJerome Forissier# $(call force,CFG_FOO,foo,required by CFG_BAR)
170dffb0049SJerome Forissierdefine force
171e5834434SJerome Forissier$(eval $(call _force,$(strip $(1)),$(2),$(3)))
172dffb0049SJerome Forissierendef
173dffb0049SJerome Forissier
174dffb0049SJerome Forissierdefine _force
175dffb0049SJerome Forissierifdef $(1)
176dffb0049SJerome Forissierifneq ($($(1)),$(2))
17710b7925cSJerome Forissierifneq (,$(3))
17810b7925cSJerome Forissier_reason := $$(_empty) [$(3)]
17910b7925cSJerome Forissierendif
18010b7925cSJerome Forissier$$(error $(1) is set to '$($(1))' (from $(origin $(1))) but its value must be '$(2)'$$(_reason))
181dffb0049SJerome Forissierendif
182dffb0049SJerome Forissierendif
183dffb0049SJerome Forissier$(1) := $(2)
184dffb0049SJerome Forissierendef
185