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

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Thu Jan 24 12:05:47 UTC 2019



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

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