Merge from emacs-24; up to 2014-05-15T16:55:18Z!jan.h.d@swipnet.se
[bpt/emacs.git] / autogen.sh
index d15817d..32f86ab 100755 (executable)
@@ -1,9 +1,10 @@
 #!/bin/sh
 ### autogen.sh - tool to help build Emacs from a bzr checkout
 
-## Copyright (C) 2011  Free Software Foundation, Inc.
+## Copyright (C) 2011-2014 Free Software Foundation, Inc.
 
 ## Author: Glenn Morris <rgm@gnu.org>
+## Maintainer: emacs-devel@gnu.org
 
 ## This file is part of GNU Emacs.
 
 ## The Emacs bzr repository does not include the configure script
 ## (and associated helpers).  The first time you fetch Emacs from bzr,
 ## run this script to generate the necessary files.
-## For more details, see the file INSTALL.BZR.
+## For more details, see the file INSTALL.REPO.
 
 ### Code:
 
 ## Tools we need:
 ## Note that we respect the values of AUTOCONF etc, like autoreconf does.
-progs="autoconf automake"
+progs="autoconf automake pkg-config"
 
 ## Minimum versions we need:
-autoconf_min=`sed -n 's/^ *AC_PREREQ(\([0-9\.]*\)).*/\1/p' configure.in`
+autoconf_min=`sed -n 's/^ *AC_PREREQ(\([0-9\.]*\)).*/\1/p' configure.ac`
 
-## FIXME how to determine this from the sources?
-automake_min=1.11
+## This will need improving if more options are ever added to the
+## AM_INIT_AUTOMAKE call.
+automake_min=`sed -n 's/^ *AM_INIT_AUTOMAKE(\([0-9\.]*\)).*/\1/p' configure.ac`
 
+pkg_config_min=`sed -n 's/^ *PKG_PROG_PKG_CONFIG(\([0-9\.]*\)).*/\1/p' configure.ac`
 
 ## $1 = program, eg "autoconf".
 ## Echo the version string, eg "2.59".
@@ -48,7 +51,7 @@ automake_min=1.11
 get_version ()
 {
     ## Remove eg "./autogen.sh: line 50: autoconf: command not found".
-    $1 --version 2>&1 | sed -e '/not found/d' -n -e '1 s/.* \([1-9][0-9\.]*\).*/\1/p'
+    $1 --version 2>&1 | sed -e '/not found/d' -e 's/.* //' -n -e '1 s/\([0-9][0-9\.]*\).*/\1/p'
 }
 
 ## $1 = version string, eg "2.59"
@@ -67,14 +70,14 @@ minor_version ()
 
 ## $1 = program
 ## $2 = minimum version.
