xref: /optee_os/mk/checkconf.mk (revision b5569a68c7ef6c8fd593d561f85c6d944daeb1ca)
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_*
50a7f95b9SJerome Forissier# and _CFG_* variables):
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     $@';			\
17fe52b1f5SJerome Forissier	cnf="$(strip $(foreach var,				\
18fe52b1f5SJerome Forissier		$(call cfg-vars-by-prefix,$1),			\
19fe52b1f5SJerome Forissier		$(call cfg-make-define,$(var))))";		\
20fe52b1f5SJerome Forissier	guard="_`echo $@ | tr -- -/. ___`_";			\
21fe52b1f5SJerome Forissier	mkdir -p $(dir $@);					\
22fe52b1f5SJerome Forissier	echo "#ifndef $${guard}" >$@.tmp;			\
23fe52b1f5SJerome Forissier	echo "#define $${guard}" >>$@.tmp;			\
24fe52b1f5SJerome Forissier	echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp;	\
25fe52b1f5SJerome Forissier	echo "#endif" >>$@.tmp;					\
263354f9b2SJerome Forissier	$(call mv-if-changed,$@.tmp,$@)
27fe52b1f5SJerome Forissierendef
28fe52b1f5SJerome Forissier
293354f9b2SJerome Forissierdefine check-conf-mk
30dde0e235Setienne carriere	$(q)set -e;						\
3162428631SJens Wiklander	$(cmd-echo-silent) '  CHK     $@';			\
32dde0e235Setienne carriere	cnf="$(strip $(foreach var,				\
33dde0e235Setienne carriere		$(call cfg-vars-by-prefix,CFG_),		\
342c5782f1Setienne carriere		$(strip $(var)=$($(var))_nl_)))"; \
35dde0e235Setienne carriere	mkdir -p $(dir $@);					\
36dde0e235Setienne carriere	echo "# auto-generated TEE configuration file" >$@.tmp; \
37*b5569a68SPascal Brand	echo "# TEE version ${TEE_IMPL_VERSION}" >>$@.tmp; \
38dde0e235Setienne carriere	echo "ARCH=${ARCH}" >>$@.tmp;				\
39dde0e235Setienne carriere	echo "PLATFORM=${PLATFORM}" >>$@.tmp;			\
40dde0e235Setienne carriere	echo "PLATFORM_FLAVOR=${PLATFORM_FLAVOR}" >>$@.tmp; 	\
41dde0e235Setienne carriere	echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp;	\
423354f9b2SJerome Forissier	$(call mv-if-changed,$@.tmp,$@)
433354f9b2SJerome Forissierendef
443354f9b2SJerome Forissier
453354f9b2SJerome Forissier# Rename $1 to $2 only if file content differs. Otherwise just delete $1.
463354f9b2SJerome Forissierdefine mv-if-changed
473354f9b2SJerome Forissier	if [ -r $2 ] && cmp -s $2 $1; then			\
483354f9b2SJerome Forissier		rm -f $1;					\
493354f9b2SJerome Forissier	else							\
5062428631SJens Wiklander		$(cmd-echo-silent) '  UPD     $2';		\
513354f9b2SJerome Forissier		mv $1 $2;					\
523354f9b2SJerome Forissier	fi
53dde0e235Setienne carriereendef
54dde0e235Setienne carriere
55fe52b1f5SJerome Forissierdefine cfg-vars-by-prefix
56fe52b1f5SJerome Forissier	$(strip $(if $(1),$(call _cfg-vars-by-prefix,$(1)),
570a7f95b9SJerome Forissier			  $(call _cfg-vars-by-prefix,CFG_ _CFG_)))
58fe52b1f5SJerome Forissierendef
59fe52b1f5SJerome Forissier
60fe52b1f5SJerome Forissierdefine _cfg-vars-by-prefix
61fe52b1f5SJerome Forissier	$(sort $(foreach prefix,$(1),$(filter $(prefix)%,$(.VARIABLES))))
62fe52b1f5SJerome Forissierendef
63fe52b1f5SJerome Forissier
64fe52b1f5SJerome Forissier# Convert a makefile variable to a #define
65fe52b1f5SJerome Forissier# <undefined>, n => <undefined>
66fe52b1f5SJerome Forissier# y              => 1
67fe52b1f5SJerome Forissier# <other value>  => <other value>
68fe52b1f5SJerome Forissierdefine cfg-make-define
69fe52b1f5SJerome Forissier	$(strip $(if $(filter y,$($1)),
70fe52b1f5SJerome Forissier		     #define $1 1 /* '$($1)' */_nl_,
71fe52b1f5SJerome Forissier		     $(if $(filter xn x,x$($1)),
72fe52b1f5SJerome Forissier			  /* $1 is not set ('$($1)') */_nl_,
73fe52b1f5SJerome Forissier			  #define $1 $($1) /* '$($1)' */_nl_)))
74fe52b1f5SJerome Forissierendef
750a7f95b9SJerome Forissier
760a7f95b9SJerome Forissier# Returns 'y' if at least one variable is 'y', empty otherwise
770a7f95b9SJerome Forissier# Example:
780a7f95b9SJerome Forissier# FOO_OR_BAR := $(call cfg-one-enabled, FOO BAR)
790a7f95b9SJerome Forissiercfg-one-enabled = $(if $(filter y, $(foreach var,$(1),$($(var)))),y,)
800a7f95b9SJerome Forissier
810a7f95b9SJerome Forissier# Returns 'y' if all variables are 'y', empty otherwise
820a7f95b9SJerome Forissier# Example:
830a7f95b9SJerome Forissier# FOO_AND_BAR := $(call cfg-all-enabled, FOO BAR)
840a7f95b9SJerome Forissiercfg-all-enabled =                                                             \
850a7f95b9SJerome Forissier    $(strip                                                                   \
860a7f95b9SJerome Forissier        $(if $(1),                                                            \
870a7f95b9SJerome Forissier            $(if $(filter y,$($(firstword $(1)))),                            \
880a7f95b9SJerome Forissier                $(call cfg-all-enabled,$(filter-out $(firstword $(1)),$(1))), \
890a7f95b9SJerome Forissier             ),                                                               \
900a7f95b9SJerome Forissier            y                                                                 \
910a7f95b9SJerome Forissier         )                                                                    \
920a7f95b9SJerome Forissier     )
930a7f95b9SJerome Forissier
940a7f95b9SJerome Forissier# Disable a configuration variable if some dependency is disabled
950a7f95b9SJerome Forissier# Example:
960a7f95b9SJerome Forissier# $(eval $(call cfg-depends-all,FOO,BAR BAZ))
970a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and BAR or BAZ are not 'y'
980a7f95b9SJerome Forissiercfg-depends-all =                                                           \
990a7f95b9SJerome Forissier    $(strip                                                                 \
1000a7f95b9SJerome Forissier        $(if $(filter y, $($(1))),                                          \
1010a7f95b9SJerome Forissier            $(if $(call cfg-all-enabled,$(2)),                              \
1020a7f95b9SJerome Forissier                ,                                                           \
1030a7f95b9SJerome Forissier                $(warning Warning: Disabling $(1) [requires $(strip $(2))]) \
1040a7f95b9SJerome Forissier                    override $(1) :=                                        \
1050a7f95b9SJerome Forissier             )                                                              \
1060a7f95b9SJerome Forissier         )                                                                  \
1070a7f95b9SJerome Forissier     )
1080a7f95b9SJerome Forissier
1090a7f95b9SJerome Forissier# Disable a configuration variable if all dependencies are disabled
1100a7f95b9SJerome Forissier# Example:
1110a7f95b9SJerome Forissier# $(eval $(call cfg-depends-one,FOO,BAR BAZ))
1120a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and both BAR and BAZ are not 'y'
1130a7f95b9SJerome Forissiercfg-depends-one =                                                                    \
1140a7f95b9SJerome Forissier    $(strip                                                                          \
1150a7f95b9SJerome Forissier        $(if $(filter y, $($(1))),                                                   \
1160a7f95b9SJerome Forissier            $(if $(call cfg-one-enabled,$(2)),                                       \
1170a7f95b9SJerome Forissier                ,                                                                    \
1180a7f95b9SJerome Forissier                $(warning Warning: Disabling $(1) [requires (one of) $(strip $(2))]) \
1190a7f95b9SJerome Forissier                    override $(1) :=                                                 \
1200a7f95b9SJerome Forissier             )                                                                       \
1210a7f95b9SJerome Forissier         )                                                                           \
1220a7f95b9SJerome Forissier     )
123a8224611SJames Kung
124a8224611SJames Kung
125a8224611SJames Kung# Enable all depend variables
126a8224611SJames Kung# Example:
127a8224611SJames Kung# $(eval $(call cfg-enable-all-depends,FOO,BAR BAZ))
128a8224611SJames Kung# Will enable BAR and BAZ if FOO is initially 'y'
129a8224611SJames Kungcfg-enable-all-depends =                                                                   \
130a8224611SJames Kung    $(strip                                                                                \
131a8224611SJames Kung        $(if $(2),                                                                         \
132a8224611SJames Kung            $(if $(filter y, $($(1))),                                                     \
133a8224611SJames Kung                $(if $(filter y,$($(firstword $(2)))),                                     \
134a8224611SJames Kung                    ,                                                                      \
135a8224611SJames Kung                    $(warning Warning: Enabling $(firstword $(2)) [required by $(1)])      \
136c8212ba7SJerome Forissier                        $(eval override $(firstword $(2)) := y)                            \
137a8224611SJames Kung                 )                                                                         \
138a8224611SJames Kung                 $(call cfg-enable-all-depends,$(1),$(filter-out $(firstword $(2)),$(2))), \
139a8224611SJames Kung             )                                                                             \
140a8224611SJames Kung             ,                                                                             \
141a8224611SJames Kung        )                                                                                  \
142a8224611SJames Kung     )
143dffb0049SJerome Forissier
14410b7925cSJerome Forissier# Set a variable or error out if it was previously set to a different value
14510b7925cSJerome Forissier# The reason message (3rd parameter) is optional
146dffb0049SJerome Forissier# Example:
14710b7925cSJerome Forissier# $(call force,CFG_FOO,foo,required by CFG_BAR)
148dffb0049SJerome Forissierdefine force
14910b7925cSJerome Forissier$(eval $(call _force,$(1),$(2),$(3)))
150dffb0049SJerome Forissierendef
151dffb0049SJerome Forissier
152dffb0049SJerome Forissierdefine _force
153dffb0049SJerome Forissierifdef $(1)
154dffb0049SJerome Forissierifneq ($($(1)),$(2))
15510b7925cSJerome Forissierifneq (,$(3))
15610b7925cSJerome Forissier_reason := $$(_empty) [$(3)]
15710b7925cSJerome Forissierendif
15810b7925cSJerome Forissier$$(error $(1) is set to '$($(1))' (from $(origin $(1))) but its value must be '$(2)'$$(_reason))
159dffb0049SJerome Forissierendif
160dffb0049SJerome Forissierendif
161dffb0049SJerome Forissier$(1) := $(2)
162dffb0049SJerome Forissierendef
163