[Buildroot] [PATCH v2 1/1] package/pkg-utils: prevent kconfig_enable_opt from changing =m to =y

TIAN Yuanhao tianyuanhao3 at 163.com
Mon May 23 11:53:26 UTC 2022


All,

On 5/18/22 13:21, Yann E. MORIN wrote:
> Christian, Arnout, All,
>
> On 2022-05-18 20:01 +0200, Arnout Vandecappelle spake thusly:
>> On 17/05/2022 12:36, Christian Stewart via buildroot wrote:
>>> This patch changes KCONFIG_MUNGE_DOT_CONFIG to prevent changing `=m` to `=y`.
>>   Good catch!
>>   Patch is a bit over-complicated, but I don't know how to do better.
> [--SNIP--]
>>> @@ -21,8 +21,14 @@ KCONFIG_DOT_CONFIG = $(strip \
>>>   )
>>>   # KCONFIG_MUNGE_DOT_CONFIG (option, newline [, file])
>>> +# If setting to =y and the option is already set to =m, ignore.
>>>   define KCONFIG_MUNGE_DOT_CONFIG
>>> -	$(SED) "/\\<$(strip $(1))\\>/d" $(call KCONFIG_DOT_CONFIG,$(3))
>>> +	if [[ "$(lastword $(subst =, ,$(strip $(2))))" == "y" ]]; then \
>>   This part we could avoid by adding a 4th option and setting it only on
>> KCONFIG_ENABLE_OPT.
>>
>>> +		if grep -q "$(strip $(1))=m" $(call KCONFIG_DOT_CONFIG,$(3)); then \
>>> +			exit 0; \
>>   This is a kind of hard-to-follow control structure - better turn around the
>> condition and do the replacement inside it. So, combined with the above:
>>
>> 	if $(if $(4),grep -q ...,true); then \
>> 		sed ...; \
>> 		echo ...; \
>> 	fi
> Actually, I think the check should not be in KCONFIG_MUNGE_DOT_CONFIG,
> as it really belongs to KCONFIG_ENABLE_OPT.
>
> Maybe something like:
>
>      diff --git a/package/pkg-utils.mk b/package/pkg-utils.mk
>      index 7d1aea7710..56cd72a9a9 100644
>      --- a/package/pkg-utils.mk
>      +++ b/package/pkg-utils.mk
>      @@ -22,12 +22,16 @@ KCONFIG_DOT_CONFIG = $(strip \
>       
>       # KCONFIG_MUNGE_DOT_CONFIG (option, newline [, file])
>       define KCONFIG_MUNGE_DOT_CONFIG
>      -	$(SED) "/\\<$(strip $(1))\\>/d" $(call KCONFIG_DOT_CONFIG,$(3))
>      +	$(SED) "/\\<$(strip $(1))\\>/d" $(call KCONFIG_DOT_CONFIG,$(3)) && \
>       	echo '$(strip $(2))' >> $(call KCONFIG_DOT_CONFIG,$(3))
>       endef
>       
>       # KCONFIG_ENABLE_OPT (option [, file])
>      -KCONFIG_ENABLE_OPT  = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=y, $(2))
>      +define KCONFIG_ENABLE_OPT
>      +	if ! grep -q -E '^$(1)=' $(call KCONFIG_DOT_CONFIG,$(2)); then \
>      +		$(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=y, $(2)) || exit 1; \
>      +	fi
>      +endif
>       # KCONFIG_SET_OPT (option, value [, file])
>       KCONFIG_SET_OPT     = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=$(2), $(3))
>       # KCONFIG_DISABLE_OPT  (option [, file])
I prefer this:

  # KCONFIG_MUNGE_DOT_CONFIG (option, newline [, file])
  define KCONFIG_MUNGE_DOT_CONFIG
-    $(SED) "/\\<$(strip $(1))\\>/d" $(call KCONFIG_DOT_CONFIG,$(3))
+    $(SED) '/^\(# \)\?$(strip $(1))\>/d' $(call 
KCONFIG_DOT_CONFIG,$(3)) && \
      echo '$(strip $(2))' >> $(call KCONFIG_DOT_CONFIG,$(3))
  endef

  # KCONFIG_ENABLE_OPT (option [, file])
-KCONFIG_ENABLE_OPT  = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=y, $(2))
+define KCONFIG_ENABLE_OPT
+    $(Q)if ! grep -q '^$(strip $(1))=[my]' $(call 
KCONFIG_DOT_CONFIG,$(2)); then \
+        $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=y, $(2)) || exit 1; \
+    fi
+endef

Regards,
Yuanhao
>
> Or maybe just that:
>
>      diff --git a/package/pkg-utils.mk b/package/pkg-utils.mk
>      index 7d1aea7710..8aebd14114 100644
>      --- a/package/pkg-utils.mk
>      +++ b/package/pkg-utils.mk
>      @@ -27,7 +27,7 @@ define KCONFIG_MUNGE_DOT_CONFIG
>       endef
>       
>       # KCONFIG_ENABLE_OPT (option [, file])
>      -KCONFIG_ENABLE_OPT  = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=y, $(2))
>      +KCONFIG_ENABLE_OPT  = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1) is not set, $(1)=y, $(2))
>       # KCONFIG_SET_OPT (option, value [, file])
>       KCONFIG_SET_OPT     = $(call KCONFIG_MUNGE_DOT_CONFIG, $(1), $(1)=$(2), $(3))
>       # KCONFIG_DISABLE_OPT  (option [, file])
>
> Also, I notice now that this KCONFIG_MUNGE_DOT_CONFIG is pretty fragile.
> Given a .config with:
>
>      FOO="1234"
>      BAR="$(FOO)"
>
> and then:
>
>      $(call KCONFIG_SET_OPT,FOO,azerty)
>
> would yield a .config with just:
>
>      FOO="azerty"
>
> because \<FOO\> would match the assignement to BAR.
>
> So we may need to revisit that mess of mine...
>
> Regards,
> Yann E. MORIN.
>




More information about the buildroot mailing list