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