#!/bin/bash
#
# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

if test "x$1" != xCHECKME; then
  echo "ERROR: Calling this wrapper script directly is not supported."
  echo "Use the 'configure' script in the top-level directory instead."
  exit 1
fi

# The next argument is the absolute top-level directory path.
# The TOPDIR variable is passed on to configure.ac.
TOPDIR="$2"
# Remove these two arguments to get to the user supplied arguments
shift
shift

if test "x$BASH" = x; then
  echo "Error: This script must be run using bash." 1>&2
  exit 1
fi
# Force autoconf to use bash. This also means we must disable autoconf re-exec.
export CONFIG_SHELL=$BASH
export _as_can_reexec=no

# Make sure all shell commands are executed with the C locale
export LC_ALL=C

if test "x$CUSTOM_CONFIG_DIR" != x; then
  custom_hook=$CUSTOM_CONFIG_DIR/custom-hook.m4
  if test ! -e $custom_hook; then
    echo "CUSTOM_CONFIG_DIR ($CUSTOM_CONFIG_DIR) not pointing to a proper custom config dir."
    echo "Error: Cannot continue" 1>&2
    exit 1
  fi
fi

CURRENT_DIR=`pwd`
if test "x$CURRENT_DIR" = "x$TOPDIR"; then
  # We are running configure from the src root.
  # Create '.configure-support' under $TOPDIR/build
  build_support_dir="$TOPDIR/build/.configure-support"
elif test "x$CURRENT_DIR" = "x$CUSTOM_ROOT"; then
  # We are running configure from the custom root.
  # Create '.configure-support' under $CUSTOM_ROOT/build
  build_support_dir="$CUSTOM_ROOT/build/.configure-support"
else
  # We are running configure from outside of the src dir.
  # Create 'build_support_dir' in the current directory.
  build_support_dir="$CURRENT_DIR/configure-support"
fi

conf_script_dir="$TOPDIR/make/autoconf"
generated_script="$build_support_dir/generated-configure.sh"

###
### Use autoconf to create a runnable configure script, if needed
###

autoconf_missing_help() {
  APT_GET="`type -p apt-get 2> /dev/null`"
  YUM="`type -p yum 2> /dev/null`"
  BREW="`type -p brew 2> /dev/null`"
  ZYPPER="`type -p zypper 2> /dev/null`"
  CYGWIN="`type -p cygpath 2> /dev/null`"
  UNAMEOUT="`uname 2> /dev/null`"

  if test "x$ZYPPER" != x; then
    PKGHANDLER_COMMAND="sudo zypper install autoconf"
  elif test "x$APT_GET" != x; then
    PKGHANDLER_COMMAND="sudo apt-get install autoconf"
  elif test "x$YUM" != x; then
    PKGHANDLER_COMMAND="sudo yum install autoconf"
  elif test "x$BREW" != x; then
    PKGHANDLER_COMMAND="brew install autoconf"
  elif test "x$UNAMEOUT" == xAIX; then
    echo "You might be able to fix this by installing autoconf from the 'AIX Toolbox for Linux Applications' (or compile it from the sources)."
  elif test "x$CYGWIN" != x; then
    PKGHANDLER_COMMAND="( cd <location of cygwin setup.exe> && cmd /c setup -q -P autoconf )"
  fi

  if test "x$PKGHANDLER_COMMAND" != x; then
    echo "You might be able to fix this by running '$PKGHANDLER_COMMAND'."
  fi
}

generate_configure_script() {
  if test "x$AUTOCONF" != x; then
    if test ! -x "$AUTOCONF"; then
      echo
      echo "The specified AUTOCONF variable does not point to a valid autoconf executable:"
      echo "AUTOCONF=$AUTOCONF"
      echo "Error: Cannot continue" 1>&2
      exit 1
    fi
  else
    AUTOCONF="`type -p autoconf 2> /dev/null`"
    if test "x$AUTOCONF" = x; then
      echo
      echo "Autoconf is not found on the PATH ($PATH), and AUTOCONF is not set."
      echo "You need autoconf to be able to generate a runnable configure script."
      autoconf_missing_help
      echo "Error: Cannot find autoconf" 1>&2
      exit 1
    fi
  fi

  autoconf_version=`$AUTOCONF --version | head -1`
  echo "Using autoconf at ${AUTOCONF} [$autoconf_version]"

  if test "x$CUSTOM_CONFIG_DIR" != x; then
    # Generate configure script with custom hooks compiled in.
    custom_patcher='sed -e "s|#CUSTOM_AUTOCONF_INCLUDE|m4_include([$custom_hook])|"'
    custom_script_dir_include="-I$CUSTOM_CONFIG_DIR"
  else
    custom_patcher='cat'
    custom_script_dir_include=""
  fi

  mkdir -p $build_support_dir
  # Call autoconf but replace the "magic" variable in configure.ac if requested.

  cat $conf_script_dir/configure.ac | eval $custom_patcher | \
      ${AUTOCONF} -W all $custom_script_dir_include -I$conf_script_dir - \
      > $generated_script
  rm -rf autom4te.cache

  # Sanity check
  if test ! -s $generated_script; then
    echo "Error: Failed to generate runnable configure script" 1>&2
    rm -f $generated_script
    exit 1
  fi
}

test_generated_up_to_date() {
  conf_source_files="$conf_script_dir/configure.ac $conf_script_dir/*.m4"
  if test "x$CUSTOM_CONFIG_DIR" != x; then
    conf_custom_source_files="$CUSTOM_CONFIG_DIR/*.m4"
  else
    conf_custom_source_files=""
  fi

  for file in $conf_source_files $conf_custom_source_files ; do
    if test $file -nt $generated_script; then
      return 0
    fi
  done
  return 1
}

