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

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Thu Jan 24 13:30:53 UTC 2019


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