Building OpenJDK9 on MSYS2

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Tue Oct 3 23:04:44 UTC 2017


Actually, it wasn't so much remaining trouble. :-) I fired up msys2 and 
checked out where I left off. It turned out that the remaining snag was 
that msys2 tries to convert command lines automatically, from "unix" 
style paths to "windows" style paths. Unfortunately, it does not do this 
very well and it breaks all sorts of things. We already have a FIXPATH 
solution in place which deals with this, so basically all I had to do 
was disable this (by setting MSYS2_ARG_CONV_EXCL to "*"). However, this 
broke our cygpath replacement hack (!) so I had to disable it there. 
Sigh. Anyway, with those fixes it ran and worked well. (I also 
discovered and fixed a bug related to how we set up the FIXPATH variable 
on msys, but it only triggers in certain circumstances).

With this patch I now jdk9 seems to build fine on msys2. It should apply 
cleanly on jdk9/jdk9. Since it turned out to be so trivial, I'll try to 
get it in in jdk10.

Here's the patch if you want to apply it yourself:

diff -r a08cbfc0e4ec common/autoconf/basics_windows.m4
--- a/common/autoconf/basics_windows.m4    Thu Aug 03 18:56:56 2017 +0000
+++ b/common/autoconf/basics_windows.m4    Wed Oct 04 00:53:58 2017 +0200
@@ -42,7 +42,7 @@
      windows_path=`$CYGPATH -m "$unix_path"`
      $1="$windows_path"
    elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
-    windows_path=`cmd //c echo $unix_path`
+    windows_path=`MSYS2_ARG_CONV_EXCL= cmd //c echo $unix_path`
      $1="$windows_path"
    fi
  ])
@@ -136,6 +136,16 @@
    fi
  ])

+AC_DEFUN([BASIC_MSYS_UPDATE_FIXPATH],
+[
+  # Take all collected prefixes and turn them into a 
-m/c/foo@/c/bar at ... command line
+  # @ was chosen as separator to minimize risk of other tools messing 
around with it
+  all_unique_prefixes=`echo "${all_fixpath_prefixes@<:@@@:>@}" \
+      | tr ' ' '\n' | $GREP '^/./' | $SORT | $UNIQ`
+  fixpath_argument_list=`echo $all_unique_prefixes  | tr ' ' '@'`
+  FIXPATH="$FIXPATH_BIN -m$fixpath_argument_list"
+])
+
  AC_DEFUN([BASIC_FIXUP_PATH_MSYS],
  [
    path="[$]$1"
@@ -143,7 +153,7 @@
    new_path="$path"
    if test "x$has_colon" = x; then
      # Not in mixed or Windows style, start by that.
-    new_path=`cmd //c echo $path`
+    new_path=`MSYS2_ARG_CONV_EXCL= cmd //c echo $path`
    fi

    BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS([$new_path])
@@ -155,6 +165,8 @@

    # Save the first 10 bytes of this path to the storage, so fixpath 
can work.
    all_fixpath_prefixes=("${all_fixpath_prefixes@<:@@@:>@}" 
"${new_path:0:10}")
+  # We might need to re-evaluate FIXPATH.
+  BASIC_MSYS_UPDATE_FIXPATH
  ])

  AC_DEFUN([BASIC_FIXUP_EXECUTABLE_CYGWIN],
@@ -293,7 +305,7 @@
      # Do not save /bin paths to all_fixpath_prefixes!
    else
      # Not in mixed or Windows style, start by that.
-    new_path=`cmd //c echo $new_path`
+    new_path=`MSYS2_ARG_CONV_EXCL= cmd //c echo $new_path`
      BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS([$new_path])
      # Output is in $new_path
      BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path)
@@ -302,6 +314,8 @@

      # Save the first 10 bytes of this path to the storage, so fixpath 
can work.
      all_fixpath_prefixes=("${all_fixpath_prefixes@<:@@@:>@}" 
"${new_path:0:10}")
+    # We might need to re-evaluate FIXPATH.
+    BASIC_MSYS_UPDATE_FIXPATH
    fi
  ])

@@ -347,6 +361,10 @@
      WINDOWS_ENV_VENDOR='msys'
      WINDOWS_ENV_VERSION="$MSYS_VERSION"

+    # Prohibit msys2 path conversion from trying to be "intelligent", 
and rely
+    # on fixpath instead.
+    export MSYS2_ARG_CONV_EXCL="*"
+
      AC_MSG_CHECKING([msys root directory as unix-style path])
      # The cmd output ends with Windows line endings (CR/LF), the grep 
command will strip that away
      MSYS_ROOT_PATH=`cd / ; cmd /c cd | $GREP ".*"`
@@ -391,10 +409,7 @@
      elif test "x$OPENJDK_BUILD_OS_ENV" = xwindows.msys; then
        # Take all collected prefixes and turn them into a 
-m/c/foo@/c/bar at ... command line
        # @ was chosen as separator to minimize risk of other tools 
messing around with it
-      all_unique_prefixes=`echo "${all_fixpath_prefixes@<:@@@:>@}" \
-          | tr ' ' '\n' | $GREP '^/./' | $SORT | $UNIQ`
-      fixpath_argument_list=`echo $all_unique_prefixes  | tr ' ' '@'`
-      FIXPATH="$FIXPATH_BIN -m$fixpath_argument_list"
+      BASIC_MSYS_UPDATE_FIXPATH
      fi
      FIXPATH_SRC_W="$FIXPATH_SRC"
      FIXPATH_BIN_W="$FIXPATH_BIN"
