make/autoconf/configure
changeset 47216 71c04702a3d5
parent 37402 62b5f067032e
child 47217 72e3ae9a25eb
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 #!/bin/bash
       
     2 #
       
     3 # Copyright (c) 2012, 2016, 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 
       
    25 if 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)
       
    30 else
       
    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
       
    37 fi
       
    38 
       
    39 if test "x$BASH" = x; then
       
    40   echo "Error: This script must be run using bash." 1>&2
       
    41   exit 1
       
    42 fi
       
    43 # Force autoconf to use bash. This also means we must disable autoconf re-exec.
       
    44 export CONFIG_SHELL=$BASH
       
    45 export _as_can_reexec=no
       
    46 
       
    47 conf_script_dir="$TOPDIR/common/autoconf"
       
    48 
       
    49 if [ "$CUSTOM_CONFIG_DIR" = "" ]; then
       
    50   conf_custom_script_dir="$TOPDIR/closed/autoconf"
       
    51 else
       
    52   conf_custom_script_dir="$CUSTOM_CONFIG_DIR"
       
    53 fi
       
    54 
       
    55 ###
       
    56 ### Test that the generated configure is up-to-date
       
    57 ###
       
    58 
       
    59 run_autogen_or_fail() {
       
    60   if test "x`which autoconf 2> /dev/null | grep -v '^no autoconf in'`" = x; then
       
    61     echo "Cannot locate autoconf, unable to correct situation."
       
    62     echo "Please install autoconf and run 'bash autogen.sh' to update the generated files."
       
    63     echo "Error: Cannot continue" 1>&2
       
    64     exit 1
       
    65   else
       
    66     echo "Running autogen.sh to correct the situation"
       
    67     bash $conf_script_dir/autogen.sh
       
    68   fi
       
    69 }
       
    70 
       
    71 check_autoconf_timestamps() {
       
    72   for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do
       
    73     if test $file -nt $conf_script_dir/generated-configure.sh; then
       
    74       echo "Warning: The configure source files is newer than the generated files."
       
    75       run_autogen_or_fail
       
    76     fi
       
    77   done
       
    78 
       
    79   if test -e $conf_custom_script_dir/generated-configure.sh; then
       
    80     # If custom source configure is available, make sure it is up-to-date as well.
       
    81     for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $conf_custom_script_dir/*.m4; do
       
    82       if test $file -nt $conf_custom_script_dir/generated-configure.sh; then
       
    83         echo "Warning: The configure source files is newer than the custom generated files."
       
    84         run_autogen_or_fail
       
    85       fi
       
    86     done
       
    87   fi
       
    88 }
       
    89 
       
    90 check_hg_updates() {
       
    91   if test "x`which hg 2> /dev/null | grep -v '^no hg in'`" != x; then
       
    92     conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf`
       
    93     if test "x$conf_updated_autoconf_files" != x; then
       
    94       echo "Configure source code has been updated, checking time stamps"
       
    95       check_autoconf_timestamps
       
    96     fi
       
    97 
       
    98     if test -e $conf_custom_script_dir; then
       
    99       # If custom source configure is available, make sure it is up-to-date as well.
       
   100       conf_custom_updated_autoconf_files=`cd $conf_custom_script_dir && hg status -mard 2> /dev/null | grep autoconf`
       
   101       if test "x$conf_custom_updated_autoconf_files" != x; then
       
   102         echo "Configure custom source code has been updated, checking time stamps"
       
   103         check_autoconf_timestamps
       
   104       fi
       
   105     fi
       
   106   fi
       
   107 }
       
   108 
       
   109 # Check for local changes
       
   110 check_hg_updates
       
   111 
       
   112 if test -e $conf_custom_script_dir/generated-configure.sh; then
       
   113   # Test if open configure is newer than custom configure, if so, custom needs to
       
   114   # be regenerated. This test is required to ensure consistency with custom source.
       
   115   conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh  | cut -d"=" -f 2`
       
   116   conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_custom_script_dir/generated-configure.sh  | cut -d"=" -f 2`
       
   117   if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then
       
   118     echo "Warning: The generated configure file contains changes not present in the custom generated file."
       
   119     run_autogen_or_fail
       
   120   fi
       
   121 fi
       
   122 
       
   123 # Autoconf calls the configure script recursively sometimes.
       
   124 # Don't start logging twice in that case
       
   125 if test "x$conf_debug_configure" = xtrue; then
       
   126   conf_debug_configure=recursive
       
   127 fi
       
   128 
       
   129 ###
       
   130 ### Process command-line arguments
       
   131 ###
       
   132 
       
   133 # Returns a shell-escaped version of the argument given.
       
   134 function shell_quote() {
       
   135   if [[ -n "$1" ]]; then
       
   136     # Uses only shell-safe characters?  No quoting needed.
       
   137     # '=' is a zsh meta-character, but only in word-initial position.
       
   138     if echo "$1" | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\.:,%/+=_-]\{1,\}$' > /dev/null \
       
   139         && ! echo "$1" | grep '^=' > /dev/null; then
       
   140       quoted="$1"
       
   141     else
       
   142       if echo "$1" | grep "[\'!]" > /dev/null; then
       
   143         # csh does history expansion within single quotes, but not
       
   144         # when backslash-escaped!
       
   145         local quoted_quote="'\\''" quoted_exclam="'\\!'"
       
   146         word="${1//\'/${quoted_quote}}"
       
   147         word="${1//\!/${quoted_exclam}}"
       
   148       fi
       
   149       quoted="'$1'"
       
   150     fi
       
   151     echo "$quoted"
       
   152   fi
       
   153 }
       
   154 
       
   155 conf_processed_arguments=()
       
   156 conf_quoted_arguments=()
       
   157 conf_openjdk_target=
       
   158 
       
   159 for conf_option
       
   160 do
       
   161 
       
   162   # Process (and remove) our own extensions that will not be passed to autoconf
       
   163   case $conf_option in
       
   164     --openjdk-target=*)
       
   165       conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'`
       
   166       ;;
       
   167     --debug-configure)
       
   168       if test "x$conf_debug_configure" != xrecursive; then
       
   169         conf_debug_configure=true
       
   170         export conf_debug_configure
       
   171       fi
       
   172       ;;
       
   173     *)
       
   174       conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option")
       
   175       ;;
       
   176   esac
       
   177 
       
   178   # Store all variables overridden on the command line
       
   179   case $conf_option in
       
   180     [^-]*=*)
       
   181       # Add name of variable to CONFIGURE_OVERRIDDEN_VARIABLES list inside !...!.
       
   182       conf_env_var=`expr "x$conf_option" : 'x\([^=]*\)='`
       
   183       CONFIGURE_OVERRIDDEN_VARIABLES="$CONFIGURE_OVERRIDDEN_VARIABLES!$conf_env_var!"
       
   184       ;;
       
   185   esac
       
   186 
       
   187   # Save the arguments, intelligently quoted for CONFIGURE_COMMAND_LINE.
       
   188   case $conf_option in
       
   189     *=*)
       
   190       conf_option_name=`expr "x$conf_option" : 'x\([^=]*\)='`
       
   191       conf_option_name=$(shell_quote "$conf_option_name")
       
   192       conf_option_value=`expr "x$conf_option" : 'x[^=]*=\(.*\)'`
       
   193       conf_option_value=$(shell_quote "$conf_option_value")
       
   194       conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$conf_option_name=$conf_option_value")
       
   195       ;;
       
   196     *)
       
   197       conf_quoted_arguments=("${conf_quoted_arguments[@]}" "$(shell_quote "$conf_option")")
       
   198       ;;
       
   199   esac
       
   200 
       
   201   # Check for certain autoconf options that require extra action
       
   202   case $conf_option in
       
   203     -build | --build | --buil | --bui | --bu |-build=* | --build=* | --buil=* | --bui=* | --bu=*)
       
   204       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
       
   205     -target | --target | --targe | --targ | --tar | --ta | --t | -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
       
   206       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
       
   207     -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*)
       
   208       conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;;
       
   209     -help | --help | --hel | --he | -h)
       
   210       conf_print_help=true ;;
       
   211   esac
       
   212 done
       
   213 
       
   214 # Save the quoted command line
       
   215 CONFIGURE_COMMAND_LINE="${conf_quoted_arguments[@]}"
       
   216 
       
   217 if test "x$conf_legacy_crosscompile" != "x"; then
       
   218   if test "x$conf_openjdk_target" != "x"; then
       
   219     echo "Error: Specifying --openjdk-target together with autoconf"
       
   220     echo "legacy cross-compilation flags is not supported."
       
   221     echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile."
       
   222     echo "The recommended use is just --openjdk-target."
       
   223     exit 1
       
   224   else
       
   225     echo "Warning: You are using legacy autoconf cross-compilation flags."
       
   226     echo "It is recommended that you use --openjdk-target instead."
       
   227     echo ""
       
   228   fi
       
   229 fi
       
   230 
       
   231 if test "x$conf_openjdk_target" != "x"; then
       
   232   conf_build_platform=`sh $conf_script_dir/build-aux/config.guess`
       
   233   conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}")
       
   234 fi
       
   235 
       
   236 # Make configure exit with error on invalid options as default.
       
   237 # Can be overridden by --disable-option-checking, since we prepend our argument
       
   238 # and later options override earlier.
       
   239 conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}")
       
   240 
       
   241 ###
       
   242 ### Call the configure script
       
   243 ###
       
   244 if test -e $conf_custom_script_dir/generated-configure.sh; then
       
   245   # Custom source configure available; run that instead
       
   246   echo "Running custom generated-configure.sh"
       
   247   conf_script_to_run=$conf_custom_script_dir/generated-configure.sh
       
   248 else
       
   249   echo "Running generated-configure.sh"
       
   250   conf_script_to_run=$conf_script_dir/generated-configure.sh
       
   251 fi
       
   252 
       
   253 if test "x$conf_debug_configure" != x; then
       
   254   # Turn on shell debug output if requested (initial or recursive)
       
   255   set -x
       
   256 fi
       
   257 
       
   258 # Now transfer control to the script generated by autoconf. This is where the
       
   259 # main work is done.
       
   260 RCDIR=`mktemp -dt jdk-build-configure.tmp.XXXXXX` || exit $?
       
   261 trap "rm -rf \"$RCDIR\"" EXIT
       
   262 conf_logfile=./configure.log
       
   263 (exec 3>&1 ; ((. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) \
       
   264     ; echo $? > "$RCDIR/rc" ) \
       
   265     | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
       
   266 
       
   267 conf_result_code=`cat "$RCDIR/rc"`
       
   268 ###
       
   269 ### Post-processing
       
   270 ###
       
   271 
       
   272 if test $conf_result_code -eq 0; then
       
   273   if test "x$conf_print_help" = xtrue; then
       
   274     cat <<EOT
       
   275 
       
   276 Additional (non-autoconf) OpenJDK Options:
       
   277   --openjdk-target=TARGET cross-compile with TARGET as target platform
       
   278                           (i.e. the one you will run the resulting binary on).
       
   279                           Equivalent to --host=TARGET --target=TARGET
       
   280                           --build=<current platform>
       
   281   --debug-configure       Run the configure script with additional debug
       
   282                           logging enabled.
       
   283 
       
   284 EOT
       
   285 
       
   286     # Print additional help, e.g. a list of toolchains and JVM features.
       
   287     # This must be done by the autoconf script.
       
   288     ( CONFIGURE_PRINT_ADDITIONAL_HELP=true . $conf_script_to_run PRINTF=printf )
       
   289 
       
   290     cat <<EOT
       
   291 
       
   292 Please be aware that, when cross-compiling, the OpenJDK configure script will
       
   293 generally use 'target' where autoconf traditionally uses 'host'.
       
   294 
       
   295 Also note that variables must be passed on the command line. Variables in the
       
   296 environment will generally be ignored, unlike traditional autoconf scripts.
       
   297 EOT
       
   298   fi
       
   299 else
       
   300   echo configure exiting with result code $conf_result_code
       
   301 fi
       
   302 
       
   303 exit $conf_result_code