recognize new archive, audio, image formats; give audio files a separate color
[platform/upstream/coreutils.git] / 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.
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  --gnulib-srcdir=DIRNAME  Specify the local directory where gnulib
39                           sources reside.  Use this if you already
40                           have gnulib sources on your machine, and
41                           do not want to waste your bandwidth dowloading
42                           them again.
43  --copy                   Copy files instead of creating symbolic links.
44  --force                  Attempt to bootstrap even if the sources seem
45                           not to have been checked out.
46  --skip-po                Do not download po files.
47  --cvs-user=USERNAME      Set the CVS username to be used when accessing
48                           the gnulib repository.
49
50 If the file .bootstrap.conf exists in the current working directory, its
51 contents are read as shell variables to configure the bootstrap.
52
53 Running without arguments will suffice in most cases.
54 "
55 }
56
57 # Configuration.
58
59 # List of gnulib modules needed.
60 gnulib_modules=
61
62 # Any gnulib files needed that are not in modules.
63 gnulib_files=
64
65 # Translation Project URL, for the registry of all projects
66 # and for the translation-team master directory.
67 TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
68 TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
69
70 extract_package_name='
71   /^AC_INIT(/{
72      /.*,.*,.*,/{
73        s///
74        s/[][]//g
75        p
76        q
77      }
78      s/AC_INIT(\[*//
79      s/]*,.*//
80      s/^GNU //
81      y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
82      s/[^A-Za-z0-9_]/-/g
83      p
84   }
85 '
86 package=`sed -n "$extract_package_name" configure.ac` || exit
87
88 # Extra files from gnulib, which override files from other sources.
89 gnulib_extra_files='
90         build-aux/announce-gen
91         build-aux/install-sh
92         build-aux/missing
93         build-aux/mdate-sh
94         build-aux/texinfo.tex
95         build-aux/depcomp
96         build-aux/config.guess
97         build-aux/config.sub
98         doc/INSTALL
99 '
100
101 # Other locale categories that need message catalogs.
102 EXTRA_LOCALE_CATEGORIES=
103
104 # Additional xgettext options to use.  Use "\\\newline" to break lines.
105 XGETTEXT_OPTIONS='\\\
106  --flag=_:1:pass-c-format\\\
107  --flag=N_:1:pass-c-format\\\
108  --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
109 '
110
111 # Files we don't want to import.
112 excluded_files=
113
114 # File that should exist in the top directory of a checked out hierarchy,
115 # but not in a distribution tarball.
116 CVS_only_file=README-cvs
117
118 # Whether to use copies instead of symlinks.
119 copy=false
120
121 # Override the default configuration, if necessary.
122 test -r bootstrap.conf && . ./bootstrap.conf
123
124 # Translate configuration into internal form.
125
126 # Parse options.
127
128 for option
129 do
130   case $option in
131   --help)
132     usage
133     exit;;
134   --gnulib-srcdir=*)
135     GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
136   --cvs-user=*)
137     CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
138   --skip-po)
139     SKIP_PO=t;;
140   --force)
141     CVS_only_file=;;
142   --copy)
143     copy=true;;
144   *)
145     echo >&2 "$0: $option: unknown option"
146     exit 1;;
147   esac
148 done
149
150 if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
151   echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
152   exit 1
153 fi
154
155 echo "$0: Bootstrapping CVS $package..."
156
157 cleanup_gnulib() {
158   status=$?
159   rm -fr gnulib
160   exit $status
161 }
162
163 # Get gnulib files.
164
165 case ${GNULIB_SRCDIR--} in
166 -)
167   if [ ! -d gnulib ]; then
168     echo "$0: getting gnulib files..."
169
170     case ${CVS_AUTH-pserver} in
171     pserver)
172       CVS_PREFIX=':pserver:anonymous@';;
173     ssh)
174       CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
175     *)
176       echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
177       exit 1;;
178     esac
179
180     case $CVS_RSH in
181     '') CVS_RSH=ssh; export CVS_RSH;;
182     esac
183
184     trap cleanup_gnulib 1 2 13 15
185
186     cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
187       cleanup_gnulib
188
189     trap - 1 2 13 15
190   fi
191   GNULIB_SRCDIR=gnulib
192 esac
193
194 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
195 <$gnulib_tool || exit
196
197 # Get translations.
198
199 get_translations() {
200   subdir=$1
201   domain=$2
202
203   case $WGET_COMMAND in
204   '')
205     echo "$0: wget not available; skipping translations";;
206   ?*)
207     echo "$0: getting translations into $subdir for $domain..." &&
208
209     (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
210     $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
211
212     sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
213     sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
214     awk -F. '
215       { if (lang && $1 != lang) print lang, ver }
216       { lang = $1; ver = substr($0, index($0, ".") + 1) }
217       END { if (lang) print lang, ver }
218     ' | awk -v domain="$domain" -v subdir="$subdir" '
219       {
220         lang = $1
221         ver = $2
222         urlfmt = ""
223         printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
224         printf "  msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
225         printf "    echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
226         printf "    rm -f %s/%s.po; }; } &&\n", subdir, lang
227       }
228       END { print ":" }
229     ' | WGET_COMMAND="$WGET_COMMAND" sh;;
230   esac &&
231   ls "$subdir"/*.po 2>/dev/null |
232     sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
233   rm -f "$subdir/$domain.html"
234 }
235
236 case $SKIP_PO in
237 '')
238   case `wget --help` in
239   *'--no-cache'*)
240     WGET_COMMAND='wget -nv --no-cache';;
241   *'--cache=on/off'*)
242     WGET_COMMAND='wget -nv --cache=off';;
243   *'--non-verbose'*)
244     WGET_COMMAND='wget -nv';;
245   *)
246     WGET_COMMAND='';;
247   esac
248
249   get_translations po $package || exit
250
251   if test -d runtime-po; then
252     get_translations runtime-po $package-runtime || exit
253   fi;;
254 esac
255
256 symlink_to_gnulib()
257 {
258   src=$GNULIB_SRCDIR/$1
259   dst=${2-$1}
260
261   test -f "$src" && {
262     if $copy; then
263       {
264         test ! -h "$dst" || {
265           echo "$0: rm -f $dst" &&
266           rm -f "$dst"
267         }
268       } &&
269       test -f "$dst" &&
270       cmp -s "$src" "$dst" || {
271         echo "$0: cp -fp $src $dst" &&
272         cp -fp "$src" "$dst"
273       }
274     else
275       test -h "$dst" &&
276       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
277       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
278       test "$src_i" = "$dst_i" || {
279         dot_dots=
280         case $src in
281         /*) ;;
282         *)
283           case /$dst/ in
284           *//* | */../* | */./* | /*/*/*/*/*/)
285              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
286              exit 1;;
287           /*/*/*/*/)    dot_dots=../../../;;
288           /*/*/*/)      dot_dots=../../;;
289           /*/*/)        dot_dots=../;;
290           esac;;
291         esac
292
293         echo "$0: ln -fs $dot_dots$src $dst" &&
294         ln -fs "$dot_dots$src" "$dst"
295       }
296     fi
297   }
298 }
299
300 cp_mark_as_generated()
301 {
302   cp_src=$1
303   cp_dst=$2
304
305   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
306     symlink_to_gnulib "$cp_dst"
307   else
308     case $cp_dst in
309       *.[ch])             c1='/* '; c2=' */';;
310       *.texi)             c1='@c '; c2=     ;;
311       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
312       *)                  c1=     ; c2=     ;;
313     esac
314
315     if test -z "$c1"; then
316       cmp -s "$cp_src" "$cp_dst" || {
317         echo "$0: cp -f $cp_src $cp_dst" &&
318         cp -f "$cp_src" "$cp_dst"
319       }
320     else
321       # Copy the file first to get proper permissions if it
322       # doesn't already exist.  Then overwrite the copy.
323       cp "$cp_src" "$cp_dst-t" &&
324       (
325         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
326         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
327         cat "$cp_src"
328       ) > $cp_dst-t &&
329       if cmp -s "$cp_dst-t" "$cp_dst"; then
330         rm -f "$cp_dst-t"
331       else
332         echo "$0: cp $cp_src $cp_dst # with edits" &&
333         mv -f "$cp_dst-t" "$cp_dst"
334       fi
335     fi
336   fi
337 }
338
339 version_controlled_file() {
340   dir=$1
341   file=$2
342   found=no
343   if test -d CVS; then
344     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
345              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
346   elif test -d .git; then
347     git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
348   else
349     echo "$0: no version control for $dir/$file?" >&2
350   fi
351   test $found = yes
352 }
353
354 slurp() {
355   for dir in . `(cd $1 && find * -type d -print)`; do
356     copied=
357     sep=
358     for file in `ls $1/$dir`; do
359       test -d $1/$dir/$file && continue
360       for excluded_file in $excluded_files; do
361         test "$dir/$file" = "$excluded_file" && continue 2
362       done
363       if test $file = Makefile.am; then
364         copied=$copied${sep}gnulib.mk; sep=$nl
365         remove_intl='/^[^#].*\/intl/s/^/#/'
366         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
367           echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
368           rm -f $dir/gnulib.mk &&
369           sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
370         }
371       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
372            version_controlled_file $dir $file; then
373         echo "$0: $dir/$file overrides $1/$dir/$file"
374       else
375         copied=$copied$sep$file; sep=$nl
376         if test $file = gettext.m4; then
377           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
378           rm -f $dir/$file
379           sed '
380             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
381               AC_DEFUN([AM_INTL_SUBDIR], [
382             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
383               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
384             $a\
385               AC_DEFUN([gl_LOCK_EARLY], [])
386           ' $1/$dir/$file >$dir/$file
387         else
388           cp_mark_as_generated $1/$dir/$file $dir/$file
389         fi
390       fi || exit
391     done
392
393     for dot_ig in .cvsignore .gitignore; do
394       ig=$dir/$dot_ig
395       if test -n "$copied" && test -f $ig; then
396         echo "$copied" | sort -u - $ig | cmp -s - $ig ||
397         echo "$copied" | sort -u - $ig -o $ig || exit
398       fi
399     done
400   done
401 }
402
403
404 # Create boot temporary directories to import from gnulib and gettext.
405
406 bt='.#bootmp'
407 bt2=${bt}2
408 rm -fr $bt $bt2 &&
409 mkdir $bt $bt2 || exit
410
411 # Import from gnulib.
412
413 gnulib_tool_options="\
414  --import\
415  --no-changelog\
416  --aux-dir $bt/build-aux\
417  --doc-base $bt/doc\
418  --lib lib$package\
419  --m4-base $bt/m4/\
420  --source-base $bt/lib/\
421  --tests-base $bt/tests\
422  --local-dir gl\
423 "
424 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
425 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
426 slurp $bt || exit
427
428 for file in $gnulib_files; do
429   symlink_to_gnulib $file || exit
430 done
431
432
433 # Import from gettext.
434
435 echo "$0: (cd $bt2; autopoint) ..."
436 cp configure.ac $bt2 &&
437 (cd $bt2 && autopoint && rm configure.ac) &&
438 slurp $bt2 $bt || exit
439
440 rm -fr $bt $bt2 || exit
441
442
443 # Reconfigure, getting other files.
444
445 for command in \
446   'aclocal --force -I m4' \
447   'autoconf --force' \
448   'autoheader --force' \
449   'automake --add-missing --copy --force-missing';
450 do
451   echo "$0: $command ..."
452   $command || exit
453 done
454
455
456 # Get some extra files from gnulib, overriding existing files.
457
458 for file in $gnulib_extra_files; do
459   case $file in
460   */INSTALL) dst=INSTALL;;
461   *) dst=$file;;
462   esac
463   symlink_to_gnulib $file $dst || exit
464 done
465
466
467 # Create gettext configuration.
468 echo "$0: Creating po/Makevars from po/Makevars.template ..."
469 rm -f po/Makevars
470 sed '
471   /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
472   /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
473   /^XGETTEXT_OPTIONS *=/{
474     s/$/ \\/
475     a\
476         '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
477   }
478 ' po/Makevars.template >po/Makevars
479
480 if test -d runtime-po; then
481   # Similarly for runtime-po/Makevars, but not quite the same.
482   rm -f runtime-po/Makevars
483   sed '
484     /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
485     /^subdir *=.*/s/=.*/= runtime-po/
486     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
487     /^XGETTEXT_OPTIONS *=/{
488       s/$/ \\/
489       a\
490           '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
491     }
492   ' <po/Makevars.template >runtime-po/Makevars
493
494   # Copy identical files from po to runtime-po.
495   (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
496 fi
497
498 echo "$0: done.  Now you can run './configure'."