run_autoconf=false
if test "x$1" = xautogen; then
  # User called us as "configure autogen", so force regeneration
  run_autoconf=true
  shift
fi

if test ! -s $generated_script; then
  # Generated script is missing, so we need to create it
  echo "Runnable configure script is not present"
  run_autoconf=true
else
  # File is present, but is it up to date?
  if test_generated_up_to_date; then
    echo "Runnable configure script is not up to date"
    run_autoconf=true
  fi
fi

if test "x$run_autoconf" = xtrue; then
  echo "Generating runnable configure script at $generated_script"
  generate_configure_script
fi

# Autoconf calls the configure script recursively sometimes.
# Don't start logging twice in that case
if test "x$conf_debug_configure" = xtrue; then
  conf_debug_configure=recursive
fi

###
### Process command-line arguments
###

# Returns a shell-escaped version of the argument given.
function shell_quote() {
  if [[ -n "$1" ]]; then
    # Uses only shell-safe characters?  No quoting needed.
    # '=' is a zsh meta-character, but only in word-initial position.
    if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \
        && ! echo "$1" | grep '^=' > /dev/null; then
      quoted="$1"
    else
      if echo "$1" | grep "[\'!]" > /dev/null; then
        # csh does history expansion within single quotes, but not
        # when backslash-escaped!
        local quoted_quote="'\\''" quoted_exclam="'\\!'"
        word="${1//\'/${quoted_quote}}"
        word="${1//\!/${quoted_exclam}}"
      fi
      quoted="'$1'"
    fi
    echo "$quoted"
  fi
}

conf_processed_arguments=()
conf_quoted_arguments=()
conf_openjdk_target=

for conf_option
do

  # Process (and remove) our own extensions that will not be passed to autoconf
  case $conf_option in
    --openjdk-target=*)
      conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
      ;;
    --debug-configure)
      if test "x$conf_debug_configure" != xrecursive; then
        conf_debug_configure=true
        export conf_debug_configure
      fi
      ;;
    *)
      conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
      ;;
  esac

  # Store all variables overridden on the command line
  case $conf_option in
    [^-]*=*)
      # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
      conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
      CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
      ;;
  esac

  # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
  case $conf_option in
    *=*)
      conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
      conf_option_name=$(shell_quote "$conf_option_name")
      conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
      conf_option_value=$(shell_quote "$conf_option_value")
      conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
      ;;
    *)
      conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
      ;;
  esac

  # Check for certain autoconf options that require extra action
  case $conf_option in
    -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
      conf_build_set=true ;;
    -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
      conf_incompatible_crosscompile="$conf_incompatible_crosscompile $conf_option" ;;
    -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
      conf_incompatible_crosscompile="$conf_incompatible_crosscompile $conf_option" ;;
    -help | --help | --hel | --he | -h)
      conf_print_help=true ;;
  esac
done

# Save the quoted command line
CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"

if test "x$conf_incompatible_crosscompile" != "x"; then
  if test "x$conf_openjdk_target" != "x"; then
    echo "Error: --openjdk-target was specified together with"
    echo "incompatible autoconf cross-compilation flags."
    echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_incompatible_crosscompile."
    echo "It is recommended that you only use --openjdk-target."
    exit 1
  else
    echo "Warning: You are using misleading autoconf cross-compilation flag(s)."
    echo "This is not encouraged as use of such flags during building can"
    echo "quickly become confusing."
    echo "It is highly recommended that you use --openjdk-target instead."
    echo ""
  fi
fi

if test "x$conf_openjdk_target" != "x"; then
  conf_processed_arguments=("--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")

  # If --build has been explicitly set don't override that flag with our own
  if test "x$conf_build_set" != xtrue; then
    conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
    conf_processed_arguments=("--build=$conf_build_platform" "${conf_processed_arguments[@]}")
  fi
fi

# Make configure exit with error on invalid options as default.
# Can be overridden by --disable-option-checking, since we prepend our argument
# and later options override earlier.
conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")

###
### Call the configure script
###
if test "x$conf_debug_configure" != x; then
  # Turn on shell debug output if requested (initial or recursive)
  set -x
fi

# Now transfer control to the script generated by autoconf. This is where the
# main work is done.
RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
trap "rm -rf \"$RCDIR\"" EXIT
conf_logfile=./configure.log
(exec 3>&1 ; ((. $generated_script "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \
    ; echo $? > "$RCDIR/rc" ) \
    | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile

conf_result_code=`cat "$RCDIR/rc"`
###
### Post-processing
###

if test $conf_result_code -eq 0; then
  if test "x$conf_print_help" = xtrue; then
    cat <<EOT

Additional (non-autoconf) OpenJDK Options:
  --openjdk-target=TARGET cross-compile with TARGET as target platform
                          (i.e. the one you will run the resulting binary on).
                          Equivalent to --host=TARGET --target=TARGET
                          --build=<current platform>, or the platform you
                          have provided if you have explicitly passed
                          --build to configure
  --debug-configure       Run the configure script with additional debug
                          logging enabled.

EOT

    # Print additional help, e.g. a list of toolchains and JVM features.
    # This must be done by the autoconf script.
    ( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $generated_script PRINTF=printf )

    cat <<EOT

Please be aware that, when cross-compiling, the OpenJDK configure script will
generally use 'target' where autoconf traditionally uses 'host'.

Also note that variables must be passed on the command line. Variables in the
environment will generally be ignored, unlike traditional autoconf scripts.
EOT
  fi
else
  echo configure exiting with result code $conf_result_code
fi

exit $conf_result_code
