66945e5010
Reviewed-by: erikj
559 lines
19 KiB
Plaintext
559 lines
19 KiB
Plaintext
#
|
|
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
#
|
|
# This code is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License version 2 only, as
|
|
# published by the Free Software Foundation. Oracle designates this
|
|
# particular file as subject to the "Classpath" exception as provided
|
|
# by Oracle in the LICENSE file that accompanied this code.
|
|
#
|
|
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
# version 2 for more details (a copy is included in the LICENSE file that
|
|
# accompanied this code).
|
|
#
|
|
# You should have received a copy of the GNU General Public License version
|
|
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
# or visit www.oracle.com if you need additional information or have any
|
|
# questions.
|
|
#
|
|
|
|
################################################################################
|
|
# Appends a string to a path variable, only adding the : when needed.
|
|
AC_DEFUN([UTIL_APPEND_TO_PATH],
|
|
[
|
|
if test "x$2" != x; then
|
|
if test "x[$]$1" = x; then
|
|
$1="$2"
|
|
else
|
|
$1="[$]$1:$2"
|
|
fi
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# Prepends a string to a path variable, only adding the : when needed.
|
|
AC_DEFUN([UTIL_PREPEND_TO_PATH],
|
|
[
|
|
if test "x$2" != x; then
|
|
if test "x[$]$1" = x; then
|
|
$1="$2"
|
|
else
|
|
$1="$2:[$]$1"
|
|
fi
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# This will make sure the given variable points to a full and proper
|
|
# path. This means:
|
|
# 1) There will be no spaces in the path. On unix platforms,
|
|
# spaces in the path will result in an error. On Windows,
|
|
# the path will be rewritten using short-style to be space-free.
|
|
# 2) The path will be absolute, and it will be in unix-style (on
|
|
# cygwin).
|
|
# $1: The name of the variable to fix
|
|
# $2: if NOFAIL, errors will be silently ignored
|
|
AC_DEFUN([UTIL_FIXUP_PATH],
|
|
[
|
|
# Only process if variable expands to non-empty
|
|
path="[$]$1"
|
|
if test "x$path" != x; then
|
|
if test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
if test "x$2" = "xNOFAIL"; then
|
|
quiet_option="-q"
|
|
fi
|
|
imported_path=`$FIXPATH_BASE $quiet_option import "$path"`
|
|
$FIXPATH_BASE verify "$imported_path"
|
|
if test $? -ne 0; then
|
|
if test "x$2" != "xNOFAIL"; then
|
|
AC_MSG_ERROR([The path of $1, which resolves as "$path", could not be imported.])
|
|
else
|
|
imported_path=""
|
|
fi
|
|
fi
|
|
if test "x$imported_path" != "x$path"; then
|
|
$1="$imported_path"
|
|
fi
|
|
else
|
|
[ if [[ "$path" =~ " " ]]; then ]
|
|
if test "x$2" != "xNOFAIL"; then
|
|
AC_MSG_NOTICE([The path of $1, which resolves as "$path", is invalid.])
|
|
AC_MSG_ERROR([Spaces are not allowed in this path.])
|
|
else
|
|
path=""
|
|
fi
|
|
fi
|
|
|
|
# Use eval to expand a potential ~.
|
|
eval new_path="$path"
|
|
if test ! -e "$new_path"; then
|
|
if test "x$2" != "xNOFAIL"; then
|
|
AC_MSG_ERROR([The path of $1, which resolves as "$new_path", is not found.])
|
|
else
|
|
new_path=""
|
|
fi
|
|
fi
|
|
|
|
# Make the path absolute
|
|
if test "x$new_path" != x; then
|
|
if test -d "$new_path"; then
|
|
path="`cd "$new_path"; pwd -L`"
|
|
else
|
|
dir="`$DIRNAME "$new_path"`"
|
|
base="`$BASENAME "$new_path"`"
|
|
path="`cd "$dir"; pwd -L`/$base"
|
|
fi
|
|
else
|
|
path=""
|
|
fi
|
|
|
|
$1="$path"
|
|
fi
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# Fixup path to be a Windows full long path
|
|
# Note: Only supported with cygwin/msys2 (cygpath tool)
|
|
AC_DEFUN([UTIL_FIXUP_WIN_LONG_PATH],
|
|
[
|
|
# Only process if variable expands to non-empty
|
|
path="[$]$1"
|
|
if test "x$path" != x; then
|
|
if test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
win_path=$($PATHTOOL -wl "$path")
|
|
if test "x$win_path" != "x$path"; then
|
|
$1="$win_path"
|
|
fi
|
|
fi
|
|
fi
|
|
])
|
|
|
|
|
|
################################################################################
|
|
# Check if the given file is a unix-style or windows-style executable, that is,
|
|
# if it expects paths in unix-style or windows-style.
|
|
# Returns "windows" or "unix" in $RESULT.
|
|
AC_DEFUN([UTIL_CHECK_WINENV_EXEC_TYPE],
|
|
[
|
|
# For cygwin and msys2, if it's linked with the correct helper lib, it
|
|
# accept unix paths
|
|
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin" || \
|
|
test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys2"; then
|
|
linked_libs=`$LDD $1 2>&1`
|
|
if test $? -ne 0; then
|
|
# Non-binary files (e.g. shell scripts) are unix files
|
|
RESULT=unix
|
|
else
|
|
[ if [[ "$linked_libs" =~ $WINENV_MARKER_DLL ]]; then ]
|
|
RESULT=unix
|
|
else
|
|
RESULT=windows
|
|
fi
|
|
fi
|
|
elif test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
# On WSL, we can check if it is a PE file
|
|
file_type=`$FILE -b $1 2>&1`
|
|
[ if [[ $file_type =~ PE.*Windows ]]; then ]
|
|
RESULT=windows
|
|
else
|
|
RESULT=unix
|
|
fi
|
|
else
|
|
RESULT=unix
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# This will make sure the given variable points to a executable
|
|
# with a full and proper path. This means:
|
|
# 1) There will be no spaces in the path. On unix platforms,
|
|
# spaces in the path will result in an error. On Windows,
|
|
# the path will be rewritten using short-style to be space-free.
|
|
# 2) The path will be absolute, and it will be in unix-style (on
|
|
# cygwin).
|
|
# Any arguments given to the executable is preserved.
|
|
# If the input variable does not have a directory specification, then
|
|
# it need to be in the PATH.
|
|
# $1: The name of the variable to fix
|
|
# $2: Where to look for the command (replaces $PATH)
|
|
# $3: set to NOFIXPATH to skip prefixing FIXPATH, even if needed on platform
|
|
AC_DEFUN([UTIL_FIXUP_EXECUTABLE],
|
|
[
|
|
input="[$]$1"
|
|
|
|
# Only process if variable expands to non-empty
|
|
if test "x$input" != x; then
|
|
# First separate the path from the arguments. This will split at the first
|
|
# space.
|
|
[ if [[ "$OPENJDK_BUILD_OS" = "windows" && input =~ ^$FIXPATH ]]; then
|
|
line="${input#$FIXPATH }"
|
|
fixpath_prefix="$FIXPATH "
|
|
else
|
|
line="$input"
|
|
fixpath_prefix=""
|
|
fi ]
|
|
path="${line%% *}"
|
|
arguments="${line#"$path"}"
|
|
|
|
[ if ! [[ "$path" =~ /|\\ ]]; then ]
|
|
# This is a command without path (e.g. "gcc" or "echo")
|
|
command_type=`type -t "$path"`
|
|
if test "x$command_type" = xbuiltin || test "x$command_type" = xkeyword; then
|
|
# Shell builtin or keyword; we're done here
|
|
new_path="$path"
|
|
else
|
|
# Search in $PATH using bash built-in 'type -p'.
|
|
saved_path="$PATH"
|
|
if test "x$2" != x; then
|
|
PATH="$2"
|
|
fi
|
|
new_path=`type -p "$path"`
|
|
if test "x$new_path" = x && test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
# Try again with .exe
|
|
new_path="`type -p "$path.exe"`"
|
|
fi
|
|
PATH="$saved_path"
|
|
|
|
if test "x$new_path" = x; then
|
|
AC_MSG_NOTICE([The command for $1, which resolves as "$input", is not found in the PATH.])
|
|
AC_MSG_ERROR([Cannot locate $path])
|
|
fi
|
|
fi
|
|
else
|
|
# This is a path with slashes, don't look at $PATH
|
|
if test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
# fixpath.sh import will do all heavy lifting for us
|
|
new_path=`$FIXPATH_BASE import "$path"`
|
|
|
|
if test ! -e $new_path; then
|
|
# It failed, but maybe spaces were part of the path and not separating
|
|
# the command and argument. Retry using that assumption.
|
|
new_path=`$FIXPATH_BASE import "$input"`
|
|
if test ! -e $new_path; then
|
|
AC_MSG_NOTICE([The command for $1, which resolves as "$input", can not be found.])
|
|
AC_MSG_ERROR([Cannot locate $input])
|
|
fi
|
|
# It worked, clear all "arguments"
|
|
arguments=""
|
|
fi
|
|
else # on unix
|
|
# Make absolute
|
|
$1="$path"
|
|
UTIL_FIXUP_PATH($1, NOFAIL)
|
|
new_path="[$]$1"
|
|
|
|
if test ! -e $new_path; then
|
|
AC_MSG_NOTICE([The command for $1, which resolves as "$input", is not found])
|
|
[ if [[ "$path" =~ " " ]]; then ]
|
|
AC_MSG_NOTICE([This might be caused by spaces in the path, which is not allowed.])
|
|
fi
|
|
AC_MSG_ERROR([Cannot locate $path])
|
|
fi
|
|
if test ! -x $new_path; then
|
|
AC_MSG_NOTICE([The command for $1, which resolves as "$input", is not executable.])
|
|
AC_MSG_ERROR([Cannot execute command at $path])
|
|
fi
|
|
fi # end on unix
|
|
fi # end with or without slashes
|
|
|
|
# Now we have a usable command as new_path, with arguments in arguments
|
|
if test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
if test "x$fixpath_prefix" = x; then
|
|
# Only mess around if fixpath_prefix was not given
|
|
UTIL_CHECK_WINENV_EXEC_TYPE("$new_path")
|
|
if test "x$RESULT" = xwindows; then
|
|
fixpath_prefix="$FIXPATH "
|
|
# make sure we have an .exe suffix (but not two)
|
|
new_path="${new_path%.exe}.exe"
|
|
else
|
|
# If we have gotten a .exe suffix, remove it
|
|
new_path="${new_path%.exe}"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if test "x$3" = xNOFIXPATH; then
|
|
fixpath_prefix=""
|
|
fi
|
|
|
|
# Now join together the path and the arguments once again
|
|
new_complete="$fixpath_prefix$new_path$arguments"
|
|
$1="$new_complete"
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# Setup a tool for the given variable. If correctly specified by the user,
|
|
# use that value, otherwise search for the tool using the supplied code snippet.
|
|
# $1: variable to set
|
|
# $2: code snippet to call to look for the tool
|
|
# $3: code snippet to call if variable was used to find tool
|
|
AC_DEFUN([UTIL_SETUP_TOOL],
|
|
[
|
|
# Publish this variable in the help.
|
|
AC_ARG_VAR($1, [Override default value for $1])
|
|
|
|
if [[ -z "${$1+x}" ]]; then
|
|
# The variable is not set by user, try to locate tool using the code snippet
|
|
$2
|
|
else
|
|
# The variable is set, but is it from the command line or the environment?
|
|
|
|
# Try to remove the string !$1! from our list.
|
|
try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!$1!/}
|
|
if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
|
|
# If it failed, the variable was not from the command line. Ignore it,
|
|
# but warn the user (except for BASH, which is always set by the calling BASH).
|
|
if test "x$1" != xBASH; then
|
|
AC_MSG_WARN([Ignoring value of $1 from the environment. Use command line variables instead.])
|
|
fi
|
|
# Try to locate tool using the code snippet
|
|
$2
|
|
else
|
|
# If it succeeded, then it was overridden by the user. We will use it
|
|
# for the tool.
|
|
|
|
# First remove it from the list of overridden variables, so we can test
|
|
# for unknown variables in the end.
|
|
CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
|
|
|
|
tool_override=[$]$1
|
|
|
|
# Check if we try to supply an empty value
|
|
if test "x$tool_override" = x; then
|
|
AC_MSG_CHECKING([for $1])
|
|
AC_MSG_RESULT([[[disabled by user]]])
|
|
else
|
|
# Split up override in command part and argument part
|
|
tool_and_args=($tool_override)
|
|
[ tool_command=${tool_and_args[0]} ]
|
|
[ unset 'tool_and_args[0]' ]
|
|
[ tool_args=${tool_and_args[@]} ]
|
|
|
|
# Check if the provided tool contains a complete path.
|
|
tool_basename="${tool_command##*/}"
|
|
if test "x$tool_basename" = "x$tool_command"; then
|
|
# A command without a complete path is provided, search $PATH.
|
|
AC_MSG_NOTICE([Will search for user supplied tool "$tool_basename"])
|
|
AC_PATH_PROGS($1, $tool_basename ${tool_basename}.exe)
|
|
tool_command="[$]$1"
|
|
if test "x$tool_command" = x; then
|
|
AC_MSG_ERROR([User supplied tool $1="$tool_basename" could not be found in PATH])
|
|
fi
|
|
else
|
|
# Otherwise we believe it is a complete path. Use it as it is.
|
|
if test ! -x "$tool_command" && test ! -x "${tool_command}.exe"; then
|
|
AC_MSG_ERROR([User supplied tool $1="$tool_command" does not exist or is not executable])
|
|
fi
|
|
if test ! -x "$tool_command"; then
|
|
tool_command="${tool_command}.exe"
|
|
fi
|
|
$1="$tool_command"
|
|
fi
|
|
if test "x$tool_args" != x; then
|
|
# If we got arguments, re-append them to the command after the fixup.
|
|
$1="[$]$1 $tool_args"
|
|
fi
|
|
AC_MSG_CHECKING([for $1])
|
|
AC_MSG_RESULT([[$]$1 [[user supplied]]])
|
|
fi
|
|
fi
|
|
$3
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# Locate a tool using proper methods.
|
|
# $1: variable to set
|
|
# $2: executable name (or list of names) to look for
|
|
# $3: [path]
|
|
# $4: set to NOFIXPATH to skip prefixing FIXPATH, even if needed on platform
|
|
AC_DEFUN([UTIL_LOOKUP_PROGS],
|
|
[
|
|
UTIL_SETUP_TOOL($1, [
|
|
$1=""
|
|
|
|
if test "x$3" != x; then
|
|
old_path="$PATH"
|
|
PATH="$3"
|
|
fi
|
|
|
|
for name in $2; do
|
|
AC_MSG_CHECKING(for $name)
|
|
|
|
command_type=`type -t "$name"`
|
|
if test "x$command_type" = xbuiltin || test "x$command_type" = xkeyword; then
|
|
# Shell builtin or keyword; we're done here
|
|
full_path="$name"
|
|
$1="$full_path"
|
|
AC_MSG_RESULT([[$full_path [builtin]]])
|
|
break
|
|
else
|
|
# Search in $PATH
|
|
old_ifs="$IFS"
|
|
IFS=":"
|
|
for elem in $PATH; do
|
|
IFS="$old_ifs"
|
|
if test "x$elem" = x; then
|
|
continue
|
|
fi
|
|
full_path="$elem/$name"
|
|
if test ! -e "$full_path" && test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
|
# Try again with .exe
|
|
full_path="$elem/$name.exe"
|
|
fi
|
|
if test -x "$full_path" && test ! -d "$full_path" ; then
|
|
$1="$full_path"
|
|
UTIL_FIXUP_EXECUTABLE($1, $3, $4)
|
|
result="[$]$1"
|
|
|
|
# If we have FIXPATH enabled, strip all instances of it and prepend
|
|
# a single one, to avoid double fixpath prefixing.
|
|
if test "x$4" != xNOFIXPATH; then
|
|
[ if [[ $FIXPATH != "" && $result =~ ^"$FIXPATH " ]]; then ]
|
|
result="\$FIXPATH ${result#"$FIXPATH "}"
|
|
fi
|
|
fi
|
|
AC_MSG_RESULT([$result])
|
|
break 2;
|
|
fi
|
|
done
|
|
IFS="$old_ifs"
|
|
fi
|
|
AC_MSG_RESULT([[[not found]]])
|
|
done
|
|
|
|
if test "x$3" != x; then
|
|
PATH="$old_path"
|
|
fi
|
|
])
|
|
])
|
|
|
|
################################################################################
|
|
# Call UTIL_SETUP_TOOL with AC_CHECK_TOOLS to locate the tool. This will look
|
|
# first for cross-compilation tools.
|
|
# $1: variable to set
|
|
# $2: executable name (or list of names) to look for
|
|
# $3: [path]
|
|
AC_DEFUN([UTIL_LOOKUP_TOOLCHAIN_PROGS],
|
|
[
|
|
if test "x$ac_tool_prefix" = x; then
|
|
UTIL_LOOKUP_PROGS($1, $2, $3)
|
|
else
|
|
prefixed_names=$(for name in $2; do echo ${ac_tool_prefix}${name} $name; done)
|
|
UTIL_LOOKUP_PROGS($1, $prefixed_names, $3)
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# Test that variable $1 denoting a program is not empty. If empty, exit with an error.
|
|
# $1: variable to check
|
|
AC_DEFUN([UTIL_CHECK_NONEMPTY],
|
|
[
|
|
if test "x[$]$1" = x; then
|
|
AC_MSG_ERROR([Could not find required tool for $1])
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
# Like UTIL_LOOKUP_PROGS but fails if no tool was found.
|
|
# $1: variable to set
|
|
# $2: executable name (or list of names) to look for
|
|
# $3: [path]
|
|
AC_DEFUN([UTIL_REQUIRE_PROGS],
|
|
[
|
|
UTIL_LOOKUP_PROGS($1, $2, $3)
|
|
UTIL_CHECK_NONEMPTY($1)
|
|
])
|
|
|
|
################################################################################
|
|
# Like UTIL_LOOKUP_PROGS but fails if no tool was found.
|
|
# $1: variable to set
|
|
# $2: executable name (or list of names) to look for
|
|
# $3: [path]
|
|
AC_DEFUN([UTIL_REQUIRE_TOOLCHAIN_PROGS],
|
|
[
|
|
UTIL_LOOKUP_TOOLCHAIN_PROGS($1, $2, $3)
|
|
UTIL_CHECK_NONEMPTY($1)
|
|
])
|
|
|
|
|
|
################################################################################
|
|
# Like UTIL_SETUP_TOOL but fails if no tool was found.
|
|
# $1: variable to set
|
|
# $2: autoconf macro to call to look for the special tool
|
|
AC_DEFUN([UTIL_REQUIRE_SPECIAL],
|
|
[
|
|
UTIL_SETUP_TOOL($1, [$2])
|
|
UTIL_CHECK_NONEMPTY($1)
|
|
# The special macro will return an absolute path, and is only used for
|
|
# unix tools. No further processing needed.
|
|
])
|
|
|
|
################################################################################
|
|
# Add FIXPATH prefix to variable. Normally this is done by UTIL_LOOKUP_PROGS
|
|
# or UTIL_FIXUP_EXECUTABLE, but in some circumstances this has to be done
|
|
# explicitly, such as when the command in question does not exist yet.
|
|
#
|
|
# $1: variable to add fixpath to
|
|
AC_DEFUN([UTIL_ADD_FIXPATH],
|
|
[
|
|
if test "x$FIXPATH" != x; then
|
|
$1="$FIXPATH [$]$1"
|
|
fi
|
|
])
|
|
|
|
################################################################################
|
|
AC_DEFUN([UTIL_REMOVE_SYMBOLIC_LINKS],
|
|
[
|
|
if test "x$OPENJDK_BUILD_OS" != xwindows; then
|
|
# Follow a chain of symbolic links. Use readlink
|
|
# where it exists, else fall back to horribly
|
|
# complicated shell code.
|
|
if test "x$READLINK_TESTED" != yes; then
|
|
# On MacOSX there is a readlink tool with a different
|
|
# purpose than the GNU readlink tool. Check the found readlink.
|
|
READLINK_ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
|
# If READLINK_ISGNU is empty, then it's a non-GNU readlink. Don't use it.
|
|
READLINK_TESTED=yes
|
|
fi
|
|
|
|
if test "x$READLINK" != x && test "x$READLINK_ISGNU" != x; then
|
|
$1=`$READLINK -f [$]$1`
|
|
else
|
|
# Save the current directory for restoring afterwards
|
|
STARTDIR=$PWD
|
|
COUNTER=0
|
|
sym_link_dir=`$DIRNAME [$]$1`
|
|
sym_link_file=`$BASENAME [$]$1`
|
|
cd $sym_link_dir
|
|
# Use -P flag to resolve symlinks in directories.
|
|
cd `pwd -P`
|
|
sym_link_dir=`pwd -P`
|
|
# Resolve file symlinks
|
|
while test $COUNTER -lt 20; do
|
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP -e '->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
|
if test "x$ISLINK" == x; then
|
|
# This is not a symbolic link! We are done!
|
|
break
|
|
fi
|
|
# Again resolve directory symlinks since the target of the just found
|
|
# link could be in a different directory
|
|
cd `$DIRNAME $ISLINK`
|
|
sym_link_dir=`pwd -P`
|
|
sym_link_file=`$BASENAME $ISLINK`
|
|
let COUNTER=COUNTER+1
|
|
done
|
|
cd $STARTDIR
|
|
$1=$sym_link_dir/$sym_link_file
|
|
fi
|
|
fi
|
|
])
|