1 #!/bin/bash 2 # 3 # Copyright (c) 2012, 2017, 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 conf_script_dir="$TOPDIR/make/autoconf" 47 48 if test "x$CUSTOM_CONFIG_DIR" != x; then 49 if test ! -e $CUSTOM_CONFIG_DIR/generated-configure.sh; then 50 echo "CUSTOM_CONFIG_DIR not pointing to a proper custom config dir." 51 echo "Error: Cannot continue" 1>&2 52 exit 1 53 fi 54 fi 55 56 ### 57 ### Test that the generated configure is up-to-date 58 ### 59 60 run_autogen_or_fail() { 61 if test "x`which autoconf 2> /dev/null | grep -v '^no autoconf in'`" = x; then 62 echo "Cannot locate autoconf, unable to correct situation." 63 echo "Please install autoconf and run 'bash autogen.sh' to update the generated files." 64 echo "Error: Cannot continue" 1>&2 65 exit 1 66 else 67 echo "Running autogen.sh to correct the situation" 68 bash $conf_script_dir/autogen.sh 69 fi 70 } 71 72 check_autoconf_timestamps() { 73 for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do 74 if test $file -nt $conf_script_dir/generated-configure.sh; then 75 echo "Warning: The configure source files is newer than the generated files." 76 run_autogen_or_fail 77 fi 78 done 79 80 if test "x$CUSTOM_CONFIG_DIR" != x; then 81 # If custom source configure is available, make sure it is up-to-date as well. 82 for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $CUSTOM_CONFIG_DIR/*.m4; do 83 if test $file -nt $CUSTOM_CONFIG_DIR/generated-configure.sh; then 84 echo "Warning: The configure source files is newer than the custom generated files." 85 run_autogen_or_fail 86 fi 87 done 88 fi 89 } 90 91 check_hg_updates() { 92 if test "x`which hg 2> /dev/null | grep -v '^no hg in'`" != x; then 93 conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard . 2> /dev/null` 94 if test "x$conf_updated_autoconf_files" != x; then 95 echo "Configure source code has been updated, checking time stamps" 96 check_autoconf_timestamps 97 elif test "x$CUSTOM_CONFIG_DIR" != x; then 98 # If custom source configure is available, make sure it is up-to-date as well. 99 conf_custom_updated_autoconf_files=`cd $CUSTOM_CONFIG_DIR && hg status -mard . 2> /dev/null` 100 if test "x$conf_custom_updated_autoconf_files" != x; then 101 echo "Configure custom source code has been updated, checking time stamps" 102 check_autoconf_timestamps 103 fi 104 fi 105 fi 106 } 107 108 # Check for local changes 109 check_hg_updates 110 111 if test "x$CUSTOM_CONFIG_DIR" != x; then 112 # Test if open configure is newer than custom configure, if so, custom needs to 113 # be regenerated. This test is required to ensure consistency with custom source. 114 conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh | cut -d"=" -f 2` 115 conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $CUSTOM_CONFIG_DIR/generated-configure.sh | cut -d"=" -f 2` 116 if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then 117 echo "Warning: The generated configure file contains changes not present in the custom generated file." 118 run_autogen_or_fail 119 fi 120 fi 121 122 # Autoconf calls the configure script recursively sometimes. 123 # Don't start logging twice in that case 124 if test "x$conf_debug_configure" = xtrue; then 125 conf_debug_configure=recursive 126 fi 127 128 ### 129 ### Process command-line arguments 130 ### 131 132 # Returns a shell-escaped version of the argument given. 133 function shell_quote() { 134 if [[ -n "$1" ]]; then 135 # Uses only shell-safe characters? No quoting needed. 136 # '=' is a zsh meta-character, but only in word-initial position. 137 if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \ 138 && ! echo "$1" | grep '^=' > /dev/null; then 139 quoted="$1" 140 else 141 if echo "$1" | grep "[\'!]" > /dev/null; then 142 # csh does history expansion within single quotes, but not 143 # when backslash-escaped! 144 local quoted_quote="'\\''" quoted_exclam="'\\!'" 145 word="${1//\'/${quoted_quote}}" 146 word="${1//\!/${quoted_exclam}}" 147 fi 148 quoted="'$1'" 149 fi 150 echo "$quoted" 151 fi 152 } 153 154 conf_processed_arguments=() 155 conf_quoted_arguments=() 156 conf_openjdk_target= 157 158 for conf_option 159 do 160 161 # Process (and remove) our own extensions that will not be passed to autoconf 162 case $conf_option in 163 --openjdk-target=*) 164 conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'` 165 ;; 166 --debug-configure) 167 if test "x$conf_debug_configure" != xrecursive; then 168 conf_debug_configure=true 169 export conf_debug_configure 170 fi 171 ;; 172 *) 173 conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option") 174 ;; 175 esac 176 177 # Store all variables overridden on the command line 178 case $conf_option in 179 [^-]*=*) 180 # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!. 181 conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='` 182 CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!" 183 ;; 184 esac 185 186 # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE. 187 case $conf_option in 188 *=*) 189 conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='` 190 conf_option_name=$(shell_quote "$conf_option_name") 191 conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'` 192 conf_option_value=$(shell_quote "$conf_option_value") 193 conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value") 194 ;; 195 *) 196 conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")") 197 ;; 198 esac 199 200 # Check for certain autoconf options that require extra action 201 case $conf_option in 202 -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*) 203 conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; 204 -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) 205 conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; 206 -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*) 207 conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; 208 -help | --help | --hel | --he | -h) 209 conf_print_help=true ;; 210 esac 211 done 212 213 # Save the quoted command line 214 CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}" 215 216 if test "x$conf_legacy_crosscompile" != "x"; then 217 if test "x$conf_openjdk_target" != "x"; then 218 echo "Error: Specifying --openjdk-target together with autoconf" 219 echo "legacy cross-compilation flags is not supported." 220 echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile." 221 echo "The recommended use is just --openjdk-target." 222 exit 1 223 else 224 echo "Warning: You are using legacy autoconf cross-compilation flags." 225 echo "It is recommended that you use --openjdk-target instead." 226 echo "" 227 fi 228 fi 229 230 if test "x$conf_openjdk_target" != "x"; then 231 conf_build_platform=`sh $conf_script_dir/build-aux/config.guess` 232 conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}") 233 fi 234 235 # Make configure exit with error on invalid options as default. 236 # Can be overridden by --disable-option-checking, since we prepend our argument 237 # and later options override earlier. 238 conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}") 239 240 ### 241 ### Call the configure script 242 ### 243 if test "x$CUSTOM_CONFIG_DIR" != x; then 244 # Custom source configure available; run that instead 245 echo "Running custom generated-configure.sh" 246 conf_script_to_run=$CUSTOM_CONFIG_DIR/generated-configure.sh 247 else 248 echo "Running generated-configure.sh" 249 conf_script_to_run=$conf_script_dir/generated-configure.sh 250 fi 251 252 if test "x$conf_debug_configure" != x; then 253 # Turn on shell debug output if requested (initial or recursive) 254 set -x 255 fi 256 257 # Now transfer control to the script generated by autoconf. This is where the 258 # main work is done. 259 RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $? 260 trap "rm -rf \"$RCDIR\"" EXIT 261 conf_logfile=./configure.log 262 (exec 3>&1 ; ((. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \ 263 ; echo $? > "$RCDIR/rc" ) \ 264 | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile 265 266 conf_result_code=`cat "$RCDIR/rc"` 267 ### 268 ### Post-processing 269 ### 270 271 if test $conf_result_code -eq 0; then 272 if test "x$conf_print_help" = xtrue; then 273 cat <<EOT 274 275 Additional (non-autoconf) OpenJDK Options: 276 --openjdk-target=TARGET cross-compile with TARGET as target platform 277 (i.e. the one you will run the resulting binary on). 278 Equivalent to --host=TARGET --target=TARGET 279 --build=<current platform> 280 --debug-configure Run the configure script with additional debug 281 logging enabled. 282 283 EOT 284 285 # Print additional help, e.g. a list of toolchains and JVM features. 286 # This must be done by the autoconf script. 287 ( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $conf_script_to_run PRINTF=printf ) 288 289 cat <<EOT 290 291 Please be aware that, when cross-compiling, the OpenJDK configure script will 292 generally use 'target' where autoconf traditionally uses 'host'. 293 294 Also note that variables must be passed on the command line. Variables in the 295 environment will generally be ignored, unlike traditional autoconf scripts. 296 EOT 297 fi 298 else 299 echo configure exiting with result code $conf_result_code 300 fi 301 302 exit $conf_result_code