]> Dogcows Code - chaz/tar/blob - bootstrap
Implement --update-po and .bootstrap
[chaz/tar] / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from CVS.
4
5 # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2, or (at your option)
10 # any later version.
11
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301, USA.
21
22 # Written by Paul Eggert and Sergey Poznyakoff.
23
24 nl='
25 '
26
27 # Ensure file names are sorted consistently across platforms.
28 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
29 LC_ALL=C
30 export LC_ALL
31
32 usage() {
33 echo >&2 "\
34 Usage: $0 [OPTION]...
35 Bootstrap this package from the checked-out sources.
36
37 Options:
38 --paxutils-srcdir=DIRNAME Specify the local directory where paxutils
39 sources reside. Use this if you already
40 have paxutils sources on your machine, and
41 do not want to waste your bandwidth dowloading
42 them again.
43 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
44 sources reside. Use this if you already
45 have gnulib sources on your machine, and
46 do not want to waste your bandwidth dowloading
47 them again.
48 --copy Copy files instead of creating symbolic links.
49 --force Attempt to bootstrap even if the sources seem
50 not to have been checked out.
51 --skip-po Do not download po files.
52 --update-po[=LANG] Update po file(s) and exit.
53 --cvs-user=USERNAME Set the CVS username to be used when accessing
54 the gnulib repository.
55
56 If the file bootstrap.conf exists in the current working directory, its
57 contents are read as shell variables to configure the bootstrap.
58
59 Local defaults can be provided by placing the file \`.bootstrap' in the
60 current working directory. The file is read after bootstrap.conf, comments
61 and empty lines are removed, shell variables expanded and the result is
62 prepended to the command line options.
63
64 Running without arguments will suffice in most cases.
65 "
66 }
67
68 checkout() {
69 if [ ! -d $1 ]; then
70 echo "$0: getting $1 files..."
71
72 case ${CVS_AUTH-pserver} in
73 pserver)
74 CVS_PREFIX=':pserver:anonymous@';;
75 ssh)
76 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
77 *)
78 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
79 exit 1;;
80 esac
81
82 case $CVS_RSH in
83 '') CVS_RSH=ssh; export CVS_RSH;;
84 esac
85
86 trap "cleanup $1" 1 2 13 15
87
88 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/"$1" co $1 ||
89 cleanup $1
90
91 trap - 1 2 13 15
92 fi
93 }
94
95 cleanup() {
96 status=$?
97 rm -fr $1
98 exit $status
99 }
100
101 # Configuration.
102
103 # List of gnulib modules needed.
104 gnulib_modules=
105
106 # Any gnulib files needed that are not in modules.
107 gnulib_files=
108
109 # Translation Project URL, for the registry of all projects
110 # and for the translation-team master directory.
111 TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
112 TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
113
114 extract_package_name='
115 /^AC_INIT(/{
116 /.*,.*,.*,/{
117 s///
118 s/[][]//g
119 p
120 q
121 }
122 s/AC_INIT(\[*//
123 s/]*,.*//
124 s/^GNU //
125 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
126 s/[^A-Za-z0-9_]/-/g
127 p
128 }
129 '
130 package=`sed -n "$extract_package_name" configure.ac` || exit
131
132 # Extra files from gnulib, which override files from other sources.
133 gnulib_extra_files='
134 build-aux/announce-gen
135 build-aux/install-sh
136 build-aux/missing
137 build-aux/mdate-sh
138 build-aux/texinfo.tex
139 build-aux/depcomp
140 build-aux/config.guess
141 build-aux/config.sub
142 doc/INSTALL
143 '
144
145 # Other locale categories that need message catalogs.
146 EXTRA_LOCALE_CATEGORIES=
147
148 # Additional xgettext options to use. Use "\\\newline" to break lines.
149 XGETTEXT_OPTIONS='\\\
150 --flag=_:1:pass-c-format\\\
151 --flag=N_:1:pass-c-format\\\
152 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
153 '
154
155 # Files we don't want to import.
156 excluded_files=
157
158 # File that should exist in the top directory of a checked out hierarchy,
159 # but not in a distribution tarball.
160 CVS_only_file=README-cvs
161
162 # Whether to use copies instead of symlinks.
163 copy=false
164
165 # Override the default configuration, if necessary.
166 test -r bootstrap.conf && . ./bootstrap.conf
167
168 # Read local configuration file
169 if [ -r .bootstrap ]; then
170 echo "$0: Reading configuration file .bootstrap"
171 eval set -- "`sed 's/#.*$//;/^$/d' .bootstrap | tr '\n' ' '` $*"
172 fi
173
174 # Translate configuration into internal form.
175
176 # Parse options.
177
178 for option
179 do
180 case $option in
181 --help)
182 usage
183 exit;;
184 --paxutils-srcdir=*)
185 PAXUTILS_SRCDIR=`expr "$option" : '--paxutils-srcdir=\(.*\)'`;;
186 --gnulib-srcdir=*)
187 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
188 --cvs-user=*)
189 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
190 --skip-po | --no-po) # --no-po is for compatibility with 'tar' tradition.
191 DOWNLOAD_PO=skip;;
192 --update-po=*)
193 DOWNLOAD_PO=`expr "$option" : '--update-po=\(.*\)'`;;
194 --update-po)
195 DOWNLOAD_PO=only;;
196 --force)
197 CVS_only_file=;;
198 --copy)
199 copy=true;;
200 *)
201 echo >&2 "$0: $option: unknown option"
202 exit 1;;
203 esac
204 done
205
206 if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
207 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
208 exit 1
209 fi
210
211 echo "$0: Bootstrapping CVS $package..."
212
213 # Get translations.
214
215 get_translations() {
216 subdir=$1
217 domain=$2
218 po_file=$3
219
220 case $WGET_COMMAND in
221 '')
222 echo "$0: wget not available; skipping translations";;
223 ?*)
224 echo "$0: getting ${po_file:-translations} into $subdir for $domain..." &&
225 case $po_file in
226 '') (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`);;
227 esac &&
228
229 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
230
231 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
232 sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
233 awk -F. '
234 { if (lang && $1 != lang) print lang, ver }
235 { lang = $1; ver = substr($0, index($0, ".") + 1) }
236 END { if (lang) print lang, ver }
237 ' | awk -v domain="$domain" -v po_file="$po_file" -v subdir="$subdir" '
238 {
239 lang = $1
240 if (po_file && po_file != (lang ".po")) next
241
242 ver = $2
243 urlfmt = ""
244 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
245 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
246 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
247 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
248 }
249 END { print ":" }
250 ' | WGET_COMMAND="$WGET_COMMAND" sh;;
251 esac &&
252 ls "$subdir"/*.po 2>/dev/null |
253 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
254 rm -f "$subdir/$domain.html"
255 }
256
257 case `wget --help` in
258 *'--no-cache'*)
259 WGET_COMMAND='wget -nv --no-cache';;
260 *'--cache=on/off'*)
261 WGET_COMMAND='wget -nv --cache=off';;
262 *'--non-verbose'*)
263 WGET_COMMAND='wget -nv';;
264 *)
265 WGET_COMMAND='';;
266 esac
267
268 case $DOWNLOAD_PO in
269 'skip')
270 ;;
271 '')
272 get_translations po $package || exit
273 ;;
274 'only')
275 get_translations po $package
276 exit
277 ;;
278 *.po)
279 get_translations po $package "$DOWNLOAD_PO"
280 exit
281 ;;
282 *)
283 get_translations po $package "${DOWNLOAD_PO}.po"
284 exit
285 esac
286
287 # Get paxutils files.
288
289 case ${PAXUTILS_SRCDIR--} in
290 -) checkout paxutils
291 PAXUTILS_SRCDIR=paxutils
292 esac
293
294 if [ -r $PAXUTILS_SRCDIR/gnulib.modules ]; then
295 gnulib_modules=`
296 (echo "$gnulib_modules"; grep '^[^#]' $PAXUTILS_SRCDIR/gnulib.modules) |
297 sort -u
298 `
299 fi
300
301 # copy_files srcdir dstdir
302 copy_files() {
303 for file in `cat $1/DISTFILES`
304 do
305 case $file in
306 "#*") continue;;
307 esac
308 dst=`echo $file | sed 's^.*/^^'`
309 if [ $# -eq 3 ]; then
310 case $dst in
311 ${3}*) ;;
312 *) dst=${3}$dst;;
313 esac
314 fi
315 echo "$0: Copying file $1/$file to $2/$dst"
316 cp -p $1/$file $2/$dst
317 done
318 }
319
320 copy_files ${PAXUTILS_SRCDIR}/m4 m4
321 echo "$0: Creating m4/paxutils.m4"
322 (echo "# This file is generated automatically. Please, do not edit."
323 echo "#"
324 echo "AC_DEFUN([${package}_PAXUTILS],["
325 cat ${PAXUTILS_SRCDIR}/m4/DISTFILES | sed '/^#/d;s/\(.*\)\.m4/pu_\1/' | tr a-z A-Z
326 echo "])") > ./m4/paxutils.m4
327
328 if [ -d rmt ]; then
329 :
330 else
331 mkdir rmt
332 fi
333
334 for dir in doc rmt lib tests
335 do
336 copy_files ${PAXUTILS_SRCDIR}/$dir $dir
337 done
338
339 copy_files ${PAXUTILS_SRCDIR}/paxlib lib pax
340
341 # Get gnulib files.
342
343 case ${GNULIB_SRCDIR--} in
344 -)
345 checkout gnulib
346 GNULIB_SRCDIR=gnulib
347 esac
348
349 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
350 <$gnulib_tool || exit
351
352 symlink_to_gnulib()
353 {
354 src=$GNULIB_SRCDIR/$1
355 dst=${2-$1}
356
357 test -f "$src" && {
358 if $copy; then
359 {
360 test ! -h "$dst" || {
361 echo "$0: rm -f $dst" &&
362 rm -f "$dst"
363 }
364 } &&
365 test -f "$dst" &&
366 cmp -s "$src" "$dst" || {
367 echo "$0: cp -fp $src $dst" &&
368 cp -fp "$src" "$dst"
369 }
370 else
371 test -h "$dst" &&
372 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
373 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
374 test "$src_i" = "$dst_i" || {
375 dot_dots=
376 case $src in
377 /*) ;;
378 *)
379 case /$dst/ in
380 *//* | */../* | */./* | /*/*/*/*/*/)
381 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
382 exit 1;;
383 /*/*/*/*/) dot_dots=../../../;;
384 /*/*/*/) dot_dots=../../;;
385 /*/*/) dot_dots=../;;
386 esac;;
387 esac
388
389 echo "$0: ln -fs $dot_dots$src $dst" &&
390 ln -fs "$dot_dots$src" "$dst"
391 }
392 fi
393 }
394 }
395
396 cp_mark_as_generated()
397 {
398 cp_src=$1
399 cp_dst=$2
400
401 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
402 symlink_to_gnulib "$cp_dst"
403 else
404 case $cp_dst in
405 *.[ch]) c1='/* '; c2=' */';;
406 *.texi) c1='@c '; c2= ;;
407 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
408 *) c1= ; c2= ;;
409 esac
410
411 if test -z "$c1"; then
412 cmp -s "$cp_src" "$cp_dst" || {
413 echo "$0: cp -f $cp_src $cp_dst" &&
414 cp -f "$cp_src" "$cp_dst"
415 }
416 else
417 # Copy the file first to get proper permissions if it
418 # doesn't already exist. Then overwrite the copy.
419 cp "$cp_src" "$cp_dst-t" &&
420 (
421 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
422 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
423 cat "$cp_src"
424 ) > $cp_dst-t &&
425 if cmp -s "$cp_dst-t" "$cp_dst"; then
426 rm -f "$cp_dst-t"
427 else
428 echo "$0: cp $cp_src $cp_dst # with edits" &&
429 mv -f "$cp_dst-t" "$cp_dst"
430 fi
431 fi
432 fi
433 }
434
435 version_controlled_file() {
436 dir=$1
437 file=$2
438 found=no
439 if test -d CVS; then
440 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
441 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
442 elif test -d .git; then
443 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
444 else
445 echo "$0: no version control for $dir/$file?" >&2
446 fi
447 test $found = yes
448 }
449
450 slurp() {
451 for dir in . `(cd $1 && find * -type d -print)`; do
452 copied=
453 sep=
454 for file in `ls $1/$dir`; do
455 test -d $1/$dir/$file && continue
456 for excluded_file in $excluded_files; do
457 test "$dir/$file" = "$excluded_file" && continue 2
458 done
459 if test $file = Makefile.am; then
460 copied=$copied${sep}gnulib.mk; sep=$nl
461 remove_intl='/^[^#].*\/intl/s/^/#/'
462 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
463 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
464 rm -f $dir/gnulib.mk &&
465 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
466 }
467 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
468 version_controlled_file $dir $file; then
469 echo "$0: $dir/$file overrides $1/$dir/$file"
470 else
471 copied=$copied$sep$file; sep=$nl
472 if test $file = gettext.m4; then
473 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
474 rm -f $dir/$file
475 sed '
476 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
477 AC_DEFUN([AM_INTL_SUBDIR], [
478 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
479 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
480 $a\
481 AC_DEFUN([gl_LOCK_EARLY], [])
482 ' $1/$dir/$file >$dir/$file
483 else
484 cp_mark_as_generated $1/$dir/$file $dir/$file
485 fi
486 fi || exit
487 done
488
489 for dot_ig in .cvsignore .gitignore; do
490 ig=$dir/$dot_ig
491 if test -n "$copied" && test -f $ig; then
492 echo "$copied" | sort -u - $ig | cmp -s - $ig ||
493 echo "$copied" | sort -u - $ig -o $ig || exit
494 fi
495 done
496 done
497 }
498
499
500 # Create boot temporary directories to import from gnulib and gettext.
501
502 bt='.#bootmp'
503 bt2=${bt}2
504 rm -fr $bt $bt2 &&
505 mkdir $bt $bt2 || exit
506
507 # Import from gnulib.
508
509 test -d build-aux || {
510 echo "$0: mkdir build-aux ..." &&
511 mkdir build-aux
512 } || exit
513 gnulib_tool_options="\
514 --import\
515 --no-changelog\
516 --aux-dir $bt/build-aux\
517 --doc-base $bt/doc\
518 --lib lib$package\
519 --m4-base $bt/m4/\
520 --source-base $bt/lib/\
521 --tests-base $bt/tests\
522 --local-dir gl\
523 "
524 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
525 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
526 slurp $bt || exit
527
528 for file in $gnulib_files; do
529 symlink_to_gnulib $file || exit
530 done
531
532
533 # Import from gettext.
534
535 echo "$0: (cd $bt2; autopoint) ..."
536 cp configure.ac $bt2 &&
537 (cd $bt2 && autopoint && rm configure.ac) &&
538 slurp $bt2 $bt || exit
539
540 rm -fr $bt $bt2 || exit
541
542
543 # Reconfigure, getting other files.
544
545 for command in \
546 'aclocal --force -I m4' \
547 'autoconf --force' \
548 'autoheader --force' \
549 'automake --add-missing --copy --force-missing';
550 do
551 echo "$0: $command ..."
552 $command || exit
553 done
554
555
556 # Get some extra files from gnulib, overriding existing files.
557
558 for file in $gnulib_extra_files; do
559 case $file in
560 */INSTALL) dst=INSTALL;;
561 *) dst=$file;;
562 esac
563 symlink_to_gnulib $file $dst || exit
564 done
565
566
567 # Create gettext configuration.
568 echo "$0: Creating po/Makevars from po/Makevars.template ..."
569 rm -f po/Makevars
570 sed '
571 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
572 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
573 /^XGETTEXT_OPTIONS *=/{
574 s/$/ \\/
575 a\
576 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
577 }
578 ' po/Makevars.template >po/Makevars
579
580 if test -d runtime-po; then
581 # Similarly for runtime-po/Makevars, but not quite the same.
582 rm -f runtime-po/Makevars
583 sed '
584 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
585 /^subdir *=.*/s/=.*/= runtime-po/
586 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
587 /^XGETTEXT_OPTIONS *=/{
588 s/$/ \\/
589 a\
590 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
591 }
592 ' <po/Makevars.template >runtime-po/Makevars
593
594 # Copy identical files from po to runtime-po.
595 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
596 fi
597
598 echo "$0: done. Now you can run './configure'."
This page took 0.063718 seconds and 5 git commands to generate.