#!/bin/bash # # Copyright (c) 2012, 2014, 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 "This script cannot be run directly." echo "Use the 'configure' script in the top-level directory instead." exit 1 fi # Now 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 conf_script_dir="$TOPDIR/common/autoconf" if [ "$CUSTOM_CONFIG_DIR" = "" ]; then conf_custom_script_dir="$TOPDIR/closed/autoconf" else conf_custom_script_dir="$CUSTOM_CONFIG_DIR" fi ### ### Test that the generated configure is up-to-date ### run_autogen_or_fail() { if test "x`which autoconf 2> /dev/null`" = x; then echo "Cannot locate autoconf, unable to correct situation." echo "Please install autoconf and run 'bash autogen.sh' to update the generated files." echo "Error: Cannot continue" 1>&2 exit 1 else echo "Running autogen.sh to correct the situation" bash $conf_script_dir/autogen.sh fi } check_autoconf_timestamps() { for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do if test $file -nt $conf_script_dir/generated-configure.sh; then echo "Warning: The configure source files is newer than the generated files." run_autogen_or_fail fi done if test -e $conf_custom_script_dir/generated-configure.sh; then # If custom source configure is available, make sure it is up-to-date as well. for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $conf_custom_script_dir/*.m4; do if test $file -nt $conf_custom_script_dir/generated-configure.sh; then echo "Warning: The configure source files is newer than the custom generated files." run_autogen_or_fail fi done fi } check_hg_updates() { if test "x`which hg 2> /dev/null`" != x; then conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf` if test "x$conf_updated_autoconf_files" != x; then echo "Configure source code has been updated, checking time stamps" check_autoconf_timestamps fi if test -e $conf_custom_script_dir; then # If custom source configure is available, make sure it is up-to-date as well. conf_custom_updated_autoconf_files=`cd $conf_custom_script_dir && hg status -mard 2> /dev/null | grep autoconf` if test "x$conf_custom_updated_autoconf_files" != x; then echo "Configure custom source code has been updated, checking time stamps" check_autoconf_timestamps fi fi fi } # Check for local changes check_hg_updates if test -e $conf_custom_script_dir/generated-configure.sh; then # Test if open configure is newer than custom configure, if so, custom needs to # be regenerated. This test is required to ensure consistency with custom source. conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh | cut -d"=" -f 2` conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_custom_script_dir/generated-configure.sh | cut -d"=" -f 2` if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then echo "Warning: The generated configure file contains changes not present in the custom generated file." run_autogen_or_fail fi 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 [[ "$1" =~ ^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.:,%/+=_-]+$ && ! "$1" =~ ^= ]]; then quoted="$1" else if [[ "$1" =~ [\'!] ]]; 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_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*) conf_legacy_crosscompile="$conf_legacy_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_legacy_crosscompile" != "x"; then if test "x$conf_openjdk_target" != "x"; then echo "Error: Specifying --openjdk-target together with autoconf" echo "legacy cross-compilation flags is not supported." echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile." echo "The recommended use is just --openjdk-target." exit 1 else echo "Warning: You are using legacy autoconf cross-compilation flags." echo "It is recommended that you use --openjdk-target instead." echo "" fi fi if test "x$conf_openjdk_target" != "x"; then conf_build_platform=`sh $conf_script_dir/build-aux/config.guess` conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}") 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 -e $conf_custom_script_dir/generated-configure.sh; then # Custom source configure available; run that instead echo "Running custom generated-configure.sh" conf_script_to_run=$conf_custom_script_dir/generated-configure.sh else echo "Running generated-configure.sh" conf_script_to_run=$conf_script_dir/generated-configure.sh fi if test "x$conf_debug_configure" != x; then # Turn on shell debug output if requested (initial or recursive) set -x fi if test "x$conf_debug_configure" = xtrue; then # Turn on logging, but don't turn on twice when called recursive conf_debug_logfile=./debug-configure.log (exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile else ( . $conf_script_to_run "${conf_processed_arguments[@]}" ) fi conf_result_code=$? ### ### Post-processing ### if test $conf_result_code -eq 0; then if test "x$conf_print_help" = xtrue; then cat < --debug-configure Run the configure script with additional debug logging enabled. 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