make 4.1 parses MAKEFLAGS later than in make 3.x, which breaks
'?=' assignment on variables with builtin assignments when
MAKEFLAGS adds -R flag
https://savannah.gnu.org/bugs/?45211
Since apparently make does not guarantee results with '-R' flag
unless it is supplied on the command line (rather than later
injected by manipulating MAKEFLAGS), it is safer to stop trying
to inject '-R' and instead deal with possible builtin values.
New custom macro 'set_if_default_or_unset' consistently achieves
the intended behavior for both 3.x and 4.x versions of make:
* if variable is unset,
assign new value
* if variable has builtin default value,
assign new value
* otherwise variable has user-set value (env or command-line),
so leave it alone
Signed-off-by: S. Lockwood-Childs <
s...@vctlabs.com>
---
Makefile | 25 ++++++++++++++-----------
scripts/Kbuild.include | 4 ++++
2 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/Makefile b/Makefile
index 6cf6b7d..4b5a916 100644
--- a/Makefile
+++ b/Makefile
@@ -11,10 +11,10 @@ NAME =
# expect to learn how to build the kernel reading this file.
# Do not:
-# o use make's built-in rules and variables
+# o use make's built-in rules
# (this increases performance and avoids hard-to-debug behaviour);
# o print "Entering directory ...";
-MAKEFLAGS += -rR --no-print-directory
+MAKEFLAGS += -r --no-print-directory
# To put more focus on warnings, be less verbose as default
@@ -169,15 +169,18 @@ include $(srctree)/scripts/Kbuild.include
# Make variables (CC, etc...)
-AS ?= $(CROSS_COMPILE)as
-LD ?= $(CROSS_COMPILE)gcc
-CC ?= $(CROSS_COMPILE)gcc
-CPP ?= $(CC) -E
-AR ?= $(CROSS_COMPILE)ar
-NM ?= $(CROSS_COMPILE)nm
-STRIP ?= $(CROSS_COMPILE)strip
-OBJCOPY ?= $(CROSS_COMPILE)objcopy
-OBJDUMP ?= $(CROSS_COMPILE)objdump
+# this looks a bit horrible, but 'VAR ?= VALUE' preserves builtin values
+# rather than only user-supplied values from env or command-line
+$(call set_if_default_or_unset,AS,$(CROSS_COMPILE)as)
+$(call set_if_default_or_unset,LD,$(CROSS_COMPILE)gcc)
+$(call set_if_default_or_unset,CC,$(CROSS_COMPILE)gcc)
+$(call set_if_default_or_unset,CPP,$(CC) -E)
+$(call set_if_default_or_unset,AR,$(CROSS_COMPILE)ar)
+$(call set_if_default_or_unset,NM,$(CROSS_COMPILE)nm)
+$(call set_if_default_or_unset,STRIP,$(CROSS_COMPILE)strip)
+$(call set_if_default_or_unset,OBJCOPY,$(CROSS_COMPILE)objcopy)
+$(call set_if_default_or_unset,OBJDUMP,$(CROSS_COMPILE)objdump)
+
AWK = awk
INSTALLKERNEL := installkernel
PERL = perl
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index be39cd1..b635171 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -233,6 +233,10 @@ if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \
@set -e; \
$(rule_$(1)))
+# Usage: $(call set_if_default_or_unset,var,value)
+set_if_default_or_unset = $(if $(filter default undefined,$(origin $(1))), \
+ $(eval $(1) = $(2)) )
+
###
# why - tell why a a target got build
# enabled by make V=2
--
2.4.6