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