| # | |
| # Copyright (c) 2011, 2025, 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, if the path cannot be resolved then errors will not be | |
| # reported and an empty path will be set | |
| 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 | |
| imported_path=`$FIXPATH_BASE -q import "$path"` | |
| if test $? -ne 0 || test ! -e $imported_path; then | |
| if test "x$2" != "xNOFAIL"; then | |
| AC_MSG_NOTICE([The path of $1, which is given as "$path", can not be properly resolved.]) | |
| AC_MSG_NOTICE([Please see the section "Special Considerations" in building.md.]) | |
| AC_MSG_NOTICE([This is the error message given by fixpath:]) | |
| # Rerun fixpath without -q to get an error message | |
| $FIXPATH_BASE import "$path" | |
| AC_MSG_ERROR([Cannot continue]) | |
| else | |
| imported_path="" | |
| fi | |
| fi | |
| $FIXPATH_BASE -q 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 verified.]) | |
| else | |
| imported_path="" | |
| fi | |
| fi | |
| [ imported_path_lower=`$ECHO $imported_path | $TR '[:upper:]' '[:lower:]'` ] | |
| [ orig_path_lower=`$ECHO $path | $TR '[:upper:]' '[:lower:]'` ] | |
| # If only case differs, keep original path | |
| if test "x$imported_path_lower" != "x$orig_path_lower"; then | |
| $1="$imported_path" | |
| fi | |
| else # non-Windows | |
| [ 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) | |
| 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 -q import "$path"` | |
| if test $? -ne 0 || 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 -q import "$input"` | |
| if test $? -ne 0 || test ! -e $new_path; then | |
| AC_MSG_NOTICE([The command for $1, which is given as "$input", can not be properly resolved.]) | |
| AC_MSG_NOTICE([Please see the section "Special Considerations" in building.md.]) | |
| AC_MSG_NOTICE([This is the error message given by fixpath:]) | |
| # Rerun fixpath without -q to get an error message | |
| $FIXPATH_BASE import "$input" | |
| AC_MSG_ERROR([Cannot continue]) | |
| 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 | |
| # 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 | |
| # Maybe the path had spaces in it; try again with the entire argument | |
| if test ! -x "$tool_override" && test ! -x "${tool_override}.exe"; then | |
| AC_MSG_ERROR([User supplied tool $1="$tool_override" does not exist or is not executable]) | |
| else | |
| # We successfully located the executable assuming the spaces were part of the path. | |
| # We can't combine using paths with spaces and arguments, so assume tool_args is empty. | |
| tool_command="$tool_override" | |
| tool_args="" | |
| fi | |
| fi | |
| if test ! -x "$tool_command"; then | |
| tool_command="${tool_command}.exe" | |
| fi | |
| $1="$tool_command" | |
| fi | |
| # Make sure we add fixpath if needed | |
| UTIL_FIXUP_EXECUTABLE($1) | |
| 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] | |
| 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 [[ $FIXPATH != "" && $result =~ ^"$FIXPATH " ]]; then ] | |
| result="\$FIXPATH ${result#"$FIXPATH "}" | |
| 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 | |
| ]) | |
| ################################################################################ | |
| # Return a path to the executable binary from a command line, stripping away | |
| # any FIXPATH prefix or arguments. The resulting value can be checked for | |
| # existence using "test -e". The result is returned in a variable named | |
| # "$1_EXECUTABLE". | |
| # | |
| # $1: variable describing the command to get the binary for | |
| AC_DEFUN([UTIL_GET_EXECUTABLE], | |
| [ | |
| # Strip the FIXPATH prefix, if any | |
| fixpath_stripped="[$]$1" | |
| [ if [[ $FIXPATH != "" && $fixpath_stripped =~ ^"$FIXPATH " ]]; then ] | |
| fixpath_stripped="${fixpath_stripped#"$FIXPATH "}" | |
| fi | |
| # Remove any arguments following the binary | |
| $1_EXECUTABLE="${fixpath_stripped%% *}" | |
| ]) | |
| ################################################################################ | |
| 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 | |
| ]) |