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 25if 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 29fi 30 31# The next argument is the absolute top-level directory path. 32# The TOPDIR variable is passed on to configure.ac. 33TOPDIR="$2" 34# Remove these two arguments to get to the user supplied arguments 35shift 36shift 37 38if test "x$BASH" = x; then 39 echo "Error: This script must be run using bash." 1>&2 40 exit 1 41fi 42# Force autoconf to use bash. This also means we must disable autoconf re-exec. 43export CONFIG_SHELL=$BASH 44export _as_can_reexec=no 45 46if 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 53fi 54 55CURRENT_DIR=`pwd` 56if 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" 60elif 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" 64else 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" 68fi 69 70conf_script_dir="$TOPDIR/make/autoconf" 71generated_script="$build_support_dir/generated-configure.sh" 72 73### 74### Use autoconf to create a runnable configure script, if needed 75### 76 77autoconf_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 101generate_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 150test_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 166run_autoconf=false 167if test "x$1" = xautogen; then 168 # User called us as "configure autogen", so force regeneration 169 run_autoconf=true 170 shift 171fi 172 173if 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 177else 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 183fi 184 185if test "x$run_autoconf" = xtrue; then 186 echo "Generating runnable configure script at $generated_script" 187 generate_configure_script 188fi 189 190# Autoconf calls the configure script recursively sometimes. 191# Don't start logging twice in that case 192if test "x$conf_debug_configure" = xtrue; then 193 conf_debug_configure=recursive 194fi 195 196### 197### Process command-line arguments 198### 199 200# Returns a shell-escaped version of the argument given. 201function 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 222conf_processed_arguments=() 223conf_quoted_arguments=() 224conf_openjdk_target= 225 226for conf_option 227do 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 279done 280 281# Save the quoted command line 282CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}" 283 284if 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 296fi 297 298if 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[@]}") 301fi 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. 306conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}") 307 308### 309### Call the configure script 310### 311if test "x$conf_debug_configure" != x; then 312 # Turn on shell debug output if requested (initial or recursive) 313 set -x 314fi 315 316# Now transfer control to the script generated by autoconf. This is where the 317# main work is done. 318RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $? 319trap "rm -rf \"$RCDIR\"" EXIT 320conf_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 325conf_result_code=`cat "$RCDIR/rc"` 326### 327### Post-processing 328### 329 330if test $conf_result_code -eq 0; then 331 if test "x$conf_print_help" = xtrue; then 332 cat <<EOT 333 334Additional (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 342EOT 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 350Please be aware that, when cross-compiling, the OpenJDK configure script will 351generally use 'target' where autoconf traditionally uses 'host'. 352 353Also note that variables must be passed on the command line. Variables in the 354environment will generally be ignored, unlike traditional autoconf scripts. 355EOT 356 fi 357else 358 echo configure exiting with result code $conf_result_code 359fi 360 361exit $conf_result_code 362