RFR: JDK-8159047: Disable redundant build steps when creating buildjdk

David Holmes david.holmes at oracle.com
Thu Jun 9 00:54:15 UTC 2016


Hi Erik,

This seems good. Though it does seem to me that whole BUILJDK things is 
rather complex!

Great to see that truncated classfile problem tracked down though!

Thanks,
David

On 8/06/2016 10:01 PM, Erik Joelsson wrote:
> Hello,
>
> When creating the buildjdk (when cross compiling), the idea is to only
> rebuild the parts that actually need to be rebuilt for the build
> platform and reuse as much as possible from the normal build. Currently,
> the interim-langtools step is rebuilt when it shouldn't be.
>
> The reason interim-langtools gets rebuilt is that the gensrc steps for
> those modules get rebuilt. They in turn get rebuilt because the buildjdk
> redefines the support outputdir, so for the buildjdk makefiles, it looks
> like the gensrc steps for those modules have not happened. The
> buildtools outputdir is not redefined however, so when the
> interim-langtools get rebuilt, it overwrites the old build of it.
>
> While this is bad from an efficiency standpoint, it also causes
> intermittent failures due to a race. When building the test lib, the
> compilation of the test lib may happen at the same time as the
> interim-langtools being rebuilt for the buildjdk. This means that the
> class files being run for the interim javac compiler can be overwritten
> while they are running. The failure can look like this:
>
> BuildTestLib.gmk:49: recipe for target
> '/scratch/opt/jprt/T/P1/220139.ssteuck/s/build/linux-arm64/support/test/lib/test-lib_classes/_the.BUILD_TEST_LIB_JAR_batch'
> failed
> make[3]: Leaving directory
> '/scratch/opt/jprt/T/P1/220139.ssteuck/s/make/test'
> make/Main.gmk:413: recipe for target 'build-test-lib' failed
> Exception in thread "main" java.lang.ClassFormatError: Truncated class file
>     at com.sun.tools.javac.main.CommandLine.parse(CommandLine.java:58)
>     at
> com.sun.tools.sjavac.options.OptionHelper.traverse(OptionHelper.java:121)
>     at com.sun.tools.sjavac.options.Options.parseArgs(Options.java:187)
>     at com.sun.tools.sjavac.client.ClientMain.run(ClientMain.java:60)
>     at com.sun.tools.sjavac.client.ClientMain.run(ClientMain.java:49)
>     at com.sun.tools.sjavac.Main.go(Main.java:56)
>     at com.sun.tools.sjavac.Main.main(Main.java:46)
> make[3]: ***
> [/scratch/opt/jprt/T/P1/220139.ssteuck/s/build/linux-arm64/support/test/lib/test-lib_classes/_the.BUILD_TEST_LIB_JAR_batch]
> Error 1
> make[2]: *** [build-test-lib] Error 1
>
>
> My proposed fix for this problem is to add more guards in make/Main.gmk
> that disables the interim and gensrc targets completely when the
> buildjdk is being built.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8159047
> Webrev: http://cr.openjdk.java.net/~erikj/8159047/webrev.01/
>
> /Erik



More information about the build-dev mailing list