git: ce5fa47cf02a - main - share/mk: support for "single" group options
Date: Fri, 01 Sep 2023 16:54:53 UTC
The branch main has been updated by brooks: URL: https://cgit.FreeBSD.org/src/commit/?id=ce5fa47cf02ae97844a826d967d122cc8171dd58 commit ce5fa47cf02ae97844a826d967d122cc8171dd58 Author: Brooks Davis <brooks@FreeBSD.org> AuthorDate: 2023-09-01 16:41:07 +0000 Commit: Brooks Davis <brooks@FreeBSD.org> CommitDate: 2023-09-01 16:52:28 +0000 share/mk: support for "single" group options Support group options where 1 of n values will be selected (or a default value will be used). After processing, an OPT_FOO will be set to one value from __FOO_OPTIONS for each FOO in __SINGLE_OPTIONS. If the user sets FOO that value will be used, otherwise __FOO_DEFAULT will be used. Options that don't work an a particular system can be remapped to an alternative using BROKEN_SINGLE_OPTIONS which can be set to a list of 3-tuples of the form: OPTION broken_value replacement_value This is somewhat inspired by OPTIONS_SINGLE from ports, but the structure is quite different with a per-option variable in the style of MK_FOO={yes,no}. Reviewed by: imp, emaste Differential Revision: https://reviews.freebsd.org/D41659 --- share/mk/bsd.mkopt.mk | 38 +++++++++++++++++++++++++++++++++++++- sys/conf/kern.opts.mk | 27 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/share/mk/bsd.mkopt.mk b/share/mk/bsd.mkopt.mk index 7d43e91b042d..043a41212064 100644 --- a/share/mk/bsd.mkopt.mk +++ b/share/mk/bsd.mkopt.mk @@ -1,7 +1,7 @@ # # # Generic mechanism to deal with WITH and WITHOUT options and turn -# them into MK_ options. +# them into MK_ options. Also turn group options into OPT_ options. # # For each option FOO in __DEFAULT_YES_OPTIONS, MK_FOO is set to # "yes", unless WITHOUT_FOO is defined, in which case it is set to @@ -31,6 +31,15 @@ # system should use MK_FOO={yes,no} when it needs to override the # user's desires or default behavior. # +# For each option in __SINGLE_OPTIONS, OPT_FOO is set to FOO if +# defined and __FOO_DEFAULT if not. Valid values for FOO are specified +# by __FOO_OPTIONS. +# +# Other parts of the build system will set BROKEN_SINGLE_OPTIONS to a +# list of 3-tuples of the form: "OPTION broken_value replacment_value". +# This will not be unset before returning. Clients are expected to +# always += this variable. +# # # MK_* options which default to "yes". @@ -93,6 +102,33 @@ MK_${var}:= no MK_${var}:= no .endfor +# +# Group options set an OPT_FOO variable for each option. +# +.for opt in ${__SINGLE_OPTIONS} +.if !defined(__${opt}_OPTIONS) || empty(__${opt}_OPTIONS) +.error __${opt}_OPTIONS undefined or empty +.endif +.if !defined(__${opt}_DEFAULT) || empty(__${opt}_DEFAULT) +.error __${opt}_DEFAULT undefined or empty +.endif +.if defined(${opt}) +OPT_${opt}:= ${${opt}} +.else +OPT_${opt}:= ${__${opt}_DEFAULT} +.endif +.if empty(OPT_${opt}) || ${__${opt}_OPTIONS:M${OPT_${opt}}} != ${OPT_${opt}} +.error Invalid option OPT_${opt} (${OPT_${opt}}), must be one of: ${__${opt}_OPTIONS} +.endif +.endfor +.undef __SINGLE_OPTIONS + +.for opt val rep in ${BROKEN_SINGLE_OPTIONS} +.if ${OPT_${opt}} == ${val} +OPT_${opt}:= ${rep} +.endif +.endfor + .for vv in ${__DEFAULT_DEPENDENT_OPTIONS} .if defined(WITH_${vv:H}) && defined(WITHOUT_${vv:H}) MK_${vv:H}?= no diff --git a/sys/conf/kern.opts.mk b/sys/conf/kern.opts.mk index 178a4db61cb2..bad5e218a5b0 100644 --- a/sys/conf/kern.opts.mk +++ b/sys/conf/kern.opts.mk @@ -141,6 +141,33 @@ MK_${var}:= no MK_${var}:= no .endfor .undef BROKEN_OPTIONS + +# +# Group options set an OPT_FOO variable for each option. +# +.for opt in ${__SINGLE_OPTIONS} +.if !defined(__${opt}_OPTIONS) || empty(__${opt}_OPTIONS) +.error __${opt}_OPTIONS not defined or empty +.endif +.if !defined(__${opt}_DEFAULT) || empty(__${opt}_DEFAULT) +.error __${opt}_DEFAULT undefined or empty +.endif +.if defined(${opt}) +OPT_${opt}:= ${${opt}} +.else +OPT_${opt}:= ${__${opt}_DEFAULT} +.endif +.if empty(OPT_${opt}) || ${__${opt}_OPTIONS:M${OPT_${opt}}} != ${OPT_${opt}} +.error Invalid option OPT_${opt} (${OPT_${opt}}), must be one of: ${__${opt}_OPTIONS} +.endif +.endfor +.undef __SINGLE_OPTIONS + +.for opt val rep in ${BROKEN_SINGLE_OPTIONS} +.if ${OPT_${opt}} == ${val} +OPT_${opt}:= ${rep} +.endif +.endfor #end of bsd.mkopt.mk expanded inline. #