From dcbc00f4e7ccc9a80d21daaa8a171b0c62468d76 Mon Sep 17 00:00:00 2001
From: Tor Lillqvist <tml@collabora.com>
Date: Mon, 17 Apr 2017 12:47:32 +0300
Subject: [PATCH] Ubuntu on Windows WIP

---
 configure.ac | 130 +++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 78 insertions(+), 52 deletions(-)

diff --git a/configure.ac b/configure.ac
index c70d28c..89a6b1a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -151,6 +151,14 @@ dnl do this before argument processing to allow for platform dependent defaults
 dnl ===================================================================
 AC_CANONICAL_HOST
 
+# Detect Ubuntu on Windows
+if grep -q Microsoft /proc/version; then
+    AC_MSG_NOTICE([This is Ubuntu on Windows, but we will pretend it is mostly like Cygwin])
+    build_os=cygwin
+    host_os=cygwin
+    cygwin_is_uow=TRUE
+fi
+
 AC_MSG_CHECKING([for product name])
 PRODUCTNAME="AC_PACKAGE_NAME"
 if test -n "$with_product_name" -a "$with_product_name" != no; then
@@ -293,12 +301,6 @@ if test "$build_os" = "cygwin"; then
     PathFormat "$BUILDDIR"
     BUILDDIR="$formatted_path"
     x_Cygwin=
-    AC_MSG_CHECKING(for explicit COMSPEC)
-    if test -z "$COMSPEC"; then
-        AC_MSG_ERROR([COMSPEC not set in environment, please set it and rerun])
-    else
-        AC_MSG_RESULT([found: $COMSPEC])
-    fi
 fi
 
 AC_SUBST(SRC_ROOT)
