a006d7eae0
Co-authored-by: Mike Duigou <mduigou@openjdk.org> Reviewed-by: erikj
383 lines
13 KiB
Bash
383 lines
13 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2012, 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.
|
|
#
|
|
# 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.
|
|
#
|
|
|
|
if test "x$1" != xCHECKME; then
|
|
echo "ERROR: Calling this wrapper script directly is not supported."
|
|
echo "Use the 'configure' script in the top-level directory instead."
|
|
exit 1
|
|
fi
|
|
|
|
# The next argument is the absolute top-level directory path.
|
|
# The TOPDIR variable is passed on to configure.ac.
|
|
TOPDIR="$2"
|
|
# Remove these two arguments to get to the user supplied arguments
|
|
shift
|
|
shift
|
|
|
|
if test "x$BASH" = x; then
|
|
echo "Error: This script must be run using bash." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$TOPDIR" =~ .*[[:space:]]+.* ]]; then
|
|
echo "Error: Build path containing space character is not supported" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# Force autoconf to use bash. This also means we must disable autoconf re-exec.
|
|
export CONFIG_SHELL=$BASH
|
|
export _as_can_reexec=no
|
|
|
|
# Make sure all shell commands are executed with the C locale
|
|
export LC_ALL=C
|
|
|
|
if test "x$CUSTOM_CONFIG_DIR" != x; then
|
|
custom_hook=$CUSTOM_CONFIG_DIR/custom-hook.m4
|
|
if test ! -e $custom_hook; then
|
|
echo "CUSTOM_CONFIG_DIR ($CUSTOM_CONFIG_DIR) not pointing to a proper custom config dir."
|
|
echo "Error: Cannot continue" 1>&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
CURRENT_DIR=`pwd`
|
|
if test "x$CURRENT_DIR" = "x$TOPDIR"; then
|
|
# We are running configure from the src root.
|
|
# Create '.configure-support' under $TOPDIR/build
|
|
build_support_dir="$TOPDIR/build/.configure-support"
|
|
elif test "x$CURRENT_DIR" = "x$CUSTOM_ROOT"; then
|
|
# We are running configure from the custom root.
|
|
# Create '.configure-support' under $CUSTOM_ROOT/build
|
|
build_support_dir="$CUSTOM_ROOT/build/.configure-support"
|
|
else
|
|
# We are running configure from outside of the src dir.
|
|
# Create 'build_support_dir' in the current directory.
|
|
build_support_dir="$CURRENT_DIR/configure-support"
|
|
fi
|
|
|
|
conf_script_dir="$TOPDIR/make/autoconf"
|
|
generated_script="$build_support_dir/generated-configure.sh"
|
|
|
|
###
|
|
### Use autoconf to create a runnable configure script, if needed
|
|
###
|
|
|
|
autoconf_missing_help() {
|
|
APT_GET="`type -p apt-get 2> /dev/null`"
|
|
YUM="`type -p yum 2> /dev/null`"
|
|
BREW="`type -p brew 2> /dev/null`"
|
|
ZYPPER="`type -p zypper 2> /dev/null`"
|
|
CYGWIN="`type -p cygpath 2> /dev/null`"
|
|
UNAMEOUT="`uname 2> /dev/null`"
|
|
|
|
if test "x$ZYPPER" != x; then
|
|
PKGHANDLER_COMMAND="sudo zypper install autoconf"
|
|
elif test "x$APT_GET" != x; then
|
|
PKGHANDLER_COMMAND="sudo apt-get install autoconf"
|
|
elif test "x$YUM" != x; then
|
|
PKGHANDLER_COMMAND="sudo yum install autoconf"
|
|
elif test "x$BREW" != x; then
|
|
PKGHANDLER_COMMAND="brew install autoconf"
|
|
elif test "x$UNAMEOUT" == xAIX; then
|
|
echo "You might be able to fix this by installing autoconf from the 'AIX Toolbox for Linux Applications' (or compile it from the sources)."
|
|
elif test "x$CYGWIN" != x; then
|
|
PKGHANDLER_COMMAND="( cd <location of cygwin setup.exe> && cmd /c setup -q -P autoconf )"
|
|
fi
|
|
|
|
if test "x$PKGHANDLER_COMMAND" != x; then
|
|
echo "You might be able to fix this by running '$PKGHANDLER_COMMAND'."
|
|
fi
|
|
}
|
|
|
|
generate_configure_script() {
|
|
if test "x$AUTOCONF" != x; then
|
|
if test ! -x "$AUTOCONF"; then
|
|
echo
|
|
echo "The specified AUTOCONF variable does not point to a valid autoconf executable:"
|
|
echo "AUTOCONF=$AUTOCONF"
|
|
echo "Error: Cannot continue" 1>&2
|
|
exit 1
|
|
fi
|
|
else
|
|
AUTOCONF="`type -p autoconf 2> /dev/null`"
|
|
if test "x$AUTOCONF" = x; then
|
|
echo
|
|
echo "Autoconf is not found on the PATH ($PATH), and AUTOCONF is not set."
|
|
echo "You need autoconf to be able to generate a runnable configure script."
|
|
autoconf_missing_help
|
|
echo "Error: Cannot find autoconf" 1>&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
autoconf_version=`$AUTOCONF --version | head -1`
|
|
echo "Using autoconf at ${AUTOCONF} [$autoconf_version]"
|
|
|
|
if test "x$CUSTOM_CONFIG_DIR" != x; then
|
|
# Generate configure script with custom hooks compiled in.
|
|
custom_patcher='sed -e "s|#CUSTOM_AUTOCONF_INCLUDE|m4_include([$custom_hook])|"'
|
|
custom_script_dir_include="-I$CUSTOM_CONFIG_DIR"
|
|
else
|
|
custom_patcher='cat'
|
|
custom_script_dir_include=""
|
|
fi
|
|
|
|
mkdir -p $build_support_dir
|
|
# Call autoconf but replace the "magic" variable in configure.ac if requested.
|
|
|
|
cat $conf_script_dir/configure.ac | eval $custom_patcher | \
|
|
${AUTOCONF} -W all $custom_script_dir_include -I$conf_script_dir - \
|
|
> $generated_script
|
|
rm -rf autom4te.cache
|
|
|
|
# Sanity check
|
|
if test ! -s $generated_script; then
|
|
echo "Error: Failed to generate runnable configure script" 1>&2
|
|
rm -f $generated_script
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
test_generated_up_to_date() {
|
|
conf_source_files="$conf_script_dir/configure.ac $conf_script_dir/*.m4"
|
|
if test "x$CUSTOM_CONFIG_DIR" != x; then
|
|
conf_custom_source_files="$CUSTOM_CONFIG_DIR/*.m4"
|
|
else
|
|
conf_custom_source_files=""
|
|
fi
|
|
|
|
for file in $conf_source_files $conf_custom_source_files ; do
|
|
if test $file -nt $generated_script; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
run_autoconf=false
|
|
if test "x$1" = xautogen; then
|
|
# User called us as "configure autogen", so force regeneration
|
|
run_autoconf=true
|
|
shift
|
|
fi
|
|
|
|
if test ! -s $generated_script; then
|
|
# Generated script is missing, so we need to create it
|
|
echo "Runnable configure script is not present"
|
|
run_autoconf=true
|
|
else
|
|
# File is present, but is it up to date?
|
|
if test_generated_up_to_date; then
|
|
echo "Runnable configure script is not up to date"
|
|
run_autoconf=true
|
|
fi
|
|
fi
|
|
|
|
if test "x$run_autoconf" = xtrue; then
|
|
echo "Generating runnable configure script at $generated_script"
|
|
generate_configure_script
|
|
fi
|
|
|
|
# Autoconf calls the configure script recursively sometimes.
|
|
# Don't start logging twice in that case
|
|
if test "x$conf_debug_configure" = xtrue; then
|
|
conf_debug_configure=recursive
|
|
fi
|
|
|
|
###
|
|
### Process command-line arguments
|
|
###
|
|
|
|
# Returns a shell-escaped version of the argument given.
|
|
function shell_quote() {
|
|
if [[ -n "$1" ]]; then
|
|
# Uses only shell-safe characters? No quoting needed.
|
|
# '=' is a zsh meta-character, but only in word-initial position.
|
|
if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \
|
|
&& ! echo "$1" | grep '^=' > /dev/null; then
|
|
quoted="$1"
|
|
else
|
|
if echo "$1" | grep "[\'!]" > /dev/null; then
|
|
# csh does history expansion within single quotes, but not
|
|
# when backslash-escaped!
|
|
local quoted_quote="'\\''" quoted_exclam="'\\!'"
|
|
word="${1//\'/${quoted_quote}}"
|
|
word="${1//\!/${quoted_exclam}}"
|
|
fi
|
|
quoted="'$1'"
|
|
fi
|
|
echo "$quoted"
|
|
fi
|
|
}
|
|
|
|
conf_processed_arguments=()
|
|
conf_quoted_arguments=()
|
|
conf_openjdk_target=
|
|
|
|
for conf_option
|
|
do
|
|
|
|
# Process (and remove) our own extensions that will not be passed to autoconf
|
|
case $conf_option in
|
|
--openjdk-target=*)
|
|
conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
|
|
;;
|
|
--debug-configure)
|
|
if test "x$conf_debug_configure" != xrecursive; then
|
|
conf_debug_configure=true
|
|
export conf_debug_configure
|
|
fi
|
|
;;
|
|
*)
|
|
conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
|
|
;;
|
|
esac
|
|
|
|
# Store all variables overridden on the command line
|
|
case $conf_option in
|
|
[^-]*=*)
|
|
# Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
|
|
conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
|
|
CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
|
|
;;
|
|
esac
|
|
|
|
# Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
|
|
case $conf_option in
|
|
*=*)
|
|
conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
|
|
conf_option_name=$(shell_quote "$conf_option_name")
|
|
conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
|
|
conf_option_value=$(shell_quote "$conf_option_value")
|
|
conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
|
|
;;
|
|
*)
|
|
conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
|
|
;;
|
|
esac
|
|
|
|
# Check for certain autoconf options that require extra action
|
|
case $conf_option in
|
|
-build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
|
|
conf_build_set=true ;;
|
|
-target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
|
|
conf_incompatible_crosscompile="$conf_incompatible_crosscompile $conf_option" ;;
|
|
-host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
|
|
conf_incompatible_crosscompile="$conf_incompatible_crosscompile $conf_option" ;;
|
|
-help | --help | --hel | --he | -h)
|
|
conf_print_help=true ;;
|
|
esac
|
|
done
|
|
|
|
# Save the quoted command line
|
|
CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
|
|
|
|
if test "x$conf_incompatible_crosscompile" != "x"; then
|
|
if test "x$conf_openjdk_target" != "x"; then
|
|
echo "Error: --openjdk-target was specified together with"
|
|
echo "incompatible autoconf cross-compilation flags."
|
|
echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_incompatible_crosscompile."
|
|
echo "It is recommended that you only use --openjdk-target."
|
|
exit 1
|
|
else
|
|
echo "Warning: You are using misleading autoconf cross-compilation flag(s)."
|
|
echo "This is not encouraged as use of such flags during building can"
|
|
echo "quickly become confusing."
|
|
echo "It is highly recommended that you use --openjdk-target instead."
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
if test "x$conf_openjdk_target" != "x"; then
|
|
conf_processed_arguments=("--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
|
|
|
|
# If --build has been explicitly set don't override that flag with our own
|
|
if test "x$conf_build_set" != xtrue; then
|
|
conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
|
|
conf_processed_arguments=("--build=$conf_build_platform" "${conf_processed_arguments[@]}")
|
|
fi
|
|
fi
|
|
|
|
# Make configure exit with error on invalid options as default.
|
|
# Can be overridden by --disable-option-checking, since we prepend our argument
|
|
# and later options override earlier.
|
|
conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
|
|
|
|
###
|
|
### Call the configure script
|
|
###
|
|
if test "x$conf_debug_configure" != x; then
|
|
# Turn on shell debug output if requested (initial or recursive)
|
|
set -x
|
|
fi
|
|
|
|
# Now transfer control to the script generated by autoconf. This is where the
|
|
# main work is done.
|
|
RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
|
|
trap "rm -rf \"$RCDIR\"" EXIT
|
|
conf_logfile=./configure.log
|
|
(exec 3>&1 ; ((. $generated_script "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \
|
|
; echo $? > "$RCDIR/rc" ) \
|
|
| tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
|
|
|
|
conf_result_code=`cat "$RCDIR/rc"`
|
|
###
|
|
### Post-processing
|
|
###
|
|
|
|
if test $conf_result_code -eq 0; then
|
|
if test "x$conf_print_help" = xtrue; then
|
|
cat <<EOT
|
|
|
|
Additional (non-autoconf) OpenJDK Options:
|
|
--openjdk-target=TARGET cross-compile with TARGET as target platform
|
|
(i.e. the one you will run the resulting binary on).
|
|
Equivalent to --host=TARGET --target=TARGET
|
|
--build=<current platform>, or the platform you
|
|
have provided if you have explicitly passed
|
|
--build to configure
|
|
--debug-configure Run the configure script with additional debug
|
|
logging enabled.
|
|
|
|
EOT
|
|
|
|
# Print additional help, e.g. a list of toolchains and JVM features.
|
|
# This must be done by the autoconf script.
|
|
( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $generated_script PRINTF=printf )
|
|
|
|
cat <<EOT
|
|
|
|
Please be aware that, when cross-compiling, the OpenJDK configure script will
|
|
generally use 'target' where autoconf traditionally uses 'host'.
|
|
|
|
Also note that variables must be passed on the command line. Variables in the
|
|
environment will generally be ignored, unlike traditional autoconf scripts.
|
|
EOT
|
|
fi
|
|
else
|
|
echo configure exiting with result code $conf_result_code
|
|
fi
|
|
|
|
exit $conf_result_code
|