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