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