Update
[tar/ericb.git] / bootstrap
bloba318f68f2c7bd73219faea1a6980f46e40d4a641
1 #! /bin/sh
3 # Bootstrap this package from CVS.
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
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.
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.
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.
22 # Written by Paul Eggert and Sergey Poznyakoff.
24 nl='
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
32 usage() {
33 echo >&2 "\
34 Usage: $0 [OPTION]...
35 Bootstrap this package from the checked-out sources.
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 paxutils repository.
56 If the file bootstrap.conf exists in the current working directory, its
57 contents are read as shell variables to configure the bootstrap.
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.
64 Running without arguments will suffice in most cases.
68 checkout() {
69 if [ ! -d $1 ]; then
70 echo "$0: getting $1 files..."
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+@}";;
80 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
81 exit 1;;
82 esac
84 case $CVS_RSH in
85 '') CVS_RSH=ssh; export CVS_RSH;;
86 esac
88 CVSURL=${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/"$1"
91 gnulib)
92 CVSURL=:pserver:anonymous@pserver.git.sv.gnu.org:/gnulib.git
95 esac
97 trap "cleanup $1" 1 2 13 15
99 cvs -z3 -q -d $CVSURL co $1 || cleanup $1
101 trap - 1 2 13 15
105 cleanup() {
106 status=$?
107 rm -fr $1
108 exit $status
111 # Configuration.
113 # List of gnulib modules needed.
114 gnulib_modules=
116 # Any gnulib files needed that are not in modules.
117 gnulib_files=
119 # Translation Project URL, for the registry of all projects
120 # and for the translation-team master directory.
121 tp_url() {
122 echo "http://translationproject.org/domain/$1.html"
125 extract_package_name='
126 /^AC_INIT(/{
127 /.*,.*,.*,/{
128 s///
129 s/[][]//g
133 s/AC_INIT(\[*//
134 s/]*,.*//
135 s/^GNU //
136 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
137 s/[^A-Za-z0-9_]/-/g
141 package=`sed -n "$extract_package_name" configure.ac` || exit
143 # Extra files from gnulib, which override files from other sources.
144 gnulib_extra_files='
145 build-aux/announce-gen
146 build-aux/install-sh
147 build-aux/missing
148 build-aux/mdate-sh
149 build-aux/texinfo.tex
150 build-aux/depcomp
151 build-aux/config.guess
152 build-aux/config.sub
153 doc/INSTALL
156 # Other locale categories that need message catalogs.
157 EXTRA_LOCALE_CATEGORIES=
159 # Additional xgettext options to use. Use "\\\newline" to break lines.
160 XGETTEXT_OPTIONS='\\\
161 --flag=_:1:pass-c-format\\\
162 --flag=N_:1:pass-c-format\\\
163 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
166 # Files we don't want to import.
167 excluded_files=
169 # File that should exist in the top directory of a checked out hierarchy,
170 # but not in a distribution tarball.
171 CVS_only_file=README-cvs
173 # Whether to use copies instead of symlinks.
174 copy=false
176 # Override the default configuration, if necessary.
177 test -r bootstrap.conf && . ./bootstrap.conf
179 # Read local configuration file
180 if [ -r .bootstrap ]; then
181 echo "$0: Reading configuration file .bootstrap"
182 eval set -- "`sed 's/#.*$//;/^$/d' .bootstrap | tr '\n' ' '` $*"
185 # Translate configuration into internal form.
187 # Parse options.
189 for option
191 case $option in
192 --help)
193 usage
194 exit;;
195 --paxutils-srcdir=*)
196 PAXUTILS_SRCDIR=`expr "$option" : '--paxutils-srcdir=\(.*\)'`;;
197 --gnulib-srcdir=*)
198 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
199 --cvs-user=*)
200 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
201 --skip-po | --no-po) # --no-po is for compatibility with 'tar' tradition.
202 DOWNLOAD_PO=skip;;
203 --update-po=*)
204 DOWNLOAD_PO=`expr "$option" : '--update-po=\(.*\)'`;;
205 --update-po)
206 DOWNLOAD_PO=only;;
207 --force)
208 CVS_only_file=;;
209 --copy)
210 copy=true;;
212 echo >&2 "$0: $option: unknown option"
213 exit 1;;
214 esac
215 done
217 if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
218 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
219 exit 1
222 echo "$0: Bootstrapping CVS $package..."
224 # Get translations.
226 get_translations() {
227 subdir=$1
228 domain=$2
229 po_file=$3
231 case $WGET_COMMAND in
233 echo "$0: wget not available; skipping translations";;
235 url=`tp_url $domain`
236 baseurl=`expr "$url" : '\(.*\)/.*'`
237 echo "$0: getting translations into $subdir for $domain..." &&
238 case $po_file in
239 '') (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`);;
240 esac &&
242 $WGET_COMMAND -O "$subdir/$domain.html" "$url" &&
244 sed -n 's|.*href="\(.*\)/\([^/][^/]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\2:\3:\1|p' <"$subdir/$domain.html" |
245 sort -t: -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
246 awk -F: '
247 { if (lang && $1 != lang) print lang, ver, $3 }
248 { lang = $1; ver = $2 }
249 END { if (lang) print lang, ver, $3 }
250 ' | awk -v domain="$domain" -v baseurl="$baseurl" -v subdir="$subdir" \
251 -v po_file="$po_file" '
253 lang = $1
254 if (po_file && po_file != (lang ".po")) next
255 ver = $2
256 printf "{ $WGET_COMMAND -O %s/%s.po %s/%s/%s/%s-%s.%s.po &&\n", subdir, lang, baseurl, $3, lang, domain, ver, lang
257 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
258 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
259 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
261 END { print ":" }
262 ' | WGET_COMMAND="$WGET_COMMAND" sh
264 esac &&
265 ls "$subdir"/*.po 2>/dev/null |
266 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
267 rm -f "$subdir/$domain.html"
270 case `wget --help` in
271 *'--no-cache'*)
272 WGET_COMMAND='wget -nv --no-cache';;
273 *'--cache=on/off'*)
274 WGET_COMMAND='wget -nv --cache=off';;
275 *'--non-verbose'*)
276 WGET_COMMAND='wget -nv';;
278 WGET_COMMAND='';;
279 esac
281 case $DOWNLOAD_PO in
282 'skip')
285 get_translations po $package || exit
287 'only')
288 get_translations po $package
289 exit
291 *.po)
292 get_translations po $package "$DOWNLOAD_PO"
293 exit
296 get_translations po $package "${DOWNLOAD_PO}.po"
297 exit
298 esac
300 # Get paxutils files.
302 case ${PAXUTILS_SRCDIR--} in
303 -) checkout paxutils
304 PAXUTILS_SRCDIR=paxutils
305 esac
307 if [ -r $PAXUTILS_SRCDIR/gnulib.modules ]; then
308 gnulib_modules=`
309 (echo "$gnulib_modules"; grep '^[^#]' $PAXUTILS_SRCDIR/gnulib.modules) |
310 sort -u
314 ignore_file_list=
315 cleanup_ifl() {
316 test -n "$ignore_file_list" && rm -f $ignore_file_list
319 trap 'cleanup_ifl' 1 2 3 15
321 # ignorefile DIR FILE
322 # add FILE to the temporary ignorelist in the directory DIR
323 ignorefile() {
324 file=$1/.ignore.$$
325 echo "$2" >> $file
326 if `echo $ignore_list | grep -qv $file`; then
327 ignore_file_list="$ignore_file_list
328 $file"
332 # copy_files srcdir dstdir
333 copy_files() {
334 for file in `cat $1/DISTFILES`
336 case $file in
337 "#*") continue;;
338 esac
339 dst=`echo $file | sed 's^.*/^^'`
340 if [ $# -eq 3 ]; then
341 case $dst in
342 ${3}*) ;;
343 *) dst=${3}$dst;;
344 esac
346 echo "$0: Copying file $1/$file to $2/$dst"
347 cp -p $1/$file $2/$dst
348 ignorefile $2 $dst
349 done
352 # Get gnulib files.
354 case ${GNULIB_SRCDIR--} in
356 checkout gnulib
357 GNULIB_SRCDIR=gnulib
358 esac
360 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
361 <$gnulib_tool || exit
363 ensure_dir_exists()
365 d=`dirname $dst`
366 test -d "$d" || mkdir -p -- "$d"
369 symlink_to_gnulib()
371 src=$GNULIB_SRCDIR/$1
372 dst=${2-$1}
374 test -f "$src" && {
375 if $copy; then
377 test ! -h "$dst" || {
378 echo "$0: rm -f $dst" &&
379 rm -f "$dst"
381 } &&
382 test -f "$dst" &&
383 cmp -s "$src" "$dst" || {
384 echo "$0: cp -fp $src $dst" &&
385 ensure_dir_exists $dst &&
386 cp -fp "$src" "$dst"
388 else
389 test -h "$dst" &&
390 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
391 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
392 test "$src_i" = "$dst_i" || {
393 dot_dots=
394 case $src in
395 /*) ;;
397 case /$dst/ in
398 *//* | */../* | */./* | /*/*/*/*/*/)
399 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
400 exit 1;;
401 /*/*/*/*/) dot_dots=../../../;;
402 /*/*/*/) dot_dots=../../;;
403 /*/*/) dot_dots=../;;
404 esac;;
405 esac
407 echo "$0: ln -fs $dot_dots$src $dst" &&
408 ensure_dir_exists $dst &&
409 ln -fs "$dot_dots$src" "$dst"
415 cp_mark_as_generated()
417 cp_src=$1
418 cp_dst=$2
420 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
421 symlink_to_gnulib "$cp_dst"
422 else
423 case $cp_dst in
424 *.[ch]) c1='/* '; c2=' */';;
425 *.texi) c1='@c '; c2= ;;
426 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
427 *) c1= ; c2= ;;
428 esac
430 if test -z "$c1"; then
431 cmp -s "$cp_src" "$cp_dst" || {
432 echo "$0: cp -f $cp_src $cp_dst" &&
433 cp -f "$cp_src" "$cp_dst"
435 else
436 # Copy the file first to get proper permissions if it
437 # doesn't already exist. Then overwrite the copy.
438 cp "$cp_src" "$cp_dst-t" &&
440 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
441 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
442 cat "$cp_src"
443 ) > $cp_dst-t &&
444 if cmp -s "$cp_dst-t" "$cp_dst"; then
445 rm -f "$cp_dst-t"
446 else
447 echo "$0: cp $cp_src $cp_dst # with edits" &&
448 mv -f "$cp_dst-t" "$cp_dst"
454 version_controlled_file() {
455 dir=$1
456 file=$2
457 found=no
458 if test -d CVS; then
459 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
460 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
461 elif test -d .git; then
462 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
463 else
464 echo "$0: no version control for $dir/$file?" >&2
466 test $found = yes
469 slurp() {
470 for dir in . `(cd $1 && find * -type d -print)`; do
471 copied=
472 sep=
473 for file in `ls $1/$dir`; do
474 test -d $1/$dir/$file && continue
475 for excluded_file in $excluded_files; do
476 test "$dir/$file" = "$excluded_file" && continue 2
477 done
478 if test $file = Makefile.am; then
479 copied=$copied${sep}gnulib.mk; sep=$nl
480 remove_intl='/^[^#].*\/intl/s/^/#/;'"s,/$bt,,g"
481 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
482 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
483 rm -f $dir/gnulib.mk &&
484 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
486 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
487 version_controlled_file $dir $file; then
488 echo "$0: $dir/$file overrides $1/$dir/$file"
489 else
490 copied=$copied$sep$file; sep=$nl
491 if test $file = gettext.m4; then
492 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
493 rm -f $dir/$file
494 sed '
495 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
496 AC_DEFUN([AM_INTL_SUBDIR], [
497 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
498 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
500 AC_DEFUN([gl_LOCK_EARLY], [])
501 ' $1/$dir/$file >$dir/$file
502 else
503 cp_mark_as_generated $1/$dir/$file $dir/$file
505 fi || exit
506 done
508 if test -n "$copied"; then
509 copied="Makefile
510 Makefile.in
511 $copied"
512 if test -d CVS; then
513 dot_ig=.cvsignore
514 else
515 dor_ig=.gitignore
518 ig=$dir/$dot_ig
519 if [ -f $dir/.ignore.$$ ]; then
520 tfile=$dir/.ignore.$$
521 else
522 tfile=
524 if test -f $ig; then
525 echo "$copied" | sort -u - $ig | cmp -s - $ig ||
526 echo "$copied" | sort -u - $ig $tfile -o $ig
527 else
528 copied="$dot_ig
529 $copied"
530 if [ "$dir" = "po" ]; then
531 copied="LINGUAS
532 Makevars
533 POTFILES
534 *.mo
535 *.gmo
536 *.po
537 remove-potcdate.sed
538 stamp-po
539 $package.pot
540 $copied"
542 echo "$copied" | sort -u - $tfile -o $ig
543 fi || exit
545 done
549 # Create boot temporary directories to import from gnulib and gettext.
551 bt='.#bootmp'
552 bt2=${bt}2
553 rm -fr $bt $bt2 &&
554 mkdir $bt $bt2 || exit
556 # Import from gnulib.
558 test -d build-aux || {
559 echo "$0: mkdir build-aux ..." &&
560 mkdir build-aux
561 } || exit
562 gnulib_tool_options="\
563 --import\
564 --no-changelog\
565 --aux-dir $bt/build-aux\
566 --doc-base $bt/doc\
567 --lib lib$package\
568 --m4-base $bt/m4/\
569 --source-base $bt/lib/\
570 --tests-base $bt/tests\
571 --local-dir gl\
573 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
574 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
575 slurp $bt || exit
577 for file in $gnulib_files; do
578 symlink_to_gnulib $file || exit
579 done
582 # Import from gettext.
584 echo "$0: (cd $bt2; autopoint) ..."
585 cp configure.ac $bt2 &&
586 (cd $bt2 && autopoint && rm configure.ac) &&
587 slurp $bt2 $bt || exit
589 rm -fr $bt $bt2 || exit
591 # Import from paxutils
592 copy_files ${PAXUTILS_SRCDIR}/m4 m4
593 echo "$0: Creating m4/paxutils.m4"
594 (echo "# This file is generated automatically. Please, do not edit."
595 echo "#"
596 echo "AC_DEFUN([${package}_PAXUTILS],["
597 cat ${PAXUTILS_SRCDIR}/m4/DISTFILES | sed '/^#/d;s/\(.*\)\.m4/pu_\1/' | tr a-z A-Z
598 echo "])") > ./m4/paxutils.m4
599 ignorefile m4 paxutils.m4
601 if [ -d rmt ]; then
603 else
604 mkdir rmt
607 for dir in doc rmt lib tests
609 copy_files ${PAXUTILS_SRCDIR}/$dir $dir
610 done
612 copy_files ${PAXUTILS_SRCDIR}/paxlib lib pax
614 # Reconfigure, getting other files.
616 for command in \
617 'aclocal --force -I m4' \
618 'autoconf --force' \
619 'autoheader --force' \
620 'automake --add-missing --copy --force-missing';
622 echo "$0: $command ..."
623 $command || exit
624 done
627 # Get some extra files from gnulib, overriding existing files.
629 for file in $gnulib_extra_files; do
630 case $file in
631 */INSTALL) dst=INSTALL;;
632 *) dst=$file;;
633 esac
634 symlink_to_gnulib $file $dst || exit
635 done
638 # Create gettext configuration.
639 echo "$0: Creating po/Makevars from po/Makevars.template ..."
640 rm -f po/Makevars
641 sed '
642 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
643 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
644 /^XGETTEXT_OPTIONS *=/{
645 s/$/ \\/
647 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
649 ' po/Makevars.template >po/Makevars
651 if test -d runtime-po; then
652 # Similarly for runtime-po/Makevars, but not quite the same.
653 rm -f runtime-po/Makevars
654 sed '
655 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
656 /^subdir *=.*/s/=.*/= runtime-po/
657 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
658 /^XGETTEXT_OPTIONS *=/{
659 s/$/ \\/
661 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
663 ' <po/Makevars.template >runtime-po/Makevars
665 # Copy identical files from po to runtime-po.
666 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
668 cleanup_ifl
669 echo "$0: done. Now you can run './configure'."