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