#! /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 auxdir and m4dir from configure.ac:
lt_tab='	'
my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
	/AC_CONFIG_AUX_DIR[^_]/  {
	    s,^.*AC_CONFIG_AUX_DIR([[ '"$lt_tab"']*\([^])]*\).*$,auxdir=\1,; p;
	};
	/AC_CONFIG_MACRO_DIR/   {
	    s,^.*AC_CONFIG_MACRO_DIR([[ '"$lt_tab"']*\([^])]*\).*$,m4dir=\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
$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.
# We don't have all the substitution values to build ltmain.sh from this
# script yet, but we need config/ltmain.sh for the libtool commands in
# configure, and ltversion.m4 to generate configure in the first place:
rm -f $auxdir/ltmain.sh $m4dir/ltversion.m4

$MAKE ./$auxdir/ltmain.sh ./$m4dir/ltversion.m4 \
    ./libtoolize.in ./tests/defs.in ./tests/package.m4 \
    ./tests/testsuite ./libltdl/Makefile.am ./doc/notes.txt \
    srcdir=. top_srcdir=. PACKAGE="$PACKAGE" VERSION="$VERSION" \
    PACKAGE_NAME="$PACKAGE_NAME" PACKAGE_URL="$PACKAGE_URL" \
    PACKAGE_BUGREPORT="bug-$PACKAGE@gnu.org" M4SH="$AUTOM4TE --language=m4sh" \
    AUTOTEST="$AUTOM4TE --language=autotest" SED="$SED" MAKEINFO="$MAKEINFO" \
    GREP="$GREP" FGREP="$FGREP" EGREP="$EGREP" LN_S="$LN_S"

test -f clcommit.m4sh && $MAKE -f Makefile.maint ./commit \
    srcdir=. top_srcdir=. PACKAGE="$PACKAGE" VERSION="$VERSION" \
    M4SH="$AUTOM4TE -l m4sh" \
    SED="$SED" GREP="$GREP" FGREP="$FGREP" EGREP="$EGREP" LN_S="$LN_S"

rm -f Makefile

# Make a dummy libtoolize script for autoreconf:
cat > $auxdir/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 $auxdir/libtoolize

# Running the installed `libtoolize' will trash the local (newer) libtool.m4
# among others.  Call the dummy script we made earlier.
LIBTOOLIZE=`pwd`/$auxdir/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 $auxdir/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 $auxdir/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

# Commit script caveat:
cat <<EOF
WARNING: You might want to regenerate \`commit' and \`$auxdir/mailnotify'
WARNING: after you have run \`configure' to discover the real whereabouts
WARNING: of \`sed', \`grep' etc. like this:
WARNING:
WARNING:      rm -f commit $auxdir/mailnotify
WARNING:      make -f Makefile.maint ./commit ./$auxdir/mailnotify
EOF

exit 0