@@ -3157,9 +3159,20 @@ dnl ===================================================================
 
 reg_get_value()
 {
+    # Args: $1: 32 or 64
+    #       $2: the path to the value, with / separators
     # Return value: $regvalue
     unset regvalue
 
+    if test "$cygwin_is_uow"; then
+        local path="$2"
+        local value=$(basename "$path")
+        path=$(dirname "$path")
+        local path="${path////\\}"
+        regvalue=$(reg.exe query "$path" /v "$value" /reg:$1 2>/dev/null | tr -d '\r' | grep "^    $value" | sed -e 's/.*REG_SZ    //')
+        return
+    fi
+
     local _regentry="/proc/registry${1}/${2}"
     if test -f "$_regentry"; then
         # Stop bash complaining about \0 bytes in input, as it can't handle them.
@@ -3281,7 +3294,9 @@ vs_versions_to_check()
 
 win_get_env_from_vsvars32bat()
 {
-    WRAPPERBATCHFILEPATH="`mktemp -t wrpXXXXXX.bat`"
+    mkdir -p workdir
+    local tmpdir=$(cygpath -w workdir)
+    local WRAPPERBATCHFILEPATH="`mktemp -p "$tmpdir" -t wrpXXXXXX.bat`"
     if test $vcnum = "150"; then
       # Also seems to be located in another directory under the same name: vsvars32.bat
       # https://github.com/bazelbuild/bazel/blob/master/src/main/native/build_windows_jni.sh#L56-L57
@@ -3290,8 +3305,8 @@ win_get_env_from_vsvars32bat()
       printf '@call "%s/../Common7/Tools/vsvars32.bat"\r\n' "$(cygpath -w $VC_PRODUCT_DIR)" > $WRAPPERBATCHFILEPATH
     fi
     printf '@setlocal\r\n@echo %%%s%%\r\n@endlocal\r\n' "$1" >> $WRAPPERBATCHFILEPATH
-    chmod +x $WRAPPERBATCHFILEPATH
-    _win_get_env_from_vsvars32bat=$("$WRAPPERBATCHFILEPATH" | tr -d '\r')
+    local wrapperbatchfilepath_w=$(cygpath -w "$WRAPPERBATCHFILEPATH")
+    _win_get_env_from_vsvars32bat=$(cmd.exe /c $wrapperbatchfilepath_w | tr -d '\r')
     rm -f $WRAPPERBATCHFILEPATH
     printf '%s' "$_win_get_env_from_vsvars32bat"
 }
@@ -3305,7 +3320,7 @@ find_ucrt()
         reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v10.0/ProductVersion"
         UCRTVERSION=$regvalue
         # Rest if not exist
-        if ! test -d "${UCRTSDKDIR}Include/$UCRTVERSION/ucrt"; then
+        if ! test -d "$(cygpath -u ${UCRTSDKDIR}Include/$UCRTVERSION/ucrt)"; then
           UCRTSDKDIR=
         fi
     fi
@@ -3320,10 +3335,11 @@ find_ucrt()
             PathFormat "$(win_get_env_from_vsvars32bat UniversalCRTSdkDir)"
             UCRTSDKDIR=$formatted_path
             UCRTVERSION=$(win_get_env_from_vsvars32bat UCRTVersion)
+            local ucrtsdkdir_u=$(cygpath -u "$UCRTSDKDIR")
             dnl Hack needed at least by tml:
             if test "$UCRTVERSION" = 10.0.15063.0 \
-                -a ! -f "${UCRTSDKDIR}Include/10.0.15063.0/um/sqlext.h" \
-                -a -f "${UCRTSDKDIR}Include/10.0.14393.0/um/sqlext.h"
+                -a ! -f "${ucrtsdkdir_u}Include/10.0.15063.0/um/sqlext.h" \
+                -a -f "${ucrtsdkdir_u}Include/10.0.14393.0/um/sqlext.h"
             then
                 UCRTVERSION=10.0.14393.0
             fi
@@ -3337,9 +3353,9 @@ find_msvc()
 {
     # Find Visual C++ 2015/2017
     # Args: $1 (optional) : The VS version year
-    # Return values: $vctest, $vcyear, $vcnum, $vcnumwithdot, $vcbuildnumber
+    # Return values: $vctest, $vctest_u, $vcyear, $vcnum, $vcnumwithdot, $vcbuildnumber
 
-    unset vctest vcnum vcnumwithdot vcbuildnumber
+    unset vctest vctest_u vcnum vcnumwithdot vcbuildnumber
 
     vs_versions_to_check "$1"
 
@@ -3355,6 +3371,7 @@ find_msvc()
             AC_MSG_RESULT([found: $regvalue])
             PathFormat "$regvalue"
             vctest=$formatted_path
+            vctest_u=$(cygpath -u "$vctest")
             break
         fi
     done
@@ -3368,7 +3385,7 @@ find_msvc()
         15.0)
             vcyear=2017
             vcnum=150
-            vcbuildnumber=`ls $vctest/VC/Tools/MSVC -A1r | head -1`
+            vcbuildnumber=`ls $vctest_u/VC/Tools/MSVC -A1r | head -1`
             ;;
         esac
     fi
@@ -3389,19 +3406,18 @@ if test "$_os" = "WINNT"; then
             AC_MSG_ERROR([No Visual Studio 2015/2017 installation found])
         fi
     fi
-
     if test "$BITNESS_OVERRIDE" = ""; then
-        if test -f "$vctest/bin/cl.exe"; then
+        if test -f "$vctest_u/bin/cl.exe"; then
             VC_PRODUCT_DIR=$vctest
-        elif test -f "$vctest/VC/Tools/MSVC/$vcbuildnumber/bin/HostX86/x86/cl.exe"; then
+        elif test -f "$vctest_/VC/Tools/MSVC/$vcbuildnumber/bin/HostX86/x86/cl.exe"; then
             VC_PRODUCT_DIR=$vctest/VC
         else
             AC_MSG_ERROR([No compiler (cl.exe) in $vctest/bin/cl.exe])
         fi
     else
-        if test -f "$vctest/bin/amd64/cl.exe"; then
+        if test -f "$vctest_u/bin/amd64/cl.exe"; then
             VC_PRODUCT_DIR=$vctest
-        elif test -f "$vctest/VC/Tools/MSVC/$vcbuildnumber/bin/HostX64/x64/cl.exe"; then
+        elif test -f "$vctest_u/VC/Tools/MSVC/$vcbuildnumber/bin/HostX64/x64/cl.exe"; then
             VC_PRODUCT_DIR=$vctest/VC
         else
             AC_MSG_ERROR([No compiler (cl.exe) in $vctest/VC/Tools/MSVC/$vcbuildnumber/bin/HostX64/x64/cl.exe or $vctest/bin/amd64/cl.exe or $vctest/bin/x86_amd64/cl.exe])
@@ -3455,7 +3471,8 @@ if test "$_os" = "WINNT"; then
     # Find the version of devenv.exe
     # MSVC 2017 devenv does not start properly from a DOS 8.3 path
     DEVENV=$(cygpath -lm "$VC_PRODUCT_DIR/../Common7/IDE/devenv.exe")
-    if test ! -e "$DEVENV"; then
+    devenv_u=$(cygpath -u "$DEVENV")
+    if test ! -e "$devenv_u"; then
         AC_MSG_ERROR([No devenv.exe found, Visual Studio installation broken?])
     fi
 
@@ -3557,7 +3574,7 @@ if test "$_os" = "WINNT"; then
             COMPATH="$COMPATH/Tools/MSVC/$vcbuildnumber"
         fi
 
-        export INCLUDE=`cygpath -d "$COMPATH\Include"`
+        COMPILERINCLUDE=`cygpath -m -s "$COMPATH\Include"`
 
         PathFormat "$COMPATH"
         COMPATH="$formatted_path"
@@ -3615,7 +3632,7 @@ if test "$_os" = "WINNT"; then
             ;;
         esac
     done
-    SHOWINCLUDES_PREFIX=`$my_CC $CFLAGS -c -showIncludes conftest.c 2>/dev/null | \
+    SHOWINCLUDES_PREFIX=`$my_CC -nologo $CFLAGS -I$COMPILERINCLUDE -c -showIncludes conftest.c | \
         grep 'stdlib\.h' | head -n1 | sed 's/ [[[:alpha:]]]:.*//'`
     rm -f conftest.c conftest.obj
     if test -z "$SHOWINCLUDES_PREFIX"; then
@@ -5086,13 +5103,13 @@ fi
 
 find_csc()
 {
-    # Return value: $csctest
+    # Return value: $csctest_u
 
-    unset csctest
+    unset csctest_u
 
     reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/NET Framework Setup/NDP/v4/Client/InstallPath"
     if test -n "$regvalue"; then
-        csctest=$regvalue
+        csctest_u=$(cygpath -u $regvalue)
         return
     fi
 }
@@ -5156,15 +5173,16 @@ find_dotnetsdk46()
 find_winsdk_version()
 {
     # Args: $1 : SDK version as in "6.0A", "7.0" etc
-    # Return values: $winsdktest, $winsdkbinsubdir, $winsdklibsubdir
+    # Return values: $winsdktest, $winsdktest_u, $winsdkbinsubdir, $winsdklibsubdir
 
-    unset winsdktest winsdkbinsubdir winsdklibsubdir
+    unset winsdktest winsdktest_u winsdkbinsubdir winsdklibsubdir
 
     case "$1" in
     7.*)
         reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v${1}/InstallationFolder"
         if test -n "$regvalue"; then
             winsdktest=$regvalue
+            winsdktest_u=$(cygpath -u "$winsdktest")
             winsdklibsubdir=.
             return
         fi
@@ -5173,6 +5191,7 @@ find_winsdk_version()
         reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows Kits/Installed Roots/KitsRoot"
         if test -n "$regvalue"; then
             winsdktest=$regvalue
+            winsdktest_u=$(cygpath -u "$winsdktest")
             winsdklibsubdir=win8
             return
         fi
@@ -5181,6 +5200,7 @@ find_winsdk_version()
         reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows Kits/Installed Roots/KitsRoot81"
         if test -n "$regvalue"; then
             winsdktest=$regvalue
+            winsdktest_u=$(cygpath -u "$winsdktest")
             winsdklibsubdir=winv6.3
             return
         fi
@@ -5189,6 +5209,7 @@ find_winsdk_version()
         reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v${1}/InstallationFolder"
         if test -n "$regvalue"; then
             winsdktest=$regvalue
+            winsdktest_u=$(cygpath -u "$winsdktest")
             reg_get_value_32 "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v${1}/ProductVersion"
             if test -n "$regvalue"; then
                 winsdkbinsubdir="$regvalue".0
@@ -5199,8 +5220,8 @@ find_winsdk_version()
             elif test "$regvalue" = "10.0.15063"; then
                 winsdklibsubdir="10.0.15063.0"
                 dnl Hack needed at least by tml:
-                if test ! -f "${winsdktest}/Include/10.0.15063.0/um/sqlext.h" \
-                    -a -f "${winsdktest}/Include/10.0.14393.0/um/sqlext.h"
+                if test ! -f "${winsdktest_u}/Include/10.0.15063.0/um/sqlext.h" \
+                    -a -f "${winsdktest_u}/Include/10.0.14393.0/um/sqlext.h"
                 then
                     winsdklibsubdir="10.0.14393.0"
                 fi
@@ -5334,15 +5355,15 @@ if test "$_os" = "WINNT"; then
         WINDOWS_SDK_HOME=`echo $WINDOWS_SDK_HOME | $SED 's/\/$//'`
 
         if test -f "$WINDOWS_SDK_HOME/Include/adoint.h" \
-             -a -f "$WINDOWS_SDK_HOME/Include/SqlUcode.h" \
+             -a -f "$WINDOWS_SDK_HOME/Include/sqlucode.h" \
              -a -f "$WINDOWS_SDK_HOME/Include/usp10.h"; then
             have_windows_sdk_headers=yes
         elif test -f "$WINDOWS_SDK_HOME/Include/um/adoint.h" \
-             -a -f "$WINDOWS_SDK_HOME/Include/um/SqlUcode.h" \
+             -a -f "$WINDOWS_SDK_HOME/Include/um/sqlucode.h" \
              -a -f "$WINDOWS_SDK_HOME/Include/um/usp10.h"; then
             have_windows_sdk_headers=yes
         elif test -f "$WINDOWS_SDK_HOME/Include/$winsdklibsubdir/um/adoint.h" \
-             -a -f "$WINDOWS_SDK_HOME/Include/$winsdklibsubdir/um/SqlUcode.h" \
+             -a -f "$WINDOWS_SDK_HOME/Include/$winsdklibsubdir/um/sqlucode.h" \
              -a -f "$WINDOWS_SDK_HOME/Include/$winsdklibsubdir/um/usp10.h"; then
             have_windows_sdk_headers=yes
         else
@@ -5351,7 +5372,7 @@ if test "$_os" = "WINNT"; then
 
         if test -f "$WINDOWS_SDK_HOME/lib/user32.lib"; then
             have_windows_sdk_libs=yes
-        elif test -f "$WINDOWS_SDK_HOME/lib/$winsdklibsubdir/um/$WINDOWS_SDK_ARCH/user32.lib"; then
+        elif test -f "$WINDOWS_SDK_HOME/Lib/$winsdklibsubdir/um/$WINDOWS_SDK_ARCH/User32.Lib"; then
             have_windows_sdk_libs=yes
         else
             have_windows_sdk_libs=no
@@ -5419,6 +5440,9 @@ the  Windows SDK are installed.])
         fi
     fi
 fi
+
+WINDOWS_SDK_HOME_u=$(cygpath -u "$WINDOWS_SDK_HOME")
+
 AC_SUBST(WINDOWS_SDK_HOME)
 AC_SUBST(WINDOWS_SDK_LIB_SUBDIR)
 AC_SUBST(WINDOWS_SDK_VERSION)
@@ -5432,26 +5456,26 @@ if test "$build_os" = "cygwin"; then
 
     find_winsdk
     if test -n "$winsdkbinsubdir" \
-        -a -f "$winsdktest/Bin/$winsdkbinsubdir/$WINDOWS_SDK_ARCH/midl.exe"
+        -a -f "$winsdktest_u/bin/$winsdkbinsubdir/$WINDOWS_SDK_ARCH/midl.exe"
     then
-        MIDL_PATH=$winsdktest/Bin/$winsdkbinsubdir/$WINDOWS_SDK_ARCH
-        WINDOWS_SDK_BINDIR_NO_ARCH=$WINDOWS_SDK_HOME/Bin/$winsdkbinsubdir
-    elif test -f "$winsdktest/Bin/$WINDOWS_SDK_ARCH/midl.exe"; then
-        MIDL_PATH=$winsdktest/Bin/$WINDOWS_SDK_ARCH
-        WINDOWS_SDK_BINDIR_NO_ARCH=$WINDOWS_SDK_HOME/Bin
-    elif test -f "$winsdktest/Bin/midl.exe"; then
-        MIDL_PATH=$winsdktest/Bin
-        WINDOWS_SDK_BINDIR_NO_ARCH=$WINDOWS_SDK_HOME/Bin
-    fi
-    if test ! -f "$MIDL_PATH/midl.exe"; then
-        AC_MSG_ERROR([midl.exe not found in $winsdktest/Bin/$WINDOWS_SDK_ARCH, Windows SDK installation broken?])
+        MIDL_PATH=$winsdktest/bin/$winsdkbinsubdir/$WINDOWS_SDK_ARCH
+        WINDOWS_SDK_BINDIR_NO_ARCH=$WINDOWS_SDK_HOME_u/bin/$winsdkbinsubdir
+    elif test -f "$winsdktest_u/bin/$WINDOWS_SDK_ARCH/midl.exe"; then
+        MIDL_PATH=$winsdktest/bin/$WINDOWS_SDK_ARCH
+        WINDOWS_SDK_BINDIR_NO_ARCH=$WINDOWS_SDK_HOME_u/bin
+    elif test -f "$winsdktest_u/bin/midl.exe"; then
+        MIDL_PATH=$winsdktest/bin
+        WINDOWS_SDK_BINDIR_NO_ARCH=$WINDOWS_SDK_HOME_u/bin
     else
-        AC_MSG_RESULT([$MIDL_PATH/midl.exe])
+        AC_MSG_ERROR([midl.exe not found in $winsdktest/bin/$WINDOWS_SDK_ARCH, Windows SDK installation broken?])
     fi
 
+    AC_MSG_RESULT([$MIDL_PATH/midl.exe])
+
     # Convert to posix path with 8.3 filename restrictions ( No spaces )
     MIDL_PATH=`win_short_path_for_make "$MIDL_PATH"`
 
+set -x
     if test -f "$WINDOWS_SDK_BINDIR_NO_ARCH/msiinfo.exe" \
          -a -f "$WINDOWS_SDK_BINDIR_NO_ARCH/msidb.exe" \
          -a -f "$WINDOWS_SDK_BINDIR_NO_ARCH/uuidgen.exe" \
@@ -5460,19 +5484,21 @@ if test "$build_os" = "cygwin"; then
          -a -f "$WINDOWS_SDK_BINDIR_NO_ARCH/x86/msidb.exe" \
          -a -f "$WINDOWS_SDK_BINDIR_NO_ARCH/x86/uuidgen.exe" \
          -a -f "$WINDOWS_SDK_BINDIR_NO_ARCH/x86/msitran.exe"; then :
-    elif test -f "$WINDOWS_SDK_HOME/bin/x86/msiinfo.exe" \
-         -a -f "$WINDOWS_SDK_HOME/bin/x86/msidb.exe" \
+    elif test -f "$WINDOWS_SDK_HOME_u/bin/x86/MsiInfo.exe" \
+         -a -f "$WINDOWS_SDK_HOME_u/bin/x86/MsiDb.exe" \
          -a -f "$WINDOWS_SDK_BINDIR_NO_ARCH/x86/uuidgen.exe" \
-         -a -f "$WINDOWS_SDK_HOME/bin/x86/msitran.exe"; then :
+         -a -f "$WINDOWS_SDK_HOME_u/bin/x86/MsiTran.exe"; then :
     else
+set +x
         AC_MSG_ERROR([Some (all?) Windows Installer tools in the Windows SDK are missing, please install.])
     fi
+set +x
 
     dnl Check csc.exe
     AC_MSG_CHECKING([for csc.exe])
     find_csc
-    if test -f "$csctest/csc.exe"; then
-        CSC_PATH="$csctest"
+    if test -f "$csctest_u/csc.exe"; then
+        CSC_PATH="$csctest_u"
     fi
     if test ! -f "$CSC_PATH/csc.exe"; then
         AC_MSG_ERROR([csc.exe not found as $CSC_PATH/csc.exe])
-- 
2.7.4

