On Fri, Jun 16, 2023 at 11:57:50PM +0900, Masahiro Yamada wrote: > With commit 9da0763bdd82 ("kbuild: Use relative path when building in > a subdir of the source tree"), compiler messages in out-of-tree builds > include relative paths, which are relative to the build directory, not > the directory where make was started. > > To help IDEs/editors find the source files, Kbuild lets GNU Make print > "Entering directory ..." when it changes the working directory. It has > been working fine for a long time, but David reported it is broken with > the latest GNU Make. > > The behavior was changed by GNU Make commit 8f9e7722ff0f ("[SV 63537] > Fix setting -w in makefiles"). Previously, setting --no-print-directory > to MAKEFLAGS only affected child makes, but it is now interpreted in > the current make as soon as it is set. > > [test code] > > $ cat /tmp/Makefile > ifneq ($(SUBMAKE),1) > MAKEFLAGS += --no-print-directory > all: ; $(MAKE) SUBMAKE=1 > else > all: ; : > endif > > [before 8f9e7722ff0f] > > $ make -C /tmp > make: Entering directory '/tmp' > make SUBMAKE=1 > : > make: Leaving directory '/tmp' > > [after 8f9e7722ff0f] > > $ make -C /tmp > make SUBMAKE=1 > : > > Previously, the effect of --no-print-directory was delayed until Kbuild > started the directory descending, but it is no longer true with GNU Make > 4.4.1. > > This commit adds one more recursion to cater to GNU Make >= 4.4.1. > > When Kbuild needs to change the working directory, __submake will be > executed twice. > > __submake without --no-print-directory --> show "Entering directory ..." > __submake with --no-print-directory --> parse the rest of Makefile > > We end up with one more recursion than needed for GNU Make < 4.4.1, but > I do not want to complicate the version check. > > Reported-by: David Howells <dhowells@xxxxxxxxxx> > Closes: https://lore.kernel.org/all/2427604.1686237298@xxxxxxxxxxxxxxxxxxxxxx/ > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- > > Changes in v2: > - Fix the code. V1 did not work. > - Remove the version check to simplify the code Tested-by: Nicolas Schier <n.schier@xxxxxx> > > Makefile | 36 ++++++++++++++++++++---------------- > 1 file changed, 20 insertions(+), 16 deletions(-) > > diff --git a/Makefile b/Makefile > index cc3fe09c4dec..916c1a7984b0 100644 > --- a/Makefile > +++ b/Makefile > @@ -189,13 +189,6 @@ else > abs_objtree := $(CURDIR) > endif # ifneq ($(KBUILD_OUTPUT),) > > -ifeq ($(abs_objtree),$(CURDIR)) > -# Suppress "Entering directory ..." unless we are changing the work directory. > -MAKEFLAGS += --no-print-directory > -else > -need-sub-make := 1 > -endif > - > this-makefile := $(lastword $(MAKEFILE_LIST)) > abs_srctree := $(realpath $(dir $(this-makefile))) > > @@ -214,6 +207,23 @@ endif > export abs_srctree abs_objtree > export sub_make_done := 1 > > +endif # sub_make_done > + > +ifeq ($(abs_objtree),$(CURDIR)) > +# Suppress "Entering directory ..." if we are at the final work directory. > +no-print-directory := --no-print-directory > +else > +# Recursion to show "Entering directory ..." > +need-sub-make := 1 > +endif > + > +ifeq ($(filter --no-print-directory, $(MAKEFLAGS)),) > +# If --no-print-directory is unset, recurse once again to set it. > +# You may end up with recursing into __sub-make twice. This is due to the > +# behavior change for GNU Make 4.4.1. > +need-sub-make := 1 > +endif > + > ifeq ($(need-sub-make),1) > > PHONY += $(MAKECMDGOALS) __sub-make > @@ -223,18 +233,12 @@ $(filter-out $(this-makefile), $(MAKECMDGOALS)) __all: __sub-make > > # Invoke a second make in the output directory, passing relevant variables > __sub-make: > - $(Q)$(MAKE) -C $(abs_objtree) -f $(abs_srctree)/Makefile $(MAKECMDGOALS) > + $(Q)$(MAKE) $(no-print-directory) -C $(abs_objtree) \ > + -f $(abs_srctree)/Makefile $(MAKECMDGOALS) > > -endif # need-sub-make > -endif # sub_make_done > +else # need-sub-make > > # We process the rest of the Makefile if this is the final invocation of make > -ifeq ($(need-sub-make),) > - > -# Do not print "Entering directory ...", > -# but we want to display it when entering to the output directory > -# so that IDEs/editors are able to understand relative filenames. > -MAKEFLAGS += --no-print-directory > > ifeq ($(abs_srctree),$(abs_objtree)) > # building in the source tree > -- > 2.39.2 >