RFR: 8213736: Build fails with LOG=debug on F28 after JDK-8210958
Erik Joelsson
erik.joelsson at oracle.com
Wed Nov 14 17:21:53 UTC 2018
Hello,
On 2018-11-14 03:27, Severin Gehwolf wrote:
> Hi,
>
> Thanks for Erik Joelsson for contributing this temporary?! fix for a
> build issue with LOG=debug.
>
> The actual issue is that on some systems with make 4.x when building
> with LOG=debug MAKE_TEST_TARGETS receives debug output from the
> shell'ed make invocation. This in turn changes ALL_NAMED_TESTS which is
> iterated over in Main.gmk so as to produce test-<name> targets. This
> fails for some of the supposed test names of: "gmake[1]:", "Leaving",
> "directory" or "'<top-dir-path>'". All of them are bogus.
>
> In other words, MAKE_TEST_TARGETS gets value:
>
> make-base java-compilation copy-files idea compile-commands gmake[1]: Leaving directory '<top-dir-path>'
>
> instead of:
>
> make-base java-compilation copy-files idea compile-commands
>
> This only happens the second time TestMake.gmk's print-targets is
> executed. Why is it executed (at least) twice? The chain is something
> like this:
>
> Init.gmk => InitSupport.gmk (include) => Main.gmk (create-main-targets-include)
> => FindTests.gmk (include) => TestMake.gmk (print-targets)
> => Modules.gmk (include) => ??? => FindTests.gmk (include) => TestMake.gmk (print-targets)
What happens here is that Modules.gmk does a -include on a generated
file (module-deps.gmk), that has a rule for generating it in the same
makefile. Make will check if this file is up to date, if not it will get
generated and then make will restart the current top level makefile from
the top. It seems like make will continue to evaluate the rest of the
current makefile before running the rule however, which is why it
continues down in FindTests.gmk one time, then runs the rule for
module-deps.gmk, then restarts Main.gmk. It's only on the second go
through Main.gmk that the $(shell $(MAKE) -f TestMake.gmk ...)
invocation fails. This is the part that really baffles me.
> As to where Modules.gmk depends on FindTests.gmk (or includes it) is a
> mystery to me.
>
> The proposed fix is to add --no-print-directory flag to the main make
> invocation (Main.gmk).
In my testing it doesn't matter at all what arguments we give make in
the $(shell $(MAKE) -f TestMake.gmk ...) call. What matters is the
makeflags active in the parent process, which is why adding
--no-print-directory in Init.gmk helps. Normally, when running with
LOG=info/warn, we have -s in all make calls, which also implies
--no-print-directory. That is why this only happens for LOG=debug/trace.
I think this fix is good enough for now, but perhaps we should consider
always running with --no-print-directory even in debug/trace? The
directory we run in isn't really relevant considering how we have
organized our makefiles. That info is basically assuming a normal
recursive makefile structure with a makefile in each src dir. We
basically run everything from the top level make dir.
We could also reconsider the communications model of the targets in
FindTests.gmk and avoid the $(shell $(MAKE)) call.
Regarding the patch, I think we need to add a comment explaining it.
Something like:
# The --no-print-directory is needed to make the call from FindTest.gmk
to Test.gmk work
# with LOG=debug/trace.
/Erik
> Bug: https://bugs.openjdk.java.net/browse/JDK-8213736
> webrev: http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8213736/webrev.01/
>
> This allows me to build with LOG=debug again.
>
> Thoughts?
>
> Thanks,
> Severin
>
More information about the build-dev
mailing list