3 # bootstrap (GNU M4) version 2009-06-15
4 # Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software
6 # License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
7 # This is free software: you are free to change and redistribute it.
8 # There is NO WARRANTY, to the extent permitted by law.
10 # Written by Gary V. Vaughan <gary@gnu.org>
12 # This file is part of GNU M4.
14 # GNU M4 is free software: you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation, either version 3 of the License, or
17 # (at your option) any later version.
19 # GNU M4 is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
27 # Usage: $progname [options]
29 # -f --force bootstrap even when sources are not from git
30 # --skip-po skip downloading pofiles
31 # -v --version print version information
32 # -h,-? --help print short or long help message
34 # You can also set the following variables to help $progname
35 # locate the right tools:
36 # AUTOPOINT, AUTORECONF, AWK, CONFIG_SHELL, GNULIB_SRCDIR, LIBTOOLIZE,
39 # This script bootstraps a git or CVS checkout of GNU M4 by correctly calling
40 # out to parts of the GNU Build Platform. Currently this requires GNU
41 # Gettext 0.16 or better, the latest git Autoconf 2.63b-41 or better,
42 # GNU M4 1.4.5 or better, Automake 1.10b or better, Libtool 2.2 or better,
43 # and the latest git or CVS checkout of Gnulib.
44 # Libtool must be installed; either with the same --prefix as
45 # automake, or made accessible to aclocal's search path via
46 # $AUTOMAKE_prefix/share/aclocal/dirlist.
48 # Report bugs to <bug-m4@gnu.org>
50 : ${AUTOPOINT=autopoint}
51 : ${AUTORECONF=autoreconf}
53 : ${CONFIG_SHELL=/bin/sh}
54 : ${LIBTOOLIZE=libtoolize}
59 # Ensure file names are sorted consistently across platforms.
60 # Also, ensure diagnostics are in English.
66 config_aux_dir
=build-aux
67 config_macro_dir
=$ltdldir/m4
70 # List dependencies here too; we don't extract them, otherwise dependent
71 # modules could end up being imported to src/ *and* gnu/!
72 src_modules
='getopt version-etc-fsf version-etc xstrtol'
77 # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
78 # is ksh but when the shell is invoked as "sh" and the current value of
79 # the _XPG environment variable is not equal to 1 (one), the special
80 # positional parameter $0, within a function call, is the name of the
84 # The name of this program:
85 progname
=`echo "$progpath" | $SED "$basename"`
88 # Detect whether this is a version control system checkout or a tarball
92 # Echo program name prefixed message.
95 echo $progname: ${1+"$@"}
99 # Echo program name prefixed message to standard error.
102 echo $progname: ${1+"$@"} >&2
105 # func_fatal_error arg...
106 # Echo program name prefixed message to standard error, and exit.
113 # func_verbose arg...
114 # Echo program name prefixed message in verbose mode only.
117 $opt_verbose && func_error
${1+"$@"}
120 # func_missing_arg argname
121 # Echo program name prefixed message to standard error and set global
125 func_error
"missing argument for $1"
129 # func_fatal_help arg...
130 # Echo program name prefixed message to standard error, followed by
131 # a help hint, and exit.
135 func_fatal_error
"Try \`$progname --help' for more information."
138 # func_missing_arg argname
139 # Echo program name prefixed message to standard error and set global
143 func_error
"missing argument for $1"
148 # Echo short help message to standard output and exit.
151 $SED '/^# Usage:/,/# -h/ {
153 s/\$progname/'$progname'/;
157 echo "run \`$progname --help | more' for full usage"
162 # Echo long help message to standard output and exit.
165 $SED '/^# Usage:/,/# Report bugs to/ {
167 s/\$progname/'$progname'/;
174 # Echo version message to standard output and exit.
177 $SED '/^# '$PROGRAM' (GNU /,/# Written by / {
179 s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/;
186 # Copy $1 to $2 if it is newer.
189 if test -f "$2" && cmp -s "$1" "$2" ; then
190 func_verbose
"$2 is up-to-date"
192 func_echo
"copying $1 -> $2"
197 # Parse options once, thoroughly. This comes as soon as possible in
198 # the script to make things like `bootstrap --version' happen quickly.
201 my_sed_single_opt
='1s/^\(..\).*$/\1/;q'
202 my_sed_single_rest
='1s/^..\(.*\)$/\1/;q'
203 my_sed_long_opt
='1s/^\(--[^=]*\)=.*/\1/;q'
204 my_sed_long_arg
='1s/^--[^=]*=//'
206 # this just eases exit handling
207 while test $# -gt 0; do
211 -f|
--force) vcs_only_file
= ;;
212 --skip-po) SKIP_PO
=t
;;
213 -\?|
-h) func_usage
;;
215 --version) func_version
;;
217 -*) func_fatal_help
"unrecognized option \`$opt'" ;;
218 *) set -- "$opt" ${1+"$@"}; break ;;
222 # Bail if the options were screwed
223 $exit_cmd $EXIT_FAILURE
225 if test -n "$vcs_only_file" && test ! -r "$vcs_only_file"; then
227 "Bootstrapping from a non-version-control distribution is risky."
231 ## --------------------------------------- ##
232 ## Fetch translations. ##
233 ## (taken from gnulib build-aux/bootstrap) ##
234 ## --------------------------------------- ##
236 # The command to download all .po files for a specified domain into
237 # a specified directory. Fill in the first %s with the domain name,
238 # the second with the destination directory. Use rsync's -L and -r
239 # options because the latest/%s directory and the .po files within
241 po_download_command_format
=\
242 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
244 func_get_translations
()
249 func_echo
"getting translations into $subdir for $domain..."
250 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
254 ## --------------------------------------- ##
255 ## Update translations. ##
256 ## (taken from gnulib build-aux/bootstrap) ##
257 ## --------------------------------------- ##
261 # Directory containing primary .po files.
262 # Overwrite them only when we're sure a .po file is new.
266 # Download *.po files into this dir.
267 # Usually contains *.s1 checksum files.
268 ref_po_dir
="$po_dir/.reference"
270 test -d $ref_po_dir || mkdir
$ref_po_dir ||
return
272 func_get_translations
$ref_po_dir $domain \
273 && ls "$ref_po_dir"/*.po
2>/dev
/null \
274 |
sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
275 langs
=`cd $ref_po_dir && echo *.po | sed 's/\.po//g'`
277 test "$langs" = '*' && langs
=x
279 case $po in x
) continue;; esac
280 new_po
="$ref_po_dir/$po.po"
281 cksum_file
="$ref_po_dir/$po.s1"
282 if ! test -f "$cksum_file" ||
283 ! test -f "$po_dir/$po.po" ||
284 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev
/null
; then
285 echo "updated $po_dir/$po.po..."
286 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
292 '') func_update_po
;;
295 ## ---------------- ##
296 ## Version control. ##
297 ## ---------------- ##
299 # See if we can use gnulib's git-merge-changelog merge driver.
300 if test -d .git
&& (git
--version) >/dev
/null
2>/dev
/null
; then
301 if git config merge.merge-changelog.driver
>/dev
/null
; then
303 elif (git-merge-changelog
--version) >/dev
/null
2>/dev
/null
; then
304 func_echo
"initializing git-merge-changelog driver"
305 git config merge.merge-changelog.name
'GNU-style ChangeLog merge driver'
306 git config merge.merge-changelog.driver
'git-merge-changelog %O %A %B'
308 func_echo
"consider installing git-merge-changelog from gnulib"
310 if git config
diff.texinfo.funcname
>/dev
/null
; then
313 func_echo
"initializing git texinfo diff driver"
314 git config
diff.texinfo.funcname
'^@node[ ][ ]*\\([^,][^,]*\\)'
318 ## ------------------------------ ##
319 ## Update the gnulib module tree. ##
320 ## ------------------------------ ##
322 if test -d .git
&& (git
--version) >/dev
/null
2>/dev
/null
; then
323 if test -f gnulib
/gnulib-tool
; then
324 func_echo
"updating gnulib submodule"
325 git submodule update \
326 || func_fatal_error
"Unable to update gnulib"
328 # A fresh checkout creates an empty subdirectory gnulib. However,
329 # older git didn't know how to clone into an empty subdir. If the
330 # user provided GNULIB_SRCDIR, then make the initial clone refer
331 # to the existing checkout, to save network traffic.
332 func_echo
"importing gnulib submodule"
333 if test -d "$GNULIB_SRCDIR" ; then
334 rmdir gnulib
2>/dev
/null
335 git clone
--reference "$GNULIB_SRCDIR" git
://git.sv.gnu.org
/gnulib.git \
336 && git submodule init
&& git submodule update \
337 || func_fatal_error
"Unable to update gnulib"
339 git submodule update
--init \
340 || func_fatal_error
"Unable to update gnulib"
344 func_echo
"git not detected. If needed, update gnulib subdirectory manually"
351 # Released autopoint has the tendency to install macros that have been
352 # obsoleted in current gnulib, so run this before gnulib-tool.
353 func_echo
"running: $AUTOPOINT --force"
360 # Autoreconf runs aclocal before libtoolize, which causes spurious
361 # warnings if the initial aclocal is confused by the libtoolized
362 # (or worse out-of-date) macro directory.
363 func_echo
"running: $LIBTOOLIZE --copy --install"
364 ${LIBTOOLIZE} --copy --install
366 ## ---------------------- ##
367 ## Import Gnulib modules. ##
368 ## ---------------------- ##
370 func_echo
"running: $CONFIG_SHELL gnulib/gnulib-tool --update"
371 $CONFIG_SHELL gnulib
/gnulib-tool
--update \
372 || func_fatal_error
"gnulib-tool failed"
374 ## --------------------------------- ##
375 ## Copy additional src only modules. ##
376 ## --------------------------------- ##
378 func_echo
"fetching modules for src directory"
380 for file in `$CONFIG_SHELL gnulib/gnulib-tool --extract-filelist $src_modules`
383 dest
=`echo $file | $SED "$basename"`
385 lib
/*) dest
=src
/$dest ;;
386 m
4/*) dest
=$config_macro_dir/$dest ;;
387 *) func_echo
"Unknown file: $file"
392 # Be sure to show all copying errors before bailing out
393 if test -f gnulib
/$file; then
394 func_echo
"copying file \`$dest'"
395 cp gnulib
/$file $dest
397 func_error
"gnulib/$file does not exist"
408 # Disable autopoint and libtoolize, since they were already done above.
409 func_echo
"running: AUTOPOINT=true LIBTOOLIZE=true " \
410 "$AUTORECONF --verbose --install --no-recursive"
411 AUTOPOINT
=true LIBTOOLIZE
=true \
412 $AUTORECONF --verbose --install --no-recursive \
413 || func_fatal_error
"autoreconf failed"
419 if test x
"$SKIP_PO" = x
; then
420 func_echo
"If your pofiles are up-to-date, you can rerun bootstrap"
421 func_echo
"as \`$progname --skip-po' to avoid redownloading."
427 # eval: (add-hook 'write-file-hooks 'time-stamp)
428 # time-stamp-start: "# bootstrap (GNU M4) version "
429 # time-stamp-format: "%:y-%02m-%02d"
430 # time-stamp-end: "$"