-## Return 0 if program is present with version >= minumum version.
+## Return 0 if program is present with version >= minimum version.
 ## Return 1 if program is missing.
 ## Return 2 if program is present but too old.
 ## Return 3 for unexpected error (eg failed to parse version).
 check_version ()
 {
     ## Respect eg $AUTOMAKE if it is set, like autoreconf does.
-    uprog=`echo $1 | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+    uprog=`echo $1 | sed -e 's/-/_/g' -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
 
     eval uprog=\$${uprog}
 
@@ -104,7 +107,7 @@ check_version ()
 
 cat <<EOF
 Checking whether you have the necessary tools...
-(Read INSTALL.BZR for more details on building Emacs)
+(Read INSTALL.REPO for more details on building Emacs)
 
 EOF
 
@@ -112,7 +115,9 @@ missing=
 
 for prog in $progs; do
 
-    eval min=\$${prog}_min
+    sprog=`echo "$prog" | sed 's/-/_/g'`
+
+    eval min=\$${sprog}_min
 
     echo "Checking for $prog (need at least version $min)..."
 
@@ -131,7 +136,7 @@ for prog in $progs; do
 
     if [ $retval -ne 0 ]; then
         missing="$missing $prog"
-        eval ${prog}_why=\""$stat"\"
+        eval ${sprog}_why=\""$stat"\"
     fi
 
 done
@@ -145,7 +150,9 @@ Building Emacs from Bzr requires the following specialized programs:
 EOF
 
     for prog in $progs; do
-        eval min=\$${prog}_min
+        sprog=`echo "$prog" | sed 's/-/_/g'`
+
+        eval min=\$${sprog}_min
 
         echo "$prog (minimum version $min)"
     done
@@ -157,7 +164,9 @@ Your system seems to be missing the following tool(s):
 EOF
 
     for prog in $missing; do
-        eval why=\$${prog}_why
+        sprog=`echo "$prog" | sed 's/-/_/g'`
+
+        eval why=\$${sprog}_why
 
         echo "$prog ($why)"
     done
@@ -186,30 +195,118 @@ this script.
 If you know that the required versions are in your PATH, but this
 script has made an error, then you can simply run
 
-autoreconf -i -I m4
+autoreconf -fi -I m4
 
 instead of this script.
 
-If all else fails, you can try using the pre-built versions of the
-generated files by doing:
-
-./autogen/copy_autogen
-
-This is not recommended - see the comments in \`copy_autogen'.
-
 Please report any problems with this script to bug-gnu-emacs@gnu.org .
 EOF
 
     exit 1
 fi
 
-echo "Your system has the required tools, running autoreconf..."
+# If automake is installed in a nonstandard location, find the standard
+# location if possible and append it to ACLOCAL_PATH.  That way, it will
+# find the pkg.m4 that is installed in the standard location.
+echo "Checking for pkg.m4..."
+AUTORECONF_ENV=
+env_space=
+ac_dir=`aclocal --print-ac-dir` || {
+    cat <<EOF
+There was a problem running 'aclocal --print-ac-dir'.
+The aclocal program is part of automake.
+Please check your automake installation.
+EOF
+
+    exit 1
+}
+
+test -n "$ac_dir" && test -r "$ac_dir/pkg.m4" || {
+
+  # Maybe ACLOCAL_PATH is already set-up.
+  if test -n "$ACLOCAL_PATH"; then
+    oIFS=$IFS
+    IFS=:
+    for dir in $ACLOCAL_PATH; do
+      if test -r "$dir/pkg.m4"; then
+       AUTORECONF_ENV="ACLOCAL_PATH='$ACLOCAL_PATH'"
+        env_space=' '
+       break
+      fi
+    done
+    IFS=$oIFS
+  fi
+
+  if test -z "$AUTORECONF_ENV"; then
+    oIFS=$IFS
+    IFS=:
+    before_first_aclocal=true
+    for dir in $PATH; do
+      if test -x "$dir/aclocal"; then
+        if $before_first_aclocal; then
+          before_first_aclocal=false
+        elif ac_dir=`"$dir/aclocal" --print-ac-dir` && test -r "$ac_dir/pkg.m4"
+        then
+          case $ACLOCAL_PATH in
+            '') ACLOCAL_PATH=$ac_dir;;
+            ?*) ACLOCAL_PATH=$ACLOCAL_PATH:$ac_dir;;
+          esac
+          export ACLOCAL_PATH
+          AUTORECONF_ENV="ACLOCAL_PATH='$ACLOCAL_PATH'"
+          env_space=' '
+          break
+        fi
+      fi
+    done
+    IFS=$oIFS
+  fi
+
+  ## OK, maybe pkg-config is in a weird place (eg on hydra).
+  if test -z "$AUTORECONF_ENV"; then
+    oIFS=$IFS
+    IFS=:
+    for dir in $PATH; do
+      if test -x "$dir/pkg-config"; then
+        ac_dir=`echo "$dir" | sed 's|bin$|share/aclocal|'`
+        if test -r "$ac_dir/pkg.m4"; then
+          case $ACLOCAL_PATH in
+            '') ACLOCAL_PATH=$ac_dir;;
+            ?*) ACLOCAL_PATH=$ACLOCAL_PATH:$ac_dir;;
+          esac
+          export ACLOCAL_PATH
+          AUTORECONF_ENV="ACLOCAL_PATH='$ACLOCAL_PATH'"
+          env_space=' '
+          break
+        fi
+      fi
+    done
+    IFS=$oIFS
+  fi
+
+  if test -z "$AUTORECONF_ENV"; then
+    cat <<EOF
+The version of aclocal that you are using cannot find the pkg.m4 file that
+pkg-config provides.  If it is installed in some unusual directory /FOO/BAR,
+set ACLOCAL_PATH='/FOO/BAR' in the environment and run this script again.
+EOF
+    exit 1
+  fi
+}
+echo ok
+
+echo 'Your system has the required tools.'
+echo "Running \"$AUTORECONF_ENV${env_space}autoreconf -fi -I m4\" ..."
 
 
 ## Let autoreconf figure out what, if anything, needs doing.
-autoreconf -i -I m4 || exit $?
+## Use autoreconf's -f option in case autoreconf itself has changed.
+autoreconf -fi -I m4 || exit $?
+
+## Create a timestamp, so that './autogen.sh; make' doesn't
+## cause 'make' to needlessly run 'autoheader'.
+echo timestamp > src/stamp-h.in || exit
 
-echo "You can now run \`./configure'."
+echo "You can now run \"./configure$env_space$AUTORECONF_ENV\"."
 
 exit 0