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 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 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 98generate_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 147test_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 163run_autoconf=false 164if test "x$1" = xautogen; then 165 # User called us as "configure autogen", so force regeneration 166 run_autoconf=true 167 shift 168fi 169 170if 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 174else 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 180fi 181 182if test "x$run_autoconf" = xtrue; then 183 echo "Generating runnable configure script at $generated_script" 184 generate_configure_script 185fi 186 187# Autoconf calls the configure script recursively sometimes. 188# Don't start logging twice in that case 189if test "x$conf_debug_configure" = xtrue; then 190 conf_debug_configure=recursive 191fi 192 193### 194### Process command-line arguments 195### 196 197# Returns a shell-escaped version of the argument given. 198function 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 219conf_processed_arguments=() 220conf_quoted_arguments=() 221conf_openjdk_target= 222 223for conf_option 224do 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 276done 277 278# Save the quoted command line 279CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}" 280 281if 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 293fi 294 295if 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[@]}") 298fi 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. 303conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}") 304 305### 306### Call the configure script 307### 308if test "x$conf_debug_configure" != x; then 309 # Turn on shell debug output if requested (initial or recursive) 310 set -x 311fi 312 313# Now transfer control to the script generated by autoconf. This is where the 314# main work is done. 315RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $? 316trap "rm -rf \"$RCDIR\"" EXIT 317conf_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 322conf_result_code=`cat "$RCDIR/rc"` 323### 324### Post-processing 325### 326 327if test $conf_result_code -eq 0; then 328 if test "x$conf_print_help" = xtrue; then 329 cat <<EOT 330 331Additional (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 339EOT 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 347Please be aware that, when cross-compiling, the OpenJDK configure script will 348generally use 'target' where autoconf traditionally uses 'host'. 349 350Also note that variables must be passed on the command line. Variables in the 351environment will generally be ignored, unlike traditional autoconf scripts. 352EOT 353 fi 354else 355 echo configure exiting with result code $conf_result_code 356fi 357 358exit $conf_result_code 359