xref: /optee_os/mk/checkconf.mk (revision dde0e235e2fb357980444767f7030a190acfa706)
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;						\
16fe52b1f5SJerome Forissier	echo '  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;					\
26fe52b1f5SJerome Forissier	if [ -r $@ ] && cmp -s $@ $@.tmp; then			\
27fe52b1f5SJerome Forissier		rm -f $@.tmp;					\
28fe52b1f5SJerome Forissier	else							\
29fe52b1f5SJerome Forissier		echo '  UPD     $@';				\
30fe52b1f5SJerome Forissier		mv $@.tmp $@;					\
31fe52b1f5SJerome Forissier	fi
32fe52b1f5SJerome Forissierendef
33fe52b1f5SJerome Forissier
34*dde0e235Setienne carrieredefine build-conf-mk
35*dde0e235Setienne carriere	$(q)set -e;						\
36*dde0e235Setienne carriere	cnf="$(strip $(foreach var,				\
37*dde0e235Setienne carriere		$(call cfg-vars-by-prefix,CFG_),		\
38*dde0e235Setienne carriere		$(call cfg-make-variable,$(var))))";		\
39*dde0e235Setienne carriere	mkdir -p $(dir $@);					\
40*dde0e235Setienne carriere	echo "# auto-generated TEE configuration file" >$@.tmp; \
41*dde0e235Setienne carriere	echo "# TEE version $${CFG_TEE_VERSION:-(undefined)}" >>$@.tmp; \
42*dde0e235Setienne carriere	echo "ARCH=${ARCH}" >>$@.tmp;				\
43*dde0e235Setienne carriere	echo "PLATFORM=${PLATFORM}" >>$@.tmp;			\
44*dde0e235Setienne carriere	echo "PLATFORM_FLAVOR=${PLATFORM_FLAVOR}" >>$@.tmp; 	\
45*dde0e235Setienne carriere	echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp;	\
46*dde0e235Setienne carriere	echo '  UPD     $@';					\
47*dde0e235Setienne carriere	mv $@.tmp $@;
48*dde0e235Setienne carriereendef
49*dde0e235Setienne carriere
50fe52b1f5SJerome Forissierdefine cfg-vars-by-prefix
51fe52b1f5SJerome Forissier	$(strip $(if $(1),$(call _cfg-vars-by-prefix,$(1)),
520a7f95b9SJerome Forissier			  $(call _cfg-vars-by-prefix,CFG_ _CFG_)))
53fe52b1f5SJerome Forissierendef
54fe52b1f5SJerome Forissier
55fe52b1f5SJerome Forissierdefine _cfg-vars-by-prefix
56fe52b1f5SJerome Forissier	$(sort $(foreach prefix,$(1),$(filter $(prefix)%,$(.VARIABLES))))
57fe52b1f5SJerome Forissierendef
58fe52b1f5SJerome Forissier
59fe52b1f5SJerome Forissier# Convert a makefile variable to a #define
60fe52b1f5SJerome Forissier# <undefined>, n => <undefined>
61fe52b1f5SJerome Forissier# y              => 1
62fe52b1f5SJerome Forissier# <other value>  => <other value>
63fe52b1f5SJerome Forissierdefine cfg-make-define
64fe52b1f5SJerome Forissier	$(strip $(if $(filter y,$($1)),
65fe52b1f5SJerome Forissier		     #define $1 1 /* '$($1)' */_nl_,
66fe52b1f5SJerome Forissier		     $(if $(filter xn x,x$($1)),
67fe52b1f5SJerome Forissier			  /* $1 is not set ('$($1)') */_nl_,
68fe52b1f5SJerome Forissier			  #define $1 $($1) /* '$($1)' */_nl_)))
69fe52b1f5SJerome Forissierendef
700a7f95b9SJerome Forissier
71*dde0e235Setienne carrieredefine cfg-make-variable
72*dde0e235Setienne carriere	$(strip $(if $(filter xn x,x$($1)),
73*dde0e235Setienne carriere			  # $1 is not set ('$($1)')_nl_,
74*dde0e235Setienne carriere			  $1=$($1)_nl_))
75*dde0e235Setienne carriereendef
76*dde0e235Setienne carriere
770a7f95b9SJerome Forissier# Returns 'y' if at least one variable is 'y', empty otherwise
780a7f95b9SJerome Forissier# Example:
790a7f95b9SJerome Forissier# FOO_OR_BAR := $(call cfg-one-enabled, FOO BAR)
800a7f95b9SJerome Forissiercfg-one-enabled = $(if $(filter y, $(foreach var,$(1),$($(var)))),y,)
810a7f95b9SJerome Forissier
820a7f95b9SJerome Forissier# Returns 'y' if all variables are 'y', empty otherwise
830a7f95b9SJerome Forissier# Example:
840a7f95b9SJerome Forissier# FOO_AND_BAR := $(call cfg-all-enabled, FOO BAR)
850a7f95b9SJerome Forissiercfg-all-enabled =                                                             \
860a7f95b9SJerome Forissier    $(strip                                                                   \
870a7f95b9SJerome Forissier        $(if $(1),                                                            \
880a7f95b9SJerome Forissier            $(if $(filter y,$($(firstword $(1)))),                            \
890a7f95b9SJerome Forissier                $(call cfg-all-enabled,$(filter-out $(firstword $(1)),$(1))), \
900a7f95b9SJerome Forissier             ),                                                               \
910a7f95b9SJerome Forissier            y                                                                 \
920a7f95b9SJerome Forissier         )                                                                    \
930a7f95b9SJerome Forissier     )
940a7f95b9SJerome Forissier
950a7f95b9SJerome Forissier# Disable a configuration variable if some dependency is disabled
960a7f95b9SJerome Forissier# Example:
970a7f95b9SJerome Forissier# $(eval $(call cfg-depends-all,FOO,BAR BAZ))
980a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and BAR or BAZ are not 'y'
990a7f95b9SJerome Forissiercfg-depends-all =                                                           \
1000a7f95b9SJerome Forissier    $(strip                                                                 \
1010a7f95b9SJerome Forissier        $(if $(filter y, $($(1))),                                          \
1020a7f95b9SJerome Forissier            $(if $(call cfg-all-enabled,$(2)),                              \
1030a7f95b9SJerome Forissier                ,                                                           \
1040a7f95b9SJerome Forissier                $(warning Warning: Disabling $(1) [requires $(strip $(2))]) \
1050a7f95b9SJerome Forissier                    override $(1) :=                                        \
1060a7f95b9SJerome Forissier             )                                                              \
1070a7f95b9SJerome Forissier         )                                                                  \
1080a7f95b9SJerome Forissier     )
1090a7f95b9SJerome Forissier
1100a7f95b9SJerome Forissier# Disable a configuration variable if all dependencies are disabled
1110a7f95b9SJerome Forissier# Example:
1120a7f95b9SJerome Forissier# $(eval $(call cfg-depends-one,FOO,BAR BAZ))
1130a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and both BAR and BAZ are not 'y'
1140a7f95b9SJerome Forissiercfg-depends-one =                                                                    \
1150a7f95b9SJerome Forissier    $(strip                                                                          \
1160a7f95b9SJerome Forissier        $(if $(filter y, $($(1))),                                                   \
1170a7f95b9SJerome Forissier            $(if $(call cfg-one-enabled,$(2)),                                       \
1180a7f95b9SJerome Forissier                ,                                                                    \
1190a7f95b9SJerome Forissier                $(warning Warning: Disabling $(1) [requires (one of) $(strip $(2))]) \
1200a7f95b9SJerome Forissier                    override $(1) :=                                                 \
1210a7f95b9SJerome Forissier             )                                                                       \
1220a7f95b9SJerome Forissier         )                                                                           \
1230a7f95b9SJerome Forissier     )
124