1 #!/bin/bash
   2 #
   3 # Copyright (c) 2012, 2018, 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 if test "x$CUSTOM_CONFIG_DIR" != x; then
  47   custom_hook=$CUSTOM_CONFIG_DIR/custom-hook.m4
  48   if test ! -e $custom_hook; then
  49     echo "CUSTOM_CONFIG_DIR not pointing to a proper custom config dir."
  50     echo "Error: Cannot continue" 1>&2
  51     exit 1
  52   fi
  53 fi
  54 
  55 CURRENT_DIR=`pwd`
  56 if test "x$CURRENT_DIR" = "x$TOPDIR"; then
  57   # We are running configure from the src root.
  58   # Create '.configure-support' under $TOPDIR/build
  59   build_support_dir="$TOPDIR/build/.configure-support"
  60 elif test "x$CURRENT_DIR" = "x$CUSTOM_ROOT"; then
  61   # We are running configure from the custom root.
  62   # Create '.configure-support' under $CUSTOM_ROOT/build
  63   build_support_dir="$CUSTOM_ROOT/build/.configure-support"
  64 else
  65   # We are running configure from outside of the src dir.
  66   # Create 'build_support_dir' in the current directory.
  67   build_support_dir="$CURRENT_DIR/configure-support"
  68 fi
  69 
  70 conf_script_dir="$TOPDIR/make/autoconf"
  71 generated_script="$build_support_dir/generated-configure.sh"
  72 
  73 ###
  74 ### Use autoconf to create a runnable configure script, if needed
  75 ###
  76 
  77 autoconf_missing_help() {
  78   APT_GET="`which apt-get 2> /dev/null | grep -v '^no apt-get in'`"
  79   YUM="`which yum 2> /dev/null | grep -v '^no yum in'`"
  80   BREW="`which brew 2> /dev/null | grep -v '^no brew in'`"
  81   CYGWIN="`which cygpath 2> /dev/null | grep -v '^no cygpath in'`"
  82 
  83   if test "x$APT_GET" != x; then
  84     PKGHANDLER_COMMAND="sudo apt-get install autoconf"
  85   elif test "x$YUM" != x; then
  86     PKGHANDLER_COMMAND="sudo yum install autoconf"
  87   elif test "x$BREW" != x; then
  88     PKGHANDLER_COMMAND="brew install autoconf"
  89   elif test "x$CYGWIN" != x; then
  90     PKGHANDLER_COMMAND="( cd <location of cygwin setup.exe> && cmd /c setup -q -P autoconf )"
  91   fi
  92 
  93   if test "x$PKGHANDLER_COMMAND" != x; then
  94     echo "You might be able to fix this by running '$PKGHANDLER_COMMAND'."
  95   fi
  96 }
  97 
  98 generate_configure_script() {
  99   if test "x$AUTOCONF" != x; then
 100     if test ! -x "$AUTOCONF"; then
 101       echo
 102       echo "The specified AUTOCONF variable does not point to a valid autoconf executable:"
 103       echo "AUTOCONF=$AUTOCONF"
 104       echo "Error: Cannot continue" 1>&2
 105       exit 1
 106     fi
 107   else
 108     AUTOCONF="`which autoconf 2> /dev/null | grep -v '^no autoconf in'`"
 109     if test "x$AUTOCONF" = x; then
 110       echo
 111       echo "Autoconf is not found on the PATH, and AUTOCONF is not set."
 112       echo "You need autoconf to be able to generate a runnable configure script."
 113       autoconf_missing_help
 114       echo "Error: Cannot find autoconf" 1>&2
 115       exit 1
 116     fi
 117   fi
 118 
 119   autoconf_version=`$AUTOCONF --version | head -1`
 120   echo "Using autoconf at ${AUTOCONF} [$autoconf_version]"
 121 
 122   if test "x$CUSTOM_CONFIG_DIR" != x; then
 123     # Generate configure script with custom hooks compiled in.
 124     custom_patcher='sed -e "s|#CUSTOM_AUTOCONF_INCLUDE|m4_include([$custom_hook])|"'
 125     custom_script_dir_include="-I$CUSTOM_CONFIG_DIR"
 126   else
 127     custom_patcher='cat'
 128     custom_script_dir_include=""
 129   fi
 130 
 131   mkdir -p $build_support_dir
 132   # Call autoconf but replace the "magic" variable in configure.ac if requested.
 133 
 134   cat $conf_script_dir/configure.ac | eval $custom_patcher | \
 135       ${AUTOCONF} -W all $custom_script_dir_include -I$conf_script_dir - \
 136       > $generated_script
 137   rm -rf autom4te.cache
 138 
 139   # Sanity check
 140   if test ! -s $generated_script; then
 141     echo "Error: Failed to generate runnable configure script" 1>&2
 142     rm -f $generated_script
 143     exit 1
 144   fi
 145 }
 146 
 147 test_generated_up_to_date() {
 148   conf_source_files="$conf_script_dir/configure.ac $conf_script_dir/*.m4"
 149   if test "x$CUSTOM_CONFIG_DIR" != x; then
 150     conf_custom_source_files="$CUSTOM_CONFIG_DIR/*.m4"
 151   else
 152     conf_custom_source_files=""
 153   fi
 154 
 155   for file in $conf_source_files $conf_custom_source_files ; do
 156     if test $file -nt $generated_script; then
 157       return 0
 158     fi
 159   done
 160   return 1
 161 }
 162 
 163 run_autoconf=false
 164 if test "x$1" = xautogen; then
 165   # User called us as "configure autogen", so force regeneration
 166   run_autoconf=true
 167   shift
 168 fi
 169 
 170 if test ! -s $generated_script; then
 171   # Generated script is missing, so we need to create it
 172   echo "Runnable configure script is not present"
 173   run_autoconf=true
 174 else
 175   # File is present, but is it up to date?
 176   if test_generated_up_to_date; then
 177     echo "Runnable configure script is not up to date"
 178     run_autoconf=true
 179   fi
 180 fi
 181 
 182 if test "x$run_autoconf" = xtrue; then
 183   echo "Generating runnable configure script at $generated_script"
 184   generate_configure_script
 185 fi
 186 
 187 # Autoconf calls the configure script recursively sometimes.
 188 # Don't start logging twice in that case
 189 if test "x$conf_debug_configure" = xtrue; then
 190   conf_debug_configure=recursive
 191 fi
 192 
 193 ###
 194 ### Process command-line arguments
 195 ###
 196 
 197 # Returns a shell-escaped version of the argument given.
 198 function shell_quote() {
 199   if [[ -n "$1" ]]; then
 200     # Uses only shell-safe characters?  No quoting needed.
 201     # '=' is a zsh meta-character, but only in word-initial position.
 202     if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \
 203         && ! echo "$1" | grep '^=' > /dev/null; then
 204       quoted="$1"
 205     else
 206       if echo "$1" | grep "[\'!]" > /dev/null; then
 207         # csh does history expansion within single quotes, but not
 208         # when backslash-escaped!
 209         local quoted_quote="'\\''" quoted_exclam="'\\!'"
 210         word="${1//\'/${quoted_quote}}"
 211         word="${1//\!/${quoted_exclam}}"
 212       fi
 213       quoted="'$1'"
 214     fi
 215     echo "$quoted"
 216   fi
 217 }
 218 
 219 conf_processed_arguments=()
 220 conf_quoted_arguments=()
 221 conf_openjdk_target=
 222 
 223 for conf_option
 224 do
 225 
 226   # Process (and remove) our own extensions that will not be passed to autoconf
 227   case $conf_option in
 228     --openjdk-target=*)
 229       conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
 230       ;;
 231     --debug-configure)
 232       if test "x$conf_debug_configure" != xrecursive; then
 233         conf_debug_configure=true
 234         export conf_debug_configure
 235       fi
 236       ;;
 237     *)
 238       conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
 239       ;;
 240   esac
 241 
 242   # Store all variables overridden on the command line
 243   case $conf_option in
 244     [^-]*=*)
 245       # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
 246       conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
 247       CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
 248       ;;
 249   esac
 250 
 251   # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
 252   case $conf_option in
 253     *=*)
 254       conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
 255       conf_option_name=$(shell_quote "$conf_option_name")
 256       conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
 257       conf_option_value=$(shell_quote "$conf_option_value")
 258       conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
 259       ;;
 260     *)
 261       conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
 262       ;;
 263   esac
 264 
 265   # Check for certain autoconf options that require extra action
 266   case $conf_option in
 267     -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
 268       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
 269     -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
 270       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
 271     -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
 272       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
 273     -help | --help | --hel | --he | -h)
 274       conf_print_help=true ;;
 275   esac
 276 done
 277 
 278 # Save the quoted command line
 279 CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
 280 
 281 if test "x$conf_legacy_crosscompile" != "x"; then
 282   if test "x$conf_openjdk_target" != "x"; then
 283     echo "Error: Specifying --openjdk-target together with autoconf"
 284     echo "legacy cross-compilation flags is not supported."
 285     echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile."
 286     echo "The recommended use is just --openjdk-target."
 287     exit 1
 288   else
 289     echo "Warning: You are using legacy autoconf cross-compilation flags."
 290     echo "It is recommended that you use --openjdk-target instead."
 291     echo ""
 292   fi
 293 fi
 294 
 295 if test "x$conf_openjdk_target" != "x"; then
 296   conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
 297   conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
 298 fi
 299 
 300 # Make configure exit with error on invalid options as default.
 301 # Can be overridden by --disable-option-checking, since we prepend our argument
 302 # and later options override earlier.
 303 conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
 304 
 305 ###
 306 ### Call the configure script
 307 ###
 308 if test "x$conf_debug_configure" != x; then
 309   # Turn on shell debug output if requested (initial or recursive)
 310   set -x
 311 fi
 312 
 313 # Now transfer control to the script generated by autoconf. This is where the
 314 # main work is done.
 315 RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
 316 trap "rm -rf \"$RCDIR\"" EXIT
 317 conf_logfile=./configure.log
 318 (exec 3>&1 ; ((. $generated_script "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \
 319     ; echo $? > "$RCDIR/rc" ) \
 320     | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
 321 
 322 conf_result_code=`cat "$RCDIR/rc"`
 323 ###
 324 ### Post-processing
 325 ###
 326 
 327 if test $conf_result_code -eq 0; then
 328   if test "x$conf_print_help" = xtrue; then
 329     cat <<EOT
 330 
 331 Additional (non-autoconf) OpenJDK Options:
 332   --openjdk-target=TARGET cross-compile with TARGET as target platform
 333                           (i.e. the one you will run the resulting binary on).
 334                           Equivalent to --host=TARGET --target=TARGET
 335                           --build=<current platform>
 336   --debug-configure       Run the configure script with additional debug
 337                           logging enabled.
 338 
 339 EOT
 340 
 341     # Print additional help, e.g. a list of toolchains and JVM features.
 342     # This must be done by the autoconf script.
 343     ( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $generated_script PRINTF=printf )
 344 
 345     cat <<EOT
 346 
 347 Please be aware that, when cross-compiling, the OpenJDK configure script will
 348 generally use 'target' where autoconf traditionally uses 'host'.
 349 
 350 Also note that variables must be passed on the command line. Variables in the
 351 environment will generally be ignored, unlike traditional autoconf scripts.
 352 EOT
 353   fi
 354 else
 355   echo configure exiting with result code $conf_result_code
 356 fi
 357 
 358 exit $conf_result_code