RFR(S): 8184022: Build JDK 10 on OSX 10.12 and above

Tim Bell tim.bell at oracle.com
Fri Jul 14 16:04:53 UTC 2017


I can pick this up and sponsor it, but as Erik wrote, I'll be pushing to 
jdk10/jdk10.

Tim

On 07/14/17 07:02, Erik Joelsson wrote:
> I realized I spoke too soon. I won't be able to sponsor this anytime
> soon as I'm about to leave on vacation now. Hopefully someone else will
> be able to pick this up for you.
>
> /Erik
>
>
> On 2017-07-14 08:53, Erik Joelsson wrote:
>> This looks good to me. Never mind the regexps, they are fine.
>>
>> I can sponsor the change since it touches configure and will need a
>> corresponding closed change. Do you mind if I push this to jdk10/jdk10
>> instead of hs? That way it will get to hs within a week, but also be
>> in jdk10, while going the other way, it will take much longer before
>> it hits jdk10.
>>
>> /Erik
>>
>> On 2017-07-13 19:24, Hohensee, Paul wrote:
>>> New webrev with two-line change to flags.m4 at line 1129.
>>>
>>> http://cr.openjdk.java.net/~phh/8184022/webrev.03/
>>>
>>> “xno” now means “use build system default”, just as if the switch had
>>> not been used.
>>>
>>> I’m a very inexperienced regex user, so I used what worked first for
>>> me. What would it look like to escape the whole expression or
>>> sub-expressions?
>>>
>>> Paul
>>>
>>> On 7/13/17, 10:04 AM, "Erik Joelsson" <erik.joelsson at oracle.com> wrote:
>>>
>>>      This looks pretty good. A few points:
>>>           * Please use $GREP since configure is doing some work on
>>> finding a good
>>>      grep for us. If you want to make the grep patterns more
>>> readable, it's
>>>      possible to put the [] escapes around the whole expression, or
>>> at any
>>>      level you wish. That way you don't need to repeat them for each
>>> [0-9].
>>>      Both styles are used throughout the configure script and I don't
>>> have a
>>>      strong preference myself.
>>>           * The check for "no" got me thinking. If someone explicitly
>>> sets
>>>      --without-macosx-version-max, that probably means they want it
>>> empty.
>>>      The reason for doing so would be to override an earlier instance
>>> of the
>>>      parameter on the command line (set by some script or automatic
>>> system
>>>      that you can't directly influence). This is not a likely usecase
>>> but is
>>>      perhaps a more correct action. Sorry for confusing this earlier.
>>> "yes"
>>>      is definitely an error though.
>>>           I took this patch for a run here and it seems to work as it
>>> should from
>>>      the Oracle point of view.
>>>           /Erik
>>>                On 2017-07-13 17:46, Hohensee, Paul wrote:
>>>      > New webrev
>>>      >
>>>      > http://cr.openjdk.java.net/~phh/8184022/webrev.02/
>>>      >
>>>      > It includes –with-macosx-version-max format checks (disallows
>>> –without-macosx-version-max) and your jib-profiles.js patch. I put
>>> the checking logic in AC_ARG_WITH based on the code in basics.m4 line
>>> 597 that defines BASIC_SETUP_DEVKIT.
>>>      >
>>>      > --with-macosx-version-max will fail the format checks and
>>> –without-macosx-version-max will fail the check against ‘xno’.
>>>      >
>>>      > Paul
>>>      >
>>>      > On 7/12/17, 1:15 AM, "Erik Joelsson"
>>> <erik.joelsson at oracle.com> wrote:
>>>      >
>>>      >      Hello,
>>>      >
>>>      >
>>>      >      On 2017-07-12 03:19, Hohensee, Paul wrote:
>>>      >      > New webrev at
>>>      >      >
>>>      >      > http://cr.openjdk.java.net/~phh/8184022/webrev.01/
>>>      >      For the AC_ARG_WITH, we usually refrain from using the
>>> builtin "if-set,
>>>      >      if-not-set" parameters and define our own logic to handle
>>> all 4
>>>      >      possibilities: not set, --with-foobar=value,
>>> --with-foobar and
>>>      >      --without-foobar. The latter two results in the values
>>> "yes" and "no"
>>>      >      respectively and in this case those two are invalid and
>>> needs to result
>>>      >      in errors. Also since we are expecting a very specific
>>> format on the
>>>      >      input, we need to validate this format so we fail fast
>>> instead of
>>>      >      getting weird compile errors much later.
>>>      >
>>>      >      My understanding of -mmacosx-version-min is that it sets
>>>      >      MAC_OS_X_VERSION_MIN_REQUIRED for you so no need to add
>>> that. OTOH, it
>>>      >      makes it more obvious where this comes from if anyone
>>> stumbles on it in
>>>      >      the source.
>>>      >      > I defined a new shell variable MACOSX_VERSION_MAX which
>>> is settable via a new configure switch
>>> –with-macosx-version-max=<version>. Example use:
>>> --with-macosx-version-max=10.12.00. The specified version is passed
>>> via a compiler command line switch, vis
>>> –DMAC_OS_X_VERSION_MAX_ALLOWED=101200 (de-dotted <version>).
>>>      >      At what point did they introduce the double zeros at the
>>> end? Seems like
>>>      >      we will need guard the values quite carefully and make
>>> sure we zero pad
>>>      >      if needed.
>>>      >      > MACOSX_VERSION_MIN remains hardcoded to 10.7.0, but is
>>> now passed to the compilers via -DMAC_OS_X_VERSION_MIN_REQUIRED=1070
>>> rather than via -DMAC_OS_X_VERSION_MAX_ALLOWED=1070.
>>>      >      >
>>>      >      > Tested by attempting builds on OSX 10.12.04.
>>>      >      >
>>>      >      > (1) no –with-macosx-version-max: succeeds as expected
>>> because no –DMAC_OS_X_VERSION_MAX_ALLOWED passed to compilers, so
>>> defaults to 10.12.04.
>>>      >      > (2) –with-macosx-version-max=10.11.00: fails as
>>> expected due to formal parameter type mismatch.
>>>      >      > (3) –with-macosx-version-max=10.12.00: succeeds as
>>> expected because formal parameter types are the same for all 10.12.xx.
>>>      >      >
>>>      >      > It’d be great if you could try it out.
>>>      >      >
>>>      >      > Note that successful cases (1) and (3) above provoke
>>> three warnings which I haven’t investigated. Imo, I/we can figure out
>>> how to get rid of these next/later.
>>>      >      >
>>>      >      > ld: warning: object file
>>> (/Users/hohensee/workspaces/jdk10-hs/build/macosx-x86_64-normal-server-release/support/native/java.base//libfdlibm.a)
>>> was built for newer OSX version (10.12) than being linked (10.7)
>>>      >      > ld: warning: object file
>>> (/Users/hohensee/workspaces/jdk10-hs/build/macosx-x86_64-normal-server-release/support/native/java.base/libjli_static.a)
>>> was built for newer OSX version (10.12) than being linked (10.7)
>>>      >      > clang: warning: libstdc++ is deprecated; move to libc++
>>> with a minimum deployment target of OS X 10.9 [-Wdeprecated]
>>>      >      I believe the warnings for static libs is simply caused
>>> by not adding
>>>      >      -mmacosx-version-min to the ARFLAGS. Not sure if ar on
>>> mac takes that
>>>      >      flag though.
>>>      >
>>>      >      The libstdc++ warning seems harder to work around until
>>> we change the
>>>      >      minimum to 10.9 instead of 10.7.
>>>      >
>>>      >      I would appreciate if you could also include this patch
>>> as part of this
>>>      >      change to make Oracle builds still behave as before:
>>>      >
>>>      >      diff -r a6c830ee8a67 common/conf/jib-profiles.js
>>>      >      --- a/common/conf/jib-profiles.js
>>>      >      +++ b/common/conf/jib-profiles.js
>>>      >      @@ -436,7 +436,8 @@
>>>      >                    target_os: "macosx",
>>>      >                    target_cpu: "x64",
>>>      >                    dependencies: ["devkit"],
>>>      >      -            configure_args:
>>> concat(common.configure_args_64bit,
>>>      >      "--with-zlib=system"),
>>>      >      +            configure_args:
>>> concat(common.configure_args_64bit,
>>>      >      "--with-zlib=system",
>>>      >      + "--with-macosx-version-max=10.7.0"),
>>>      >                },
>>>      >
>>>      >                "solaris-x64": {
>>>      >
>>>      >
>>>      >      Thanks!
>>>      >      /Erik
>>>      >      > Paul
>>>      >      >
>>>      >      > On 7/11/17, 2:45 AM, "Erik Joelsson"
>>> <erik.joelsson at oracle.com> wrote:
>>>      >      >
>>>      >      >      The -DMAC_OSX_VERSION_MAX_ALLOWED and
>>> -mmacosx-version-min arguments are
>>>      >      >      used in combination to achieve the same thing. I
>>> chose to use both to
>>>      >      >      really enforce full compatibility with the
>>> specified version. The
>>>      >      >      "official" way of targeting earlier versions of
>>> the OS is just using
>>>      >      >      -mmacosx-version-min. This will however still
>>> accept uses of newer APIs,
>>>      >      >      but at link time, those will be linked with
>>> weak_import. Essentially
>>>      >      >      it's expected that your application should be able
>>> to do without these
>>>      >      >      calls if necessary, at the application level.
>>> While better than not
>>>      >      >      being able to launch at all on the older OS, by
>>> adding
>>>      >      >      -DMAC_OSX_VERSION_MAX_ALLOWED, it becomes a
>>> compile time error if any
>>>      >      >      code tries to use a newer API.
>>>      >      >
>>>      >      >      As I see it, either we fully enforce this at build
>>> time, or we don't at
>>>      >      >      all. The natural default is to build for the
>>> current host platform. The
>>>      >      >      configure parameter would make it possible to
>>> enforce a minimal
>>>      >      >      compatible OS version that the binaries must be
>>> usable on.
>>>      >      >
>>>      >      >      (Note that if you propose such a change, I will
>>> need to add the Oracle
>>>      >      >      bit as well, where we use the parameter, which
>>> would need to go in at
>>>      >      >      the same time in common/conf/jib-profiles.js. Also
>>> note that I will be
>>>      >      >      on vacation for 5 weeks starting this weekend so
>>> won't be around to
>>>      >      >      review for most of that time.)
>>>      >      >
>>>      >      >      /Erik
>>>      >      >
>>>      >      >
>>>      >      >      On 2017-07-10 19:48, Hohensee, Paul wrote:
>>>      >      >      > That’s a good idea, though the option would be
>>> --with-macosx-version-max=<n>, right? The minimum is currently
>>> hard-coded and should probably stay that way since there’s likely a
>>> lot of code that depends on it. Let me see what I can come up with.
>>>      >      >      >
>>>      >      >      > Thanks,
>>>      >      >      >
>>>      >      >      > Paul
>>>      >      >      >
>>>      >      >      > On 7/10/17, 10:01 AM, "Erik Joelsson"
>>> <erik.joelsson at oracle.com> wrote:
>>>      >      >      >
>>>      >      >      >
>>>      >      >      >
>>>      >      >      >      On 2017-07-10 18:09, Hohensee, Paul wrote:
>>>      >      >      >      > Hi Erik,
>>>      >      >      >      >
>>>      >      >      >      > The problem is that the compiler doesn’t
>>> issue a warning in this case, but rather a type-mismatch error on
>>> NSEventMask, so I can’t turn it off. NSUInteger was being used as an
>>> enum, so Apple changed to using a real enum in 10.12 as a matter of
>>> code hygiene. The new code in NSApplicationAWT.m is doing the right
>>> thing by checking MAC_OS_X_VERSION_MAX_ALLOWED.
>>>      >      >      >      >
>>>      >      >      >      > What particular problem were you trying
>>> to solve? Production, QA and JPRT builds and test runs are done on
>>> the oldest supported OSX version, so any use of newer features should
>>> be detected very early in the test process. Restricting builds to old
>>> OSX versions means that engineers who keep their development boxes up
>>> to date (which they should: security, etc.) can’t use them to do JDK
>>> development.
>>>      >      >      >      That's not exactly true. Apple is making it
>>> very hard to stay on older
>>>      >      >      >      versions of the OS compared to other OS
>>> vendors. For this reason we are
>>>      >      >      >      not always able to stay on a particular
>>> version for Macosx in
>>>      >      >      >      particular. We also in general try to avoid
>>> having to fill our build
>>>      >      >      >      servers/environments with just the oldest
>>> OSes, because older OSes are
>>>      >      >      >      harder to maintain and less convenient to
>>> work with. So instead, we try
>>>      >      >      >      to maintain working build environments on
>>> newer OSes that produce
>>>      >      >      >      binaries that are compatible with the
>>> oldest we support. So, at least
>>>      >      >      >      from Oracle's perspective, we prefer if
>>> builds on different OS versions
>>>      >      >      >      produce equivalent binaries when possible.
>>> We certainly don't want to
>>>      >      >      >      prevent building on newer OS/compilers.
>>>      >      >      >
>>>      >      >      >      If this can't be worked around at the
>>> source level, then perhaps we need
>>>      >      >      >      to consider hiding this macro definition
>>> behind a configure option that
>>>      >      >      >      we can use internally. I would be open to
>>> that. Something like
>>>      >      >      > --with-macosx-version-min=10.7 which configure
>>> could then translate to
>>>      >      >      >      the combination of options currently used.
>>> That way, most openjdk
>>>      >      >      >      developers/builders would not need to
>>> suffer this Oracle requirement.
>>>      >      >      >
>>>      >      >      >      /Erik
>>>      >      >      >      > Thanks,
>>>      >      >      >      >
>>>      >      >      >      > Paul
>>>      >      >      >      >
>>>      >      >      >      > On 7/10/17, 1:10 AM, "Erik Joelsson"
>>> <erik.joelsson at oracle.com> wrote:
>>>      >      >      >      >
>>>      >      >      >      >      Hello,
>>>      >      >      >      >
>>>      >      >      >      >      I do not agree to removing that
>>> macro. I added those options to help
>>>      >      >      >      >      guarantee that a build made on a
>>> newer version of macosx would still run
>>>      >      >      >      >      on the oldest version currently
>>> supported. The macro is not mainly meant
>>>      >      >      >      >      to be used in our code, but is
>>> picked up by system headers to cause an
>>>      >      >      >      >      error if any features newer than
>>> 10.7 are used. It may be that we should
>>>      >      >      >      >      bump it to a newer version of macosx
>>> in JDK 10, but certainly not to 10.12.
>>>      >      >      >      >
>>>      >      >      >      >      It seems to me that we instead need
>>> to ignore the particular warning for
>>>      >      >      >      >      this case.
>>>      >      >      >      >
>>>      >      >      >      >      /Erik
>>>      >      >      >      >
>>>      >      >      >      >
>>>      >      >      >      >      On 2017-07-09 15:26, Hohensee, Paul
>>> wrote:
>>>      >      >      >      >      > Please review the following change
>>> to get JDK10 to build on OSX 10.12 and above.
>>>      >      >      >      >      >
>>>      >      >      >      >      >
>>> https://bugs.openjdk.java.net/browse/JDK-8184022
>>>      >      >      >      >      >
>>> http://cr.openjdk.java.net/~phh/8184022/webrev.00/
>>>      >      >      >      >      >
>>>      >      >      >      >      > I’d very much appreciate a sponsor
>>> for this fix. Imo, successful JDK10 builds on all supported platforms
>>> would be sufficient testing, but please let me know what I can do to
>>> help.
>>>      >      >      >      >      >
>>>      >      >      >      >      > Slightly revised from the RFE:
>>>      >      >      >      >      >
>>>      >      >      >      >      >
>>> JDK-8182299<https://bugs.openjdk.java.net/browse/JDK-8182299> enabled
>>> previously disabled clang warnings and was intended to also enable
>>> builds on OSX 10 + Xcode 8. Due to a mixup, this code in
>>> jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m
>>>      >      >      >      >      >
>>>      >      >      >      >      >    #if
>>> defined(MAC_OS_X_VERSION_10_12) && \
>>>      >      >      >      >      > MAC_OS_X_VERSION_MAX_ALLOWED >=
>>> MAC_OS_X_VERSION_10_12 && \
>>>      >      >      >      >      >       __LP64__
>>>      >      >      >      >      >       / 10.12 changed `mask` to
>>> NSEventMask (unsigned long long) for x86_64 builds.
>>>      >      >      >      >      >    - (NSEvent
>>> *)nextEventMatchingMask:(NSEventMask)mask
>>>      >      >      >      >      >    #else
>>>      >      >      >      >      >    - (NSEvent
>>> *)nextEventMatchingMask:(NSUInteger)mask
>>>      >      >      >      >      >    #endif
>>>      >      >      >      >      > untilDate:(NSDate *)expiration
>>> inMode:(NSString *)mode dequeue:(BOOL)deqFlag {
>>>      >      >      >      >      >
>>>      >      >      >      >      > works fine with OSX versions
>>> earlier than 10.12, but fails to compile starting with OSX 10.12 due
>>> to MAC_OSX_VERSION_MAX_ALLOWED being defined on the compile command
>>> line as 10.7.
>>>      >      >      >      >      >
>>>      >      >      >      >      > The fix is to remove that
>>> definition, since it places an artificial upper bound on the OSX
>>> version under which JDK10 can be built. A source code search reveals
>>> no uses of MAC_OSX_VERSION_MAX_ALLOWED other than in
>>> NSApplicationAWT.m and hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp.
>>> The latter won't be affected by this change, since it checks for a
>>> version > 10.5, which is always true in JDK10.
>>>      >      >      >      >      >
>>>      >      >      >      >      > Thanks,
>>>      >      >      >      >      >
>>>      >      >      >      >      > Paul
>>>      >      >      >      >      >
>>>      >      >      >      >
>>>      >      >      >      >
>>>      >      >      >      >
>>>      >      >      >
>>>      >      >      >
>>>      >      >      >
>>>      >      >
>>>      >      >
>>>      >      >
>>>      >
>>>      >
>>>      >
>>>
>>
>




More information about the build-dev mailing list