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