#!/bin/sh
# vim:ts=4:sw=4
# Calls autotools to build configure script and Makefile.in.
# Generated automatically using bootstrapper 0.2.1
# http://bootstrapper.sourceforge.net/
#
# Copyright (C) 2002 Anthony Ventimiglia
#
# This bootstrap script 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.
#
#
# Calls proper programs to create configure script and Makefile.in files.
# if run with the --clean option, bootstrap removes files it generates. To
# clean all autogenerated files (eg: for cvs imports) first run 
# make distclean, then bootstrap --clean
# see bootstrapper(1) for more infor


if test x"$1" = x"--help"; then
	echo "$0: automatic bootstrapping utility for GNU Autotools"
	echo "		cleans up old autogenerated files and runs autoconf,"
	echo "		automake and aclocal on local directory"
	echo 
	echo "		--clean		clean up auto-generated files without"
	echo "					creating new scripts"
	echo 
	exit 0
fi


mkdir -p ac
test -f AUTHORS   || touch AUTHORS
test -f COPYING   || touch COPYING
test -f ChangeLog || cp -f CHANGELOG.md ChangeLog
test -f NEWS      || touch NEWS
test -f NOTICE    || touch NOTICE
test -f README    || cp -f README.md README

ACLOCAL="aclocal"
ACLOCAL_FILES="aclocal.m4"
ALWAYS_CLEAN="config.status config.log config.cache libtool"
AUTOCONF="autoconf"
AUTOCONF_FILES="configure"
AUTOHEADER="autoheader"
AUTOHEADER_FILES=""
AUTOMAKE="automake --add-missing --copy"
AUTOMAKE_FILES="config.sub stamp-h.in ltmain.sh missing mkinstalldirs install-sh config.guess"
CONFIG_AUX_DIR="."
CONFIG_FILES="stamp-h ltconfig"
CONFIG_HEADER=""
if [ x`uname` = x"Darwin" ]; then
	LIBTOOLIZE="glibtoolize --force --copy"
else
	LIBTOOLIZE="libtoolize --force --copy"
fi
LIBTOOLIZE_FILES="config.sub ltmain.sh config.guess"
RM="rm"
SUBDIRS="[]"


# These are files created by configure, so we'll always clean them
for i in $ALWAYS_CLEAN; do
	test -f $i && \
	$RM $i
done

if test x"$1" = x"--clean"; then
	#
	#Clean Files left by previous bootstrap run
	#
	if test -n "$CONFIG_AUX_DIR"; 
		then CONFIG_AUX_DIR="$CONFIG_AUX_DIR/"
	fi
	# Clean Libtoolize generated files
	for cf in $LIBTOOLIZE_FILES; do
		cf="$CONFIG_AUX_DIR$cf"
		test -f $cf && \
		$RM $cf
	done
	#aclocal.m4 created by aclocal
	test -f $ACLOCAL_FILES && $RM $ACLOCAL_FILES
	#Clean Autoheader Generated files
	for cf in $AUTOHEADER_FILES; do
		cf=$CONFIG_AUX_DIR$cf
		test -f $cf && \
		$RM $cf
	done
	# remove config header (Usaually config.h)
	test -n "$CONFIG_HEADER" && test -f $CONFIG_HEADER && $RM $CONFIG_HEADER
	#Clean Automake generated files
	for cf in $AUTOMAKE_FILES; do
		cf=$CONFIG_AUX_DIR$cf
		test -f $cf && \
		$RM $cf
	done
	for i in $SUBDIRS; do
		test -f $i/Makefile.in && \
		$RM $i/Makefile.in
	done
	#Autoconf generated files
	for cf in $AUTOCONF_FILES; do
		test -f $cf && \
		$RM $cf
	done
	for cf in $CONFIG_FILES; do
		cf="$CONFIG_AUX_DIR$cf"
		test -f $cf && \
		$RM $cf
	done
else
	$LIBTOOLIZE
	$ACLOCAL
	$AUTOHEADER
	$AUTOMAKE
	$AUTOCONF
fi


