bootstrap: handle perl-5.11's changed --version output
[gnulib.git] / build-aux / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from checked-out sources.
4
5 # Copyright (C) 2003-2009 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 LC_ALL=C
27 export LC_ALL
28
29 local_gl_dir=gl
30
31 # Temporary directory names.
32 bt='._bootmp'
33 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
34 bt2=${bt}2
35
36 usage() {
37   cat <<EOF
38 Usage: $0 [OPTION]...
39 Bootstrap this package from the checked-out sources.
40
41 Options:
42  --gnulib-srcdir=DIRNAME  Specify the local directory where gnulib
43                           sources reside.  Use this if you already
44                           have gnulib sources on your machine, and
45                           do not want to waste your bandwidth downloading
46                           them again.
47  --copy                   Copy files instead of creating symbolic links.
48  --force                  Attempt to bootstrap even if the sources seem
49                           not to have been checked out.
50  --skip-po                Do not download po files.
51
52 If the file $0.conf exists in the same directory as this script, its
53 contents are read as shell variables to configure the bootstrap.
54
55 For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
56 are honored.
57
58 Running without arguments will suffice in most cases.
59 EOF
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 # A function to be called after everything else in this script.
74 # Override it via your own definition in bootstrap.conf.
75 bootstrap_epilogue() { :; }
76
77 # The command to download all .po files for a specified domain into
78 # a specified directory.  Fill in the first %s is the domain name, and
79 # the second with the destination directory.  Use rsync's -L and -r
80 # options because the latest/%s directory and the .po files within are
81 # all symlinks.
82 po_download_command_format=\
83 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
84
85 extract_package_name='
86   /^AC_INIT(/{
87      /.*,.*,.*, */{
88        s///
89        s/[][]//g
90        s/)$//
91        p
92        q
93      }
94      s/AC_INIT(\[*//
95      s/]*,.*//
96      s/^GNU //
97      y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
98      s/[^A-Za-z0-9_]/-/g
99      p
100   }
101 '
102 package=`sed -n "$extract_package_name" configure.ac` || exit
103 gnulib_name=lib$package
104
105 build_aux=build-aux
106 source_base=lib
107 m4_base=m4
108 doc_base=doc
109 tests_base=tests
110
111 # Extra files from gnulib, which override files from other sources.
112 gnulib_extra_files="
113         $build_aux/install-sh
114         $build_aux/missing
115         $build_aux/mdate-sh
116         $build_aux/texinfo.tex
117         $build_aux/depcomp
118         $build_aux/config.guess
119         $build_aux/config.sub
120         doc/INSTALL
121 "
122
123 # Additional gnulib-tool options to use.  Use "\newline" to break lines.
124 gnulib_tool_option_extras=
125
126 # Other locale categories that need message catalogs.
127 EXTRA_LOCALE_CATEGORIES=
128
129 # Additional xgettext options to use.  Use "\\\newline" to break lines.
130 XGETTEXT_OPTIONS='\\\
131  --flag=_:1:pass-c-format\\\
132  --flag=N_:1:pass-c-format\\\
133  --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
134 '
135
136 # Package bug report address for gettext files
137 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
138
139 # Files we don't want to import.
140 excluded_files=
141
142 # File that should exist in the top directory of a checked out hierarchy,
143 # but not in a distribution tarball.
144 checkout_only_file=README-hacking
145
146 # Whether to use copies instead of symlinks.
147 copy=false
148
149 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
150 # those files to be generated in directories like lib/, m4/, and po/.
151 # Or set it to 'auto' to make this script select which to use based
152 # on which version control system (if any) is used in the source directory.
153 vc_ignore=auto
154
155 # find_tool ENVVAR NAMES...
156 # -------------------------
157 # Search for a required program.  Use the value of ENVVAR, if set,
158 # otherwise find the first of the NAMES that can be run (i.e.,
159 # supports --version).  If found, set ENVVAR to the program name,
160 # die otherwise.
161 find_tool ()
162 {
163   # Find sha1sum, named gsha1sum on MacPorts.
164   find_tool_envvar=$1
165   shift
166   find_tool_names=$@
167   eval "find_tool_res=\$$find_tool_envvar"
168   if test x"$find_tool_res" = x; then
169     for i
170     do
171       if ($i --version </dev/null) >/dev/null 2>&1; then
172        find_tool_res=$i
173        break
174       fi
175     done
176   else
177     find_tool_error_prefix="\$$find_tool_envvar: "
178   fi
179   if test x"$find_tool_res" = x; then
180     echo >&2 "$0: one of these is required: $find_tool_names"
181     exit 1
182   fi
183   ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
184     echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
185     exit 1
186   }
187   eval "$find_tool_envvar=\$find_tool_res"
188   eval "export $find_tool_envvar"
189 }
190
191 # Find sha1sum, named gsha1sum on MacPorts.
192 find_tool SHA1SUM sha1sum gsha1sum
193
194 # Override the default configuration, if necessary.
195 # Make sure that bootstrap.conf is sourced from the current directory
196 # if we were invoked as "sh bootstrap".
197 case "$0" in
198   */*) test -r "$0.conf" && . "$0.conf" ;;
199   *) test -r "$0.conf" && . ./"$0.conf" ;;
200 esac
201
202
203 if test "$vc_ignore" = auto; then
204   vc_ignore=
205   test -d .git && vc_ignore=.gitignore
206   test -d CVS && vc_ignore="$vc_ignore .cvsignore"
207 fi
208
209 # Translate configuration into internal form.
210
211 # Parse options.
212
213 for option
214 do
215   case $option in
216   --help)
217     usage
218     exit;;
219   --gnulib-srcdir=*)
220     GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
221   --skip-po)
222     SKIP_PO=t;;
223   --force)
224     checkout_only_file=;;
225   --copy)
226     copy=true;;
227   *)
228     echo >&2 "$0: $option: unknown option"
229     exit 1;;
230   esac
231 done
232
233 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
234   echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
235   exit 1
236 fi
237
238 # If $STR is not already on a line by itself in $FILE, insert it,
239 # sorting the new contents of the file and replacing $FILE with the result.
240 insert_sorted_if_absent() {
241   file=$1
242   str=$2
243   test -f $file || touch $file
244   echo "$str" | sort -u - $file | cmp - $file > /dev/null \
245     || echo "$str" | sort -u - $file -o $file \
246     || exit 1
247 }
248
249 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
250 found_aux_dir=no
251 grep '^[         ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
252     >/dev/null && found_aux_dir=yes
253 grep '^[         ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
254     >/dev/null && found_aux_dir=yes
255 if test $found_aux_dir = no; then
256   echo "$0: expected line not found in configure.ac. Add the following:" >&2
257   echo "  AC_CONFIG_AUX_DIR([$build_aux])" >&2
258   exit 1
259 fi
260
261 # If $build_aux doesn't exist, create it now, otherwise some bits
262 # below will malfunction.  If creating it, also mark it as ignored.
263 if test ! -d $build_aux; then
264   mkdir $build_aux
265   for dot_ig in x $vc_ignore; do
266     test $dot_ig = x && continue
267     insert_sorted_if_absent $dot_ig $build_aux
268   done
269 fi
270
271 # Note this deviates from the version comparison in automake
272 # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
273 # but this should suffice as we won't be specifying old
274 # version formats or redundant trailing .0 in bootstrap.conf.
275 # If we did want full compatibility then we should probably
276 # use m4_version_compare from autoconf.
277 sort_ver() { # sort -V is not generally available
278   ver1="$1"
279   ver2="$2"
280
281   # split on '.' and compare each component
282   i=1
283   while : ; do
284     p1=$(echo "$ver1" | cut -d. -f$i)
285     p2=$(echo "$ver2" | cut -d. -f$i)
286     if [ ! "$p1" ]; then
287       echo "$1 $2"
288       break
289     elif [ ! "$p2" ]; then
290       echo "$2 $1"
291       break
292     elif [ ! "$p1" = "$p2" ]; then
293       if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
294         echo "$2 $1"
295       elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
296         echo "$1 $2"
297       else # numeric, then lexicographic comparison
298         lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
299         if [ "$lp" = "$p2" ]; then
300           echo "$1 $2"
301         else
302           echo "$2 $1"
303         fi
304       fi
305       break
306     fi
307     i=$(($i+1))
308   done
309 }
310
311 get_version() {
312   app=$1
313
314   # perl 5.11's --version output does not fit the mold,
315   # handle perl as a special case.
316   if test "_$app" = _perl; then
317       perl -le 'print $]' || return 1
318       return 0
319   fi
320
321   $app --version >/dev/null 2>&1 || return 1
322
323   $app --version 2>&1 |
324   sed -n 's/[^0-9.]*\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/p
325           t done
326           d
327           :done
328           q'
329 }
330
331 check_versions() {
332   ret=0
333
334   while read app req_ver; do
335     # Honor $APP variables ($TAR, $AUTOCONF, etc.)
336     appvar=`echo $app | tr '[a-z]' '[A-Z]'`
337     test "$appvar" = TAR && appvar=AMTAR
338     eval "app=\${$appvar-$app}"
339     inst_ver=$(get_version $app)
340     if [ ! "$inst_ver" ]; then
341       echo "Error: '$app' not found" >&2
342       ret=1
343     elif [ ! "$req_ver" = "-" ]; then
344       latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
345       if [ ! "$latest_ver" = "$inst_ver" ]; then
346         echo "Error: '$app' version == $inst_ver is too old" >&2
347         echo "       '$app' version >= $req_ver is required" >&2
348         ret=1
349       fi
350     fi
351   done
352
353   return $ret
354 }
355
356 print_versions() {
357   echo "Program    Min_version"
358   echo "----------------------"
359   printf "$buildreq"
360   echo "----------------------"
361   # can't depend on column -t
362 }
363
364 if ! printf "$buildreq" | check_versions; then
365   test -f README-prereq &&
366   echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
367   echo
368   print_versions
369   exit 1
370 fi
371
372 echo "$0: Bootstrapping from checked-out $package sources..."
373
374 # See if we can use gnulib's git-merge-changelog merge driver.
375 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
376   if git config merge.merge-changelog.driver >/dev/null ; then
377     :
378   elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
379     echo "initializing git-merge-changelog driver"
380     git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
381     git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
382   else
383     echo "consider installing git-merge-changelog from gnulib"
384   fi
385 fi
386
387
388 cleanup_gnulib() {
389   status=$?
390   rm -fr gnulib
391   exit $status
392 }
393
394 git_modules_config () {
395   test -f .gitmodules && git config --file .gitmodules "$@"
396 }
397
398 # Get gnulib files.
399
400 case ${GNULIB_SRCDIR--} in
401 -)
402   if git_modules_config submodule.gnulib.url >/dev/null; then
403     echo "$0: getting gnulib files..."
404     git submodule init || exit $?
405     git submodule update || exit $?
406
407   elif [ ! -d gnulib ]; then
408     echo "$0: getting gnulib files..."
409
410     trap cleanup_gnulib 1 2 13 15
411
412     git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
413     git clone $shallow git://git.sv.gnu.org/gnulib ||
414       cleanup_gnulib
415
416     trap - 1 2 13 15
417   fi
418   GNULIB_SRCDIR=gnulib
419   ;;
420 *)
421   # Redirect the gnulib submodule to the directory on the command line
422   # if possible.
423   if test -d "$GNULIB_SRCDIR"/.git && \
424         git_modules_config submodule.gnulib.url >/dev/null; then
425     git submodule init
426     GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
427     git_modules_config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
428     echo "$0: getting gnulib files..."
429     git submodule update || exit $?
430     GNULIB_SRCDIR=gnulib
431   fi
432   ;;
433 esac
434
435 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
436 <$gnulib_tool || exit
437
438 # Get translations.
439
440 download_po_files() {
441   subdir=$1
442   domain=$2
443   echo "$0: getting translations into $subdir for $domain..."
444   cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
445   eval "$cmd"
446 }
447
448 # Download .po files to $po_dir/.reference and copy only the new
449 # or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
450 update_po_files() {
451   # Directory containing primary .po files.
452   # Overwrite them only when we're sure a .po file is new.
453   po_dir=$1
454   domain=$2
455
456   # Download *.po files into this dir.
457   # Usually contains *.s1 checksum files.
458   ref_po_dir="$po_dir/.reference"
459
460   test -d $ref_po_dir || mkdir $ref_po_dir || return
461   download_po_files $ref_po_dir $domain \
462     && ls "$ref_po_dir"/*.po 2>/dev/null |
463       sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
464
465   langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
466   test "$langs" = '*' && langs=x
467   for po in $langs; do
468     case $po in x) continue;; esac
469     new_po="$ref_po_dir/$po.po"
470     cksum_file="$ref_po_dir/$po.s1"
471     if ! test -f "$cksum_file" ||
472         ! test -f "$po_dir/$po.po" ||
473         ! $SHA1SUM -c --status "$cksum_file" \
474             < "$new_po" > /dev/null; then
475       echo "updated $po_dir/$po.po..."
476       cp "$new_po" "$po_dir/$po.po" \
477           && $SHA1SUM < "$new_po" > "$cksum_file"
478     fi
479   done
480 }
481
482 case $SKIP_PO in
483 '')
484   if test -d po; then
485     update_po_files po $package || exit
486   fi
487
488   if test -d runtime-po; then
489     update_po_files runtime-po $package-runtime || exit
490   fi;;
491 esac
492
493 symlink_to_dir()
494 {
495   src=$1/$2
496   dst=${3-$2}
497
498   test -f "$src" && {
499
500     # If the destination directory doesn't exist, create it.
501     # This is required at least for "lib/uniwidth/cjk.h".
502     dst_dir=`dirname "$dst"`
503     if ! test -d "$dst_dir"; then
504       mkdir -p "$dst_dir"
505
506       # If we've just created a directory like lib/uniwidth,
507       # tell version control system(s) it's ignorable.
508       # FIXME: for now, this does only one level
509       parent=`dirname "$dst_dir"`
510       for dot_ig in x $vc_ignore; do
511         test $dot_ig = x && continue
512         ig=$parent/$dot_ig
513         insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
514       done
515     fi
516
517     if $copy; then
518       {
519         test ! -h "$dst" || {
520           echo "$0: rm -f $dst" &&
521           rm -f "$dst"
522         }
523       } &&
524       test -f "$dst" &&
525       cmp -s "$src" "$dst" || {
526         echo "$0: cp -fp $src $dst" &&
527         cp -fp "$src" "$dst"
528       }
529     else
530       test -h "$dst" &&
531       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
532       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
533       test "$src_i" = "$dst_i" || {
534         dot_dots=
535         case $src in
536         /*) ;;
537         *)
538           case /$dst/ in
539           *//* | */../* | */./* | /*/*/*/*/*/)
540              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
541              exit 1;;
542           /*/*/*/*/)    dot_dots=../../../;;
543           /*/*/*/)      dot_dots=../../;;
544           /*/*/)        dot_dots=../;;
545           esac;;
546         esac
547
548         echo "$0: ln -fs $dot_dots$src $dst" &&
549         ln -fs "$dot_dots$src" "$dst"
550       }
551     fi
552   }
553 }
554
555 cp_mark_as_generated()
556 {
557   cp_src=$1
558   cp_dst=$2
559
560   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
561     symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
562   elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
563     symlink_to_dir $local_gl_dir "$cp_dst"
564   else
565     case $cp_dst in
566       *.[ch])             c1='/* '; c2=' */';;
567       *.texi)             c1='@c '; c2=     ;;
568       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
569       *)                  c1=     ; c2=     ;;
570     esac
571
572     # If the destination directory doesn't exist, create it.
573     # This is required at least for "lib/uniwidth/cjk.h".
574     dst_dir=`dirname "$cp_dst"`
575     test -d "$dst_dir" || mkdir -p "$dst_dir"
576
577     if test -z "$c1"; then
578       cmp -s "$cp_src" "$cp_dst" || {
579         # Copy the file first to get proper permissions if it
580         # doesn't already exist.  Then overwrite the copy.
581         echo "$0: cp -f $cp_src $cp_dst" &&
582         rm -f "$cp_dst" &&
583         cp "$cp_src" "$cp_dst-t" &&
584         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
585         mv -f "$cp_dst-t" "$cp_dst"
586       }
587     else
588       # Copy the file first to get proper permissions if it
589       # doesn't already exist.  Then overwrite the copy.
590       cp "$cp_src" "$cp_dst-t" &&
591       (
592         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
593         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
594         sed "s!$bt_regex/!!g" "$cp_src"
595       ) > $cp_dst-t &&
596       if cmp -s "$cp_dst-t" "$cp_dst"; then
597         rm -f "$cp_dst-t"
598       else
599         echo "$0: cp $cp_src $cp_dst # with edits" &&
600         mv -f "$cp_dst-t" "$cp_dst"
601       fi
602     fi
603   fi
604 }
605
606 version_controlled_file() {
607   dir=$1
608   file=$2
609   found=no
610   if test -d CVS; then
611     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
612              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
613   elif test -d .git; then
614     git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
615   elif test -d .svn; then
616     svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
617   else
618     echo "$0: no version control for $dir/$file?" >&2
619   fi
620   test $found = yes
621 }
622
623 slurp() {
624   for dir in . `(cd $1 && find * -type d -print)`; do
625     copied=
626     sep=
627     for file in `ls -a $1/$dir`; do
628       case $file in
629       .|..) continue;;
630       .*) continue;; # FIXME: should all file names starting with "." be ignored?
631       esac
632       test -d $1/$dir/$file && continue
633       for excluded_file in $excluded_files; do
634         test "$dir/$file" = "$excluded_file" && continue 2
635       done
636       if test $file = Makefile.am; then
637         copied=$copied${sep}$gnulib_mk; sep=$nl
638         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
639         sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
640           echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
641           rm -f $dir/$gnulib_mk &&
642           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
643         }
644       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
645            version_controlled_file $dir $file; then
646         echo "$0: $dir/$file overrides $1/$dir/$file"
647       else
648         copied=$copied$sep$file; sep=$nl
649         if test $file = gettext.m4; then
650           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
651           rm -f $dir/$file
652           sed '
653             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
654               AC_DEFUN([AM_INTL_SUBDIR], [
655             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
656               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
657             $a\
658               AC_DEFUN([gl_LOCK_EARLY], [])
659           ' $1/$dir/$file >$dir/$file
660         else
661           cp_mark_as_generated $1/$dir/$file $dir/$file
662         fi
663       fi || exit
664     done
665
666     for dot_ig in x $vc_ignore; do
667       test $dot_ig = x && continue
668       ig=$dir/$dot_ig
669       if test -n "$copied"; then
670         insert_sorted_if_absent $ig "$copied"
671         # If an ignored file name ends with .in.h, then also add
672         # the name with just ".h".  Many gnulib headers are generated,
673         # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
674         # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
675         f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
676         insert_sorted_if_absent $ig "$f"
677
678         # For files like sys_stat.in.h and sys_time.in.h, record as
679         # ignorable the directory we might eventually create: sys/.
680         f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
681         insert_sorted_if_absent $ig "$f"
682       fi
683     done
684   done
685 }
686
687
688 # Create boot temporary directories to import from gnulib and gettext.
689 rm -fr $bt $bt2 &&
690 mkdir $bt $bt2 || exit
691
692 # Import from gnulib.
693
694 gnulib_tool_options="\
695  --import\
696  --no-changelog\
697  --aux-dir $bt/$build_aux\
698  --doc-base $bt/$doc_base\
699  --lib $gnulib_name\
700  --m4-base $bt/$m4_base/\
701  --source-base $bt/$source_base/\
702  --tests-base $bt/$tests_base\
703  --local-dir $local_gl_dir\
704  $gnulib_tool_option_extras\
705 "
706 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
707 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
708 slurp $bt || exit
709
710 for file in $gnulib_files; do
711   symlink_to_dir "$GNULIB_SRCDIR" $file || exit
712 done
713
714
715 # Import from gettext.
716 with_gettext=yes
717 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
718     with_gettext=no
719
720 if test $with_gettext = yes; then
721   echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
722   cp configure.ac $bt2 &&
723   (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
724   slurp $bt2 $bt || exit
725 fi
726 rm -fr $bt $bt2 || exit
727
728 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
729 # gnulib-populated directories.  Such .m4 files would cause aclocal to fail.
730 # The following requires GNU find 4.2.3 or newer.  Considering the usual
731 # portability constraints of this script, that may seem a very demanding
732 # requirement, but it should be ok.  Ignore any failure, which is fine,
733 # since this is only a convenience to help developers avoid the relatively
734 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
735 # between successive runs of this script.
736 find "$m4_base" "$source_base" \
737   -depth \( -name '*.m4' -o -name '*.[ch]' \) \
738   -type l -xtype l -delete > /dev/null 2>&1
739
740 # Reconfigure, getting other files.
741
742 # Skip autoheader if it's not needed.
743 grep -E '^[      ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
744   AUTOHEADER=true
745
746 for command in \
747   libtool \
748   "${ACLOCAL-aclocal} --force -I m4" \
749   "${AUTOCONF-autoconf} --force" \
750   "${AUTOHEADER-autoheader} --force" \
751   "${AUTOMAKE-automake} --add-missing --copy --force-missing"
752 do
753   if test "$command" = libtool; then
754     use_libtool=0
755     # We'd like to use grep -E, to see if any of LT_INIT,
756     # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
757     # but that's not portable enough (e.g., for Solaris).
758     grep '^[     ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
759       && use_libtool=1
760     grep '^[     ]*LT_INIT' configure.ac >/dev/null \
761       && use_libtool=1
762     test $use_libtool = 0 \
763       && continue
764     command="${LIBTOOLIZE-libtoolize} -c -f"
765   fi
766   echo "$0: $command ..."
767   $command || exit
768 done
769
770
771 # Get some extra files from gnulib, overriding existing files.
772 for file in $gnulib_extra_files; do
773   case $file in
774   */INSTALL) dst=INSTALL;;
775   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
776   *) dst=$file;;
777   esac
778   symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
779 done
780
781 if test $with_gettext = yes; then
782   # Create gettext configuration.
783   echo "$0: Creating po/Makevars from po/Makevars.template ..."
784   rm -f po/Makevars
785   sed '
786     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
787     /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
788     /^XGETTEXT_OPTIONS *=/{
789       s/$/ \\/
790       a\
791           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
792     }
793   ' po/Makevars.template >po/Makevars
794
795   if test -d runtime-po; then
796     # Similarly for runtime-po/Makevars, but not quite the same.
797     rm -f runtime-po/Makevars
798     sed '
799       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
800       /^subdir *=.*/s/=.*/= runtime-po/
801       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
802       /^XGETTEXT_OPTIONS *=/{
803         s/$/ \\/
804         a\
805             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
806       }
807     ' <po/Makevars.template >runtime-po/Makevars
808
809     # Copy identical files from po to runtime-po.
810     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
811   fi
812 fi
813
814 bootstrap_epilogue
815
816 echo "$0: done.  Now you can run './configure'."
817
818 # Local Variables:
819 # indent-tabs-mode: nil
820 # End: