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