1 #!/bin/bash
   2 #
   3 # Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
   4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 #
   6 # This code is free software; you can redistribute it and/or modify it
   7 # under the terms of the GNU General Public License version 2 only, as
   8 # published by the Free Software Foundation.
   9 #
  10 # This code is distributed in the hope that it will be useful, but WITHOUT
  11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13 # version 2 for more details (a copy is included in the LICENSE file that
  14 # accompanied this code).
  15 #
  16 # You should have received a copy of the GNU General Public License version
  17 # 2 along with this work; if not, write to the Free Software Foundation,
  18 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19 #
  20 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21 # or visit www.oracle.com if you need additional information or have any
  22 # questions.
  23 #
  24 
  25 if test "x$1" != xCHECKME; then
  26   echo "WARNING: Calling the wrapper script directly is deprecated and unsupported."
  27   echo "Not all features of configure will be available."
  28   echo "Use the 'configure' script in the top-level directory instead."
  29   TOPDIR=$(cd $(dirname $0)/../.. > /dev/null && pwd)
  30 else
  31   # Now the next argument is the absolute top-level directory path.
  32   # The TOPDIR variable is passed on to configure.ac.
  33   TOPDIR="$2"
  34   # Remove these two arguments to get to the user supplied arguments
  35   shift
  36   shift
  37 fi
  38 
  39 if test "x$BASH" = x; then
  40   echo "Error: This script must be run using bash." 1>&2
  41   exit 1
  42 fi
  43 # Force autoconf to use bash. This also means we must disable autoconf re-exec.
  44 export CONFIG_SHELL=$BASH
  45 export _as_can_reexec=no
  46 
  47 conf_script_dir="$TOPDIR/make/autoconf"
  48 
  49 if test "x$CUSTOM_CONFIG_DIR" != x; then
  50   if test ! -e $CUSTOM_CONFIG_DIR/generated-configure.sh; then
  51     echo "CUSTOM_CONFIG_DIR not pointing to a proper custom config dir."
  52     echo "Error: Cannot continue" 1>&2
  53     exit 1
  54   fi
  55 fi
  56 
  57 ###
  58 ### Test that the generated configure is up-to-date
  59 ###
  60 
  61 run_autogen_or_fail() {
  62   if test "x`which autoconf 2> /dev/null | grep -v '^no autoconf in'`" = x; then
  63     echo "Cannot locate autoconf, unable to correct situation."
  64     echo "Please install autoconf and run 'bash autogen.sh' to update the generated files."
  65     echo "Error: Cannot continue" 1>&2
  66     exit 1
  67   else
  68     echo "Running autogen.sh to correct the situation"
  69     bash $conf_script_dir/autogen.sh
  70   fi
  71 }
  72 
  73 check_autoconf_timestamps() {
  74   for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do
  75     if test $file -nt $conf_script_dir/generated-configure.sh; then
  76       echo "Warning: The configure source files is newer than the generated files."
  77       run_autogen_or_fail
  78     fi
  79   done
  80 
  81   if test "x$CUSTOM_CONFIG_DIR" != x; then
  82     # If custom source configure is available, make sure it is up-to-date as well.
  83     for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $CUSTOM_CONFIG_DIR/*.m4; do
  84       if test $file -nt $CUSTOM_CONFIG_DIR/generated-configure.sh; then
  85         echo "Warning: The configure source files is newer than the custom generated files."
  86         run_autogen_or_fail
  87       fi
  88     done
  89   fi
  90 }
  91 
  92 check_hg_updates() {
  93   if test "x`which hg 2> /dev/null | grep -v '^no hg in'`" != x; then
  94     conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf`
  95     if test "x$conf_updated_autoconf_files" != x; then
  96       echo "Configure source code has been updated, checking time stamps"
  97       check_autoconf_timestamps
  98     elif test "x$CUSTOM_CONFIG_DIR" != x; then
  99       # If custom source configure is available, make sure it is up-to-date as well.
 100       conf_custom_updated_autoconf_files=`cd $CUSTOM_CONFIG_DIR && hg status -mard 2> /dev/null | grep autoconf`
 101       if test "x$conf_custom_updated_autoconf_files" != x; then
 102         echo "Configure custom source code has been updated, checking time stamps"
 103         check_autoconf_timestamps
 104       fi
 105     fi
 106   fi
 107 }
 108 
 109 # Check for local changes
 110 check_hg_updates
 111 
 112 if test "x$CUSTOM_CONFIG_DIR" != x; then
 113   # Test if open configure is newer than custom configure, if so, custom needs to
 114   # be regenerated. This test is required to ensure consistency with custom source.
 115   conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh  | cut -d"=" -f 2`
 116   conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $CUSTOM_CONFIG_DIR/generated-configure.sh  | cut -d"=" -f 2`
 117   if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then
 118     echo "Warning: The generated configure file contains changes not present in the custom generated file."
 119     run_autogen_or_fail
 120   fi
 121 fi
 122 
 123 # Autoconf calls the configure script recursively sometimes.
 124 # Don't start logging twice in that case
 125 if test "x$conf_debug_configure" = xtrue; then
 126   conf_debug_configure=recursive
 127 fi
 128 
 129 ###
 130 ### Process command-line arguments
 131 ###
 132 
 133 # Returns a shell-escaped version of the argument given.
 134 function shell_quote() {
 135   if [[ -n "$1" ]]; then
 136     # Uses only shell-safe characters?  No quoting needed.
 137     # '=' is a zsh meta-character, but only in word-initial position.
 138     if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \
 139         && ! echo "$1" | grep '^=' > /dev/null; then
 140       quoted="$1"
 141     else
 142       if echo "$1" | grep "[\'!]" > /dev/null; then
 143         # csh does history expansion within single quotes, but not
 144         # when backslash-escaped!
 145         local quoted_quote="'\\''" quoted_exclam="'\\!'"
 146         word="${1//\'/${quoted_quote}}"
 147         word="${1//\!/${quoted_exclam}}"
 148       fi
 149       quoted="'$1'"
 150     fi
 151     echo "$quoted"
 152   fi
 153 }
 154 
 155 conf_processed_arguments=()
 156 conf_quoted_arguments=()
 157 conf_openjdk_target=
 158 
 159 for conf_option
 160 do
 161 
 162   # Process (and remove) our own extensions that will not be passed to autoconf
 163   case $conf_option in
 164     --openjdk-target=*)
 165       conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
 166       ;;
 167     --debug-configure)
 168       if test "x$conf_debug_configure" != xrecursive; then
 169         conf_debug_configure=true
 170         export conf_debug_configure
 171       fi
 172       ;;
 173     *)
 174       conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
 175       ;;
 176   esac
 177 
 178   # Store all variables overridden on the command line
 179   case $conf_option in
 180     [^-]*=*)
 181       # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
 182       conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
 183       CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
 184       ;;
 185   esac
 186 
 187   # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
 188   case $conf_option in
 189     *=*)
 190       conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
 191       conf_option_name=$(shell_quote "$conf_option_name")
 192       conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
 193       conf_option_value=$(shell_quote "$conf_option_value")
 194       conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
 195       ;;
 196     *)
 197       conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
 198       ;;
 199   esac
 200 
 201   # Check for certain autoconf options that require extra action
 202   case $conf_option in
 203     -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
 204       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
 205     -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
 206       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
 207     -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
 208       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
 209     -help | --help | --hel | --he | -h)
 210       conf_print_help=true ;;
 211   esac
 212 done
 213 
 214 # Save the quoted command line
 215 CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
 216 
 217 if test "x$conf_legacy_crosscompile" != "x"; then
 218   if test "x$conf_openjdk_target" != "x"; then
 219     echo "Error: Specifying --openjdk-target together with autoconf"
 220     echo "legacy cross-compilation flags is not supported."
 221     echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile."
 222     echo "The recommended use is just --openjdk-target."
 223     exit 1
 224   else
 225     echo "Warning: You are using legacy autoconf cross-compilation flags."
 226     echo "It is recommended that you use --openjdk-target instead."
 227     echo ""
 228   fi
 229 fi
 230 
 231 if test "x$conf_openjdk_target" != "x"; then
 232   conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
 233   conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
 234 fi
 235 
 236 # Make configure exit with error on invalid options as default.
 237 # Can be overridden by --disable-option-checking, since we prepend our argument
 238 # and later options override earlier.
 239 conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
 240 
 241 ###
 242 ### Call the configure script
 243 ###
 244 if test "x$CUSTOM_CONFIG_DIR" != x; then
 245   # Custom source configure available; run that instead
 246   echo "Running custom generated-configure.sh"
 247   conf_script_to_run=$CUSTOM_CONFIG_DIR/generated-configure.sh
 248 else
 249   echo "Running generated-configure.sh"
 250   conf_script_to_run=$conf_script_dir/generated-configure.sh
 251 fi
 252 
 253 if test "x$conf_debug_configure" != x; then
 254   # Turn on shell debug output if requested (initial or recursive)
 255   set -x
 256 fi
 257 
 258 # Now transfer control to the script generated by autoconf. This is where the
 259 # main work is done.
 260 RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
 261 trap "rm -rf \"$RCDIR\"" EXIT
 262 conf_logfile=./configure.log
 263 (exec 3>&1 ; ((. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \
 264     ; echo $? > "$RCDIR/rc" ) \
 265     | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
 266 
 267 conf_result_code=`cat "$RCDIR/rc"`
 268 ###
 269 ### Post-processing
 270 ###
 271 
 272 if test $conf_result_code -eq 0; then
 273   if test "x$conf_print_help" = xtrue; then
 274     cat <<EOT
 275 
 276 Additional (non-autoconf) OpenJDK Options:
 277   --openjdk-target=TARGET cross-compile with TARGET as target platform
 278                           (i.e. the one you will run the resulting binary on).
 279                           Equivalent to --host=TARGET --target=TARGET
 280                           --build=<current platform>
 281   --debug-configure       Run the configure script with additional debug
 282                           logging enabled.
 283 
 284 EOT
 285 
 286     # Print additional help, e.g. a list of toolchains and JVM features.
 287     # This must be done by the autoconf script.
 288     ( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $conf_script_to_run PRINTF=printf )
 289 
 290     cat <<EOT
 291 
 292 Please be aware that, when cross-compiling, the OpenJDK configure script will
 293 generally use 'target' where autoconf traditionally uses 'host'.
 294 
 295 Also note that variables must be passed on the command line. Variables in the
 296 environment will generally be ignored, unlike traditional autoconf scripts.
 297 EOT
 298   fi
 299 else
 300   echo configure exiting with result code $conf_result_code
 301 fi
 302 
 303 exit $conf_result_code