common/autoconf/configure
author ihse
Wed, 29 Jan 2014 11:21:54 +0100
changeset 22475 777928354ad9
parent 20363 fa7663fc5d50
child 22714 a752920c4317
permissions -rw-r--r--
8031759: Improved tool overriding in configure Reviewed-by: tbell, mduigou, erikj

#!/bin/bash
#
# Copyright (c) 2012, 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$BASH_VERSION" = x; then
  echo This script needs bash to run.
  echo It is recommended to use the configure script in the source tree root instead.
  exit 1
fi

CONFIGURE_COMMAND_LINE="$@"
conf_script_dir=`dirname $0`

if [ "$CUSTOM_CONFIG_DIR" = "" ]; then
  conf_custom_script_dir="$conf_script_dir/../../jdk/make/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
###
conf_processed_arguments=()
conf_openjdk_target=

for conf_option
do
  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
      ;;
    [^-]*=*)
      # 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!"
      # ... and then process argument as usual
      conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
      ;;
    *)
      conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
      ;;
  esac

  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

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 <<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>
  --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