| #! /bin/sh |
| |
| # bootstrap (GNU M4) version 2008-04-15 |
| # Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
| # License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> |
| # This is free software: you are free to change and redistribute it. |
| # There is NO WARRANTY, to the extent permitted by law. |
| |
| # Written by Gary V. Vaughan <gary@gnu.org> |
| |
| # 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 |
| # -p ARG --download-po=ARG whether to download pofiles [yes] |
| # -v --version print version information |
| # -h,-? --help print short or long help message |
| |
| # For --download-po, ARG can also be `no' to skip pofile downloads, |
| # `only' to just update pofiles, or a set of locales to add or update. |
| |
| # You can also set the following variables to help $progname |
| # locate the right tools: |
| # AUTOPOINT, AUTORECONF, AWK, GNULIB_TOOL, LIBTOOLIZE, M4, RM, SED, WGET |
| |
| # 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 |
| # Gettext 0.16 or better, Autoconf 2.62 or better, GNU M4 1.4.5 or better, |
| # Automake 1.10.1 or better, Libtool 2.2 or better, |
| # and the latest git or CVS checkout of Gnulib. |
| # Libtool must be installed; either with the same --prefix as |
| # automake, or made accessible to aclocal's search path via |
| # $AUTOMAKE_prefix/share/aclocal/dirlist. |
| |
| # Report bugs to <bug-m4@gnu.org> |
| |
| : ${AUTOPOINT=autopoint} |
| : ${AUTORECONF=autoreconf} |
| : ${AWK=awk} |
| : ${GNULIB_TOOL=gnulib-tool} |
| : ${LIBTOOLIZE=libtoolize} |
| : ${M4=m4} |
| : ${RM=rm -f} |
| : ${SED=sed} |
| : ${WGET=wget} |
| export WGET |
| |
| : ${DOWNLOAD_PO=yes} |
| |
| # Ensure file names are sorted consistently across platforms. |
| # Also, ensure diagnostics are in English, e.g., "wget --help" below. |
| LC_ALL=C |
| export LC_ALL |
| |
| package=m4 |
| ltdldir=ltdl |
| config_aux_dir=build-aux |
| config_macro_dir=$ltdldir/m4 |
| bailout_cb=: |
| |
| # List dependencies here too; we don't extract them, otherwise dependent |
| # modules could end up being imported to src/ *and* gnu/! |
| src_modules='getopt version-etc-fsf version-etc xstrtol' |
| |
| 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 /,/# Written by / { |
| 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 |
| -p|--download-po) |
| test $# = 0 && func_missing_arg $opt && break |
| case $1 in |
| 0|[Nn]*|[Ff]*) DOWNLOAD_PO=no ;; |
| [Oo]*) DOWNLOAD_PO=only ;; |
| esac |
| ;; |
| |
| # Separate optargs to long options: |
| --download-po=*) |
| arg=`echo "$opt" | $SED "$my_sed_long_arg"` |
| opt=`echo "$opt" | $SED "$my_sed_long_opt"` |
| set -- "$opt" "$arg" ${1+"$@"} |
| ;; |
| |
| # Separate optargs to short options: |
| -p*) |
| arg=`echo "$opt" |$SED "$my_sed_single_rest"` |
| opt=`echo "$opt" |$SED "$my_sed_single_opt"` |
| set -- "$opt" "$arg" ${1+"$@"} |
| ;; |
| |
| -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 |
| } |
| |
| ## ------------------------------ ## |
| ## Fetch translations. ## |
| ## (taken from GNU tar bootstrap) ## |
| ## ------------------------------ ## |
| |
| func_get_translations() |
| { |
| subdir=$1 |
| domain=$2 |
| po_file=$3 |
| |
| url=http://translationproject.org/domain/$2.html |
| baseurl=`expr "$url" : '\(.*\)/.*'` |
| |
| func_echo "getting translations into $subdir for $domain..." |
| |
| case $po_file in |
| '') (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`);; |
| esac && |
| |
| $WGET -nv --cache=off -O "$subdir/$domain.html" "$url" && |
| |
| sed -n 's|.*href="\(.*\)/\([^/][^/]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\2:\3:\1|p' <"$subdir/$domain.html" | |
| sort -t: -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 | |
| $AWK -F: ' |
| { if (lang && $1 != lang) print lang, ver, subdir } |
| { lang = $1; ver = $2; subdir = $3 } |
| END { if (lang) print lang, ver, subdir } |
| ' | $AWK -v domain="$domain" -v po_file="$po_file" -v baseurl="$baseurl" -v subdir="$subdir" ' |
| { |
| lang = $1 |
| if (po_file == (lang ".po")) next |
| |
| ver = $2 |
| urlfmt = "" |
| printf "$WGET -nv --cache=off -O %s/%s.po %s/%s/%s/%s-%s.%s.po &&\n", subdir, lang, baseurl, $3, lang, domain, ver, lang |
| } |
| END { print ":" } |
| ' | |
| sh && |
| ls "$subdir"/*.po | sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" && |
| rm "$subdir/$domain.html" |
| } |
| |
| ## ------------------------------ ## |
| ## Update translations. ## |
| ## (taken from GNU tar bootstrap) ## |
| ## ------------------------------ ## |
| |
| func_update_po () |
| { |
| if test $# = 1; then |
| case $1 in |
| *.po) POFILE=$1 ;; |
| *) POFILE=$1.po ;; |
| esac |
| func_get_translations ./po $package "$POFILE" && |
| LANG=`expr $POFILE : '\(.*\)\.po'` && |
| { grep -q $LANG po/LINGUAS || |
| (echo $LANG; cat po/LINGUAS) | sort -o po/LINGUAS; } |
| else |
| func_get_translations ./po $package |
| fi |
| } |
| |
| case $DOWNLOAD_PO in |
| no) ;; |
| only) func_update_po; exit 0 ;; |
| yes) func_update_po ;; |
| *) func_update_po $DOWNLOAD_PO ;; |
| esac |
| |
| ## ---------------- ## |
| ## Version control. ## |
| ## ---------------- ## |
| |
| # gnulib-tool updates ltdl/m4/.{git,cvs}ignore and gnu/.{git,cvs}ignore, and |
| # keeping generated files under version control does not make sense. Since |
| # gnu is entirely ignored, we only need to prepopulate the ltdl/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 |
| # files manually imported, rather than using gnulib-tool |
| getopt.m4 |
| xstrtol.m4 |
| # files created by autopoint |
| codeset.m4 |
| gettext.m4 |
| glibc2.m4 |
| glibc21.m4 |
| iconv.m4 |
| intdiv0.m4 |
| intl.m4 |
| intldir.m4 |
| intmax.m4 |
| inttypes-pri.m4 |
| inttypes_h.m4 |
| lcmessage.m4 |
| lib-ld.m4 |
| lib-link.m4 |
| lib-prefix.m4 |
| lock.m4 |
| longdouble.m4 |
| longlong.m4 |
| nls.m4 |
| po.m4 |
| printf-posix.m4 |
| progtest.m4 |
| size_max.m4 |
| stdint_h.m4 |
| uintmax_t.m4 |
| ulonglong.m4 |
| visibility.m4 |
| wchar_t.m4 |
| wint_t.m4 |
| xsize.m4 |
| # files created by libtoolize |
| argz.m4 |
| libtool.m4 |
| ltdl.m4 |
| ltoptions.m4 |
| ltsugar.m4 |
| ltversion.m4 |
| lt~obsolete.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 |
| |
| ## ---------- ## |
| ## Autopoint. ## |
| ## ---------- ## |
| |
| # Released autopoint has the tendency to install macros that have been |
| # obsoleted in current gnulib, so run this before gnulib-tool. |
| func_echo "running: $AUTOPOINT --force" |
| $AUTOPOINT --force |
| |
| ## ----------- ## |
| ## Libtoolize. ## |
| ## ----------- ## |
| |
| # Autoreconf runs aclocal before libtoolize, which causes spurious |
| # warnings if the initial aclocal is confused by the libtoolized |
| # (or worse out-of-date) macro directory. |
| func_echo "running: $LIBTOOLIZE --force --copy --install" |
| ${LIBTOOLIZE} --force --copy --install |
| |
| ## ---------------------------- ## |
| ## 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 |
| |
| |
| ## --------------------------------- ## |
| ## Copy additional src only modules. ## |
| ## --------------------------------- ## |
| |
| func_echo "fetching modules for src directory" |
| |
| for file in `${GNULIB_TOOL} --extract-filelist $src_modules`; do |
| |
| dest=`echo $file | $SED "$basename"` |
| case $file in |
| lib/*) dest=src/$dest ;; |
| m4/*) dest=$config_macro_dir/$dest ;; |
| *) func_echo "Unknown file: $file" |
| exit 1 |
| ;; |
| esac |
| |
| # Be sure to show all copying errors before bailing out |
| if test -f $gnulibdir/$file; then |
| func_echo "copying file \`$dest'" |
| cp $gnulibdir/$file $dest |
| else |
| func_error "$gnulibdir/$file does not exist" |
| bailout_cb="exit 1" |
| fi |
| done |
| $bailout_cb |
| |
| |
| ## ----------- ## |
| ## Autoreconf. ## |
| ## ----------- ## |
| |
| # Disable autopoint and libtoolize, since they were already done above. |
| func_echo "running: AUTOPOINT=true LIBTOOLIZE=true " \ |
| "$AUTORECONF --force --verbose --install --no-recursive" |
| AUTOPOINT=true LIBTOOLIZE=true \ |
| $AUTORECONF --force --verbose --install --no-recursive |
| |
| |
| ## ---------------------------------------- ## |
| ## Gnulib is more up-to-date than automake. ## |
| ## ---------------------------------------- ## |
| |
| func_update "$gnulibdir"/build-aux/config.guess $config_aux_dir/config.guess |
| func_update "$gnulibdir"/build-aux/config.sub $config_aux_dir/config.sub |
| func_update "$gnulibdir"/build-aux/depcomp $config_aux_dir/depcomp |
| func_update "$gnulibdir"/build-aux/install-sh $config_aux_dir/install-sh |
| func_update "$gnulibdir"/build-aux/mdate-sh $config_aux_dir/mdate-sh |
| func_update "$gnulibdir"/build-aux/missing $config_aux_dir/missing |
| func_update "$gnulibdir"/build-aux/texinfo.tex $config_aux_dir/texinfo.tex |
| func_update "$gnulibdir"/build-aux/po/Makefile.in.in po/Makefile.in.in |
| func_update "$gnulibdir"/build-aux/po/remove-potcdate.sin po/remove-potcdate.sin |
| func_update "$gnulibdir"/doc/COPYINGv3 COPYING |
| func_update "$gnulibdir"/doc/INSTALL INSTALL |
| |
| |
| ## ------- ## |
| ## Wrapup. ## |
| ## ------- ## |
| |
| if test x"$DOWNLOAD_PO" != xno; then |
| func_echo "If your pofiles are up-to-date, you can rerun bootstrap" |
| func_echo "as \`DOWNLOAD_PO=no $progname' to avoid redownloading." |
| fi |
| |
| 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: |