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.
Showing the changes to scripts (1 of 1 file). Show all
Unified · Split
| @@ -7,6 +7,7 @@ quote := " · 6 unmodified lines | ||
| 7 | 7 | squote := ' |
| 8 | 8 | empty := |
| 9 | 9 | space := $(empty) $(empty) |
| 10 | +space_escape := _-_SPACE_-_ | |
| 10 | 11 | |
| 11 | 12 | ### |
| 12 | 13 | # 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 | ||
| 226 | 227 | # See Documentation/kbuild/makefiles.txt for more info |
| 227 | 228 | |
| 228 | 229 | 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)))) | |
| 233 | 234 | else |
| 234 | 235 | arg-check = $(if $(strip $(cmd_$@)),,1) |
| 235 | 236 | endif |
| @@ -373,8 +374,6 @@ endif · 137 unmodified lines | ||
| 373 | 374 | # |
| 374 | 375 | ############################################################################### |
| 375 | 376 | # |
| 376 | −space_escape := %%%SPACE%%% | |
| 377 | −# | |
| 378 | 377 | define config_filename |
| 379 | 378 | ifneq ($$(CONFIG_$(1)),"") |
| 380 | 379 | $(1)_FILENAME := $$(subst \\,\,$$(subst \$$(quote),$$(quote),$$(subst $$(space_escape),\$$(space),$$(patsubst "%",%,$$(subst $$(space),$$(space_escape),$$(CONFIG_$(1))))))) |