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