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