| #! /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: |