diff options
author | Jean-Philippe Brucker | 2020-03-12 17:19:45 +0100 |
---|---|---|
committer | Denys Vlasenko | 2020-04-29 14:52:19 +0200 |
commit | ed8af51b600fd16d22c6663a241547c3a9d7f2b4 (patch) | |
tree | cefe5aea5aaf30a1d96de97184aba405825ea509 /scripts/Kbuild.include | |
parent | b9943741c26e1e597edc142066f428540d1f1207 (diff) | |
download | busybox-ed8af51b600fd16d22c6663a241547c3a9d7f2b4.zip busybox-ed8af51b600fd16d22c6663a241547c3a9d7f2b4.tar.gz |
build system: remove KBUILD_STR()
When using GNU Make >=4.3, the KBUILD_STR() definition interferes badly
with dependency checks during build, and forces a complete rebuild every
time Make runs.
In if_changed_rule, Kconfig checks if the command used to build a file
has changed since last execution. The previous command is stored in the
generated .<file>.o.cmd file. For example applets/.applets.o.cmd defines
a "cmd_applets/applets.o" variable:
cmd_applets/applets.o := gcc ... -D"KBUILD_STR(s)=#s" ...
Here the '#' should be escaped with a backslash, otherwise GNU Make
interprets it as starting a comment, and ignore the rest of the
variable. As a result of this truncation, the previous command doesn't
equal the new command and Make rebuilds each target.
The problem started to appear when GNU Make 4.3 (released January 2020),
introduced a backward-incompatible fix to macros containing a '#'. While
the above use of '#', a simple Make variable, still needs to be escaped,
a '#' within a function invocation doesn't need to be escaped anymore.
As Martin Dorey explained on the GNU Make discussion [1], the above
declaration is generated from make-cmd, defined as:
make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))
Since GNU Make 4.3, the first argument of subst should not have a
backslash. make-cmd now looks for literally \# and doesn't find it, and
as a result doesn't add the backslash when generating .o.cmd files.
[1] http://savannah.gnu.org/bugs/?20513
We could fix it by changing make-cmd to "$(subst #,\#,...)", but to
avoid compatibility headaches, simply get rid of the KBUILD_STR
definition, as done in Linux by b42841b7bb62 ("kbuild: Get rid of
KBUILD_STR"). Quote the string arguments directly rather than asking the
preprocessor to quote them.
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'scripts/Kbuild.include')
-rw-r--r-- | scripts/Kbuild.include | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 6ec1809..5b4db5c 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -4,6 +4,7 @@ # Convinient variables comma := , squote := ' +quote := " empty := space := $(empty) $(empty) |