Fail to cross compiling jdk12 for mips64el-linux-gnu target

Ao Qi aoqi at loongson.cn
Mon Jan 28 08:25:23 UTC 2019


Hi Magnus,

On Fri, Jan 25, 2019 at 10:18 PM Magnus Ihse Bursie
<magnus.ihse.bursie at oracle.com> wrote:
>
> On 2019-01-25 02:47, Leslie Zhai wrote:
> > Hi Magnus,
> >
> > Failed to make images:
> >
> > $ make images CONF=mips
> > Building target 'images' in configuration
> > 'linux-mips64el-normal-server-fastdebug'
> > GenerateLinkOptData.gmk:61: recipe for target
> > '/home/loongson/zhaixiang/jdk12-mips/build/linux-mips64el-normal-server-fastdebug/support/link_opt/classlist'
> > failed
> > make[3]: ***
> > [/home/loongson/zhaixiang/jdk12-mips/build/linux-mips64el-normal-server-fastdebug/support/link_opt/classlist]
> > Error 1
> > make[3]: *** Deleting file
> > '/home/loongson/zhaixiang/jdk12-mips/build/linux-mips64el-normal-server-fastdebug/support/link_opt/classlist'
> > make/Main.gmk:441: recipe for target 'generate-link-opt-data' failed
> > make[2]: *** [generate-link-opt-data] Error 2
>
> This should have worked, but sounds like something that can typically
> fail when cross-compiling. As a workaround, disable class list
> generation: "configure --disable-generate-classlist", or even "configure
> --disable-cds".
>

I tried mips zero of http://hg.openjdk.java.net/jdk/jdk using your
approach of buildjdk [1]. "make images" succeeded and javac (to test
open a file) worked on a mips machine. I tried the same approach to
build our jdk-mips, it failed. Then I used "configure
--disable-generate-classlist --disable-cds ...", "make images"
succeeded and javac worked on a mips machine. I think your approach
solved our problem! Thanks a lot, Magnus!

Cheers,
Ao Qi

[1] https://mail.openjdk.java.net/pipermail/build-dev/2019-January/024735.html


