]> Dogcows Code - chaz/tar/blob - bootstrap
(slurp): Create .(cvs|git)ignore if not present
[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 if test -n "$copied"; then
490 copied="Makefile
491 Makefile.in
492 $copied"
493 if test -d CVS; then
494 dot_ig=.cvsignore
495 else
496 dor_ig=.gitignore
497 fi
498
499 ig=$dir/$dot_ig
500 if test -f $ig; then
501 echo "$copied" | sort -u - $ig | cmp -s - $ig ||
502 echo "$copied" | sort -u - $ig -o $ig
503 else
504 copied="$dot_ig
505 $copied"
506 if [ "$dir" = "po" ]; then
507 copied="LINGUAS
508 Makevars
509 POTFILES
510 *.mo
511 *.gmo
512 *.po
513 remove-potcdate.sed
514 stamp-po
515 $package.pot
516 $copied"
517 fi
518 echo "$copied" | sort -u -o $ig
519 fi || exit
520 fi
521 done
522 }
523
524
525 # Create boot temporary directories to import from gnulib and gettext.
526
527 bt='.#bootmp'
528 bt2=${bt}2
529 rm -fr $bt $bt2 &&
530 mkdir $bt $bt2 || exit
531
532 # Import from gnulib.
533
534 test -d build-aux || {
535 echo "$0: mkdir build-aux ..." &&
536 mkdir build-aux
537 } || exit
538 gnulib_tool_options="\
539 --import\
540 --no-changelog\
541 --aux-dir $bt/build-aux\
542 --doc-base $bt/doc\
543 --lib lib$package\
544 --m4-base $bt/m4/\
545 --source-base $bt/lib/\
546 --tests-base $bt/tests\
547 --local-dir gl\
548 "
549 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
550 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
551 slurp $bt || exit
552
553 for file in $gnulib_files; do
554 symlink_to_gnulib $file || exit
555 done
556
557
558 # Import from gettext.
559
560 echo "$0: (cd $bt2; autopoint) ..."
561 cp configure.ac $bt2 &&
562 (cd $bt2 && autopoint && rm configure.ac) &&
563 slurp $bt2 $bt || exit
564
565 rm -fr $bt $bt2 || exit
566
567
568 # Reconfigure, getting other files.
569
570 for command in \
571 'aclocal --force -I m4' \
572 'autoconf --force' \
573 'autoheader --force' \
574 'automake --add-missing --copy --force-missing';
575 do
576 echo "$0: $command ..."
577 $command || exit
578 done
579
580
581 # Get some extra files from gnulib, overriding existing files.
582
583 for file in $gnulib_extra_files; do
584 case $file in
585 */INSTALL) dst=INSTALL;;
586 *) dst=$file;;
587 esac
588 symlink_to_gnulib $file $dst || exit
589 done
590
591
592 # Create gettext configuration.
593 echo "$0: Creating po/Makevars from po/Makevars.template ..."
594 rm -f po/Makevars
595 sed '
596 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
597 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
598 /^XGETTEXT_OPTIONS *=/{
599 s/$/ \\/
600 a\
601 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
602 }
603 ' po/Makevars.template >po/Makevars
604
605 if test -d runtime-po; then
606 # Similarly for runtime-po/Makevars, but not quite the same.
607 rm -f runtime-po/Makevars
608 sed '
609 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
610 /^subdir *=.*/s/=.*/= runtime-po/
611 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
612 /^XGETTEXT_OPTIONS *=/{
613 s/$/ \\/
614 a\
615 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
616 }
617 ' <po/Makevars.template >runtime-po/Makevars
618
619 # Copy identical files from po to runtime-po.
620 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
621 fi
622
623 echo "$0: done. Now you can run './configure'."
This page took 0.066383 seconds and 5 git commands to generate.