#! /bin/sh
# bootstrap -- Helps bootstrapping libtool, when checked out from repository.
#
#   Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010 Free Software
#   Foundation, Inc,
#   Mritten by Gary V. Vaughan, 2003
#
#   This file is part of GNU Libtool.
#
# GNU Libtool is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# GNU Libtool 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 for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####

# Exit upon failure.
set -e

# It is okay for the bootstrap process to require unreleased autoconf
# or automake, as long as any released libtool will work with at least
# the newest stable versions of each.  Generally, newer versions offer
# better features, and configure.ac documents oldest version of each
# required for bootstrap (AC_PREREQ, and AM_INIT_AUTOMAKE).

SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
: ${AUTORECONF=autoreconf}
: ${AUTOCONF=autoconf}
: ${AUTOMAKE=automake}
: ${AUTOM4TE=autom4te}
: ${MAKE=make}
: ${GREP=grep}
: ${EGREP=egrep}
: ${FGREP=fgrep}
: ${SED=sed}
: ${LN_S='ln -s'}
: ${MAKEINFO=makeinfo}

case $1 in
--help|-h*)
  cat <<EOF
`echo $0 | sed 's,^.*/,,g'`: This script is designed to bootstrap a fresh repository checkout
of Libtool.  Useful environment variable settings:
  reconfdirs='. libltdl'     Do not bootstrap the old test suite.
EOF
  exit
  ;;
esac

test -f ./configure.ac || {
  echo "bootstrap: can't find ./configure.ac, please rerun from top_srcdir"
  exit 1
}


# Extract aux_dir and macro_dir from configure.ac:
lt_tab='	'
my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
	/^AC_CONFIG_AUX_DIR[^_]/  {
	    s,^.*AC_CONFIG_AUX_DIR([[ '"$lt_tab"']*\([^])]*\).*$,aux_dir=\1,; p;
	};
	/^LT_CONFIG_LTDL_DIR[^_]/  {
	    s,^.*LT_CONFIG_LTDL_DIR([[ '"$lt_tab"']*\([^])]*\).*$,ltdl_dir=\1,; p;
	};
	/^AC_CONFIG_MACRO_DIR/   {
	    s,^.*AC_CONFIG_MACRO_DIR([[ '"$lt_tab"']*\([^])]*\).*$,macro_dir=\1,; p;
	};
	d;'
eval `cat configure.ac 2>/dev/null | $SED "$my_sed_traces"`


# Upgrade caveat:
cat <<'EOF'
WARNING: If bootstrapping with this script fails, it may be due to an
WARNING: incompatible installed `libtool.m4' being pulled in to
WARNING: `aclocal.m4'.  The best way to work around such a problem is to
WARNING: uninstall your system libtool files, or failing that, overwrite
WARNING: them with all m4 file as shipped with this distribution (except
WARNING: `lt~obsolete.m4').  After that, retry this bootstrap.
EOF

find . -depth \( -name autom4te.cache -o -name libtool \) -print \
  | grep -v '{arch}' \
  | xargs rm -rf

# Delete stale files from previous libtool versions.
rm -f acinclude.m4 libltdl/config.h

for file in argz.c lt__dirent.c lt__strl.c; do
  rm -f $file
done

if test -z "$reconfdirs"; then
  reconfdirs=". libltdl `ls -1d tests/*demo tests/*demo[0-9]`"
fi

# Extract the package name and version number from configure.ac:
set dummy `$SED -n '
    /AC_INIT/{
	s/[][,()]/ /g
	s/ GNU / /
	p
    }' configure.ac`
shift
PACKAGE=`echo "$2" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
PACKAGE_NAME=$2
PACKAGE_URL=
if grep 'AC_INIT.*GNU' configure.ac >/dev/null; then
  PACKAGE_NAME="GNU $PACKAGE_NAME"
  PACKAGE_URL="http://www.gnu.org/software/$PACKAGE/"
fi
VERSION=$3

# Whip up a dirty Makefile:
makes='Makefile.am libltdl/Makefile.inc'
rm -f Makefile
{
  echo "aux_dir	= $aux_dir"
  echo "ltdl_dir = $ltdl_dir"
  echo "macro_dir = $macro_dir"
  $SED '/^if /,/^endif$/d;/^else$/,/^endif$/d;/^include /d' $makes
} > Makefile

# Building distributed files from configure is bad for automake, so we
# generate them here, and have Makefile rules to keep them up to date.
$MAKE bootstrap-deps  \
    M4SH="$AUTOM4TE --language=m4sh" PACKAGE="$PACKAGE" \
    PACKAGE_BUGREPORT="bug-$PACKAGE@gnu.org" PACKAGE_NAME="$PACKAGE_NAME" \
    PACKAGE_URL="$PACKAGE_URL" SED="$SED" srcdir=. VERSION="$VERSION"

rm -f Makefile

# Make a dummy libtoolize script for autoreconf:
cat > $aux_dir/libtoolize <<'EOF'
#! /bin/sh
# This is a dummy file for bootstrapping libtool.
echo "$0: Bootstrap detected, no files installed." | sed 's,^.*/,,g'
exit 0
EOF
chmod 755 $aux_dir/libtoolize

# Running the installed `libtoolize' will trash the local (newer) libtool.m4
# among others.  Call the dummy script we made earlier.
LIBTOOLIZE=`pwd`/$aux_dir/libtoolize
export LIBTOOLIZE

for sub in $reconfdirs; do
  $AUTORECONF --force --verbose --install $sub
done

# Autoheader valiantly tries to prevent needless reconfigurations by
# not changing the timestamp of config-h.in unless the file contents
# are updated.  Unfortunately config-h.in depends on aclocal.m4 which
# *is* updated, so running 'libtoolize --ltdl=. && configure && make'
# causes autoheader to be called... undesireable for users that do not
# have it!  Fudge the timestamp to prevent that:
sleep 2 && touch libltdl/config-h.in

# Remove our dummy libtoolize
rm -f $aux_dir/libtoolize

# These files can cause an infinite configure loop if left behind.
rm -f Makefile libltdl/Makefile libtool vcl.tmp

# This file is misgenerated earlier in bootstrap to satisfy automake 1.9.1
# and earlier, but has a new enough timestamp to not be updated.  Force it
# to be regenerated at make-time with proper substitutions in place:
touch $aux_dir/ltmain.m4sh

for macro in LT_INIT AC_PROG_LIBTOOL AM_PROG_LIBTOOL; do
  if grep $macro aclocal.m4 libltdl/aclocal.m4; then
    echo "Bogus $macro macro contents in an aclocal.m4 file." >&2
    exit 1
  else :; fi
done

exit 0