> /Magnus
> >
> > ERROR: Build failed for target 'images' in configuration
> > 'linux-mips64el-normal-server-fastdebug' (exit code 2)
> >
> > === Make failed targets repeated here ===
> > GenerateLinkOptData.gmk:61: recipe for target
> > '/home/loongson/zhaixiang/jdk12-mips/build/linux-mips64el-normal-server-fastdebug/support/link_opt/classlist'
> > failed
> > make/Main.gmk:441: recipe for target 'generate-link-opt-data' failed
> > === End of repeated output ===
> >
> > Hint: Try searching the build log for the name of the first failed
> > target.
> > Hint: See doc/building.html#troubleshooting for assistance.
> >
> > /home/loongson/zhaixiang/jdk12-mips/make/Init.gmk:300: recipe for
> > target 'main' failed
> > make[1]: *** [main] Error 2
> > /home/loongson/zhaixiang/jdk12-mips/make/Init.gmk:186: recipe for
> > target 'images' failed
> > make: *** [images] Error 2
> >
> > ----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< ---
> >
> > My cross-compile configure option:
> >
> > CC=mips64el-linux-gnuabi64-gcc CXX=mips64el-linux-gnuabi64-g++ sh
> > ./configure \
> >   --openjdk-target=mips64el-linux-gnuabi64 \
> >   --with-sysroot=/chroots/mips64el_stretch \
> >   --with-toolchain-path=/chroots/mips64el_stretch \
> >   --with-boot-jdk=/home/loongson/aoqi/jdk-11.0.1 \
> >   --disable-warnings-as-errors \
> > --with-freetype-lib=/chroots/mips64el_stretch/usr/lib/mips64el-linux-gnuabi64
> > \
> > --with-freetype-include=/chroots/mips64el_stretch/usr/include/freetype2 \
> >   --with-debug-level=fastdebug \
> >   --with-build-jdk=build/buildjdk/jdk
> >
> > ----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< ---
> >
> > buildjdk is OK:
> >
> > $ sh configure --with-conf-name=buildjdk
> > --with-boot-jdk=/home/loongson/aoqi/jdk-11.0.1
> > --disable-warnings-as-errors
> >
> > $ make jdk CONF=buildjdk
> >
> > Building target 'jdk' in configuration 'buildjdk'
> > Finished building target 'jdk' in configuration 'buildjdk'
> >
> > Regards,
> >
> > Leslie Zhai
> >
> >
> > 在 2019/1/24 下午9:30, Magnus Ihse Bursie 写道:
> >> On 2019-01-24 13:22, Leslie Zhai wrote:
> >>> Hi Magnus,
> >>>
> >>> Thanks for your kind response!
> >>>
> >>> 在 2019/1/24 下午8:05, Magnus Ihse Bursie 写道:
> >>>>
> >>>>
> >>>> On 2019-01-24 05:45, David Holmes wrote:
> >>>>> On 24/01/2019 1:51 pm, Ao Qi wrote:
> >>>>>> Hi David,
> >>>>>>
> >>>>>> On Thu, Jan 24, 2019 at 10:47 AM David Holmes
> >>>>>> <david.holmes at oracle.com> wrote:
> >>>>>>>
> >>>>>>> Hi Leslie,
> >>>>>>>
> >>>>>>> I'm not Erik :) however ....
> >>>>>>>
> >>>>>>> On 24/01/2019 12:28 pm, Leslie Zhai wrote:
> >>>>>>>> Hi Erik,
> >>>>>>>>
> >>>>>>>> Because the flags' macro of MIPS is different from other
> >>>>>>>> targets[1], it
> >>>>>>>> will effect the `UnixConstants` of
> >>>>>>>> src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template,
> >>>>>>>> for
> >>>>>>>> example, PREFIX_O_APPEND, so the `Flags` in `FileChannel` is
> >>>>>>>> different
> >>>>>>>> from other targets.  Then failed[2] to cross compiling jdk12 for
> >>>>>>>> mips64el-linux-gnu target by following the document[3].
> >>>>>>>
> >>>>>>> It's been quite a while since we built for a platform where the
> >>>>>>> flags
> >>>>>>> had different values, but it is supposed to work. I suspect that
> >>>>>>> the way
> >>>>>>> we build now with the module system may not be quite correct in
> >>>>>>> this
> >>>>>>> regard - but that is just supposition on my part. Because
> >>>>>>> compile-time
> >>>>>>> constants are stored directly into class files that use them, we
> >>>>>>> have to
> >>>>>>> generate UnixConstants.java before compiling any class that
> >>>>>>> needs to use
> >>>>>>> it, then we must compile all classes that do use it. Those
> >>>>>>> classes must
> >>>>>>> only be executed in conjunction with a tool executing on the target
> >>>>>>> platform (javac, jmod etc). My suspicion is that we may be
> >>>>>>> executing a
> >>>>>>> tool on the build platform using the newly compiled classes for the
> >>>>>>> target platform - and that would be wrong.
> >>>>>>>
> >>>>>>
> >>>>>> Yes. Some variables in UnixConstants.java is defined according to
> >>>>>> the
> >>>>>> target (fcntl.h of mips in this case), but would be executed on host
> >>>>>> (x86 in this case) during "make images". These variables of ppc64le,
> >>>>>> aarch64 and s390x are the same as x86, but the ones of mips are not.
> >>>>>> However, mips is not an official supported target and I did not find
> >>>>>> other targets have similar issue, I am not sure if this is a bug
> >>>>>> or if
> >>>>>> this is the right mailing list :)
> >>>>>
> >>>>> This is the right mailing list to discuss. :)
> >>>>>
> >>>>> So I went back to find when this happened in the past and I
> >>>>> mis-remembered how we solved it. We previously had a problem with
> >>>>> the Oracle Java SE Embedded PPC port where some Linux PPC-e500v2
> >>>>> platforms defined a different value for the O_NOFOLLOW and
> >>>>> O_DIRECT flags. The solution then was to commit a platform
> >>>>> specific version of UnixConstants.java and change the build system
> >>>>> to only use the template file if there was not a pre-existing
> >>>>> .java file. But that platform and the SE Embedded support was all
> >>>>> removed. (SocketOptions.java had a similar problem.) Further that
> >>>>> build logic is completely different to what we had back then (JDK
> >>>>> 6/7).
> >>>>>
> >>>>> This is definitely a bug in our build logic IMHO as we
> >>>>> specifically use the build platform c-pre-processor to process the
> >>>>> template file based on the target header files, but then use the
> >>>>> resulting class when running tools on the build platform.
> >>>> I agree with David. This is a bug in the build system; arguably
> >>>> even a regression.
> >>>>
> >>>>> This was not something that happened in 6/7 or even 8 and I think
> >>>>> the module system tools are where the issue now lies.
> >>>>>
> >>>>> I think Erik and/or Magnus will have to give advice on how this
> >>>>> may be properly fixed. I can't see any simple solution.
> >>>> Unfortunately, I also agree that there is no simple solution. :-(
> >>>>
> >>>> The proper way to handle this is to generate two versions of
> >>>> UnixConstants and friends, one for the build platform, and one for
> >>>> the target platform. But as far as I know, there is no simple way
> >>>> to handle such complications in our current structure. Erik knows
> >>>> more about this, he was the one who designed the current solution
> >>>> for handling cross-compilation in the modularized world.
> >>>>
> >>>> However, I can at least help you with a relatively simple
> >>>> workaround. First some background: When we cross-compile, we need
> >>>> not only a Boot JDK (of version current N-1) running on the build
> >>>> host platform, but we also need a Build JDK, based on the current
> >>>> source code, running on the build host. (This is for running
> >>>> jmod/jlink; it needs to be up to date). If we have no Build JDK
> >>>> present, we start by creating one ourselves. This is more or less
> >>>> the same output as running a normal, non-cross compiled, build on
> >>>> the build host. (But Erik found some ways to cut a few corners to
> >>>> save time.) Your problem is that the Build JDK is broken, since
> >>>> UnixConstants has the wrong values.
> >>>> -
> >>>> But you can supply your own working Build JDK to configure!
> >>>>
> >>>> So, your workflow for cross-compiling to MIPS should be:
> >>>> 1) create a Build JDK, e.g. like this: "bash configure
> >>>> --with-conf-name=buildjdk && make jdk CONF=buildjdk"
> >>>> 2) create your cross-compilation JDK like this: "bash configure
> >>>> --openjdk-target=mipsel-unknown-linux-gnu
> >>>> --with-build-jdk=build/buildjdk/jdk"
> >>>> ... or something like that.
> >>>> Then you can build your cross-compiled jdk with "make images
> >>>> CONF=mips".
> >>>
> >>> I will try that, thanks a lot for your teaching!
> >> Please let me know if it works. I wrote the command lines out of my
> >> head, so they might need some tweaking to get right.
> >>
> >> Perhaps this is an acceptable solution to you? Unless Erik can
> >> suggest ways to fix this properly that is not too complicated, maybe
> >> this can be a good enough solution for you? (But if there is a simple
> >> solution, I'd rather have it fixed properly.)
> >>
> >> /Magnus
> >>>
> >>> Regards,
> >>>
> >>> Leslie Zhai
> >>>
> >>>
> >>>>
> >>>>
> >>>> In theory, you should rebuild your buildjdk for each and every
> >>>> change ("make jdk CONF=buildjdk && make images CONF=mips"); but in
> >>>> reality, I don't believe there is really any need to rebuild the
> >>>> buildjdk (unless major changes in jlink/jmod happens).
> >>>>
> >>>> /Magnus
> >>>>>
> >>>>> David
> >>>>> -----
> >>>>>
> >>>>>>   For example:
> >>>>>>
> >>>>>> jdk/build$ find . -name UnixConstants.java | xargs grep -A2 O_APPEND
> >>>>>> ./linux-ppc64le-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-ppc64le-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-ppc64le-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       02000
> >>>>>> --
> >>>>>> ./linux-x86_64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-x86_64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-x86_64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       02000
> >>>>>> --
> >>>>>> ./linux-s390x-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-s390x-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-s390x-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       02000
> >>>>>> --
> >>>>>> ./linux-aarch64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-aarch64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-aarch64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       02000
> >>>>>> --
> >>>>>> ./linux-x86_64-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-x86_64-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-x86_64-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       02000
> >>>>>> --
> >>>>>> ./linux-mips64el-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-mips64el-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-mips64el-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       0x0008
> >>>>>> --
> >>>>>> ./linux-ppc64le-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>>
> >>>>>>     static final int O_APPEND =
> >>>>>> ./linux-ppc64le-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>> ./linux-ppc64le-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>>
> >>>>>>                                       02000
> >>>>>>
> >>>>>> log.mips:2of path:
> >>>>>> /home/loongson/aoqi/jdk-mips/build/linux-mips64el-normal-server-release/support/interim-jmods/temp/.java.base.jmod.tmp
> >>>>>>
> >>>>>> oflags: 769 O_TRUNC:512 O_APPEND:8 O_CREAT:256 O_EXCL:1024
> >>>>>> log.ppc:2of path:
> >>>>>> /home/loongson/aoqi/jdk-mips/build/linux-ppc64le-normal-server-release/support/interim-jmods/temp/.java.base.jmod.tmp
> >>>>>>
> >>>>>> oflags: 577 O_TRUNC:512 O_APPEND:1024 O_CREAT:64 O_EXCL:128
> >>>>>>
> >>>>>> Cheers,
> >>>>>> Ao Qi
> >>>>>>
> >>>>
> >>>
> >>
> >
>



More information about the build-dev mailing list