]> Dogcows Code - chaz/tar/blob - bootstrap
* bootstrap: Use rsync to get translations.
[chaz/tar] / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from CVS.
4
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007 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 3, 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 Update po files and exit.
53 --cvs-user=USERNAME Set the CVS username to be used when accessing
54 the paxutils 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 $1 in
73 paxutils)
74 case ${CVS_AUTH-pserver} in
75 pserver)
76 CVS_PREFIX=':pserver:anonymous@';;
77 ssh)
78 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
79 *)
80 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
81 exit 1;;
82 esac
83
84 case $CVS_RSH in
85 '') CVS_RSH=ssh; export CVS_RSH;;
86 esac
87
88 CVSURL=${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/"$1"
89 ;;
90
91 gnulib)
92 CVSURL=:pserver:anonymous@pserver.git.sv.gnu.org:/gnulib.git
93 ;;
94
95 esac
96
97 trap "cleanup $1" 1 2 13 15
98
99 cvs -z3 -q -d $CVSURL co $1 || cleanup $1
100
101 trap - 1 2 13 15
102 fi
103 }
104
105 cleanup() {
106 status=$?
107 rm -fr $1
108 exit $status
109 }
110
111 # Configuration.
112
113 # List of gnulib modules needed.
114 gnulib_modules=
115
116 # Any gnulib files needed that are not in modules.
117 gnulib_files=
118
119 # The command to download all .po files for a specified domain into
120 # a specified directory. Fill in the first %s is the domain name, and
121 # the second with the destination directory. Use rsync's -L and -r
122 # options because the latest/%s directory and the .po files within are
123 # all symlinks.
124 po_download_command_format=\
125 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
126
127 extract_package_name='
128 /^AC_INIT(/{
129 /.*,.*,.*,/{
130 s///
131 s/[][]//g
132 p
133 q
134 }
135 s/AC_INIT(\[*//
136 s/]*,.*//
137 s/^GNU //
138 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
139 s/[^A-Za-z0-9_]/-/g
140 p
141 }
142 '
143 package=`sed -n "$extract_package_name" configure.ac` || exit
144
145 # Extra files from gnulib, which override files from other sources.
146 gnulib_extra_files='
147 build-aux/announce-gen
148 build-aux/install-sh
149 build-aux/missing
150 build-aux/mdate-sh
151 build-aux/texinfo.tex
152 build-aux/depcomp
153 build-aux/config.guess
154 build-aux/config.sub
155 doc/INSTALL
156 '
157
158 # Other locale categories that need message catalogs.
159 EXTRA_LOCALE_CATEGORIES=
160
161 # Additional xgettext options to use. Use "\\\newline" to break lines.
162 XGETTEXT_OPTIONS='\\\
163 --flag=_:1:pass-c-format\\\
164 --flag=N_:1:pass-c-format\\\
165 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
166 '
167
168 # Files we don't want to import.
169 excluded_files=
170
171 # File that should exist in the top directory of a checked out hierarchy,
172 # but not in a distribution tarball.
173 CVS_only_file=README-cvs
174
175 # Whether to use copies instead of symlinks.
176 copy=false
177
178 # Override the default configuration, if necessary.
179 test -r bootstrap.conf && . ./bootstrap.conf
180
181 # Read local configuration file
182 if [ -r .bootstrap ]; then
183 echo "$0: Reading configuration file .bootstrap"
184 eval set -- "`sed 's/#.*$//;/^$/d' .bootstrap | tr '\n' ' '` $*"
185 fi
186
187 # Translate configuration into internal form.
188
189 # Parse options.
190
191 for option
192 do
193 case $option in
194 --help)
195 usage
196 exit;;
197 --paxutils-srcdir=*)
198 PAXUTILS_SRCDIR=`expr "$option" : '--paxutils-srcdir=\(.*\)'`;;
199 --gnulib-srcdir=*)
200 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
201 --cvs-user=*)
202 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
203 --skip-po | --no-po) # --no-po is for compatibility with 'tar' tradition.
204 DOWNLOAD_PO=skip;;
205 --update-po=*)
206 DOWNLOAD_PO=`expr "$option" : '--update-po=\(.*\)'`;;
207 --update-po)
208 DOWNLOAD_PO=only;;
209 --force)
210 CVS_only_file=;;
211 --copy)
212 copy=true;;
213 *)
214 echo >&2 "$0: $option: unknown option"
215 exit 1;;
216 esac
217 done
218
219 if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
220 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
221 exit 1
222 fi
223
224 echo "$0: Bootstrapping CVS $package..."
225
226 # Get translations.
227
228 download_po_files() {
229 subdir=$1
230 domain=$2
231 echo "$0: getting translations into $subdir for $domain..."
232 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
233 eval "$cmd"
234 }
235
236 # Download .po files to $po_dir/.reference and copy only the new
237 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
238 update_po_files() {
239 # Directory containing primary .po files.
240 # Overwrite them only when we're sure a .po file is new.
241 po_dir=$1
242 domain=$2
243
244 # Download *.po files into this dir.
245 # Usually contains *.s1 checksum files.
246 ref_po_dir="$po_dir/.reference"
247
248 test -d $ref_po_dir || mkdir $ref_po_dir || return
249 download_po_files $ref_po_dir $domain \
250 && ls "$ref_po_dir"/*.po 2>/dev/null |
251 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
252
253 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
254 test "$langs" = '*' && langs=x
255 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
256 case $po in x) continue;; esac
257 new_po="$ref_po_dir/$po.po"
258 cksum_file="$ref_po_dir/$po.s1"
259 if ! test -f "$cksum_file" ||
260 ! test -f "$po_dir/$po.po" ||
261 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
262 echo "updated $po_dir/$po.po..."
263 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
264 fi
265 done
266 }
267
268 case $DOWNLOAD_PO in
269 'skip')
270 ;;
271 '')
272 if test -d po; then
273 update_po_files po $package || exit
274 fi
275 ;;
276 'only')
277 if test -d po; then
278 update_po_files po $package || exit
279 fi
280 exit
281 ;;
282 esac
283
284 # Get paxutils files.
285
286 case ${PAXUTILS_SRCDIR--} in
287 -) checkout paxutils
288 PAXUTILS_SRCDIR=paxutils
289 esac
290
291 if [ -r $PAXUTILS_SRCDIR/gnulib.modules ]; then
292 gnulib_modules=`
293 (echo "$gnulib_modules"; grep '^[^#]' $PAXUTILS_SRCDIR/gnulib.modules) |
294 sort -u
295 `
296 fi
297
298 ignore_file_list=
299 cleanup_ifl() {
300 test -n "$ignore_file_list" && rm -f $ignore_file_list
301 }
302
303 trap 'cleanup_ifl' 1 2 3 15
304
305 # ignorefile DIR FILE
306 # add FILE to the temporary ignorelist in the directory DIR
307 ignorefile() {
308 file=$1/.ignore.$$
309 echo "$2" >> $file
310 if `echo $ignore_list | grep -qv $file`; then
311 ignore_file_list="$ignore_file_list
312 $file"
313 fi
314 }
315
316 # copy_files srcdir dstdir
317 copy_files() {
318 for file in `cat $1/DISTFILES`
319 do
320 case $file in
321 "#*") continue;;
322 esac
323 dst=`echo $file | sed 's^.*/^^'`
324 if [ $# -eq 3 ]; then
325 case $dst in
326 ${3}*) ;;
327 *) dst=${3}$dst;;
328 esac
329 fi
330 echo "$0: Copying file $1/$file to $2/$dst"
331 cp -p $1/$file $2/$dst
332 ignorefile $2 $dst
333 done
334 }
335
336 # Get gnulib files.
337
338 case ${GNULIB_SRCDIR--} in
339 -)
340 checkout gnulib
341 GNULIB_SRCDIR=gnulib
342 esac
343
344 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
345 <$gnulib_tool || exit
346
347 ensure_dir_exists()
348 {
349 d=`dirname $dst`
350 test -d "$d" || mkdir -p -- "$d"
351 }
352
353 symlink_to_gnulib()
354 {
355 src=$GNULIB_SRCDIR/$1
356 dst=${2-$1}
357
358 test -f "$src" && {
359 if $copy; then
360 {
361 test ! -h "$dst" || {
362 echo "$0: rm -f $dst" &&
363 rm -f "$dst"
364 }
365 } &&
366 test -f "$dst" &&
367 cmp -s "$src" "$dst" || {
368 echo "$0: cp -fp $src $dst" &&
369 ensure_dir_exists $dst &&
370 cp -fp "$src" "$dst"
371 }
372 else
373 test -h "$dst" &&
374 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
375 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
376 test "$src_i" = "$dst_i" || {
377 dot_dots=
378 case $src in
379 /*) ;;
380 *)
381 case /$dst/ in
382 *//* | */../* | */./* | /*/*/*/*/*/)
383 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
384 exit 1;;
385 /*/*/*/*/) dot_dots=../../../;;
386 /*/*/*/) dot_dots=../../;;
387 /*/*/) dot_dots=../;;
388 esac;;
389 esac
390
391 echo "$0: ln -fs $dot_dots$src $dst" &&
392 ensure_dir_exists $dst &&
393 ln -fs "$dot_dots$src" "$dst"
394 }
395 fi
396 }
397 }
398
399 cp_mark_as_generated()
400 {
401 cp_src=$1
402 cp_dst=$2
403
404 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
405 symlink_to_gnulib "$cp_dst"
406 else
407 case $cp_dst in
408 *.[ch]) c1='/* '; c2=' */';;
409 *.texi) c1='@c '; c2= ;;
410 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
411 *) c1= ; c2= ;;
412 esac
413
414 if test -z "$c1"; then
415 cmp -s "$cp_src" "$cp_dst" || {
416 echo "$0: cp -f $cp_src $cp_dst" &&
417 cp -f "$cp_src" "$cp_dst"
418 }
419 else
420 # Copy the file first to get proper permissions if it
421 # doesn't already exist. Then overwrite the copy.
422 cp "$cp_src" "$cp_dst-t" &&
423 (
424 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
425 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
426 cat "$cp_src"
427 ) > $cp_dst-t &&
428 if cmp -s "$cp_dst-t" "$cp_dst"; then
429 rm -f "$cp_dst-t"
430 else
431 echo "$0: cp $cp_src $cp_dst # with edits" &&
432 mv -f "$cp_dst-t" "$cp_dst"
433 fi
434 fi
435 fi
436 }
437
438 version_controlled_file() {
439 dir=$1
440 file=$2
441 found=no
442 if test -d CVS; then
443 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
444 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
445 elif test -d .git; then
446 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
447 else
448 echo "$0: no version control for $dir/$file?" >&2
449 fi
450 test $found = yes
451 }
452
453 slurp() {
454 for dir in . `(cd $1 && find * -type d -print)`; do
455 copied=
456 sep=
457 for file in `ls $1/$dir`; do
458 test -d $1/$dir/$file && continue
459 for excluded_file in $excluded_files; do
460 test "$dir/$file" = "$excluded_file" && continue 2
461 done
462 if test $file = Makefile.am; then
463 copied=$copied${sep}gnulib.mk; sep=$nl
464 remove_intl='/^[^#].*\/intl/s/^/#/;'"s,/$bt,,g"
465 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
466 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
467 rm -f $dir/gnulib.mk &&
468 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
469 }
470 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
471 version_controlled_file $dir $file; then
472 echo "$0: $dir/$file overrides $1/$dir/$file"
473 else
474 copied=$copied$sep$file; sep=$nl
475 if test $file = gettext.m4; then
476 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
477 rm -f $dir/$file
478 sed '
479 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
480 AC_DEFUN([AM_INTL_SUBDIR], [
481 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
482 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
483 $a\
484 AC_DEFUN([gl_LOCK_EARLY], [])
485 ' $1/$dir/$file >$dir/$file
486 else
487 cp_mark_as_generated $1/$dir/$file $dir/$file
488 fi
489 fi || exit
490 done
491
492 if test -n "$copied"; then
493 copied="Makefile
494 Makefile.in
495 $copied"
496 if test -d CVS; then
497 dot_ig=.cvsignore
498 else
499 dor_ig=.gitignore
500 fi
501
502 ig=$dir/$dot_ig
503 if [ -f $dir/.ignore.$$ ]; then
504 tfile=$dir/.ignore.$$
505 else
506 tfile=
507 fi
508 if test -f $ig; then
509 echo "$copied" | sort -u - $ig | cmp -s - $ig ||
510 echo "$copied" | sort -u - $ig $tfile -o $ig
511 else
512 copied="$dot_ig
513 $copied"
514 if [ "$dir" = "po" ]; then
515 copied="LINGUAS
516 Makevars
517 POTFILES
518 *.mo
519 *.gmo
520 *.po
521 remove-potcdate.sed
522 stamp-po
523 $package.pot
524 $copied"
525 fi
526 echo "$copied" | sort -u - $tfile -o $ig
527 fi || exit
528 fi
529 done
530 }
531
532
533 # Create boot temporary directories to import from gnulib and gettext.
534
535 bt='.#bootmp'
536 bt2=${bt}2
537 rm -fr $bt $bt2 &&
538 mkdir $bt $bt2 || exit
539
540 # Import from gnulib.
541
542 test -d build-aux || {
543 echo "$0: mkdir build-aux ..." &&
544 mkdir build-aux
545 } || exit
546 gnulib_tool_options="\
547 --import\
548 --no-changelog\
549 --aux-dir $bt/build-aux\
550 --doc-base $bt/doc\
551 --lib lib$package\
552 --m4-base $bt/m4/\
553 --source-base $bt/lib/\
554 --tests-base $bt/tests\
555 --local-dir gl\
556 "
557 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
558 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
559 slurp $bt || exit
560
561 for file in $gnulib_files; do
562 symlink_to_gnulib $file || exit
563 done
564
565
566 # Import from gettext.
567
568 echo "$0: (cd $bt2; autopoint) ..."
569 cp configure.ac $bt2 &&
570 (cd $bt2 && autopoint && rm configure.ac) &&
571 slurp $bt2 $bt || exit
572
573 rm -fr $bt $bt2 || exit
574
575 # Import from paxutils
576 copy_files ${PAXUTILS_SRCDIR}/m4 m4
577 echo "$0: Creating m4/paxutils.m4"
578 (echo "# This file is generated automatically. Please, do not edit."
579 echo "#"
580 echo "AC_DEFUN([${package}_PAXUTILS],["
581 cat ${PAXUTILS_SRCDIR}/m4/DISTFILES | sed '/^#/d;s/\(.*\)\.m4/pu_\1/' | tr a-z A-Z
582 echo "])") > ./m4/paxutils.m4
583 ignorefile m4 paxutils.m4
584
585 if [ -d rmt ]; then
586 :
587 else
588 mkdir rmt
589 fi
590
591 for dir in doc rmt lib tests
592 do
593 copy_files ${PAXUTILS_SRCDIR}/$dir $dir
594 done
595
596 copy_files ${PAXUTILS_SRCDIR}/paxlib lib pax
597
598 # Reconfigure, getting other files.
599
600 for command in \
601 'aclocal --force -I m4' \
602 'autoconf --force' \
603 'autoheader --force' \
604 'automake --add-missing --copy --force-missing';
605 do
606 echo "$0: $command ..."
607 $command || exit
608 done
609
610
611 # Get some extra files from gnulib, overriding existing files.
612
613 for file in $gnulib_extra_files; do
614 case $file in
615 */INSTALL) dst=INSTALL;;
616 *) dst=$file;;
617 esac
618 symlink_to_gnulib $file $dst || exit
619 done
620
621
622 # Create gettext configuration.
623 echo "$0: Creating po/Makevars from po/Makevars.template ..."
624 rm -f po/Makevars
625 sed '
626 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
627 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
628 /^XGETTEXT_OPTIONS *=/{
629 s/$/ \\/
630 a\
631 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
632 }
633 ' po/Makevars.template >po/Makevars
634
635 if test -d runtime-po; then
636 # Similarly for runtime-po/Makevars, but not quite the same.
637 rm -f runtime-po/Makevars
638 sed '
639 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
640 /^subdir *=.*/s/=.*/= runtime-po/
641 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
642 /^XGETTEXT_OPTIONS *=/{
643 s/$/ \\/
644 a\
645 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
646 }
647 ' <po/Makevars.template >runtime-po/Makevars
648
649 # Copy identical files from po to runtime-po.
650 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
651 fi
652 cleanup_ifl
653 echo "$0: done. Now you can run './configure'."
This page took 0.066055 seconds and 5 git commands to generate.