1#!/bin/bash
2#
3# Copyright (c) 2012, 2018, 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 "ERROR: Calling this wrapper script directly is not supported."
27  echo "Use the 'configure' script in the top-level directory instead."
28  exit 1
29fi
30
31# 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
38if test "x$BASH" = x; then
39  echo "Error: This script must be run using bash." 1>&2
40  exit 1
41fi
42# Force autoconf to use bash. This also means we must disable autoconf re-exec.
43export CONFIG_SHELL=$BASH
44export _as_can_reexec=no
45
46if test "x$CUSTOM_CONFIG_DIR" != x; then
47  custom_hook=$CUSTOM_CONFIG_DIR/custom-hook.m4
48  if test ! -e $custom_hook; then
49    echo "CUSTOM_CONFIG_DIR not pointing to a proper custom config dir."
50    echo "Error: Cannot continue" 1>&2
51    exit 1
52  fi
53fi
54
55CURRENT_DIR=`pwd`
56if test "x$CURRENT_DIR" = "x$TOPDIR"; then
57  # We are running configure from the src root.
58  # Create '.configure-support' under $TOPDIR/build
59  build_support_dir="$TOPDIR/build/.configure-support"
60elif test "x$CURRENT_DIR" = "x$CUSTOM_ROOT"; then
61  # We are running configure from the custom root.
62  # Create '.configure-support' under $CUSTOM_ROOT/build
63  build_support_dir="$CUSTOM_ROOT/build/.configure-support"
64else
65  # We are running configure from outside of the src dir.
66  # Create 'build_support_dir' in the current directory.
67  build_support_dir="$CURRENT_DIR/configure-support"
68fi
69
70conf_script_dir="$TOPDIR/make/autoconf"
71generated_script="$build_support_dir/generated-configure.sh"
72
73###
74### Use autoconf to create a runnable configure script, if needed
75###
76
77autoconf_missing_help() {
78  APT_GET="`which apt-get 2> /dev/null | grep -v '^no apt-get in'`"
79  YUM="`which yum 2> /dev/null | grep -v '^no yum in'`"
80  BREW="`which brew 2> /dev/null | grep -v '^no brew in'`"
81  CYGWIN="`which cygpath 2> /dev/null | grep -v '^no cygpath in'`"
82
83  if test "x$APT_GET" != x; then
84    PKGHANDLER_COMMAND="sudo apt-get install autoconf"
85  elif test "x$YUM" != x; then
86    PKGHANDLER_COMMAND="sudo yum install autoconf"
87  elif test "x$BREW" != x; then
88    PKGHANDLER_COMMAND="brew install autoconf"
89  elif test "x$CYGWIN" != x; then
90    PKGHANDLER_COMMAND="( cd <location of cygwin setup.exe> && cmd /c setup -q -P autoconf )"
91  fi
92
93  if test "x$PKGHANDLER_COMMAND" != x; then
94    echo "You might be able to fix this by running '$PKGHANDLER_COMMAND'."
95  fi
96}
97
98generate_configure_script() {
99  if test "x$AUTOCONF" != x; then
100    if test ! -x "$AUTOCONF"; then
101      echo
102      echo "The specified AUTOCONF variable does not point to a valid autoconf executable:"
103      echo "AUTOCONF=$AUTOCONF"
104      echo "Error: Cannot continue" 1>&2
105      exit 1
106    fi
107  else
108    AUTOCONF="`which autoconf 2> /dev/null | grep -v '^no autoconf in'`"
109    if test "x$AUTOCONF" = x; then
110      echo
111      echo "Autoconf is not found on the PATH, and AUTOCONF is not set."
112      echo "You need autoconf to be able to generate a runnable configure script."
113      autoconf_missing_help
114      echo "Error: Cannot find autoconf" 1>&2
115      exit 1
116    fi
117  fi
118
119  autoconf_version=`$AUTOCONF --version | head -1`
120  echo "Using autoconf at ${AUTOCONF} [$autoconf_version]"
121
122  if test "x$CUSTOM_CONFIG_DIR" != x; then
123    # Generate configure script with custom hooks compiled in.
124    custom_patcher='sed -e "s|#CUSTOM_AUTOCONF_INCLUDE|m4_include([$custom_hook])|"'
125    custom_script_dir_include="-I$CUSTOM_CONFIG_DIR"
126  else
127    custom_patcher='cat'
128    custom_script_dir_include=""
129  fi
130
131  mkdir -p $build_support_dir
132  # Call autoconf but replace the "magic" variable in configure.ac if requested.
133
134  cat $conf_script_dir/configure.ac | eval $custom_patcher | \
135      ${AUTOCONF} -W all $custom_script_dir_include -I$conf_script_dir - \
136      > $generated_script
137  rm -rf autom4te.cache
138
139  # Sanity check
140  if test ! -s $generated_script; then
141    echo "Error: Failed to generate runnable configure script" 1>&2
142    rm -f $generated_script
143    exit 1
144  fi
145}
146
147test_generated_up_to_date() {
148  conf_source_files="$conf_script_dir/configure.ac $conf_script_dir/*.m4"
149  if test "x$CUSTOM_CONFIG_DIR" != x; then
150    conf_custom_source_files="$CUSTOM_CONFIG_DIR/*.m4"
151  else
152    conf_custom_source_files=""
153  fi
154
155  for file in $conf_source_files $conf_custom_source_files ; do
156    if test $file -nt $generated_script; then
157      return 0
158    fi
159  done
160  return 1
161}
162
163run_autoconf=false
164if test "x$1" = xautogen; then
165  # User called us as "configure autogen", so force regeneration
166  run_autoconf=true
167  shift
168fi
169
170if test ! -s $generated_script; then
171  # Generated script is missing, so we need to create it
172  echo "Runnable configure script is not present"
173  run_autoconf=true
174else
175  # File is present, but is it up to date?
176  if test_generated_up_to_date; then
177    echo "Runnable configure script is not up to date"
178    run_autoconf=true
179  fi
180fi
181
182if test "x$run_autoconf" = xtrue; then
183  echo "Generating runnable configure script at $generated_script"
184  generate_configure_script
185fi
186
187# Autoconf calls the configure script recursively sometimes.
188# Don't start logging twice in that case
189if test "x$conf_debug_configure" = xtrue; then
190  conf_debug_configure=recursive
191fi
192
193###
194### Process command-line arguments
195###
196
197# Returns a shell-escaped version of the argument given.
198function shell_quote() {
199  if [[ -n "$1" ]]; then
200    # Uses only shell-safe characters?  No quoting needed.
201    # '=' is a zsh meta-character, but only in word-initial position.
202    if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \
203        && ! echo "$1" | grep '^=' > /dev/null; then
204      quoted="$1"
205    else
206      if echo "$1" | grep "[\'!]" > /dev/null; then
207        # csh does history expansion within single quotes, but not
208        # when backslash-escaped!
209        local quoted_quote="'\\''" quoted_exclam="'\\!'"
210        word="${1//\'/${quoted_quote}}"
211        word="${1//\!/${quoted_exclam}}"
212      fi
213      quoted="'$1'"
214    fi
215    echo "$quoted"
216  fi
217}
218
219conf_processed_arguments=()
220conf_quoted_arguments=()
221conf_openjdk_target=
222
223for conf_option
224do
225
226  # Process (and remove) our own extensions that will not be passed to autoconf
227  case $conf_option in
228    --openjdk-target=*)
229      conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
230      ;;
231    --debug-configure)
232      if test "x$conf_debug_configure" != xrecursive; then
233        conf_debug_configure=true
234        export conf_debug_configure
235      fi
236      ;;
237    *)
238      conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
239      ;;
240  esac
241
242  # Store all variables overridden on the command line
243  case $conf_option in
244    [^-]*=*)
245      # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
246      conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
247      CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
248      ;;
249  esac
250
251  # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
252  case $conf_option in
253    *=*)
254      conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
255      conf_option_name=$(shell_quote "$conf_option_name")
256      conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
257      conf_option_value=$(shell_quote "$conf_option_value")
258      conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
259      ;;
260    *)
261      conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
262      ;;
263  esac
264
265  # Check for certain autoconf options that require extra action
266  case $conf_option in
267    -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
268      conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
269    -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
270      conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
271    -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
272      conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
273    -help | --help | --hel | --he | -h)
274      conf_print_help=true ;;
275  esac
276done
277
278# Save the quoted command line
279CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
280
281if test "x$conf_legacy_crosscompile" != "x"; then
282  if test "x$conf_openjdk_target" != "x"; then
283    echo "Error: Specifying --openjdk-target together with autoconf"
284    echo "legacy cross-compilation flags is not supported."
285    echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile."
286    echo "The recommended use is just --openjdk-target."
287    exit 1
288  else
289    echo "Warning: You are using legacy autoconf cross-compilation flags."
290    echo "It is recommended that you use --openjdk-target instead."
291    echo ""
292  fi
293fi
294
295if test "x$conf_openjdk_target" != "x"; then
296  conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
297  conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
298fi
299
300# Make configure exit with error on invalid options as default.
301# Can be overridden by --disable-option-checking, since we prepend our argument
302# and later options override earlier.
303conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
304
305###
306### Call the configure script
307###
308if test "x$conf_debug_configure" != x; then
309  # Turn on shell debug output if requested (initial or recursive)
310  set -x
311fi
312
313# Now transfer control to the script generated by autoconf. This is where the
314# main work is done.
315RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
316trap "rm -rf \"$RCDIR\"" EXIT
317conf_logfile=./configure.log
318(exec 3>&1 ; ((. $generated_script "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \
319    ; echo $? > "$RCDIR/rc" ) \
320    | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
321
322conf_result_code=`cat "$RCDIR/rc"`
323###
324### Post-processing
325###
326
327if test $conf_result_code -eq 0; then
328  if test "x$conf_print_help" = xtrue; then
329    cat <<EOT
330
331Additional (non-autoconf) OpenJDK Options:
332  --openjdk-target=TARGET cross-compile with TARGET as target platform
333                          (i.e. the one you will run the resulting binary on).
334                          Equivalent to --host=TARGET --target=TARGET
335                          --build=<current platform>
336  --debug-configure       Run the configure script with additional debug
337                          logging enabled.
338
339EOT
340
341    # Print additional help, e.g. a list of toolchains and JVM features.
342    # This must be done by the autoconf script.
343    ( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $generated_script PRINTF=printf )
344
345    cat <<EOT
346
347Please be aware that, when cross-compiling, the OpenJDK configure script will
348generally use 'target' where autoconf traditionally uses 'host'.
349
350Also note that variables must be passed on the command line. Variables in the
351environment will generally be ignored, unlike traditional autoconf scripts.
352EOT
353  fi
354else
355  echo configure exiting with result code $conf_result_code
356fi
357
358exit $conf_result_code
359