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