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