Adapt to deeper hierarchy in gnulib.
[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 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 # 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 # Override the default configuration, if necessary.
133 test -r bootstrap.conf && . ./bootstrap.conf
134
135 # Translate configuration into internal form.
136
137 # Parse options.
138
139 for option
140 do
141   case $option in
142   --help)
143     usage
144     exit;;
145   --gnulib-srcdir=*)
146     GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
147   --cvs-user=*)
148     CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
149   --skip-po)
150     SKIP_PO=t;;
151   --force)
152     checkout_only_file=;;
153   --copy)
154     copy=true;;
155   *)
156     echo >&2 "$0: $option: unknown option"
157     exit 1;;
158   esac
159 done
160
161 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
162   echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
163   exit 1
164 fi
165
166 # If $STR is not already on a line by itself in $FILE, insert it,
167 # sorting the new contents of the file and replacing $FILE with the result.
168 insert_sorted_if_absent() {
169   file=$1
170   str=$2
171   echo "$str" | sort -u - $file | cmp -s - $file \
172     || echo "$str" | sort -u - $file -o $file \
173     || exit 1
174 }
175
176 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
177 found_aux_dir=no
178 grep '^[         ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
179     >/dev/null && found_aux_dir=yes
180 grep '^[         ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
181     >/dev/null && found_aux_dir=yes
182 if test $found_aux_dir = no; then
183   echo "$0: expected line not found in configure.ac. Add the following:" >&2
184   echo "  AC_CONFIG_AUX_DIR([$build_aux])" >&2
185   exit 1
186 fi
187
188 # If $build_aux doesn't exist, create it now, otherwise some bits
189 # below will malfunction.  If creating it, also mark it as ignored.
190 if test ! -d $build_aux; then
191   mkdir $build_aux
192   for ig in .cvsignore .gitignore; do
193     test -f $ig && insert_sorted_if_absent $ig $build_aux
194   done
195 fi
196
197 echo "$0: Bootstrapping from checked-out $package sources..."
198
199 cleanup_gnulib() {
200   status=$?
201   rm -fr gnulib
202   exit $status
203 }
204
205 # Get gnulib files.
206
207 case ${GNULIB_SRCDIR--} in
208 -)
209   if [ ! -d gnulib ]; then
210     echo "$0: getting gnulib files..."
211
212     case ${CVS_AUTH-pserver} in
213     pserver)
214       CVS_PREFIX=':pserver:anonymous@';;
215     ssh)
216       CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
217     *)
218       echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
219       exit 1;;
220     esac
221
222     case $CVS_RSH in
223     '') CVS_RSH=ssh; export CVS_RSH;;
224     esac
225
226     trap cleanup_gnulib 1 2 13 15
227
228     cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
229       cleanup_gnulib
230
231     trap - 1 2 13 15
232   fi
233   GNULIB_SRCDIR=gnulib
234 esac
235
236 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
237 <$gnulib_tool || exit
238
239 # Get translations.
240
241 get_translations() {
242   subdir=$1
243   domain=$2
244
245   case $WGET_COMMAND in
246   '')
247     echo "$0: wget not available; skipping translations";;
248   ?*)
249     echo "$0: getting translations into $subdir for $domain..." &&
250
251     (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'` &&
252      $WGET_COMMAND -r -l1 -nd -np -A.po $TP_URL/$domain)
253     ;;
254   esac &&
255   ls "$subdir"/*.po 2>/dev/null |
256     sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS"
257 }
258
259 case $SKIP_PO in
260 '')
261   case `wget --help` in
262   *'--no-cache'*)
263     WGET_COMMAND='wget -nv --no-cache';;
264   *'--cache=on/off'*)
265     WGET_COMMAND='wget -nv --cache=off';;
266   *'--non-verbose'*)
267     WGET_COMMAND='wget -nv';;
268   *)
269     WGET_COMMAND='';;
270   esac
271
272   if test -d po; then
273     get_translations po $package || exit
274   fi
275
276   if test -d runtime-po; then
277     get_translations runtime-po $package-runtime || exit
278   fi;;
279 esac
280
281 symlink_to_gnulib()
282 {
283   src=$GNULIB_SRCDIR/$1
284   dst=${2-$1}
285
286   test -f "$src" && {
287
288     # If the destination directory doesn't exist, create it.
289     # This is required at least for "lib/uniwidth/cjk.h".
290     dst_dir=`dirname "$dst"`
291     test -d "$dst_dir" || mkdir -p "$dst_dir"
292
293     if $copy; then
294       {
295         test ! -h "$dst" || {
296           echo "$0: rm -f $dst" &&
297           rm -f "$dst"
298         }
299       } &&
300       test -f "$dst" &&
301       cmp -s "$src" "$dst" || {
302         echo "$0: cp -fp $src $dst" &&
303         cp -fp "$src" "$dst"
304       }
305     else
306       test -h "$dst" &&
307       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
308       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
309       test "$src_i" = "$dst_i" || {
310         dot_dots=
311         case $src in
312         /*) ;;
313         *)
314           case /$dst/ in
315           *//* | */../* | */./* | /*/*/*/*/*/)
316              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
317              exit 1;;
318           /*/*/*/*/)    dot_dots=../../../;;
319           /*/*/*/)      dot_dots=../../;;
320           /*/*/)        dot_dots=../;;
321           esac;;
322         esac
323
324         echo "$0: ln -fs $dot_dots$src $dst" &&
325         ln -fs "$dot_dots$src" "$dst"
326       }
327     fi
328   }
329 }
330
331 cp_mark_as_generated()
332 {
333   cp_src=$1
334   cp_dst=$2
335
336   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
337     symlink_to_gnulib "$cp_dst"
338   else
339     case $cp_dst in
340       *.[ch])             c1='/* '; c2=' */';;
341       *.texi)             c1='@c '; c2=     ;;
342       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
343       *)                  c1=     ; c2=     ;;
344     esac
345
346     if test -z "$c1"; then
347       cmp -s "$cp_src" "$cp_dst" || {
348         echo "$0: cp -f $cp_src $cp_dst" &&
349         rm -f "$cp_dst" &&
350         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
351       }
352     else
353       # Copy the file first to get proper permissions if it
354       # doesn't already exist.  Then overwrite the copy.
355       cp "$cp_src" "$cp_dst-t" &&
356       (
357         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
358         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
359         sed "s!$bt_regex/!!g" "$cp_src"
360       ) > $cp_dst-t &&
361       if cmp -s "$cp_dst-t" "$cp_dst"; then
362         rm -f "$cp_dst-t"
363       else
364         echo "$0: cp $cp_src $cp_dst # with edits" &&
365         mv -f "$cp_dst-t" "$cp_dst"
366       fi
367     fi
368   fi
369 }
370
371 version_controlled_file() {
372   dir=$1
373   file=$2
374   found=no
375   if test -d CVS; then
376     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
377              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
378   elif test -d .git; then
379     git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
380   else
381     echo "$0: no version control for $dir/$file?" >&2
382   fi
383   test $found = yes
384 }
385
386 slurp() {
387   for dir in . `(cd $1 && find * -type d -print)`; do
388     copied=
389     sep=
390     for file in `ls $1/$dir`; do
391       test -d $1/$dir/$file && continue
392       for excluded_file in $excluded_files; do
393         test "$dir/$file" = "$excluded_file" && continue 2
394       done
395       if test $file = Makefile.am; then
396         copied=$copied${sep}$gnulib_mk; sep=$nl
397         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
398         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
399           echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
400           rm -f $dir/$gnulib_mk &&
401           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
402         }
403       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
404            version_controlled_file $dir $file; then
405         echo "$0: $dir/$file overrides $1/$dir/$file"
406       else
407         copied=$copied$sep$file; sep=$nl
408         if test $file = gettext.m4; then
409           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
410           rm -f $dir/$file
411           sed '
412             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
413               AC_DEFUN([AM_INTL_SUBDIR], [
414             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
415               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
416             $a\
417               AC_DEFUN([gl_LOCK_EARLY], [])
418           ' $1/$dir/$file >$dir/$file
419         else
420           cp_mark_as_generated $1/$dir/$file $dir/$file
421         fi
422       fi || exit
423     done
424
425     for dot_ig in .cvsignore .gitignore; do
426       ig=$dir/$dot_ig
427       if test -n "$copied" && test -f $ig; then
428         insert_sorted_if_absent $ig "$copied"
429         # If an ignored file name ends with _.h, then also add
430         # the name with just ".h".  Many gnulib headers are generated,
431         # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
432         f=`echo "$copied"|sed 's/_\.h$/.h/'`
433         insert_sorted_if_absent $ig "$f"
434       fi
435     done
436   done
437 }
438
439
440 # Create boot temporary directories to import from gnulib and gettext.
441 rm -fr $bt $bt2 &&
442 mkdir $bt $bt2 || exit
443
444 # Import from gnulib.
445
446 gnulib_tool_options="\
447  --import\
448  --no-changelog\
449  --aux-dir $bt/$build_aux\
450  --doc-base $bt/doc\
451  --lib $gnulib_name\
452  --m4-base $bt/m4/\
453  --source-base $bt/lib/\
454  --tests-base $bt/tests\
455  --local-dir gl\
456 $gnulib_tool_option_extras\
457 "
458 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
459 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
460 slurp $bt || exit
461
462 for file in $gnulib_files; do
463   symlink_to_gnulib $file || exit
464 done
465
466
467 # Import from gettext.
468 with_gettext=yes
469 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
470     with_gettext=no
471
472 if test $with_gettext = yes; then
473   echo "$0: (cd $bt2; autopoint) ..."
474   cp configure.ac $bt2 &&
475   (cd $bt2 && autopoint && rm configure.ac) &&
476   slurp $bt2 $bt || exit
477
478   rm -fr $bt $bt2 || exit
479 fi
480
481 # Coreutils is unusual in that it generates some of its test-related
482 # Makefile.am files.  That must be done before invoking automake.
483 PERL=perl
484 for tool in cut head join pr sort tac tail test tr uniq wc; do
485   m=tests/$tool/Makefile.am
486   t=${m}t
487   mam_template=tests/Makefile.am.in
488   rm -f $m $t
489   sed -n '1,/^##test-files-begin/p' $mam_template > $t
490   echo "x = $tool" >> $t
491   srcdir=tests/$tool
492   $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
493   sed -n '/^##test-files-end/,$p' $mam_template >> $t
494   chmod -w $t
495   mv $t $m
496 done
497
498 # Reconfigure, getting other files.
499
500 for command in \
501   libtool \
502   'aclocal --force -I m4' \
503   'autoconf --force' \
504   'autoheader --force' \
505   'automake --add-missing --copy --force-missing';
506 do
507   if test "$command" = libtool; then
508     grep '^[     ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
509       continue
510     command='libtoolize -c -f'
511   fi
512   echo "$0: $command ..."
513   $command || exit
514 done
515
516
517 # Get some extra files from gnulib, overriding existing files.
518 for file in $gnulib_extra_files; do
519   case $file in
520   */INSTALL) dst=INSTALL;;
521   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
522   *) dst=$file;;
523   esac
524   symlink_to_gnulib $file $dst || exit
525 done
526
527 if test $with_gettext = yes; then
528   # Create gettext configuration.
529   echo "$0: Creating po/Makevars from po/Makevars.template ..."
530   rm -f po/Makevars
531   sed '
532     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
533     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
534     /^XGETTEXT_OPTIONS *=/{
535       s/$/ \\/
536       a\
537           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
538     }
539   ' po/Makevars.template >po/Makevars
540
541   if test -d runtime-po; then
542     # Similarly for runtime-po/Makevars, but not quite the same.
543     rm -f runtime-po/Makevars
544     sed '
545       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
546       /^subdir *=.*/s/=.*/= runtime-po/
547       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
548       /^XGETTEXT_OPTIONS *=/{
549         s/$/ \\/
550         a\
551             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
552       }
553     ' <po/Makevars.template >runtime-po/Makevars
554
555     # Copy identical files from po to runtime-po.
556     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
557   fi
558 fi
559
560 echo "$0: done.  Now you can run './configure'."