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