History

kbuild: fix if_change and friends to consider argument order

Currently, arg-check is implemented as follows: arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ $(filter-out $(cmd_$@), $(cmd_$(1))) ) This does not care about the order of arguments that appear in $(cmd_$(1)) and $(cmd_$@). So, if_changed and friends never rebuild the target if only the argument order is changed. This is a problem when the link order is changed. Apparently, obj-y += foo.o obj-y += bar.o and obj-y += bar.o obj-y += foo.o should be distinguished because the link order determines the probe order of drivers. So, built-in.o should be rebuilt when the order of objects is changed. This commit fixes arg-check to compare the old/current commands including the argument order. Of course, this change has a side effect; Kbuild will react to the change of compile option order. For example, "-DFOO -DBAR" and "-DBAR -DFOO" should give no difference to the build result, but false positive should be better than false negative. I am moving space_escape to the top of Kbuild.include just for a matter of preference. In practical terms, space_escape can be defined after arg-check because arg-check uses "=" flavor, not ":=". Having said that, collecting convenient variables in one place makes sense from the point of readability. Chaining "%%%SPACE%%%" to "_-_SPACE_-_" is also a matter of taste at this point. Actually, it can be arbitrary as long as it is an unlikely used string. The only problem I see in "%%%SPACE%%%" is that "%" is a special character in "$(patsubst ...)" context. This commit just uses "$(subst ...)" for arg-check, but I am fixing it now in case we might want to use it in $(patsubst ...) context in the future.

Masahiro Yamada committed 10 years ago

Commit 9c8fa9b1 parent a7c65b91 file · +5 −6Browse files

Unified · Split

scripts/Kbuild.include+5−6
@@ -7,6 +7,7 @@ quote := " · 6 unmodified lines
77 squote := '
88 empty :=
99 space := $(empty) $(empty)
10+space_escape := _-_SPACE_-_
1011
1112 ###
1213 # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
@@ -226,10 +227,10 @@ objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) · 213 unmodified lines
226227 # See Documentation/kbuild/makefiles.txt for more info
227228
228229 ifneq ($(KBUILD_NOCMDDEP),1)
229−# Check if both arguments has same arguments. Result is empty string if equal.
230−# User may override this check using make KBUILD_NOCMDDEP=1
231−arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
232− $(filter-out $(cmd_$@), $(cmd_$(1))) )
230+# Check if both arguments are the same including their order. Result is empty
231+# string if equal. User may override this check using make KBUILD_NOCMDDEP=1
232+arg-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
233+ $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
233234 else
234235 arg-check = $(if $(strip $(cmd_$@)),,1)
235236 endif
@@ -373,8 +374,6 @@ endif · 137 unmodified lines
373374 #
374375 ###############################################################################
375376 #
376−space_escape := %%%SPACE%%%
377−#
378377 define config_filename
379378 ifneq ($$(CONFIG_$(1)),"")
380379 $(1)_FILENAME := $$(subst \\,\,$$(subst \$$(quote),$$(quote),$$(subst $$(space_escape),\$$(space),$$(patsubst "%",%,$$(subst $$(space),$$(space_escape),$$(CONFIG_$(1)))))))