diff -r a08cbfc0e4ec common/autoconf/build-aux/config.sub
--- a/common/autoconf/build-aux/config.sub    Thu Aug 03 18:56:56 2017 +0000
+++ b/common/autoconf/build-aux/config.sub    Wed Oct 04 00:53:58 2017 +0200
@@ -30,7 +30,7 @@
  DIR=`dirname $0`

  # First, filter out everything that doesn't begin with "aarch64-"
-if ! echo $* | grep '^aarch64-' >/dev/null ; then
+if ! echo $* | grep -e '^aarch64-' -e 'msys' >/dev/null ; then
      . $DIR/autoconf-config.sub "$@"
      # autoconf-config.sub exits, so we never reach here, but just in
      # case we do:
@@ -38,13 +38,17 @@
  fi

  while test $# -gt 0 ; do
-    case $1 in
+    case $1 in
          -- )   # Stop option processing
              shift; break ;;
          aarch64-* )
              config=`echo $1 | sed 's/^aarch64-/arm-/'`
              sub_args="$sub_args $config"
              shift; ;;
+        *-msys )
+            config=`echo $1 | sed 's/msys/mingw32/'`
+            sub_args="$sub_args $config"
+            shift; ;;
          - )    # Use stdin as input.
              sub_args="$sub_args $1"
              shift; break ;;
diff -r a08cbfc0e4ec common/autoconf/spec.gmk.in
--- a/common/autoconf/spec.gmk.in    Thu Aug 03 18:56:56 2017 +0000
+++ b/common/autoconf/spec.gmk.in    Wed Oct 04 00:53:58 2017 +0200
@@ -120,6 +120,13 @@
    # On Windows, the Visual Studio toolchain needs the PATH to be adjusted
    # to include Visual Studio tools (this needs to be in cygwin/msys 
style).
    export PATH:=@VS_PATH@
+
+endif
+
+ifeq ($(OPENJDK_TARGET_OS_ENV), windows.msys)
+  # On msys2, prohibit msys path conversion from trying to be
+  # "intelligent", and rely on fixpath instead.
+  export MSYS2_ARG_CONV_EXCL:=*
  endif

  SYSROOT_CFLAGS := @SYSROOT_CFLAGS@

/Magnus

On 2017-10-03 22:34, Magnus Ihse Bursie wrote:
> I gave msys2 a shot some time ago, but it ended up too much trouble. 
> I'll share some of my notes from that attempt, for what it's worth.
>
> To install package X/Y, run "pacman -S X/Y". Missing tools and 
> packages where to find them:
> cmp: msys/diffutils
> tar: msys/tar
> make: msys/make
> unzip: msys/unzip
> zip: msys/zip
>
> config.sub reports msys as "x86_64-pc-mingw32" but msys2 as 
> "x86_64-pc-msys". This patch adds postprocessing in "our" config.sub 
> to report msys2 similar to msys. (Opinions, including my own :-) may 
> vary if this really is the best way..)
>
> diff -r b88023f46daa common/autoconf/build-aux/config.sub
> --- a/common/autoconf/build-aux/config.sub      Fri Jan 27 10:15:41 
> 2017 +0100
> +++ b/common/autoconf/build-aux/config.sub      Fri Feb 03 05:00:25 
> 2017 -0700
> @@ -30,7 +30,7 @@
>  DIR=`dirname $0`
>
>  # First, filter out everything that doesn't begin with "aarch64-"
> -if ! echo $* | grep '^aarch64-' >/dev/null ; then
> +if ! echo $* | grep -e '^aarch64-' -e 'msys' >/dev/null ; then
>      . $DIR/autoconf-config.sub "$@"
>      # autoconf-config.sub exits, so we never reach here, but just in
>      # case we do:
> @@ -45,6 +45,10 @@
>              config=`echo $1 | sed 's/^aarch64-/arm-/'`
>              sub_args="$sub_args $config"
>              shift; ;;
> +        *-msys )
> +            config=`echo $1 | sed 's/msys/mingw32/'`
> +            sub_args="$sub_args $config"
> +            shift; ;;
>          - )    # Use stdin as input.
>              sub_args="$sub_args $1"
>              shift; break ;;
>
> If I remember correctly, this got me past the configure stage at the 
> time.
>
> I don't think it's very hard to get it to work on msys2, I just ran 
> into one snag too many and didn't think msys2 would be used by anyone.
>
> /Magnus
>
> On 2017-10-03 17:20, Peter Budai wrote:
>> Hello,
>>
>> According to 
>> http://hg.openjdk.java.net/jdk9/jdk9/file/a08cbfc0e4ec/common/doc/building.html 
>> “msys2 and the new Windows Subsystem for Linux (WSL) would likely be 
>> possible to support in a future version but that would require a 
>> community effort to implement”
>>
>> I’d like to help making the OpenJDK 9 build working on msys2. What is 
>> the best way to move forward? Is there a similar effort in progress?
>>
>> Thank you and best regards,
>>
>> Peter
>>
>>
>




More information about the build-dev mailing list