Tue, 20 Mar 2018 09:19:10 -0700
8031759: Improved tool overriding in configure
Reviewed-by: ihse, tbell, mduigou, erikj
1 #!/bin/bash
2 #
3 # Copyright (c) 2012, 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 CONFIGURE_COMMAND_LINE="$@"
36 conf_script_dir=`dirname $0`
38 if [ "$CUSTOM_CONFIG_DIR" = "" ]; then
39 conf_custom_script_dir="$conf_script_dir/../../jdk/make/closed/autoconf"
40 else
41 conf_custom_script_dir=$CUSTOM_CONFIG_DIR
42 fi
44 ###
45 ### Test that the generated configure is up-to-date
46 ###
48 run_autogen_or_fail() {
49 if test "x`which autoconf 2> /dev/null`" = x; then
50 echo "Cannot locate autoconf, unable to correct situation."
51 echo "Please install autoconf and run 'bash autogen.sh' to update the generated files."
52 echo "Error: Cannot continue" 1>&2
53 exit 1
54 else
55 echo "Running autogen.sh to correct the situation"
56 bash $conf_script_dir/autogen.sh
57 fi
58 }
60 check_autoconf_timestamps() {
61 for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do
62 if test $file -nt $conf_script_dir/generated-configure.sh; then
63 echo "Warning: The configure source files is newer than the generated files."
64 run_autogen_or_fail
65 fi
66 done
68 if test -e $conf_custom_script_dir/generated-configure.sh; then
69 # If custom source configure is available, make sure it is up-to-date as well.
70 for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $conf_custom_script_dir/*.m4; do
71 if test $file -nt $conf_custom_script_dir/generated-configure.sh; then
72 echo "Warning: The configure source files is newer than the custom generated files."
73 run_autogen_or_fail
74 fi
75 done
76 fi
77 }
79 check_hg_updates() {
80 if test "x`which hg 2> /dev/null`" != x; then
81 conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf`
82 if test "x$conf_updated_autoconf_files" != x; then
83 echo "Configure source code has been updated, checking time stamps"
84 check_autoconf_timestamps
85 fi
87 if test -e $conf_custom_script_dir; then
88 # If custom source configure is available, make sure it is up-to-date as well.
89 conf_custom_updated_autoconf_files=`cd $conf_custom_script_dir && hg status -mard 2> /dev/null | grep autoconf`
90 if test "x$conf_custom_updated_autoconf_files" != x; then
91 echo "Configure custom source code has been updated, checking time stamps"
92 check_autoconf_timestamps
93 fi
94 fi
95 fi
96 }
98 # Check for local changes
99 check_hg_updates
101 if test -e $conf_custom_script_dir/generated-configure.sh; then
102 # Test if open configure is newer than custom configure, if so, custom needs to
103 # be regenerated. This test is required to ensure consistency with custom source.
104 conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh | cut -d"=" -f 2`
105 conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_custom_script_dir/generated-configure.sh | cut -d"=" -f 2`
106 if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then
107 echo "Warning: The generated configure file contains changes not present in the custom generated file."
108 run_autogen_or_fail
109 fi
110 fi
112 # Autoconf calls the configure script recursively sometimes.
113 # Don't start logging twice in that case
114 if test "x$conf_debug_configure" = xtrue; then
115 conf_debug_configure=recursive
116 fi
117 ###
118 ### Process command-line arguments
119 ###
120 conf_processed_arguments=()
121 conf_openjdk_target=
123 for conf_option
124 do
125 case $conf_option in
126 --openjdk-target=*)
127 conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
128 ;;
129 --debug-configure)
130 if test "x$conf_debug_configure" != xrecursive; then
131 conf_debug_configure=true
132 export conf_debug_configure
133 fi
134 ;;
135 [^-]*=*)
136 # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
137 conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
138 CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
139 # ... and then process argument as usual
140 conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
141 ;;
142 *)
143 conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
144 ;;
145 esac
147 case $conf_option in
148 -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
149 conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
150 -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
151 conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
152 -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
153 conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
154 -help | --help | --hel | --he | -h)
155 conf_print_help=true ;;
156 esac
157 done
159 if test "x$conf_legacy_crosscompile" != "x"; then
160 if test "x$conf_openjdk_target" != "x"; then
161 echo "Error: Specifying --openjdk-target together with autoconf"
162 echo "legacy cross-compilation flags is not supported."
163 echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile."
164 echo "The recommended use is just --openjdk-target."
165 exit 1
166 else
167 echo "Warning: You are using legacy autoconf cross-compilation flags."
168 echo "It is recommended that you use --openjdk-target instead."
169 echo ""
170 fi
171 fi
173 if test "x$conf_openjdk_target" != "x"; then
174 conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
175 conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
176 fi
178 # Make configure exit with error on invalid options as default.
179 # Can be overridden by --disable-option-checking, since we prepend our argument
180 # and later options override earlier.
181 conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
183 ###
184 ### Call the configure script
185 ###
186 if test -e $conf_custom_script_dir/generated-configure.sh; then
187 # Custom source configure available; run that instead
188 echo Running custom generated-configure.sh
189 conf_script_to_run=$conf_custom_script_dir/generated-configure.sh
190 else
191 echo Running generated-configure.sh
192 conf_script_to_run=$conf_script_dir/generated-configure.sh
193 fi
195 if test "x$conf_debug_configure" != x; then
196 # Turn on shell debug output if requested (initial or recursive)
197 set -x
198 fi
200 if test "x$conf_debug_configure" = xtrue; then
201 # Turn on logging, but don't turn on twice when called recursive
202 conf_debug_logfile=./debug-configure.log
203 (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
204 else
205 ( . $conf_script_to_run "${conf_processed_arguments[@]}" )
206 fi
208 conf_result_code=$?
209 ###
210 ### Post-processing
211 ###
213 if test $conf_result_code -eq 0; then
214 if test "x$conf_print_help" = xtrue; then
215 cat <<EOT
217 Additional (non-autoconf) OpenJDK Options:
218 --openjdk-target=TARGET cross-compile with TARGET as target platform
219 (i.e. the one you will run the resulting binary on).
220 Equivalent to --host=TARGET --target=TARGET
221 --build=<current platform>
222 --debug-configure Run the configure script with additional debug
223 logging enabled.
225 Please be aware that, when cross-compiling, the OpenJDK configure script will
226 generally use 'target' where autoconf traditionally uses 'host'.
228 Also note that variables must be passed on the command line. Variables in the
229 environment will generally be ignored, unlike traditional autoconf scripts.
230 EOT
231 fi
232 else
233 echo configure exiting with result code $conf_result_code
234 fi
236 exit $conf_result_code