Hello,

On 2020-05-26 08:00, Magnus Ihse Bursie wrote:
On 26/05/2020 11:14 pm, Fedor wrote:
Hello all!

I've tried to crossbuild jdk using current http://hg.openjdk.java.net/jdk/jdk/ sources and noticed that build requires write permissions to bootstrap jdk.

Your patch seems to be doing the right thing. I would just like to have Claes verify that the JVM options you are setting are actually having the desired effect. We really shouldn't be putting any files in the INTERIM_IMAGE_DIR as that can possibly be located outside the build directory. Only thing I would want to change is the suffix for the file you call $@.classlist, since $@ is already named "classlist", I would prefer something like $@.tmp or $@.interim, to signal that this is the interim result between the two generation steps.

Then just to clarify, it's not the BOOT_JDK, but the BUILD_JDK, which is a different concept. This can get tricky so it's important to keep the definitions correct. The BOOT_JDK, which is required to be of version N-1, or possibly N, is used to build a bootstrap version of the javac compiler, which we can then run on the BOOT_JDK to compiler the JDK N java code. We also use it to run most build tools in the build.

The BUILD_JDK is a concept introduced for cross compiling. In a native build, certain build steps are required to be performed with the newly built JDK. This includes running jmod and jlink as well as generating data used to optimize the JDK image in the jlink step (which is where you are seeing this issue). For a native build, the BUILD_JDK is simply the exploded image jdk we just built. When cross compiling, the default behavior is to just also build enough of the native parts of the JDK for the build platform and use that. You may also supply a BUILD_JDK when configuring a cross compilation build. When doing so you must ensure that it's built from the exact same sources as the JDK you are cross compiling, otherwise results are unpredictable.

In our internal build setups, we don't use the external BUILD_JDK feature, which is why we have not run into the problem you are reporting here.

/Erik

The problem is it tries to write/rewrite class list into bootstrap jdk directory.

No, it should write to the INTERIM_IMAGE_DIR.

However, I now see that we replace INTERIM_IMAGE_DIR with BUILD_JDK in GenerateLinkOptData.gmk if we have an external build-jdk. I assume that is how you have configured. I also assume you are not cross-compiling.

I'm not entirely sure about the thinking here. I can't say for certain that we really should run HelloClasslist if we have an external build-jdk. I think I need Erik or Claes to chime in.

/Magnus


I would like to suggest the fix below to solve this problem:


diff --git a/make/GenerateLinkOptData.gmk b/make/GenerateLinkOptData.gmk
--- a/make/GenerateLinkOptData.gmk
+++ b/make/GenerateLinkOptData.gmk
@@ -69,10 +69,10 @@
             -Duser.language=en -Duser.country=US \
             -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \
             build.tools.classlist.HelloClasslist $(LOG_DEBUG)
-       $(GREP) -v HelloClasslist $@.raw > $(INTERIM_IMAGE_DIR)/lib/classlist
-       $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -Xshare:dump \
+       $(GREP) -v HelloClasslist $@.raw > $@.classlist
+       $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -Xshare:dump -XX:SharedClassListFile=$@.classlist -XX:SharedArchiveFile=$@.jsa \
             -Xmx128M -Xms128M $(LOG_INFO)
-       $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw \ +       $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw -XX:SharedClassListFile=$@.classlist -XX:SharedArchiveFile=$@.jsa \
-Djava.lang.invoke.MethodHandle.TRACE_RESOLVE=true \
             -Duser.language=en -Duser.country=US \
             --module-path $(SUPPORT_OUTPUTDIR)/classlist.jar \

Please correct me in case if it is wrong alias, or I need to file bug first, or something else.

Best Regards,
Fedor


Reply via email to