configure revision 979:e7872d8abd12
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 [[ "$1" =~ ^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.:,%/+=_-]+$ && ! "$1" =~ ^= ]]; then
131      quoted="$1"
132    else
133      if [[ "$1" =~ [\'!] ]]; then
134        # csh does history expansion within single quotes, but not
135        # when backslash-escaped!
136        local quoted_quote="'\\''" quoted_exclam="'\\!'"
137        word="${1//\'/${quoted_quote}}"
138        word="${1//\!/${quoted_exclam}}"
139      fi
140      quoted="'$1'"
141    fi
142    echo "$quoted"
143  fi
144}
145
146conf_processed_arguments=()
147conf_quoted_arguments=()
148conf_openjdk_target=
149
150for conf_option
151do
152
153  # Process (and remove) our own extensions that will not be passed to autoconf
154  case $conf_option in
155    --openjdk-target=*)
156      conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
157      ;;
158    --debug-configure)
159      if test "x$conf_debug_configure" != xrecursive; then
160        conf_debug_configure=true
161        export conf_debug_configure
162      fi
163      ;;
164    *)
165      conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
166      ;;
167  esac
168
169  # Store all variables overridden on the command line
170  case $conf_option in
171    [^-]*=*)
172      # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
173      conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
174      CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
175      ;;
176  esac
177
178  # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
179  case $conf_option in
180    *=*)
181      conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
182      conf_option_name=$(shell_quote "$conf_option_name")
183      conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
184      conf_option_value=$(shell_quote "$conf_option_value")
185      conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
186      ;;
187    *)
188      conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
189      ;;
190  esac
191
192  # Check for certain autoconf options that require extra action
193  case $conf_option in
194    -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
195      conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
196    -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
197      conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
198    -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
199      conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
200    -help | --help | --hel | --he | -h)
201      conf_print_help=true ;;
202  esac
203done
204
205# Save the quoted command line
206CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
207
208if test "x$conf_legacy_crosscompile" != "x"; then
209  if test "x$conf_openjdk_target" != "x"; then
210    echo "Error: Specifying --openjdk-target together with autoconf"
211    echo "legacy cross-compilation flags is not supported."
212    echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile."
213    echo "The recommended use is just --openjdk-target."
214    exit 1
215  else
216    echo "Warning: You are using legacy autoconf cross-compilation flags."
217    echo "It is recommended that you use --openjdk-target instead."
218    echo ""
219  fi
220fi
221
222if test "x$conf_openjdk_target" != "x"; then
223  conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
224  conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
225fi
226
227# Make configure exit with error on invalid options as default.
228# Can be overridden by --disable-option-checking, since we prepend our argument
229# and later options override earlier.
230conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
231
232###
233### Call the configure script
234###
235if test -e $conf_custom_script_dir/generated-configure.sh; then
236  # Custom source configure available; run that instead
237  echo "Running custom generated-configure.sh"
238  conf_script_to_run=$conf_custom_script_dir/generated-configure.sh
239else
240  echo "Running generated-configure.sh"
241  conf_script_to_run=$conf_script_dir/generated-configure.sh
242fi
243
244if test "x$conf_debug_configure" != x; then
245  # Turn on shell debug output if requested (initial or recursive)
246  set -x
247fi
248
249if test "x$conf_debug_configure" = xtrue; then
250  # Turn on logging, but don't turn on twice when called recursive
251  conf_debug_logfile=./debug-configure.log
252  (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
253else
254  ( . $conf_script_to_run "${conf_processed_arguments[@]}" )
255fi
256
257conf_result_code=$?
258###
259### Post-processing
260###
261
262if test $conf_result_code -eq 0; then
263  if test "x$conf_print_help" = xtrue; then
264    cat <<EOT
265
266Additional (non-autoconf) OpenJDK Options:
267  --openjdk-target=TARGET cross-compile with TARGET as target platform
268                          (i.e. the one you will run the resulting binary on).
269                          Equivalent to --host=TARGET --target=TARGET
270                          --build=<current platform>
271  --debug-configure       Run the configure script with additional debug
272                          logging enabled.
273
274EOT
275
276    # Print list of toolchains. This must be done by the autoconf script.
277    ( CONFIGURE_PRINT_TOOLCHAIN_LIST=true . $conf_script_to_run PRINTF=printf )
278
279    cat <<EOT
280
281Please be aware that, when cross-compiling, the OpenJDK configure script will
282generally use 'target' where autoconf traditionally uses 'host'.
283
284Also note that variables must be passed on the command line. Variables in the
285environment will generally be ignored, unlike traditional autoconf scripts.
286EOT
287  fi
288else
289  echo configure exiting with result code $conf_result_code
290fi
291
292exit $conf_result_code
293