bootstrap: Ignore more.
[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     if ! test -d "$dst_dir"; then
306       mkdir -p "$dst_dir"
307
308       # If we've just created a directory like lib/uniwidth,
309       # tell version control system(s) it's ignorable.
310       # FIXME: for now, this does only one level
311       parent=`dirname "$dst_dir"`
312       for dot_ig in x $vc_ignore; do
313         test $dot_ig = x && continue
314         ig=$parent/$dot_ig
315         insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
316       done
317     fi
318
319     if $copy; then
320       {
321         test ! -h "$dst" || {
322           echo "$0: rm -f $dst" &&
323           rm -f "$dst"
324         }
325       } &&
326       test -f "$dst" &&
327       cmp -s "$src" "$dst" || {
328         echo "$0: cp -fp $src $dst" &&
329         cp -fp "$src" "$dst"
330       }
331     else
332       test -h "$dst" &&
333       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
334       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
335       test "$src_i" = "$dst_i" || {
336         dot_dots=
337         case $src in
338         /*) ;;
339         *)
340           case /$dst/ in
341           *//* | */../* | */./* | /*/*/*/*/*/)
342              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
343              exit 1;;
344           /*/*/*/*/)    dot_dots=../../../;;
345           /*/*/*/)      dot_dots=../../;;
346           /*/*/)        dot_dots=../;;
347           esac;;
348         esac
349
350         echo "$0: ln -fs $dot_dots$src $dst" &&
351         ln -fs "$dot_dots$src" "$dst"
352       }
353     fi
354   }
355 }
356
357 cp_mark_as_generated()
358 {
359   cp_src=$1
360   cp_dst=$2
361
362   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
363     symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
364   elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
365     symlink_to_dir $local_gl_dir "$cp_dst"
366   else
367     case $cp_dst in
368       *.[ch])             c1='/* '; c2=' */';;
369       *.texi)             c1='@c '; c2=     ;;
370       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
371       *)                  c1=     ; c2=     ;;
372     esac
373
374     if test -z "$c1"; then
375       cmp -s "$cp_src" "$cp_dst" || {
376         echo "$0: cp -f $cp_src $cp_dst" &&
377         rm -f "$cp_dst" &&
378         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
379       }
380     else
381       # Copy the file first to get proper permissions if it
382       # doesn't already exist.  Then overwrite the copy.
383       cp "$cp_src" "$cp_dst-t" &&
384       (
385         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
386         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
387         sed "s!$bt_regex/!!g" "$cp_src"
388       ) > $cp_dst-t &&
389       if cmp -s "$cp_dst-t" "$cp_dst"; then
390         rm -f "$cp_dst-t"
391       else
392         echo "$0: cp $cp_src $cp_dst # with edits" &&
393         mv -f "$cp_dst-t" "$cp_dst"
394       fi
395     fi
396   fi
397 }
398
399 version_controlled_file() {
400   dir=$1
401   file=$2
402   found=no
403   if test -d CVS; then
404     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
405              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
406   elif test -d .git; then
407     git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
408   else
409     echo "$0: no version control for $dir/$file?" >&2
410   fi
411   test $found = yes
412 }
413
414 slurp() {
415   for dir in . `(cd $1 && find * -type d -print)`; do
416     copied=
417     sep=
418     for file in `ls -a $1/$dir`; do
419       case $file in
420       .|..) continue;;
421       .*) continue;; # FIXME: should all file names starting with "." be ignored?
422       esac
423       test -d $1/$dir/$file && continue
424       for excluded_file in $excluded_files; do
425         test "$dir/$file" = "$excluded_file" && continue 2
426       done
427       if test $file = Makefile.am; then
428         copied=$copied${sep}$gnulib_mk; sep=$nl
429         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
430         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
431           echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
432           rm -f $dir/$gnulib_mk &&
433           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
434         }
435       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
436            version_controlled_file $dir $file; then
437         echo "$0: $dir/$file overrides $1/$dir/$file"
438       else
439         copied=$copied$sep$file; sep=$nl
440         if test $file = gettext.m4; then
441           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
442           rm -f $dir/$file
443           sed '
444             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
445               AC_DEFUN([AM_INTL_SUBDIR], [
446             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
447               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
448             $a\
449               AC_DEFUN([gl_LOCK_EARLY], [])
450           ' $1/$dir/$file >$dir/$file
451         else
452           cp_mark_as_generated $1/$dir/$file $dir/$file
453         fi
454       fi || exit
455     done
456
457     for dot_ig in x $vc_ignore; do
458       test $dot_ig = x && continue
459       ig=$dir/$dot_ig
460       if test -n "$copied"; then
461         insert_sorted_if_absent $ig "$copied"
462         # If an ignored file name ends with _.h, then also add
463         # the name with just ".h".  Many gnulib headers are generated,
464         # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
465         # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
466         f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
467         insert_sorted_if_absent $ig "$f"
468
469         # For files like sys_stat_.h and sys_time_.h, record as
470         # ignorable the directory we might eventually create: sys/.
471         f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
472         insert_sorted_if_absent $ig "$f"
473       fi
474     done
475   done
476 }
477
478
479 # Create boot temporary directories to import from gnulib and gettext.
480 rm -fr $bt $bt2 &&
481 mkdir $bt $bt2 || exit
482
483 # Import from gnulib.
484
485 gnulib_tool_options="\
486  --import\
487  --no-changelog\
488  --aux-dir $bt/$build_aux\
489  --doc-base $bt/doc\
490  --lib $gnulib_name\
491  --m4-base $bt/m4/\
492  --source-base $bt/lib/\
493  --tests-base $bt/tests\
494  --local-dir $local_gl_dir\
495 $gnulib_tool_option_extras\
496 "
497 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
498 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
499 slurp $bt || exit
500
501 for file in $gnulib_files; do
502   symlink_to_dir "$GNULIB_SRCDIR" $file || exit
503 done
504
505
506 # Import from gettext.
507 with_gettext=yes
508 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
509     with_gettext=no
510
511 if test $with_gettext = yes; then
512   echo "$0: (cd $bt2; autopoint) ..."
513   cp configure.ac $bt2 &&
514   (cd $bt2 && autopoint && rm configure.ac) &&
515   slurp $bt2 $bt || exit
516
517   rm -fr $bt $bt2 || exit
518 fi
519
520 # Coreutils is unusual in that it generates some of its test-related
521 # Makefile.am files.  That must be done before invoking automake.
522 mam_template=tests/Makefile.am.in
523 if test -f $mam_template; then
524   PERL=perl
525   for tool in cut head join pr sort tac tail test tr uniq wc; do
526     m=tests/$tool/Makefile.am
527     t=${m}t
528     rm -f $m $t
529     sed -n '1,/^##test-files-begin/p' $mam_template > $t
530     echo "x = $tool" >> $t
531     srcdir=tests/$tool
532     $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
533     sed -n '/^##test-files-end/,$p' $mam_template >> $t
534     chmod -w $t
535     mv $t $m
536   done
537 fi
538
539 # Reconfigure, getting other files.
540
541 for command in \
542   libtool \
543   'aclocal --force -I m4' \
544   'autoconf --force' \
545   'autoheader --force' \
546   'automake --add-missing --copy --force-missing';
547 do
548   if test "$command" = libtool; then
549     grep '^[     ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
550       continue
551     command='libtoolize -c -f'
552   fi
553   echo "$0: $command ..."
554   $command || exit
555 done
556
557
558 # Get some extra files from gnulib, overriding existing files.
559 for file in $gnulib_extra_files; do
560   case $file in
561   */INSTALL) dst=INSTALL;;
562   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
563   *) dst=$file;;
564   esac
565   symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
566 done
567
568 if test $with_gettext = yes; then
569   # Create gettext configuration.
570   echo "$0: Creating po/Makevars from po/Makevars.template ..."
571   rm -f po/Makevars
572   sed '
573     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
574     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
575     /^XGETTEXT_OPTIONS *=/{
576       s/$/ \\/
577       a\
578           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
579     }
580   ' po/Makevars.template >po/Makevars
581
582   if test -d runtime-po; then
583     # Similarly for runtime-po/Makevars, but not quite the same.
584     rm -f runtime-po/Makevars
585     sed '
586       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
587       /^subdir *=.*/s/=.*/= runtime-po/
588       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
589       /^XGETTEXT_OPTIONS *=/{
590         s/$/ \\/
591         a\
592             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
593       }
594     ' <po/Makevars.template >runtime-po/Makevars
595
596     # Copy identical files from po to runtime-po.
597     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
598   fi
599 fi
600
601 echo "$0: done.  Now you can run './configure'."