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