#! /bin/sh
# bootstrap -- Helps bootstrapping libtool, when checked out from repository.
#
#   Copyright (C) 2003, 2004, 2005, 2006, 2009 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.
####

# 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}
: ${WORKING_LIBOBJ_SUPPORT=false}

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.
  WORKING_LIBOBJ_SUPPORT=:   Declare that you have fixed LIBOBJDIR support
                             in autoconf (> 2.59) and automake (> 1.9.6).
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

# Workaround for missing LIBOBJDIR support in Autoconf 2.59, Automake 1.9.6:
# Have symlinks of the libobj files in top source dir.
# Set WORKING_LIBOBJ_SUPPORT=: when calling bootstrap if you have fixed tools.
case `($AUTOCONF --version) 2>/dev/null` in
  *\ 2.59[c-z]* | *\ 2.[6-9][0-9]* | *\ [3-9].[0-9]*)
  case `($AUTOMAKE --version) 2>/dev/null` in
    *\ 1.9[a-z]* | *\ 1.1[0-9]* | *\ 1.[2-9][0-9]* | *\ [2-9].[0-9]*)
      WORKING_LIBOBJ_SUPPORT=: ;;
  esac ;;
esac
for file in argz.c lt__dirent.c lt__strl.c; do
  rm -f $file
  $WORKING_LIBOBJ_SUPPORT || $LN_S libltdl/$file $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
	p
    }' configure.ac`
shift

# 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="$2" VERSION="$3" \
    PACKAGE_BUGREPORT="bug-$2@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="$2" VERSION="$3" 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
