RFR: 8213736: Build fails with LOG=debug on F28 after JDK-8210958

Severin Gehwolf sgehwolf at redhat.com
Wed Nov 14 18:38:23 UTC 2018


Hi Erik,

Thanks for the review!

On Wed, 2018-11-14 at 09:21 -0800, Erik Joelsson wrote:
> 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.

Ugh. Very subtle.

> > 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.

Done: http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8213736/webrev.02/

Thanks,
Severin

> /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