1 #
   2 # Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.  Oracle designates this
   8 # particular file as subject to the "Classpath" exception as provided
   9 # by Oracle in the LICENSE file that accompanied this code.
  10 #
  11 # This code is distributed in the hope that it will be useful, but WITHOUT
  12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14 # version 2 for more details (a copy is included in the LICENSE file that
  15 # accompanied this code).
  16 #
  17 # You should have received a copy of the GNU General Public License version
  18 # 2 along with this work; if not, write to the Free Software Foundation,
  19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20 #
  21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22 # or visit www.oracle.com if you need additional information or have any
  23 # questions.
  24 #
  25 
  26 ########################################################################
  27 # This file is responsible for detecting, verifying and setting up the
  28 # toolchain, i.e. the compiler, linker and related utilities. It will setup
  29 # proper paths to the binaries, but it will not setup any flags.
  30 #
  31 # The binaries used is determined by the toolchain type, which is the family of
  32 # compilers and related tools that are used.
  33 ########################################################################
  34 
  35 m4_include([toolchain_windows.m4])
  36 
  37 # All valid toolchains, regardless of platform (used by help.m4)
  38 VALID_TOOLCHAINS_all="gcc clang solstudio xlc microsoft"
  39 
  40 # These toolchains are valid on different platforms
  41 VALID_TOOLCHAINS_linux="gcc clang"
  42 VALID_TOOLCHAINS_solaris="solstudio"
  43 VALID_TOOLCHAINS_macosx="gcc clang"
  44 VALID_TOOLCHAINS_aix="xlc"
  45 VALID_TOOLCHAINS_windows="microsoft"
  46 
  47 # Toolchain descriptions
  48 TOOLCHAIN_DESCRIPTION_clang="clang/LLVM"
  49 TOOLCHAIN_DESCRIPTION_gcc="GNU Compiler Collection"
  50 TOOLCHAIN_DESCRIPTION_microsoft="Microsoft Visual Studio"
  51 TOOLCHAIN_DESCRIPTION_solstudio="Oracle Solaris Studio"
  52 TOOLCHAIN_DESCRIPTION_xlc="IBM XL C/C++"
  53 
  54 # Minimum supported versions, empty means unspecified
  55 TOOLCHAIN_MINIMUM_VERSION_clang="3.2"
  56 TOOLCHAIN_MINIMUM_VERSION_gcc="5.0"
  57 TOOLCHAIN_MINIMUM_VERSION_microsoft="16.00.30319.01" # VS2010
  58 TOOLCHAIN_MINIMUM_VERSION_solstudio="5.13"
  59 TOOLCHAIN_MINIMUM_VERSION_xlc=""
  60 
  61 # Minimum supported linker versions, empty means unspecified
  62 TOOLCHAIN_MINIMUM_LD_VERSION_gcc="2.18"
  63 
  64 # Prepare the system so that TOOLCHAIN_CHECK_COMPILER_VERSION can be called.
  65 # Must have CC_VERSION_NUMBER and CXX_VERSION_NUMBER.
  66 # $1 - optional variable prefix for compiler and version variables (BUILD_)
  67 # $2 - optional variable prefix for comparable variable (OPENJDK_BUILD_)
  68 # $3 - optional human readable description for the type of compilers ("build " or "")
  69 AC_DEFUN([TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS],
  70 [
  71   if test "x[$]$1CC_VERSION_NUMBER" != "x[$]$1CXX_VERSION_NUMBER"; then
  72     AC_MSG_WARN([The $3C and C++ compilers have different version numbers, [$]$1CC_VERSION_NUMBER vs [$]$1CXX_VERSION_NUMBER.])
  73     AC_MSG_WARN([This typically indicates a broken setup, and is not supported])
  74   fi
  75 
  76   # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal.
  77   if [ [[ "[$]$1CC_VERSION_NUMBER" =~ (.*\.){4} ]] ]; then
  78     AC_MSG_WARN([C compiler version number has more than four parts (W.X.Y.Z): [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.])
  79   fi
  80 
  81   if [ [[  "[$]$1CC_VERSION_NUMBER" =~ [0-9]{6} ]] ]; then
  82     AC_MSG_WARN([C compiler version number has a part larger than 99999: [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.])
  83   fi
  84 
  85   $2COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", [$]1, [$]2, [$]3, [$]4) }' <<< "[$]$1CC_VERSION_NUMBER"`
  86 ])
  87 
  88 # Check if the configured compiler (C and C++) is of a specific version or
  89 # newer. TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS must have been called before.
  90 #
  91 # Arguments:
  92 #   VERSION:   The version string to check against the found version
  93 #   IF_AT_LEAST:   block to run if the compiler is at least this version (>=)
  94 #   IF_OLDER_THAN:   block to run if the compiler is older than this version (<)
  95 #   PREFIX:   Optional variable prefix for compiler to compare version for (OPENJDK_BUILD_)
  96 UTIL_DEFUN_NAMED([TOOLCHAIN_CHECK_COMPILER_VERSION],
  97     [*VERSION PREFIX IF_AT_LEAST IF_OLDER_THAN], [$@],
  98 [
  99   # Need to assign to a variable since m4 is blocked from modifying parts in [].
 100   REFERENCE_VERSION=ARG_VERSION
 101 
 102   if [ [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ]; then
 103     AC_MSG_ERROR([Internal error: Cannot compare to ARG_VERSION, only four parts (W.X.Y.Z) is supported])
 104   fi
 105 
 106   if [ [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ]; then
 107     AC_MSG_ERROR([Internal error: Cannot compare to ARG_VERSION, only parts < 99999 is supported])
 108   fi
 109 
 110   # Version comparison method inspired by http://stackoverflow.com/a/24067243
 111   COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", [$]1, [$]2, [$]3, [$]4) }' <<< "$REFERENCE_VERSION"`
 112 
 113   if test [$]ARG_PREFIX[COMPARABLE_ACTUAL_VERSION] -ge $COMPARABLE_REFERENCE_VERSION ; then
 114     :
 115     ARG_IF_AT_LEAST
 116   else
 117     :
 118     ARG_IF_OLDER_THAN
 119   fi
 120 ])
 121 
 122 # Prepare the system so that TOOLCHAIN_CHECK_COMPILER_VERSION can be called.
 123 # Must have LD_VERSION_NUMBER.
 124 # $1 - optional variable prefix for compiler and version variables (BUILD_)
 125 # $2 - optional variable prefix for comparable variable (OPENJDK_BUILD_)
 126 AC_DEFUN([TOOLCHAIN_PREPARE_FOR_LD_VERSION_COMPARISONS],
 127 [
 128   if [ [[ "[$]$1LD_VERSION_NUMBER" =~ (.*\.){4} ]] ]; then
 129     AC_MSG_WARN([Linker version number has more than four parts (W.X.Y.Z): [$]$1LD_VERSION_NUMBER. Comparisons might be wrong.])
 130   fi
 131 
 132   if [ [[  "[$]$1LD_VERSION_NUMBER" =~ [0-9]{6} ]] ]; then
 133     AC_MSG_WARN([Linker version number has a part larger than 99999: [$]$1LD_VERSION_NUMBER. Comparisons might be wrong.])
 134   fi
 135 
 136   $2COMPARABLE_ACTUAL_LD_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", [$]1, [$]2, [$]3, [$]4) }' <<< "[$]$1LD_VERSION_NUMBER"`
 137 ])
 138 
 139 # Check if the configured linker is of a specific version or
 140 # newer. TOOLCHAIN_PREPARE_FOR_LD_VERSION_COMPARISONS must have been called before.
 141 #
 142 # Arguments:
 143 #   VERSION:   The version string to check against the found version
 144 #   IF_AT_LEAST:   block to run if the compiler is at least this version (>=)
 145 #   IF_OLDER_THAN:   block to run if the compiler is older than this version (<)
 146 #   PREFIX:   Optional variable prefix for compiler to compare version for (OPENJDK_BUILD_)
 147 UTIL_DEFUN_NAMED([TOOLCHAIN_CHECK_LINKER_VERSION],
 148     [*VERSION PREFIX IF_AT_LEAST IF_OLDER_THAN], [$@],
 149 [
 150   # Need to assign to a variable since m4 is blocked from modifying parts in [].
 151   REFERENCE_VERSION=ARG_VERSION
 152 
 153   if [ [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ]; then
 154     AC_MSG_ERROR([Internal error: Cannot compare to ARG_VERSION, only four parts (W.X.Y.Z) is supported])
 155   fi
 156 
 157   if [ [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ]; then
 158     AC_MSG_ERROR([Internal error: Cannot compare to ARG_VERSION, only parts < 99999 is supported])
 159   fi
 160 
 161   # Version comparison method inspired by http://stackoverflow.com/a/24067243
 162   COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", [$]1, [$]2, [$]3, [$]4) }' <<< "$REFERENCE_VERSION"`
 163 
 164   if test [$]ARG_PREFIX[COMPARABLE_ACTUAL_LD_VERSION] -ge $COMPARABLE_REFERENCE_VERSION ; then
 165     :
 166     ARG_IF_AT_LEAST
 167   else
 168     :
 169     ARG_IF_OLDER_THAN
 170   fi
 171 ])
 172 
 173 # Setup a number of variables describing how native output files are
 174 # named on this platform/toolchain.
 175 AC_DEFUN([TOOLCHAIN_SETUP_FILENAME_PATTERNS],
 176 [
 177   # Define filename patterns
 178   if test "x$OPENJDK_TARGET_OS" = xwindows; then
 179     LIBRARY_PREFIX=
 180     SHARED_LIBRARY_SUFFIX='.dll'
 181     STATIC_LIBRARY_SUFFIX='.lib'
 182     SHARED_LIBRARY='[$]1.dll'
 183     STATIC_LIBRARY='[$]1.lib'
 184     OBJ_SUFFIX='.obj'
 185   else
 186     LIBRARY_PREFIX=lib
 187     SHARED_LIBRARY_SUFFIX='.so'
 188     STATIC_LIBRARY_SUFFIX='.a'
 189     SHARED_LIBRARY='lib[$]1.so'
 190     STATIC_LIBRARY='lib[$]1.a'
 191     OBJ_SUFFIX='.o'
 192     if test "x$OPENJDK_TARGET_OS" = xmacosx; then
 193       # For full static builds, we're overloading the SHARED_LIBRARY
 194       # variables in order to limit the amount of changes required.
 195       # It would be better to remove SHARED and just use LIBRARY and
 196       # LIBRARY_SUFFIX for libraries that can be built either
 197       # shared or static and use STATIC_* for libraries that are
 198       # always built statically.
 199       if test "x$STATIC_BUILD" = xtrue; then
 200         SHARED_LIBRARY='lib[$]1.a'
 201         SHARED_LIBRARY_SUFFIX='.a'
 202       else
 203         SHARED_LIBRARY='lib[$]1.dylib'
 204         SHARED_LIBRARY_SUFFIX='.dylib'
 205       fi
 206     fi
 207   fi
 208 
 209   AC_SUBST(LIBRARY_PREFIX)
 210   AC_SUBST(SHARED_LIBRARY_SUFFIX)
 211   AC_SUBST(STATIC_LIBRARY_SUFFIX)
 212   AC_SUBST(SHARED_LIBRARY)
 213   AC_SUBST(STATIC_LIBRARY)
 214   AC_SUBST(OBJ_SUFFIX)
 215 ])
 216 
 217 # Determine which toolchain type to use, and make sure it is valid for this
 218 # platform. Setup various information about the selected toolchain.
 219 AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
 220 [
 221   AC_ARG_WITH(toolchain-type, [AS_HELP_STRING([--with-toolchain-type],
 222       [the toolchain type (or family) to use, use '--help' to show possible values @<:@platform dependent@:>@])])
 223 
 224   # Use indirect variable referencing
 225   toolchain_var_name=VALID_TOOLCHAINS_$OPENJDK_BUILD_OS
 226   VALID_TOOLCHAINS=${!toolchain_var_name}
 227 
 228   if test "x$OPENJDK_TARGET_OS" = xmacosx; then
 229     if test -n "$XCODEBUILD"; then
 230       # On Mac OS X, default toolchain to clang after Xcode 5
 231       XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version 2>&1 | $HEAD -n 1`
 232       $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
 233       if test $? -ne 0; then
 234         AC_MSG_NOTICE([xcodebuild output: $XCODE_VERSION_OUTPUT])
 235         AC_MSG_ERROR([Failed to determine Xcode version.])
 236       fi
 237       XCODE_MAJOR_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | \
 238           $SED -e 's/^Xcode \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/' | \
 239           $CUT -f 1 -d .`
 240       AC_MSG_NOTICE([Xcode major version: $XCODE_MAJOR_VERSION])
 241       if test $XCODE_MAJOR_VERSION -ge 5; then
 242           DEFAULT_TOOLCHAIN="clang"
 243       else
 244           DEFAULT_TOOLCHAIN="gcc"
 245       fi
 246     else
 247       # If Xcode is not installed, but the command line tools are
 248       # then we can't run xcodebuild. On these systems we should
 249       # default to clang
 250       DEFAULT_TOOLCHAIN="clang"
 251     fi
 252   else
 253     # First toolchain type in the list is the default
 254     DEFAULT_TOOLCHAIN=${VALID_TOOLCHAINS%% *}
 255   fi
 256 
 257   if test "x$with_toolchain_type" = xlist; then
 258     # List all toolchains
 259     AC_MSG_NOTICE([The following toolchains are valid on this platform:])
 260     for toolchain in $VALID_TOOLCHAINS; do
 261       toolchain_var_name=TOOLCHAIN_DESCRIPTION_$toolchain
 262       TOOLCHAIN_DESCRIPTION=${!toolchain_var_name}
 263       $PRINTF "  %-10s  %s\n" $toolchain "$TOOLCHAIN_DESCRIPTION"
 264     done
 265 
 266     exit 0
 267   elif test "x$with_toolchain_type" != x; then
 268     # User override; check that it is valid
 269     if test "x${VALID_TOOLCHAINS/$with_toolchain_type/}" = "x${VALID_TOOLCHAINS}"; then
 270       AC_MSG_NOTICE([Toolchain type $with_toolchain_type is not valid on this platform.])
 271       AC_MSG_NOTICE([Valid toolchains: $VALID_TOOLCHAINS.])
 272       AC_MSG_ERROR([Cannot continue.])
 273     fi
 274     TOOLCHAIN_TYPE=$with_toolchain_type
 275   else
 276     # No flag given, use default
 277     TOOLCHAIN_TYPE=$DEFAULT_TOOLCHAIN
 278   fi
 279   AC_SUBST(TOOLCHAIN_TYPE)
 280 
 281   # on AIX, check for xlclang++ on the PATH and TOOLCHAIN_PATH and use it if it is available
 282   if test "x$OPENJDK_TARGET_OS" = xaix; then
 283     if test "x$TOOLCHAIN_PATH" != x; then
 284       XLC_TEST_PATH=${TOOLCHAIN_PATH}/
 285     fi
 286 
 287     XLCLANG_VERSION_OUTPUT=`${XLC_TEST_PATH}xlclang++ -qversion 2>&1 | $HEAD -n 1`
 288     $ECHO "$XLCLANG_VERSION_OUTPUT" | $GREP "IBM XL C/C++ for AIX" > /dev/null
 289     if test $? -eq 0; then
 290       AC_MSG_NOTICE([xlclang++ output: $XLCLANG_VERSION_OUTPUT])
 291     else
 292       AC_MSG_ERROR([xlclang++ version output check failed, output: $XLCLANG_VERSION_OUTPUT])
 293     fi
 294   fi
 295 
 296   TOOLCHAIN_CC_BINARY_clang="clang"
 297   TOOLCHAIN_CC_BINARY_gcc="gcc"
 298   TOOLCHAIN_CC_BINARY_microsoft="cl$EXE_SUFFIX"
 299   TOOLCHAIN_CC_BINARY_solstudio="cc"
 300   TOOLCHAIN_CC_BINARY_xlc="xlclang"
 301 
 302   TOOLCHAIN_CXX_BINARY_clang="clang++"
 303   TOOLCHAIN_CXX_BINARY_gcc="g++"
 304   TOOLCHAIN_CXX_BINARY_microsoft="cl$EXE_SUFFIX"
 305   TOOLCHAIN_CXX_BINARY_solstudio="CC"
 306   TOOLCHAIN_CXX_BINARY_xlc="xlclang++"
 307 
 308   # Use indirect variable referencing
 309   toolchain_var_name=TOOLCHAIN_DESCRIPTION_$TOOLCHAIN_TYPE
 310   TOOLCHAIN_DESCRIPTION=${!toolchain_var_name}
 311   toolchain_var_name=TOOLCHAIN_MINIMUM_VERSION_$TOOLCHAIN_TYPE
 312   TOOLCHAIN_MINIMUM_VERSION=${!toolchain_var_name}
 313   toolchain_var_name=TOOLCHAIN_MINIMUM_LD_VERSION_$TOOLCHAIN_TYPE
 314   TOOLCHAIN_MINIMUM_LD_VERSION=${!toolchain_var_name}
 315   toolchain_var_name=TOOLCHAIN_CC_BINARY_$TOOLCHAIN_TYPE
 316   TOOLCHAIN_CC_BINARY=${!toolchain_var_name}
 317   toolchain_var_name=TOOLCHAIN_CXX_BINARY_$TOOLCHAIN_TYPE
 318   TOOLCHAIN_CXX_BINARY=${!toolchain_var_name}
 319 
 320   TOOLCHAIN_SETUP_FILENAME_PATTERNS
 321 
 322   if test "x$TOOLCHAIN_TYPE" = "x$DEFAULT_TOOLCHAIN"; then
 323     AC_MSG_NOTICE([Using default toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION)])
 324   else
 325     AC_MSG_NOTICE([Using user selected toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION). Default toolchain is $DEFAULT_TOOLCHAIN.])
 326   fi
 327 ])
 328 
 329 # Before we start detecting the toolchain executables, we might need some
 330 # special setup, e.g. additional paths etc.
 331 AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION],
 332 [
 333   # FIXME: Is this needed?
 334   AC_LANG(C++)
 335 
 336   # Store the CFLAGS etc passed to the configure script.
 337   ORG_CFLAGS="$CFLAGS"
 338   ORG_CXXFLAGS="$CXXFLAGS"
 339 
 340   # autoconf magic only relies on PATH, so update it if tools dir is specified
 341   OLD_PATH="$PATH"
 342 
 343   # On Windows, we need to detect the visual studio installation first.
 344   # This will change the PATH, but we need to keep that new PATH even
 345   # after toolchain detection is done, since the compiler (on x86) uses
 346   # it for DLL resolution in runtime.
 347   if test "x$OPENJDK_BUILD_OS" = "xwindows" \
 348       && test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
 349     TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV
 350     if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.wsl"; then
 351       # Append VS_PATH. In WSL, VS_PATH will not contain the WSL env path needed
 352       # for using basic Unix tools, so need to keep the original PATH.
 353       UTIL_APPEND_TO_PATH(PATH, $VS_PATH)
 354       UTIL_APPEND_TO_PATH(WSLENV, "PATH/l:LIB:INCLUDE")
 355       export WSLENV
 356     else
 357       # Reset path to VS_PATH. It will include everything that was on PATH at the time we
 358       # ran TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV.
 359       PATH="$VS_PATH"
 360     fi
 361     # The microsoft toolchain also requires INCLUDE and LIB to be set.
 362     export INCLUDE="$VS_INCLUDE"
 363     export LIB="$VS_LIB"
 364   else
 365     if test "x$XCODE_VERSION_OUTPUT" != x; then
 366       # For Xcode, we set the Xcode version as TOOLCHAIN_VERSION
 367       TOOLCHAIN_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | $CUT -f 2 -d ' '`
 368       TOOLCHAIN_DESCRIPTION="$TOOLCHAIN_DESCRIPTION from Xcode $TOOLCHAIN_VERSION"
 369     else
 370       # Currently we do not define this for other toolchains. This might change as the need arise.
 371       TOOLCHAIN_VERSION=
 372     fi
 373   fi
 374   AC_SUBST(TOOLCHAIN_VERSION)
 375 
 376   # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to
 377   # override all other locations.
 378   if test "x$TOOLCHAIN_PATH" != x; then
 379     PATH=$TOOLCHAIN_PATH:$PATH
 380   fi
 381 ])
 382 
 383 # Restore path, etc
 384 AC_DEFUN_ONCE([TOOLCHAIN_POST_DETECTION],
 385 [
 386   # Restore old path, except for the microsoft toolchain, which requires VS_PATH
 387   # to remain in place. Otherwise the compiler will not work in some siutations
 388   # in later configure checks.
 389   if test "x$TOOLCHAIN_TYPE" != "xmicrosoft"; then
 390     PATH="$OLD_PATH"
 391   fi
 392 
 393   # Restore the flags to the user specified values.
 394   # This is necessary since AC_PROG_CC defaults CFLAGS to "-g -O2"
 395   CFLAGS="$ORG_CFLAGS"
 396   CXXFLAGS="$ORG_CXXFLAGS"
 397 ])
 398 
 399 # Check if a compiler is of the toolchain type we expect, and save the version
 400 # information from it. If the compiler does not match the expected type,
 401 # this function will abort using AC_MSG_ERROR. If it matches, the version will
 402 # be stored in CC_VERSION_NUMBER/CXX_VERSION_NUMBER (as a dotted number), and
 403 # the full version string in CC_VERSION_STRING/CXX_VERSION_STRING.
 404 #
 405 # $1 = compiler to test (CC or CXX)
 406 # $2 = human readable name of compiler (C or C++)
 407 AC_DEFUN([TOOLCHAIN_EXTRACT_COMPILER_VERSION],
 408 [
 409   COMPILER=[$]$1
 410   COMPILER_NAME=$2
 411 
 412   if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
 413     # cc -V output typically looks like
 414     #     cc: Sun C 5.12 Linux_i386 2011/11/16
 415     # or
 416     #     cc: Studio 12.5 Sun C 5.14 SunOS_sparc 2016/05/31
 417     COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1`
 418     # Check that this is likely to be the Solaris Studio cc.
 419     $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.* Sun $COMPILER_NAME" > /dev/null
 420     if test $? -ne 0; then
 421       ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1`
 422       AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler.])
 423       AC_MSG_NOTICE([The result from running with -V was: "$COMPILER_VERSION_OUTPUT"])
 424       AC_MSG_NOTICE([The result from running with --version was: "$ALT_VERSION_OUTPUT"])
 425       AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
 426     fi
 427     # Remove usage instructions (if present), and
 428     # collapse compiler output into a single line
 429     COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \
 430         $SED -e 's/ *@<:@Uu@:>@sage:.*//'`
 431     COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
 432         $SED -e "s/^.*@<:@ ,\t@:>@$COMPILER_NAME@<:@ ,\t@:>@\(@<:@1-9@:>@\.@<:@0-9@:>@@<:@0-9@:>@*\).*/\1/"`
 433   elif test  "x$TOOLCHAIN_TYPE" = xxlc; then
 434     # xlc -qversion output typically looks like
 435     #     IBM XL C/C++ for AIX, V11.1 (5724-X13)
 436     #     Version: 11.01.0000.0015
 437     COMPILER_VERSION_OUTPUT=`$COMPILER -qversion 2>&1`
 438     # Check that this is likely to be the IBM XL C compiler.
 439     $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "IBM XL C" > /dev/null
 440     if test $? -ne 0; then
 441       ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1`
 442       AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler.])
 443       AC_MSG_NOTICE([The result from running with -qversion was: "$COMPILER_VERSION_OUTPUT"])
 444       AC_MSG_NOTICE([The result from running with --version was: "$ALT_VERSION_OUTPUT"])
 445       AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
 446     fi
 447     # Collapse compiler output into a single line
 448     COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT`
 449     COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
 450         $SED -e 's/^.*, V\(@<:@1-9@:>@@<:@0-9.@:>@*\).*$/\1/'`
 451   elif test  "x$TOOLCHAIN_TYPE" = xmicrosoft; then
 452     # There is no specific version flag, but all output starts with a version string.
 453     # First line typically looks something like:
 454     # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
 455     # but the compiler name may vary depending on locale.
 456     COMPILER_VERSION_OUTPUT=`"$COMPILER" 2>&1 | $GREP -v 'ERROR.*UtilTranslatePathList' | $HEAD -n 1 | $TR -d '\r'`
 457     # Check that this is likely to be Microsoft CL.EXE.
 458     $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Microsoft" > /dev/null
 459     if test $? -ne 0; then
 460       AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler.])
 461       AC_MSG_NOTICE([The result from running it was: "$COMPILER_VERSION_OUTPUT"])
 462       AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
 463     fi
 464     # Collapse compiler output into a single line
 465     COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT`
 466     COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
 467         $SED -e 's/^.*ersion.\(@<:@1-9@:>@@<:@0-9.@:>@*\) .*$/\1/'`
 468   elif test  "x$TOOLCHAIN_TYPE" = xgcc; then
 469     # gcc --version output typically looks like
 470     #     gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
 471     #     Copyright (C) 2013 Free Software Foundation, Inc.
 472     #     This is free software; see the source for copying conditions.  There is NO
 473     #     warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 474     COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1`
 475     # Check that this is likely to be GCC.
 476     $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Free Software Foundation" > /dev/null
 477     if test $? -ne 0; then
 478       AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler.])
 479       AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION"])
 480       AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
 481     fi
 482     # Remove Copyright and legalese from version string, and
 483     # collapse into a single line
 484     COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \
 485         $SED -e 's/ *Copyright .*//'`
 486     COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
 487         $SED -e 's/^.* \(@<:@1-9@:>@<:@0-9@:>@*\.@<:@0-9.@:>@*\)@<:@^0-9.@:>@.*$/\1/'`
 488   elif test  "x$TOOLCHAIN_TYPE" = xclang; then
 489     # clang --version output typically looks like
 490     #    Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
 491     #    clang version 3.3 (tags/RELEASE_33/final)
 492     # or
 493     #    Debian clang version 3.2-7ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2)
 494     #    Target: x86_64-pc-linux-gnu
 495     #    Thread model: posix
 496     COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1`
 497     # Check that this is likely to be clang
 498     $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "clang" > /dev/null
 499     if test $? -ne 0; then
 500       AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler.])
 501       AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_OUTPUT"])
 502       AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.])
 503     fi
 504     # Collapse compiler output into a single line
 505     COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT`
 506     COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
 507         $SED -e 's/^.* version \(@<:@1-9@:>@@<:@0-9.@:>@*\).*$/\1/'`
 508   else
 509       AC_MSG_ERROR([Unknown toolchain type $TOOLCHAIN_TYPE.])
 510   fi
 511   # This sets CC_VERSION_NUMBER or CXX_VERSION_NUMBER. (This comment is a grep marker)
 512   $1_VERSION_NUMBER="$COMPILER_VERSION_NUMBER"
 513   # This sets CC_VERSION_STRING or CXX_VERSION_STRING. (This comment is a grep marker)
 514   $1_VERSION_STRING="$COMPILER_VERSION_STRING"
 515 
 516   AC_MSG_NOTICE([Using $TOOLCHAIN_TYPE $COMPILER_NAME compiler version $COMPILER_VERSION_NUMBER @<:@$COMPILER_VERSION_STRING@:>@])
 517 ])
 518 
 519 # Try to locate the given C or C++ compiler in the path, or otherwise.
 520 #
 521 # $1 = compiler to test (CC or CXX)
 522 # $2 = human readable name of compiler (C or C++)
 523 # $3 = compiler name to search for
 524 AC_DEFUN([TOOLCHAIN_FIND_COMPILER],
 525 [
 526   COMPILER_NAME=$2
 527   SEARCH_LIST="$3"
 528 
 529   if test "x[$]$1" != x; then
 530     # User has supplied compiler name already, always let that override.
 531     AC_MSG_NOTICE([Will use user supplied compiler $1=[$]$1])
 532     if test "x`basename [$]$1`" = "x[$]$1"; then
 533       # A command without a complete path is provided, search $PATH.
 534 
 535       AC_PATH_PROGS(POTENTIAL_$1, [$]$1)
 536       if test "x$POTENTIAL_$1" != x; then
 537         $1=$POTENTIAL_$1
 538       else
 539         AC_MSG_ERROR([User supplied compiler $1=[$]$1 could not be found])
 540       fi
 541     else
 542       # Otherwise it might already be a complete path
 543       if test ! -x "[$]$1"; then
 544         AC_MSG_ERROR([User supplied compiler $1=[$]$1 does not exist])
 545       fi
 546     fi
 547   else
 548     # No user supplied value. Locate compiler ourselves.
 549 
 550     # If we are cross compiling, assume cross compilation tools follows the
 551     # cross compilation standard where they are prefixed with the autoconf
 552     # standard name for the target. For example the binary
 553     # i686-sun-solaris2.10-gcc will cross compile for i686-sun-solaris2.10.
 554     # If we are not cross compiling, then the default compiler name will be
 555     # used.
 556 
 557     $1=
 558     # If TOOLCHAIN_PATH is set, check for all compiler names in there first
 559     # before checking the rest of the PATH.
 560     # FIXME: Now that we prefix the TOOLS_DIR to the PATH in the PRE_DETECTION
 561     # step, this should not be necessary.
 562     if test -n "$TOOLCHAIN_PATH"; then
 563       PATH_save="$PATH"
 564       PATH="$TOOLCHAIN_PATH"
 565       AC_PATH_TOOL(TOOLCHAIN_PATH_$1, $SEARCH_LIST)
 566       $1=$TOOLCHAIN_PATH_$1
 567       PATH="$PATH_save"
 568     fi
 569 
 570     # AC_PATH_TOOL can't be run multiple times with the same variable,
 571     # so create a new name for this run.
 572     if test "x[$]$1" = x; then
 573       AC_PATH_TOOL(POTENTIAL_$1, $SEARCH_LIST)
 574       $1=$POTENTIAL_$1
 575     fi
 576 
 577     if test "x[$]$1" = x; then
 578       HELP_MSG_MISSING_DEPENDENCY([devkit])
 579       AC_MSG_ERROR([Could not find a $COMPILER_NAME compiler. $HELP_MSG])
 580     fi
 581   fi
 582 
 583   # Now we have a compiler binary in $1. Make sure it's okay.
 584   UTIL_FIXUP_EXECUTABLE($1)
 585   TEST_COMPILER="[$]$1"
 586 
 587   AC_MSG_CHECKING([resolved symbolic links for $1])
 588   SYMLINK_ORIGINAL="$TEST_COMPILER"
 589   UTIL_REMOVE_SYMBOLIC_LINKS(SYMLINK_ORIGINAL)
 590   if test "x$TEST_COMPILER" = "x$SYMLINK_ORIGINAL"; then
 591     AC_MSG_RESULT([no symlink])
 592   else
 593     AC_MSG_RESULT([$SYMLINK_ORIGINAL])
 594 
 595     # We can't handle ccache by gcc wrappers, since we need to know if we're
 596     # using ccache. Instead ccache usage must be controlled by a configure option.
 597     COMPILER_BASENAME=`$BASENAME "$SYMLINK_ORIGINAL"`
 598     if test "x$COMPILER_BASENAME" = "xccache"; then
 599       AC_MSG_NOTICE([Please use --enable-ccache instead of providing a wrapped compiler.])
 600       AC_MSG_ERROR([$TEST_COMPILER is a symbolic link to ccache. This is not supported.])
 601     fi
 602   fi
 603 
 604   TOOLCHAIN_EXTRACT_COMPILER_VERSION([$1], [$COMPILER_NAME])
 605 ])
 606 
 607 # Retrieve the linker version number and store it in LD_VERSION_NUMBER
 608 # (as a dotted number), and
 609 # the full version string in LD_VERSION_STRING.
 610 #
 611 # $1 = linker to test (LD or BUILD_LD)
 612 # $2 = human readable name of linker (Linker or BuildLinker)
 613 AC_DEFUN([TOOLCHAIN_EXTRACT_LD_VERSION],
 614 [
 615   LINKER=[$]$1
 616   LINKER_NAME="$2"
 617 
 618   if test "x$TOOLCHAIN_TYPE" = xsolstudio; then
 619     # cc -Wl,-V output typically looks like
 620     #   ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.2329
 621 
 622     # solstudio cc requires us to have an existing file to pass as argument,
 623     # but it need not be a syntactically correct C file, so just use
 624     # ourself. :) The intermediate 'cat' is needed to stop ld from leaving
 625     # a lingering a.out (!).
 626     LINKER_VERSION_STRING=`$LD -Wl,-V $TOPDIR/configure 2>&1 | $CAT | $HEAD -n 1 | $SED -e 's/ld: //'`
 627     # Extract version number
 628     [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
 629         $SED -e 's/.* \([0-9][0-9]*\.[0-9][0-9]*\)-\([0-9][0-9]*\.[0-9][0-9]*\)/\1.\2/'` ]
 630   elif test  "x$TOOLCHAIN_TYPE" = xxlc; then
 631     LINKER_VERSION_STRING="Unknown"
 632     LINKER_VERSION_NUMBER="0.0"
 633   elif test  "x$TOOLCHAIN_TYPE" = xmicrosoft; then
 634     # There is no specific version flag, but all output starts with a version string.
 635     # First line typically looks something like:
 636     #   Microsoft (R) Incremental Linker Version 12.00.31101.0
 637     LINKER_VERSION_STRING=`$LD 2>&1 | $HEAD -n 1 | $TR -d '\r'`
 638     # Extract version number
 639     [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
 640         $SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*/\1/'` ]
 641   elif test  "x$TOOLCHAIN_TYPE" = xgcc; then
 642     # gcc -Wl,-version output typically looks like:
 643     #   GNU ld (GNU Binutils for Ubuntu) 2.26.1
 644     #   Copyright (C) 2015 Free Software Foundation, Inc.
 645     #   This program is free software; [...]
 646     # If using gold it will look like:
 647     #   GNU gold (GNU Binutils 2.30) 1.15
 648     LINKER_VERSION_STRING=`$LD -Wl,--version 2> /dev/null | $HEAD -n 1`
 649     # Extract version number
 650     if [ [[ "$LINKER_VERSION_STRING" == *gold* ]] ]; then
 651       [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
 652           $SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*) .*/\1/'` ]
 653     else
 654       [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
 655           $SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*/\1/'` ]
 656     fi
 657   elif test  "x$TOOLCHAIN_TYPE" = xclang; then
 658     # clang -Wl,-v output typically looks like
 659     #   @(#)PROGRAM:ld  PROJECT:ld64-305
 660     #   configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
 661     #   Library search paths: [...]
 662     # or
 663     #   GNU ld (GNU Binutils for Ubuntu) 2.26.1
 664 
 665     LINKER_VERSION_STRING=`$LD -Wl,-v 2>&1 | $HEAD -n 1`
 666     # Check if we're using the GNU ld
 667     $ECHO "$LINKER_VERSION_STRING" | $GREP "GNU" > /dev/null
 668     if test $? -eq 0; then
 669       # Extract version number
 670       [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
 671           $SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*/\1/'` ]
 672     else
 673       # Extract version number
 674       [ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
 675           $SED -e 's/.*-\([0-9][0-9]*\)/\1/'` ]
 676     fi
 677   fi
 678 
 679   $1_VERSION_NUMBER="$LINKER_VERSION_NUMBER"
 680   $1_VERSION_STRING="$LINKER_VERSION_STRING"
 681 
 682   AC_MSG_NOTICE([Using $TOOLCHAIN_TYPE $LINKER_NAME version $LINKER_VERSION_NUMBER @<:@$LINKER_VERSION_STRING@:>@])
 683 ])
 684 
 685 # Detect the core components of the toolchain, i.e. the compilers (CC and CXX),
 686 # preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the
 687 # archiver (AR). Verify that the compilers are correct according to the
 688 # toolchain type.
 689 AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_CORE],
 690 [
 691   #
 692   # Setup the compilers (CC and CXX)
 693   #
 694   TOOLCHAIN_FIND_COMPILER([CC], [C], $TOOLCHAIN_CC_BINARY)
 695   # Now that we have resolved CC ourself, let autoconf have its go at it
 696   AC_PROG_CC([$CC])
 697 
 698   TOOLCHAIN_FIND_COMPILER([CXX], [C++], $TOOLCHAIN_CXX_BINARY)
 699   # Now that we have resolved CXX ourself, let autoconf have its go at it
 700   AC_PROG_CXX([$CXX])
 701 
 702   # This is the compiler version number on the form X.Y[.Z]
 703   AC_SUBST(CC_VERSION_NUMBER)
 704   AC_SUBST(CXX_VERSION_NUMBER)
 705 
 706   TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS
 707 
 708   if test "x$TOOLCHAIN_MINIMUM_VERSION" != x; then
 709     TOOLCHAIN_CHECK_COMPILER_VERSION(VERSION: $TOOLCHAIN_MINIMUM_VERSION,
 710         IF_OLDER_THAN: [
 711           AC_MSG_WARN([You are using $TOOLCHAIN_TYPE older than $TOOLCHAIN_MINIMUM_VERSION. This is not a supported configuration.])
 712         ]
 713     )
 714   fi
 715 
 716   #
 717   # Setup the preprocessor (CPP and CXXCPP)
 718   #
 719   AC_PROG_CPP
 720   UTIL_FIXUP_EXECUTABLE(CPP)
 721   AC_PROG_CXXCPP
 722   UTIL_FIXUP_EXECUTABLE(CXXCPP)
 723 
 724   #
 725   # Setup the linker (LD)
 726   #
 727   if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
 728     # In the Microsoft toolchain we have a separate LD command "link".
 729     # Make sure we reject /usr/bin/link (as determined in CYGWIN_LINK), which is
 730     # a cygwin program for something completely different.
 731     AC_CHECK_PROG([LD], [link$EXE_SUFFIX],[link$EXE_SUFFIX],,, [$CYGWIN_LINK])
 732     UTIL_FIXUP_EXECUTABLE(LD)
 733     # Verify that we indeed succeeded with this trick.
 734     AC_MSG_CHECKING([if the found link.exe is actually the Visual Studio linker])
 735     "$LD" --version > /dev/null
 736     if test $? -eq 0 ; then
 737       AC_MSG_RESULT([no])
 738       AC_MSG_ERROR([This is the Cygwin link tool. Please check your PATH and rerun configure.])
 739     else
 740       AC_MSG_RESULT([yes])
 741     fi
 742     LDCXX="$LD"
 743     # jaotc being a windows program expects the linker to be supplied with exe suffix.
 744     LD_JAOTC="$LD$EXE_SUFFIX"
 745   else
 746     # All other toolchains use the compiler to link.
 747     LD="$CC"
 748     LDCXX="$CXX"
 749     # jaotc expects 'ld' as the linker rather than the compiler.
 750     UTIL_CHECK_TOOLS([LD_JAOTC], ld)
 751     UTIL_FIXUP_EXECUTABLE(LD_JAOTC)
 752   fi
 753   AC_SUBST(LD)
 754   AC_SUBST(LD_JAOTC)
 755   # FIXME: it should be CXXLD, according to standard (cf CXXCPP)
 756   AC_SUBST(LDCXX)
 757 
 758   TOOLCHAIN_EXTRACT_LD_VERSION([LD], [linker])
 759   TOOLCHAIN_PREPARE_FOR_LD_VERSION_COMPARISONS
 760 
 761   if test "x$TOOLCHAIN_MINIMUM_LD_VERSION" != x; then
 762     TOOLCHAIN_CHECK_LINKER_VERSION(VERSION: $TOOLCHAIN_MINIMUM_LD_VERSION,
 763         IF_OLDER_THAN: [
 764           AC_MSG_WARN([You are using a linker older than $TOOLCHAIN_MINIMUM_LD_VERSION. This is not a supported configuration.])
 765         ]
 766     )
 767   fi
 768 
 769   #
 770   # Setup the assembler (AS)
 771   #
 772   if test "x$OPENJDK_TARGET_OS" = xsolaris; then
 773     UTIL_PATH_PROGS(AS, as)
 774     UTIL_FIXUP_EXECUTABLE(AS)
 775     if test "x$AS" = x; then
 776       AC_MSG_ERROR([Solaris assembler (as) is required. Please install via "pkg install pkg:/developer/assembler".])
 777     fi
 778   else
 779     # FIXME: is this correct for microsoft?
 780     AS="$CC -c"
 781   fi
 782   AC_SUBST(AS)
 783 
 784   #
 785   # Setup the archiver (AR)
 786   #
 787   if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
 788     # The corresponding ar tool is lib.exe (used to create static libraries)
 789     AC_CHECK_PROG([AR], [lib$EXE_SUFFIX],[lib$EXE_SUFFIX],,,)
 790   elif test "x$TOOLCHAIN_TYPE" = xgcc; then
 791     UTIL_CHECK_TOOLS(AR, ar gcc-ar)
 792   else
 793     UTIL_CHECK_TOOLS(AR, ar)
 794   fi
 795   UTIL_FIXUP_EXECUTABLE(AR)
 796 ])
 797 
 798 # Setup additional tools that is considered a part of the toolchain, but not the
 799 # core part. Many of these are highly platform-specific and do not exist,
 800 # and/or are not needed on all platforms.
 801 AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA],
 802 [
 803   if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
 804     UTIL_PATH_PROGS(LIPO, lipo)
 805     UTIL_FIXUP_EXECUTABLE(LIPO)
 806     UTIL_REQUIRE_PROGS(OTOOL, otool)
 807     UTIL_FIXUP_EXECUTABLE(OTOOL)
 808     UTIL_REQUIRE_PROGS(INSTALL_NAME_TOOL, install_name_tool)
 809     UTIL_FIXUP_EXECUTABLE(INSTALL_NAME_TOOL)
 810   fi
 811 
 812   if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
 813     AC_CHECK_PROG([MT], [mt$EXE_SUFFIX], [mt$EXE_SUFFIX],,, [/usr/bin/mt])
 814     UTIL_FIXUP_EXECUTABLE(MT)
 815     # Setup the resource compiler (RC)
 816     AC_CHECK_PROG([RC], [rc$EXE_SUFFIX], [rc$EXE_SUFFIX],,, [/usr/bin/rc])
 817     UTIL_FIXUP_EXECUTABLE(RC)
 818     AC_CHECK_PROG([DUMPBIN], [dumpbin$EXE_SUFFIX], [dumpbin$EXE_SUFFIX],,,)
 819     UTIL_FIXUP_EXECUTABLE(DUMPBIN)
 820     # We need to check for 'msbuild.exe' because at the place where we expect to
 821     # find 'msbuild.exe' there's also a directory called 'msbuild' and configure
 822     # won't find the 'msbuild.exe' executable in that case (and the
 823     # 'ac_executable_extensions' is unusable due to performance reasons).
 824     # Notice that we intentionally don't fix up the path to MSBUILD because we
 825     # will call it in a DOS shell during freetype detection on Windows (see
 826     # 'LIB_SETUP_FREETYPE' in "libraries.m4"
 827     AC_CHECK_PROG([MSBUILD], [msbuild$EXE_SUFFIX], [msbuild$EXE_SUFFIX],,,)
 828   fi
 829 
 830   if test "x$OPENJDK_TARGET_OS" = xsolaris; then
 831     UTIL_PATH_PROGS(STRIP, strip)
 832     UTIL_FIXUP_EXECUTABLE(STRIP)
 833     UTIL_PATH_PROGS(NM, nm)
 834     UTIL_FIXUP_EXECUTABLE(NM)
 835     UTIL_PATH_PROGS(GNM, gnm)
 836     UTIL_FIXUP_EXECUTABLE(GNM)
 837   elif test "x$OPENJDK_TARGET_OS" != xwindows; then
 838     # FIXME: we should unify this with the solaris case above.
 839     UTIL_CHECK_TOOLS(STRIP, strip)
 840     UTIL_FIXUP_EXECUTABLE(STRIP)
 841     if test "x$TOOLCHAIN_TYPE" = xgcc; then
 842       UTIL_CHECK_TOOLS(NM, nm gcc-nm)
 843     else
 844       UTIL_CHECK_TOOLS(NM, nm)
 845     fi
 846     UTIL_FIXUP_EXECUTABLE(NM)
 847     GNM="$NM"
 848     AC_SUBST(GNM)
 849   fi
 850 
 851   # objcopy is used for moving debug symbols to separate files when
 852   # full debug symbols are enabled.
 853   if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then
 854     UTIL_CHECK_TOOLS(OBJCOPY, [gobjcopy objcopy])
 855     # Only call fixup if objcopy was found.
 856     if test -n "$OBJCOPY"; then
 857       UTIL_FIXUP_EXECUTABLE(OBJCOPY)
 858       if test "x$OPENJDK_BUILD_OS" = xsolaris; then
 859         # objcopy prior to 2.21.1 on solaris is broken and is not usable.
 860         # Rewrite objcopy version output to VALID_VERSION or BAD_VERSION.
 861         # - version number is last blank separate word on first line
 862         # - version number formats that have been seen:
 863         #   - <major>.<minor>
 864         #   - <major>.<minor>.<micro>
 865         OBJCOPY_VERSION=`$OBJCOPY --version | $HEAD -n 1`
 866         # The outer [ ] is to prevent m4 from eating the [] in the sed expression.
 867         [ OBJCOPY_VERSION_CHECK=`$ECHO $OBJCOPY_VERSION | $SED -n \
 868               -e 's/.* //' \
 869               -e '/^[01]\./b bad' \
 870               -e '/^2\./{' \
 871               -e '  s/^2\.//' \
 872               -e '  /^[0-9]$/b bad' \
 873               -e '  /^[0-9]\./b bad' \
 874               -e '  /^1[0-9]$/b bad' \
 875               -e '  /^1[0-9]\./b bad' \
 876               -e '  /^20\./b bad' \
 877               -e '  /^21\.0$/b bad' \
 878               -e '  /^21\.0\./b bad' \
 879               -e '}' \
 880               -e ':good' \
 881               -e 's/.*/VALID_VERSION/p' \
 882               -e 'q' \
 883               -e ':bad' \
 884               -e 's/.*/BAD_VERSION/p' \
 885               -e 'q'` ]
 886         if test "x$OBJCOPY_VERSION_CHECK" = xBAD_VERSION; then
 887           OBJCOPY=
 888           AC_MSG_WARN([Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated.])
 889           AC_MSG_NOTICE([objcopy reports version $OBJCOPY_VERSION])
 890           AC_MSG_NOTICE([Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version])
 891           AC_MSG_NOTICE([Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version])
 892           AC_MSG_NOTICE([Note: Solaris 11 Update 1 contains the correct version])
 893         fi
 894       fi
 895     fi
 896   fi
 897 
 898   UTIL_CHECK_TOOLS(OBJDUMP, [gobjdump objdump])
 899   if test "x$OBJDUMP" != x; then
 900     # Only used for compare.sh; we can live without it. UTIL_FIXUP_EXECUTABLE
 901     # bails if argument is missing.
 902     UTIL_FIXUP_EXECUTABLE(OBJDUMP)
 903   fi
 904 
 905   case $TOOLCHAIN_TYPE in
 906     gcc|clang|solstudio)
 907       UTIL_CHECK_TOOLS(CXXFILT, [c++filt])
 908       UTIL_CHECK_NONEMPTY(CXXFILT)
 909       UTIL_FIXUP_EXECUTABLE(CXXFILT)
 910       ;;
 911   esac
 912 ])
 913 
 914 # Setup the build tools (i.e, the compiler and linker used to build programs
 915 # that should be run on the build platform, not the target platform, as a build
 916 # helper). Since the non-cross-compile case uses the normal, target compilers
 917 # for this, we can only do this after these have been setup.
 918 AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],
 919 [
 920   if test "x$COMPILE_TYPE" = "xcross"; then
 921     # Now we need to find a C/C++ compiler that can build executables for the
 922     # build platform. We can't use the AC_PROG_CC macro, since it can only be
 923     # used once. Also, we need to do this without adding a tools dir to the
 924     # path, otherwise we might pick up cross-compilers which don't use standard
 925     # naming.
 926 
 927     OLDPATH="$PATH"
 928 
 929     AC_ARG_WITH(build-devkit, [AS_HELP_STRING([--with-build-devkit],
 930         [Devkit to use for the build platform toolchain])])
 931     if test "x$with_build_devkit" = "xyes"; then
 932       AC_MSG_ERROR([--with-build-devkit must have a value])
 933     elif test -n "$with_build_devkit"; then
 934       if test ! -d "$with_build_devkit"; then
 935         AC_MSG_ERROR([--with-build-devkit points to non existing dir: $with_build_devkit])
 936       else
 937         UTIL_FIXUP_PATH([with_build_devkit])
 938         BUILD_DEVKIT_ROOT="$with_build_devkit"
 939         # Check for a meta data info file in the root of the devkit
 940         if test -f "$BUILD_DEVKIT_ROOT/devkit.info"; then
 941           # Process devkit.info so that existing devkit variables are not
 942           # modified by this
 943           $SED -e "s/^DEVKIT_/BUILD_DEVKIT_/g" \
 944               -e "s/\$DEVKIT_ROOT/\$BUILD_DEVKIT_ROOT/g" \
 945               -e "s/\$host/\$build/g" \
 946               $BUILD_DEVKIT_ROOT/devkit.info \
 947               > $CONFIGURESUPPORT_OUTPUTDIR/build-devkit.info
 948           . $CONFIGURESUPPORT_OUTPUTDIR/build-devkit.info
 949           # This potentially sets the following:
 950           # A descriptive name of the devkit
 951           BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_NAME])
 952           # Corresponds to --with-extra-path
 953           BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_EXTRA_PATH])
 954           # Corresponds to --with-toolchain-path
 955           BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_TOOLCHAIN_PATH])
 956           # Corresponds to --with-sysroot
 957           BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_SYSROOT])
 958           # Skip the Window specific parts
 959         fi
 960 
 961         AC_MSG_CHECKING([for build platform devkit])
 962         if test "x$BUILD_DEVKIT_NAME" != x; then
 963           AC_MSG_RESULT([$BUILD_DEVKIT_NAME in $BUILD_DEVKIT_ROOT])
 964         else
 965           AC_MSG_RESULT([$BUILD_DEVKIT_ROOT])
 966         fi
 967 
 968         BUILD_SYSROOT="$BUILD_DEVKIT_SYSROOT"
 969 
 970          # Fallback default of just /bin if DEVKIT_PATH is not defined
 971         if test "x$BUILD_DEVKIT_TOOLCHAIN_PATH" = x; then
 972           BUILD_DEVKIT_TOOLCHAIN_PATH="$BUILD_DEVKIT_ROOT/bin"
 973         fi
 974         PATH="$BUILD_DEVKIT_TOOLCHAIN_PATH:$BUILD_DEVKIT_EXTRA_PATH"
 975       fi
 976     fi
 977 
 978     # FIXME: we should list the discovered compilers as an exclude pattern!
 979     # If we do that, we can do this detection before POST_DETECTION, and still
 980     # find the build compilers in the tools dir, if needed.
 981     UTIL_REQUIRE_PROGS(BUILD_CC, [cl cc gcc])
 982     UTIL_FIXUP_EXECUTABLE(BUILD_CC)
 983     UTIL_REQUIRE_PROGS(BUILD_CXX, [cl CC g++])
 984     UTIL_FIXUP_EXECUTABLE(BUILD_CXX)
 985     UTIL_PATH_PROGS(BUILD_NM, nm gcc-nm)
 986     UTIL_FIXUP_EXECUTABLE(BUILD_NM)
 987     UTIL_PATH_PROGS(BUILD_AR, ar gcc-ar)
 988     UTIL_FIXUP_EXECUTABLE(BUILD_AR)
 989     UTIL_PATH_PROGS(BUILD_OBJCOPY, objcopy)
 990     UTIL_FIXUP_EXECUTABLE(BUILD_OBJCOPY)
 991     UTIL_PATH_PROGS(BUILD_STRIP, strip)
 992     UTIL_FIXUP_EXECUTABLE(BUILD_STRIP)
 993     # Assume the C compiler is the assembler
 994     BUILD_AS="$BUILD_CC -c"
 995     # Just like for the target compiler, use the compiler as linker
 996     BUILD_LD="$BUILD_CC"
 997     BUILD_LDCXX="$BUILD_CXX"
 998 
 999     PATH="$OLDPATH"
1000 
1001     TOOLCHAIN_EXTRACT_COMPILER_VERSION(BUILD_CC, [BuildC])
1002     TOOLCHAIN_EXTRACT_COMPILER_VERSION(BUILD_CXX, [BuildC++])
1003     TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS([BUILD_], [OPENJDK_BUILD_], [build ])
1004     TOOLCHAIN_EXTRACT_LD_VERSION(BUILD_LD, [build linker])
1005     TOOLCHAIN_PREPARE_FOR_LD_VERSION_COMPARISONS([BUILD_], [OPENJDK_BUILD_])
1006   else
1007     # If we are not cross compiling, use the normal target compilers for
1008     # building the build platform executables.
1009     BUILD_CC="$CC"
1010     BUILD_CXX="$CXX"
1011     BUILD_LD="$LD"
1012     BUILD_LDCXX="$LDCXX"
1013     BUILD_NM="$NM"
1014     BUILD_AS="$AS"
1015     BUILD_OBJCOPY="$OBJCOPY"
1016     BUILD_STRIP="$STRIP"
1017     BUILD_AR="$AR"
1018 
1019     TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS([], [OPENJDK_BUILD_], [build ])
1020     TOOLCHAIN_PREPARE_FOR_LD_VERSION_COMPARISONS([BUILD_], [OPENJDK_BUILD_])
1021   fi
1022 
1023   AC_SUBST(BUILD_CC)
1024   AC_SUBST(BUILD_CXX)
1025   AC_SUBST(BUILD_LD)
1026   AC_SUBST(BUILD_LDCXX)
1027   AC_SUBST(BUILD_NM)
1028   AC_SUBST(BUILD_AS)
1029   AC_SUBST(BUILD_AR)
1030 ])
1031 
1032 # Do some additional checks on the detected tools.
1033 AC_DEFUN_ONCE([TOOLCHAIN_MISC_CHECKS],
1034 [
1035   # Check for extra potential brokenness.
1036   if test  "x$TOOLCHAIN_TYPE" = xmicrosoft; then
1037     # On Windows, double-check that we got the right compiler.
1038     CC_VERSION_OUTPUT=`$CC 2>&1 | $GREP -v 'ERROR.*UtilTranslatePathList' | $HEAD -n 1 | $TR -d '\r'`
1039     COMPILER_CPU_TEST=`$ECHO $CC_VERSION_OUTPUT | $SED -n "s/^.* \(.*\)$/\1/p"`
1040     if test "x$OPENJDK_TARGET_CPU" = "xx86"; then
1041       if test "x$COMPILER_CPU_TEST" != "x80x86" -a "x$COMPILER_CPU_TEST" != "xx86"; then
1042         AC_MSG_ERROR([Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for "$COMPILER_CPU_TEST"; expected "80x86" or "x86".])
1043       fi
1044     elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then
1045       if test "x$COMPILER_CPU_TEST" != "xx64"; then
1046         AC_MSG_ERROR([Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for "$COMPILER_CPU_TEST"; expected "x64".])
1047       fi
1048     fi
1049   fi
1050 
1051   if test "x$TOOLCHAIN_TYPE" = xgcc; then
1052     # If this is a --hash-style=gnu system, use --hash-style=both, why?
1053     HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'`
1054     # This is later checked when setting flags.
1055   fi
1056 
1057   if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
1058     # Check if linker has -z noexecstack.
1059     HAS_NOEXECSTACK=`$CC -Wl,--help 2>/dev/null | $GREP 'z noexecstack'`
1060     # This is later checked when setting flags.
1061   fi
1062 
1063   # Setup hotspot lecagy names for toolchains
1064   HOTSPOT_TOOLCHAIN_TYPE=$TOOLCHAIN_TYPE
1065   if test "x$TOOLCHAIN_TYPE" = xclang; then
1066     HOTSPOT_TOOLCHAIN_TYPE=gcc
1067   elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
1068     HOTSPOT_TOOLCHAIN_TYPE=visCPP
1069   fi
1070   AC_SUBST(HOTSPOT_TOOLCHAIN_TYPE)
1071 ])
1072 
1073 # Setup the JTReg Regression Test Harness.
1074 AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG],
1075 [
1076   AC_ARG_WITH(jtreg, [AS_HELP_STRING([--with-jtreg],
1077       [Regression Test Harness @<:@probed@:>@])])
1078 
1079   if test "x$with_jtreg" = xno; then
1080     # jtreg disabled
1081     AC_MSG_CHECKING([for jtreg test harness])
1082     AC_MSG_RESULT([no, disabled])
1083   elif test "x$with_jtreg" != xyes && test "x$with_jtreg" != x; then
1084     # An explicit path is specified, use it.
1085     JT_HOME="$with_jtreg"
1086     UTIL_FIXUP_PATH([JT_HOME])
1087     if test ! -d "$JT_HOME"; then
1088       AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not exist])
1089     fi
1090 
1091     if test ! -e "$JT_HOME/lib/jtreg.jar"; then
1092       AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg is not a valid jtreg home])
1093     fi
1094 
1095     JTREGEXE="$JT_HOME/bin/jtreg"
1096     if test ! -x "$JTREGEXE"; then
1097       AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not contain valid jtreg executable])
1098     fi
1099 
1100     AC_MSG_CHECKING([for jtreg test harness])
1101     AC_MSG_RESULT([$JT_HOME])
1102   else
1103     # Try to locate jtreg
1104     if test "x$JT_HOME" != x; then
1105       # JT_HOME set in environment, use it
1106       if test ! -d "$JT_HOME"; then
1107         AC_MSG_WARN([Ignoring JT_HOME pointing to invalid directory: $JT_HOME])
1108         JT_HOME=
1109       else
1110         if test ! -e "$JT_HOME/lib/jtreg.jar"; then
1111           AC_MSG_WARN([Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME])
1112           JT_HOME=
1113         elif test ! -x "$JT_HOME/bin/jtreg"; then
1114           AC_MSG_WARN([Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME])
1115           JT_HOME=
1116         else
1117           JTREGEXE="$JT_HOME/bin/jtreg"
1118           AC_MSG_NOTICE([Located jtreg using JT_HOME from environment])
1119         fi
1120       fi
1121     fi
1122 
1123     if test "x$JT_HOME" = x; then
1124       # JT_HOME is not set in environment, or was deemed invalid.
1125       # Try to find jtreg on path
1126       UTIL_PATH_PROGS(JTREGEXE, jtreg)
1127       if test "x$JTREGEXE" != x; then
1128         # That's good, now try to derive JT_HOME
1129         JT_HOME=`(cd $($DIRNAME $JTREGEXE)/.. && pwd)`
1130         if test ! -e "$JT_HOME/lib/jtreg.jar"; then
1131           AC_MSG_WARN([Ignoring jtreg from path since a valid jtreg home cannot be found])
1132           JT_HOME=
1133           JTREGEXE=
1134         else
1135           AC_MSG_NOTICE([Located jtreg using jtreg executable in path])
1136         fi
1137       fi
1138     fi
1139 
1140     AC_MSG_CHECKING([for jtreg test harness])
1141     if test "x$JT_HOME" != x; then
1142       AC_MSG_RESULT([$JT_HOME])
1143     else
1144       AC_MSG_RESULT([no, not found])
1145 
1146       if test "x$with_jtreg" = xyes; then
1147         AC_MSG_ERROR([--with-jtreg was specified, but no jtreg found.])
1148       fi
1149     fi
1150   fi
1151 
1152   UTIL_FIXUP_EXECUTABLE(JTREGEXE)
1153   UTIL_FIXUP_PATH(JT_HOME)
1154   AC_SUBST(JT_HOME)
1155   AC_SUBST(JTREGEXE)
1156 ])
1157 
1158 # Setup the JIB dependency resolver
1159 AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JIB],
1160 [
1161   AC_ARG_WITH(jib, [AS_HELP_STRING([--with-jib],
1162       [Jib dependency management tool @<:@not used@:>@])])
1163 
1164   if test "x$with_jib" = xno || test "x$with_jib" = x; then
1165     # jib disabled
1166     AC_MSG_CHECKING([for jib])
1167     AC_MSG_RESULT(no)
1168   elif test "x$with_jib" = xyes; then
1169     AC_MSG_ERROR([Must supply a value to --with-jib])
1170   else
1171     JIB_HOME="${with_jib}"
1172     AC_MSG_CHECKING([for jib])
1173     AC_MSG_RESULT(${JIB_HOME})
1174     if test ! -d "${JIB_HOME}"; then
1175       AC_MSG_ERROR([--with-jib must be a directory])
1176     fi
1177     JIB_JAR=$(ls ${JIB_HOME}/lib/jib-*.jar)
1178     if test ! -f "${JIB_JAR}"; then
1179       AC_MSG_ERROR([Could not find jib jar file in ${JIB_HOME}])
1180     fi
1181   fi
1182 
1183   AC_SUBST(JIB_HOME)
1184 ])