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