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