RFR: JDK-8217739: Cannot reuse java.base UnixConstants.java from target in BuildJDK when cross compiling
Erik Joelsson
erik.joelsson at oracle.com
Wed Jun 5 20:46:52 UTC 2019
Here is a new webrev: http://cr.openjdk.java.net/~erikj/8217739/webrev.03
The change is in buildjdk-spec.gmk.in where CPP is now also overridden.
/Erik
On 2019-06-05 10:33, Erik Joelsson wrote:
> Never mind, I found the issue. The reason it worked for me was that we
> set SYSROOT_CFLAGS for both the target and the build compiler (from
> using devkits for them). The preprocessor for the target would then
> act correctly given the --sysroot parameter pointing to a sysroot for
> the build system.
>
> I'm working on a patch where PPC gets overridden with the build
> compiler in buildjdk-spec.gmk.
>
> /Erik
>
> On 2019-06-05 08:37, Erik Joelsson wrote:
>> Hello Ao Qi,
>>
>> In my testing, I tried building ppc64le (which I first identified as
>> generating a UnixConstants.java that differed from an x64 build).
>> With this patch, the buildjdk and target version of
>> UnixConstants.java differ the same way. How did you configure your
>> build? I'm suspecting something in the setup of the buildjdk
>> compilers is different from my configuration.
>>
>> /Erik
>>
>> On 2019-06-04 21:48, Ao Qi wrote:
>>> Hi Erik,
>>>
>>> Thank you a lot for taking care of this. I mainly like your approach.
>>> I tested the patch by cross building mips64-zero, by which we found
>>> this problem. However, it seems the problem still exists. The reason I
>>> found is that UnixConstants.java of buildjdk is generated by cross
>>> compiler, so the macro definitions are defined by the target. Here is
>>> a preliminary workaround for your reference only (only worked for
>>> gcc):
>>>
>>> $ hg diff make/gensrc/GensrcMisc.gmk
>>> diff -r f4df9d4201cc make/gensrc/GensrcMisc.gmk
>>> --- a/make/gensrc/GensrcMisc.gmk Tue Jun 04 16:50:25 2019 -0700
>>> +++ b/make/gensrc/GensrcMisc.gmk Wed Jun 05 12:39:43 2019 +0800
>>> @@ -61,6 +61,13 @@
>>> CPP_FLAGS += -nologo
>>> endif
>>>
>>> +ifeq ($(CREATING_BUILDJDK), true)
>>> + # Only worked for gcc
>>> + TEMP_CPP=gcc -E
>>> +else
>>> + TEMP_CPP=$(CPP)
>>> +endif
>>> +
>>> # Generate a java source file from a template through the C
>>> preprocessor for the
>>> # target system. First extract the copyright notice at the start
>>> of the file.
>>> # Run the preprocessor. Filter out the default compiler stderr
>>> output on
>>> @@ -71,7 +78,7 @@
>>> define generate-preproc-src
>>> $(call MakeDir, $(@D))
>>> ( $(NAWK) '/@@END_COPYRIGHT@@/{exit}1' $< && \
>>> - $(CPP) $(CPP_FLAGS) $(SYSROOT_CFLAGS) $(CFLAGS_JDKLIB) $< \
>>> + $(TEMP_CPP) $(CPP_FLAGS) $(SYSROOT_CFLAGS) $(CFLAGS_JDKLIB) $< \
>>> 2> >($(GREP) -v '^$(<F)$$' >&2) \
>>> | $(NAWK) '/@@START_HERE@@/,0' \
>>> | $(SED) -e 's/@@START_HERE@@/\/\/ AUTOMATICALLY GENERATED
>>> FILE - DO NOT EDIT/' \
>>>
>>>
>>> Cheers,
>>> Ao Qi
>>>
>>> On Wed, Jun 5, 2019 at 12:00 AM Erik Joelsson
>>> <erik.joelsson at oracle.com> wrote:
>>>> Thanks!
>>>>
>>>> During testing, I found an intermittent race issue. The command line
>>>> that runs the interim langtools version of javac still always
>>>> points to
>>>> the buildtools/interim-langtools dir of the normal build. This
>>>> variable
>>>> also needs to be rewritten in buildjdk-spec.gmk.in. New webrev, only
>>>> changed in buildjdk-spec.gmk.in:
>>>>
>>>> http://cr.openjdk.java.net/~erikj/8217739/webrev.02/
>>>>
>>>> /Erik
>>>>
>>>> On 2019-06-04 07:53, Tim Bell wrote:
>>>>> Erik:
>>>>>
>>>>> Looks good.
>>>>>
>>>>> Tim
>>>>>
>>>>>> This is a fix for a problem brought up on this list [1]. The main
>>>>>> issue
>>>>>> is that when cross compiling, and creating a buildjdk during the
>>>>>> build,
>>>>>> the UnixConstants.java cannot necessarily be reused between the
>>>>>> target
>>>>>> JDK and the buildjdk. While investigating this, I came to the
>>>>>> conclusion
>>>>>> that we really should stop trying to reuse anything between the
>>>>>> buildjdk
>>>>>> and target JDK. It's just becoming too complex to maintain (due
>>>>>> to the
>>>>>> intricate interactions with the interim-image,
>>>>>> generate-link-opt-data
>>>>>> and exploded-image-optimize targets, causing circular
>>>>>> dependencies and
>>>>>> endless incremental rebuilds).
>>>>>>
>>>>>> So this fix simply removes all the reuse of buildtools, gensrc
>>>>>> and java
>>>>>> compilation when creating a buildjdk. Hopefully this is making
>>>>>> Main.gmk
>>>>>> a bit less convoluted.
>>>>>>
>>>>>> While working on this, I came up with the idea of adding a log
>>>>>> prefix
>>>>>> functionality, to more easily discern which log lines were
>>>>>> printed by
>>>>>> the buildjdk build and which were part of the normal build. I
>>>>>> liked this
>>>>>> a lot so including that in the same fix, and applied it to the
>>>>>> bootcycle
>>>>>> build as well.
>>>>>>
>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8217739
>>>>>>
>>>>>> Webrev:
>>>>>> http://cr.openjdk.java.net/~erikj/8217739/webrev.01/index.html
>>>>>>
>>>>>> /Erik
>>>>>>
>>>>>> [1]
>>>>>> http://mail.openjdk.java.net/pipermail/build-dev/2019-January/024729.html
>>>>>>
>>>>>>
>>>>>
>>>>>
More information about the build-dev
mailing list