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