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