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

Leslie Zhai zhaixiang at loongson.cn
Fri Jan 25 01:47:12 UTC 2019


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

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