bootstrap: when fetching .po files, do not remove .gmo files.
[platform/upstream/coreutils.git] / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from checked-out sources.
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 3 of the License, or
10 # (at your option) 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, see <http://www.gnu.org/licenses/>.
19
20 # Written by Paul Eggert.
21
22 nl='
23 '
24
25 # Ensure file names are sorted consistently across platforms.
26 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
27 LC_ALL=C
28 export LC_ALL
29
30 local_gl_dir=gl
31
32 # Temporary directory names.
33 bt='._bootmp'
34 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
35 bt2=${bt}2
36
37 usage() {
38   echo >&2 "\
39 Usage: $0 [OPTION]...
40 Bootstrap this package from the checked-out sources.
41
42 Options:
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 downloading
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  --cvs-user=USERNAME      Set the username to use when checking out
53                           sources from the gnulib repository.
54
55 If the file bootstrap.conf exists in the current working directory, its
56 contents are read as shell variables to configure the bootstrap.
57
58 Running without arguments will suffice in most cases.
59 "
60 }
61
62 # Configuration.
63
64 # Name of the Makefile.am
65 gnulib_mk=gnulib.mk
66
67 # List of gnulib modules needed.
68 gnulib_modules=
69
70 # Any gnulib files needed that are not in modules.
71 gnulib_files=
72
73 # Translation Project URL, for the registry of all projects
74 # and for the translation-team master directory.
75 TP_URL="http://translationproject.org/latest/"
76
77 extract_package_name='
78   /^AC_INIT(/{
79      /.*,.*,.*,/{
80        s///
81        s/[][]//g
82        p
83        q
84      }
85      s/AC_INIT(\[*//
86      s/]*,.*//
87      s/^GNU //
88      y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
89      s/[^A-Za-z0-9_]/-/g
90      p
91   }
92 '
93 package=`sed -n "$extract_package_name" configure.ac` || exit
94 gnulib_name=lib$package
95
96 build_aux=build-aux
97 # Extra files from gnulib, which override files from other sources.
98 gnulib_extra_files="
99         $build_aux/install-sh
100         $build_aux/missing
101         $build_aux/mdate-sh
102         $build_aux/texinfo.tex
103         $build_aux/depcomp
104         $build_aux/config.guess
105         $build_aux/config.sub
106         doc/INSTALL
107 "
108
109 # Additional gnulib-tool options to use.  Use "\newline" to break lines.
110 gnulib_tool_option_extras=
111
112 # Other locale categories that need message catalogs.
113 EXTRA_LOCALE_CATEGORIES=
114
115 # Additional xgettext options to use.  Use "\\\newline" to break lines.
116 XGETTEXT_OPTIONS='\\\
117  --flag=_:1:pass-c-format\\\
118  --flag=N_:1:pass-c-format\\\
119  --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
120 '
121
122 # Files we don't want to import.
123 excluded_files=
124
125 # File that should exist in the top directory of a checked out hierarchy,
126 # but not in a distribution tarball.
127 checkout_only_file=README-hacking
128
129 # Whether to use copies instead of symlinks.
130 copy=false
131
132 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
133 # those files to be generated in directories like lib/, m4/, and po/.
134 # Or set it to 'auto' to make this script select which to use based
135 # on which version control system (if any) is used in the source directory.
136 vc_ignore=auto
137
138 # Override the default configuration, if necessary.
139 test -r bootstrap.conf && . ./bootstrap.conf
140
141 if test "$vc_ignore" = auto; then
142   vc_ignore=
143   test -d .git && vc_ignore=.gitignore
144   test -d CVS && vc_ignore="$vc_ignore .cvsignore"
145 fi
146
147 # Translate configuration into internal form.
148
149 # Parse options.
150
151 for option
152 do
153   case $option in
154   --help)
155     usage
156     exit;;
157   --gnulib-srcdir=*)
158     GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
159   --cvs-user=*)
160     CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
161   --skip-po)
162     SKIP_PO=t;;
163   --force)
164     checkout_only_file=;;
165   --copy)
166     copy=true;;
167   *)
168     echo >&2 "$0: $option: unknown option"
169     exit 1;;
170   esac
171 done
172
173 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
174   echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
175   exit 1
176 fi
177
178 # If $STR is not already on a line by itself in $FILE, insert it,
179 # sorting the new contents of the file and replacing $FILE with the result.
180 insert_sorted_if_absent() {
181   file=$1
182   str=$2
183   test -f $file || touch $file
184   echo "$str" | sort -u - $file | cmp -s - $file \
185     || echo "$str" | sort -u - $file -o $file \
186     || exit 1
187 }
188
189 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
190 found_aux_dir=no
191 grep '^[         ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
192     >/dev/null && found_aux_dir=yes
193 grep '^[         ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
194     >/dev/null && found_aux_dir=yes
195 if test $found_aux_dir = no; then
196   echo "$0: expected line not found in configure.ac. Add the following:" >&2
197   echo "  AC_CONFIG_AUX_DIR([$build_aux])" >&2
198   exit 1
199 fi
200
201 # If $build_aux doesn't exist, create it now, otherwise some bits
202 # below will malfunction.  If creating it, also mark it as ignored.
203 if test ! -d $build_aux; then
204   mkdir $build_aux
205   for dot_ig in x $vc_ignore; do
206     test $dot_ig = x && continue
207     insert_sorted_if_absent $dot_ig $build_aux
208   done
209 fi
210
211 echo "$0: Bootstrapping from checked-out $package sources..."
212
213 cleanup_gnulib() {
214   status=$?
215   rm -fr gnulib
216   exit $status
217 }
218
219 # Get gnulib files.
220
221 case ${GNULIB_SRCDIR--} in
222 -)
223   if [ ! -d gnulib ]; then
224     echo "$0: getting gnulib files..."
225
226     case ${CVS_AUTH-pserver} in
227     pserver)
228       CVS_PREFIX=':pserver:anonymous@';;
229     ssh)
230       CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
231     *)
232       echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
233       exit 1;;
234     esac
235
236     case $CVS_RSH in
237     '') CVS_RSH=ssh; export CVS_RSH;;
238     esac
239
240     trap cleanup_gnulib 1 2 13 15
241
242     cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
243       cleanup_gnulib
244
245     trap - 1 2 13 15
246   fi
247   GNULIB_SRCDIR=gnulib
248 esac
249
250 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
251 <$gnulib_tool || exit
252
253 # Get translations.
254
255 get_translations() {
256   subdir=$1
257   domain=$2
258
259   case $WGET_COMMAND in
260   '')
261     echo "$0: wget not available; skipping translations";;
262   ?*)
263     echo "$0: getting translations into $subdir for $domain..." &&
264
265     (cd $subdir && rm -f dummy `ls | sed -n '/\.po/p'` &&
266      $WGET_COMMAND -r -l1 -nd -np -A.po $TP_URL/$domain)
267     ;;
268   esac &&
269   ls "$subdir"/*.po 2>/dev/null |
270     sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS"
271 }
272
273 case $SKIP_PO in
274 '')
275   case `wget --help` in
276   *'--no-cache'*)
277     WGET_COMMAND='wget -nv --no-cache';;
278   *'--cache=on/off'*)
279     WGET_COMMAND='wget -nv --cache=off';;
280   *'--non-verbose'*)
281     WGET_COMMAND='wget -nv';;
282   *)
283     WGET_COMMAND='';;
284   esac
285
286   if test -d po; then
287     get_translations po $package || exit
288   fi
289
290   if test -d runtime-po; then
291     get_translations runtime-po $package-runtime || exit
292   fi;;
293 esac
294
295 symlink_to_dir()
296 {
297   src=$1/$2
298   dst=${3-$2}
299
300   test -f "$src" && {
301
302     # If the destination directory doesn't exist, create it.
303     # This is required at least for "lib/uniwidth/cjk.h".
304     dst_dir=`dirname "$dst"`
305     test -d "$dst_dir" || mkdir -p "$dst_dir"
306
307     if $copy; then
308       {
309         test ! -h "$dst" || {
310           echo "$0: rm -f $dst" &&
311           rm -f "$dst"
312         }
313       } &&
314       test -f "$dst" &&
315       cmp -s "$src" "$dst" || {
316         echo "$0: cp -fp $src $dst" &&
317         cp -fp "$src" "$dst"
318       }
319     else
320       test -h "$dst" &&
321       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
322       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
323       test "$src_i" = "$dst_i" || {
324         dot_dots=
325         case $src in
326         /*) ;;
327         *)
328           case /$dst/ in
329           *//* | */../* | */./* | /*/*/*/*/*/)
330              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
331              exit 1;;
332           /*/*/*/*/)    dot_dots=../../../;;
333           /*/*/*/)      dot_dots=../../;;
334           /*/*/)        dot_dots=../;;
335           esac;;
336         esac
337
338         echo "$0: ln -fs $dot_dots$src $dst" &&
339         ln -fs "$dot_dots$src" "$dst"
340       }
341     fi
342   }
343 }
344
345 cp_mark_as_generated()
346 {
347   cp_src=$1
348   cp_dst=$2
349
350   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
351     symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
352   elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
353     symlink_to_dir $local_gl_dir "$cp_dst"
354   else
355     case $cp_dst in
356       *.[ch])             c1='/* '; c2=' */';;
357       *.texi)             c1='@c '; c2=     ;;
358       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
359       *)                  c1=     ; c2=     ;;
360     esac
361
362     if test -z "$c1"; then
363       cmp -s "$cp_src" "$cp_dst" || {
364         echo "$0: cp -f $cp_src $cp_dst" &&
365         rm -f "$cp_dst" &&
366         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
367       }
368     else
369       # Copy the file first to get proper permissions if it
370       # doesn't already exist.  Then overwrite the copy.
371       cp "$cp_src" "$cp_dst-t" &&
372       (
373         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
374         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
375         sed "s!$bt_regex/!!g" "$cp_src"
376       ) > $cp_dst-t &&
377       if cmp -s "$cp_dst-t" "$cp_dst"; then
378         rm -f "$cp_dst-t"
379       else
380         echo "$0: cp $cp_src $cp_dst # with edits" &&
381         mv -f "$cp_dst-t" "$cp_dst"
382       fi
383     fi
384   fi
385 }
386
387 version_controlled_file() {
388   dir=$1
389   file=$2
390   found=no
391   if test -d CVS; then
392     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
393              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
394   elif test -d .git; then
395     git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
396   else
397     echo "$0: no version control for $dir/$file?" >&2
398   fi
399   test $found = yes
400 }
401
402 slurp() {
403   for dir in . `(cd $1 && find * -type d -print)`; do
404     copied=
405     sep=
406     for file in `ls -a $1/$dir`; do
407       case $file in
408       .|..) continue;;
409       .*) continue;; # FIXME: should all file names starting with "." be ignored?
410       esac
411       test -d $1/$dir/$file && continue
412       for excluded_file in $excluded_files; do
413         test "$dir/$file" = "$excluded_file" && continue 2
414       done
415       if test $file = Makefile.am; then
416         copied=$copied${sep}$gnulib_mk; sep=$nl
417         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
418         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
419           echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
420           rm -f $dir/$gnulib_mk &&
421           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
422         }
423       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
424            version_controlled_file $dir $file; then
425         echo "$0: $dir/$file overrides $1/$dir/$file"
426       else
427         copied=$copied$sep$file; sep=$nl
428         if test $file = gettext.m4; then
429           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
430           rm -f $dir/$file
431           sed '
432             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
433               AC_DEFUN([AM_INTL_SUBDIR], [
434             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
435               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
436             $a\
437               AC_DEFUN([gl_LOCK_EARLY], [])
438           ' $1/$dir/$file >$dir/$file
439         else
440           cp_mark_as_generated $1/$dir/$file $dir/$file
441         fi
442       fi || exit
443     done
444
445     for dot_ig in x $vc_ignore; do
446       test $dot_ig = x && continue
447       ig=$dir/$dot_ig
448       if test -n "$copied"; then
449         insert_sorted_if_absent $ig "$copied"
450         # If an ignored file name ends with _.h, then also add
451         # the name with just ".h".  Many gnulib headers are generated,
452         # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
453         # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
454         f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
455         insert_sorted_if_absent $ig "$f"
456       fi
457     done
458   done
459 }
460
461
462 # Create boot temporary directories to import from gnulib and gettext.
463 rm -fr $bt $bt2 &&
464 mkdir $bt $bt2 || exit
465
466 # Import from gnulib.
467
468 gnulib_tool_options="\
469  --import\
470  --no-changelog\
471  --aux-dir $bt/$build_aux\
472  --doc-base $bt/doc\
473  --lib $gnulib_name\
474  --m4-base $bt/m4/\
475  --source-base $bt/lib/\
476  --tests-base $bt/tests\
477  --local-dir $local_gl_dir\
478 $gnulib_tool_option_extras\
479 "
480 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
481 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
482 slurp $bt || exit
483
484 for file in $gnulib_files; do
485   symlink_to_dir "$GNULIB_SRCDIR" $file || exit
486 done
487
488
489 # Import from gettext.
490 with_gettext=yes
491 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
492     with_gettext=no
493
494 if test $with_gettext = yes; then
495   echo "$0: (cd $bt2; autopoint) ..."
496   cp configure.ac $bt2 &&
497   (cd $bt2 && autopoint && rm configure.ac) &&
498   slurp $bt2 $bt || exit
499
500   rm -fr $bt $bt2 || exit
501 fi
502
503 # Coreutils is unusual in that it generates some of its test-related
504 # Makefile.am files.  That must be done before invoking automake.
505 mam_template=tests/Makefile.am.in
506 if test -f $mam_template; then
507   PERL=perl
508   for tool in cut head join pr sort tac tail test tr uniq wc; do
509     m=tests/$tool/Makefile.am
510     t=${m}t
511     rm -f $m $t
512     sed -n '1,/^##test-files-begin/p' $mam_template > $t
513     echo "x = $tool" >> $t
514     srcdir=tests/$tool
515     $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
516     sed -n '/^##test-files-end/,$p' $mam_template >> $t
517     chmod -w $t
518     mv $t $m
519   done
520 fi
521
522 # Reconfigure, getting other files.
523
524 for command in \
525   libtool \
526   'aclocal --force -I m4' \
527   'autoconf --force' \
528   'autoheader --force' \
529   'automake --add-missing --copy --force-missing';
530 do
531   if test "$command" = libtool; then
532     grep '^[     ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
533       continue
534     command='libtoolize -c -f'
535   fi
536   echo "$0: $command ..."
537   $command || exit
538 done
539
540
541 # Get some extra files from gnulib, overriding existing files.
542 for file in $gnulib_extra_files; do
543   case $file in
544   */INSTALL) dst=INSTALL;;
545   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
546   *) dst=$file;;
547   esac
548   symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
549 done
550
551 if test $with_gettext = yes; then
552   # Create gettext configuration.
553   echo "$0: Creating po/Makevars from po/Makevars.template ..."
554   rm -f po/Makevars
555   sed '
556     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
557     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
558     /^XGETTEXT_OPTIONS *=/{
559       s/$/ \\/
560       a\
561           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
562     }
563   ' po/Makevars.template >po/Makevars
564
565   if test -d runtime-po; then
566     # Similarly for runtime-po/Makevars, but not quite the same.
567     rm -f runtime-po/Makevars
568     sed '
569       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
570       /^subdir *=.*/s/=.*/= runtime-po/
571       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
572       /^XGETTEXT_OPTIONS *=/{
573         s/$/ \\/
574         a\
575             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
576       }
577     ' <po/Makevars.template >runtime-po/Makevars
578
579     # Copy identical files from po to runtime-po.
580     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
581   fi
582 fi
583
584 echo "$0: done.  Now you can run './configure'."