configure revision 2024:cc16e2a24f94
1#!/bin/bash
2#
3# Copyright (c) 2012, 2016, 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
25if 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)
30else
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
37fi
38
39if test "x$BASH" = x; then
40  echo "Error: This script must be run using bash." 1>&2
41  exit 1
42fi
43# Force autoconf to use bash. This also means we must disable autoconf re-exec.
44export CONFIG_SHELL=$BASH
45export _as_can_reexec=no
46
47conf_script_dir="$TOPDIR/common/autoconf"
48
49if [ "$CUSTOM_CONFIG_DIR" = "" ]; then
50  conf_custom_script_dir="$TOPDIR/closed/autoconf"
51else
52  conf_custom_script_dir="$CUSTOM_CONFIG_DIR"
53fi
54
55###
56### Test that the generated configure is up-to-date
57###
58
59run_autogen_or_fail() {
60  if test "x`which autoconf 2> /dev/null | grep -v '^no autoconf in'`" = x; then
61    echo "Cannot locate autoconf, unable to correct situation."
62    echo "Please install autoconf and run 'bash autogen.sh' to update the generated files."
63    echo "Error: Cannot continue" 1>&2
64    exit 1
65  else
66    echo "Running autogen.sh to correct the situation"
67    bash $conf_script_dir/autogen.sh
68  fi
69}
70
71check_autoconf_timestamps() {
72  for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do
73    if test $file -nt $conf_script_dir/generated-configure.sh; then
74      echo "Warning: The configure source files is newer than the generated files."
75      run_autogen_or_fail
76    fi
77  done
78
79  if test -e $conf_custom_script_dir/generated-configure.sh; then
80    # If custom source configure is available, make sure it is up-to-date as well.
81    for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $conf_custom_script_dir/*.m4; do
82      if test $file -nt $conf_custom_script_dir/generated-configure.sh; then
83        echo "Warning: The configure source files is newer than the custom generated files."
84        run_autogen_or_fail
85      fi
86    done
87  fi
88}
89
90check_hg_updates() {
91  if test "x`which hg 2> /dev/null | grep -v '^no hg in'`" != x; then
92    conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf`
93    if test "x$conf_updated_autoconf_files" != x; then
94      echo "Configure source code has been updated, checking time stamps"
95      check_autoconf_timestamps
96    fi
97
98    if test -e $conf_custom_script_dir; then
99      # If custom source configure is available, make sure it is up-to-date as well.
100      conf_custom_updated_autoconf_files=`cd $conf_custom_script_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
110check_hg_updates
111
112if test -e $conf_custom_script_dir/generated-configure.sh; 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= $conf_custom_script_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
121fi
122
123# Autoconf calls the configure script recursively sometimes.
124# Don't start logging twice in that case
125if test "x$conf_debug_configure" = xtrue; then
126  conf_debug_configure=recursive
127fi
128
129###
130### Process command-line arguments
131###
132
133# Returns a shell-escaped version of the argument given.
134function 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
155conf_processed_arguments=()
156conf_quoted_arguments=()
157conf_openjdk_target=
158
159for conf_option
160do
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
212done
213
214# Save the quoted command line
215CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
216
217if 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
229fi
230
231if 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[@]}")
234fi
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.
239conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
240
241###
242### Call the configure script
243###
244if test -e $conf_custom_script_dir/generated-configure.sh; then
245  # Custom source configure available; run that instead
246  echo "Running custom generated-configure.sh"
247  conf_script_to_run=$conf_custom_script_dir/generated-configure.sh
248else
249  echo "Running generated-configure.sh"
250  conf_script_to_run=$conf_script_dir/generated-configure.sh
251fi
252
253if test "x$conf_debug_configure" != x; then
254  # Turn on shell debug output if requested (initial or recursive)
255  set -x
256fi
257
258# Now transfer control to the script generated by autoconf. This is where the
259# main work is done.
260RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
261trap "rm -rf \"$RCDIR\"" EXIT
262conf_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
267conf_result_code=`cat "$RCDIR/rc"`
268###
269### Post-processing
270###
271
272if test $conf_result_code -eq 0; then
273  if test "x$conf_print_help" = xtrue; then
274    cat <<EOT
275
276Additional (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
284EOT
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
292Please be aware that, when cross-compiling, the OpenJDK configure script will
293generally use 'target' where autoconf traditionally uses 'host'.
294
295Also note that variables must be passed on the command line. Variables in the
296environment will generally be ignored, unlike traditional autoconf scripts.
297EOT
298  fi
299else
300  echo configure exiting with result code $conf_result_code
301fi
302
303exit $conf_result_code
304