blob: 6a4fb3d16e7c79a877e3b3a45739505886ba0856 [file] [log] [blame]
#! /bin/sh
# bootstrap (GNU M4) version 2008-02-23
# Written by Gary V. Vaughan <gary@gnu.org>
# Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This file is part of GNU M4.
#
# GNU M4 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 3 of the License, or
# (at your option) any later version.
#
# GNU M4 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 this program. If not, see <http://www.gnu.org/licenses/>.
# Usage: $progname [options]
# -f --force bootstrap even when sources are not from git
# -v --version print version information
# -h,-? --help print short or long help message
# You can also set the following variables to help $progname
# locate the right tools:
# AUTORECONF, GNULIB_TOOL, M4, RM, SED
# This script bootstraps a git or CVS checkout of GNU M4 by correctly
# calling out to parts of the GNU Build Platform. Currently this
# requires GNU Autoconf 2.60, GNU Automake 1.10.1, and bleeding edge
# git or CVS snapshots of GNU Gnulib.
# Report bugs to <bug-m4@gnu.org>
: ${AUTORECONF=autoreconf}
: ${GNULIB_TOOL=gnulib-tool}
: ${RM=rm -f}
: ${SED=sed}
# Ensure file names are sorted consistently across platforms.
LC_ALL=C
export LC_ALL
config_macro_dir=m4
dirname="s,/[^/]*$,,"
basename="s,^.*/,,g"
# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath="$0"
# The name of this program:
progname=`echo "$progpath" | $SED "$basename"`
PROGRAM=bootstrap
# Detect whether this is a version control system checkout or a tarball
vcs_only_file=HACKING
# func_echo arg...
# Echo program name prefixed message.
func_echo ()
{
echo $progname: ${1+"$@"}
}
# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
echo $progname: ${1+"$@"} >&2
}
# func_fatal_error arg...
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
func_error ${1+"$@"}
exit $EXIT_FAILURE
}
# func_verbose arg...
# Echo program name prefixed message in verbose mode only.
func_verbose ()
{
$opt_verbose && func_error ${1+"$@"}
}
# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
func_error "missing argument for $1"
exit_cmd=exit
}
# func_fatal_help arg...
# Echo program name prefixed message to standard error, followed by
# a help hint, and exit.
func_fatal_help ()
{
func_error ${1+"$@"}
func_fatal_error "Try \`$progname --help' for more information."
}
# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
func_error "missing argument for $1"
exit_cmd=exit
}
# func_usage
# Echo short help message to standard output and exit.
func_usage ()
{
$SED '/^# Usage:/,/# -h/ {
s/^# //; s/^# *$//;
s/\$progname/'$progname'/;
p;
}; d' < "$progpath"
echo
echo "run \`$progname --help | more' for full usage"
exit $EXIT_SUCCESS
}
# func_help
# Echo long help message to standard output and exit.
func_help ()
{
$SED '/^# Usage:/,/# Report bugs to/ {
s/^# //; s/^# *$//;
s/\$progname/'$progname'/;
p;
}; d' < "$progpath"
exit $EXIT_SUCCESS
}
# func_version
# Echo version message to standard output and exit.
func_version ()
{
$SED '/^# '$PROGRAM' (GNU /,/# warranty; / {
s/^# //; s/^# *$//;
s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/;
p;
}; d' < "$progpath"
exit $EXIT_SUCCESS
}
# func_update
# Copy $1 to $2 if it is newer.
func_update ()
{
if test -f "$2" && cmp -s "$1" "$2" ; then
func_verbose "$2 is up-to-date"
else
func_echo "copying $1 -> $2"
cp "$1" "$2"
fi
}
# Parse options once, thoroughly. This comes as soon as possible in
# the script to make things like `bootstrap --version' happen quickly.
{
# sed scripts:
my_sed_single_opt='1s/^\(..\).*$/\1/;q'
my_sed_single_rest='1s/^..\(.*\)$/\1/;q'
my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
my_sed_long_arg='1s/^--[^=]*=//'
# this just eases exit handling
while test $# -gt 0; do
opt="$1"
shift
case $opt in
# Separate optargs to short options:
-f|--force) vcs_only_file= ;;
-\?|-h) func_usage ;;
--help) func_help ;;
--version) func_version ;;
--) break ;;
-*) func_fatal_help "unrecognized option \`$opt'" ;;
*) set -- "$opt" ${1+"$@"}; break ;;
esac
done
# Bail if the options were screwed
$exit_cmd $EXIT_FAILURE
if test -n "$vcs_only_file" && test ! -r "$vcs_only_file"; then
func_fatal_error \
"Bootstrapping from a non-version-control distribution is risky."
fi
}
## ---------------- ##
## Version control. ##
## ---------------- ##
# gnulib-tool updates m4/.{git,cvs}ignore and lib/.{git,cvs}ignore, and
# keeping generated files under version control does not make sense.
# Since lib is entirely ignored, we only need to prepopulate the m4 ignore
# files with generated files not tracked by gnulib-tool.
if test -f $config_macro_dir/.gitignore ; then
:
else
func_echo "creating initial $config_macro_dir/.cvsignore"
cat > $config_macro_dir/.cvsignore <<\EOF
# files created by gnulib, but that gnulib doesn't track
*~
.cvsignore
.gitignore
gnulib-comp.m4
# gnulib-tool edits below here
EOF
func_echo "creating initial $config_macro_dir/.gitignore"
cp $config_macro_dir/.cvsignore $config_macro_dir/.gitignore
fi
# See if we can use gnulib's git-merge-changelog merge driver.
if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
if git config merge.merge-changelog.driver >/dev/null ; then
:
elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
func_echo "initializing git-merge-changelog driver"
git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
else
func_echo "consider installing git-merge-changelog from gnulib"
fi
fi
## ---------------------------- ##
## Find the gnulib module tree. ##
## ---------------------------- ##
case $GNULIB_TOOL in
/* ) gnulibdir=$GNULIB_TOOL ;; # absolute
*/* ) gnulibdir=`pwd`/$GNULIB_TOOL ;; # relative
* ) gnulibdir=`which "$GNULIB_TOOL"` ;; # PATH search
esac
# Follow symlinks
while test -h "$gnulibdir"; do
# Resolve symbolic link.
sedexpr1='s, -> ,#%%#,'
sedexpr2='s,^.*#%%#\(.*\)$,\1,p'
linkval=`ls -l "$gnulibdir" | $SED "$sedexpr1" | $SED -n "$sedexpr2"`
test -n "$linkval" || break
case "$linkval" in
/* ) gnulibdir="$linkval" ;;
* ) gnulibdir=`echo "$gnulibdir" | sed -e 's,/[^/]*$,,'`/"$linkval" ;;
esac
done
gnulibdir=`echo "$gnulibdir" | $SED "$dirname"`
## ---------------------- ##
## Import Gnulib modules. ##
## ---------------------- ##
func_echo "running: $GNULIB_TOOL --update"
$GNULIB_TOOL --update || func_fatal_error "gnulib-tool failed"
## ----------- ##
## Autoreconf. ##
## ----------- ##
func_echo "running: $AUTORECONF --force --verbose --install"
$AUTORECONF --force --verbose --install || func_fatal_error "autoreconf failed"
## ---------------------------------------- ##
## Gnulib is more up-to-date than automake. ##
## ---------------------------------------- ##
func_update "$gnulibdir"/build-aux/config.guess build-aux/config.guess
func_update "$gnulibdir"/build-aux/config.sub build-aux/config.sub
func_update "$gnulibdir"/build-aux/depcomp build-aux/depcomp
func_update "$gnulibdir"/build-aux/install-sh build-aux/install-sh
func_update "$gnulibdir"/build-aux/mdate-sh build-aux/mdate-sh
func_update "$gnulibdir"/build-aux/missing build-aux/missing
func_update "$gnulibdir"/build-aux/texinfo.tex build-aux/texinfo.tex
func_update "$gnulibdir"/doc/COPYINGv3 COPYING
func_update "$gnulibdir"/doc/INSTALL INSTALL
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "# bootstrap (GNU M4) version "
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "$"
# End: