Remove autogenerated files
[debian/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'."