build: mention ftp redirector in release announcements
[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   $app --version >/dev/null 2>&1 || return 1
315
316   $app --version 2>&1 |
317   sed -n 's/[^0-9.]*\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/p
318           t done
319           d
320           :done
321           q'
322 }
323
324 check_versions() {
325   ret=0
326
327   while read app req_ver; do
328     # Honor $APP variables ($TAR, $AUTOCONF, etc.)
329     appvar=`echo $app | tr '[a-z]' '[A-Z]'`
330     test "$appvar" = TAR && appvar=AMTAR
331     eval "app=\${$appvar-$app}"
332     inst_ver=$(get_version $app)
333     if [ ! "$inst_ver" ]; then
334       echo "Error: '$app' not found" >&2
335       ret=1
336     elif [ ! "$req_ver" = "-" ]; then
337       latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
338       if [ ! "$latest_ver" = "$inst_ver" ]; then
339         echo "Error: '$app' version == $inst_ver is too old" >&2
340         echo "       '$app' version >= $req_ver is required" >&2
341         ret=1
342       fi
343     fi
344   done
345
346   return $ret
347 }
348
349 print_versions() {
350   echo "Program    Min_version"
351   echo "----------------------"
352   printf "$buildreq"
353   echo "----------------------"
354   # can't depend on column -t
355 }
356
357 if ! printf "$buildreq" | check_versions; then
358   test -f README-prereq &&
359   echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
360   echo
361   print_versions
362   exit 1
363 fi
364
365 echo "$0: Bootstrapping from checked-out $package sources..."
366
367 # See if we can use gnulib's git-merge-changelog merge driver.
368 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
369   if git config merge.merge-changelog.driver >/dev/null ; then
370     :
371   elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
372     echo "initializing git-merge-changelog driver"
373     git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
374     git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
375   else
376     echo "consider installing git-merge-changelog from gnulib"
377   fi
378 fi
379
380
381 cleanup_gnulib() {
382   status=$?
383   rm -fr gnulib
384   exit $status
385 }
386
387 git_modules_config () {
388   test -f .gitmodules && git config --file .gitmodules "$@"
389 }
390
391 # Get gnulib files.
392
393 case ${GNULIB_SRCDIR--} in
394 -)
395   if git_modules_config submodule.gnulib.url >/dev/null; then
396     echo "$0: getting gnulib files..."
397     git submodule init || exit $?
398     git submodule update || exit $?
399
400   elif [ ! -d gnulib ]; then
401     echo "$0: getting gnulib files..."
402
403     trap cleanup_gnulib 1 2 13 15
404
405     git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
406     git clone $shallow git://git.sv.gnu.org/gnulib ||
407       cleanup_gnulib
408
409     trap - 1 2 13 15
410   fi
411   GNULIB_SRCDIR=gnulib
412   ;;
413 *)
414   # Redirect the gnulib submodule to the directory on the command line
415   # if possible.
416   if test -d "$GNULIB_SRCDIR"/.git && \
417         git_modules_config submodule.gnulib.url >/dev/null; then
418     git submodule init
419     GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
420     git_modules_config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
421     echo "$0: getting gnulib files..."
422     git submodule update || exit $?
423     GNULIB_SRCDIR=gnulib
424   fi
425   ;;
426 esac
427
428 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
429 <$gnulib_tool || exit
430
431 # Get translations.
432
433 download_po_files() {
434   subdir=$1
435   domain=$2
436   echo "$0: getting translations into $subdir for $domain..."
437   cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
438   eval "$cmd"
439 }
440
441 # Download .po files to $po_dir/.reference and copy only the new
442 # or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
443 update_po_files() {
444   # Directory containing primary .po files.
445   # Overwrite them only when we're sure a .po file is new.
446   po_dir=$1
447   domain=$2
448
449   # Download *.po files into this dir.
450   # Usually contains *.s1 checksum files.
451   ref_po_dir="$po_dir/.reference"
452
453   test -d $ref_po_dir || mkdir $ref_po_dir || return
454   download_po_files $ref_po_dir $domain \
455     && ls "$ref_po_dir"/*.po 2>/dev/null |
456       sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
457
458   langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
459   test "$langs" = '*' && langs=x
460   for po in $langs; do
461     case $po in x) continue;; esac
462     new_po="$ref_po_dir/$po.po"
463     cksum_file="$ref_po_dir/$po.s1"
464     if ! test -f "$cksum_file" ||
465         ! test -f "$po_dir/$po.po" ||
466         ! $SHA1SUM -c --status "$cksum_file" \
467             < "$new_po" > /dev/null; then
468       echo "updated $po_dir/$po.po..."
469       cp "$new_po" "$po_dir/$po.po" \
470           && $SHA1SUM < "$new_po" > "$cksum_file"
471     fi
472   done
473 }
474
475 case $SKIP_PO in
476 '')
477   if test -d po; then
478     update_po_files po $package || exit
479   fi
480
481   if test -d runtime-po; then
482     update_po_files runtime-po $package-runtime || exit
483   fi;;
484 esac
485
486 symlink_to_dir()
487 {
488   src=$1/$2
489   dst=${3-$2}
490
491   test -f "$src" && {
492
493     # If the destination directory doesn't exist, create it.
494     # This is required at least for "lib/uniwidth/cjk.h".
495     dst_dir=`dirname "$dst"`
496     if ! test -d "$dst_dir"; then
497       mkdir -p "$dst_dir"
498
499       # If we've just created a directory like lib/uniwidth,
500       # tell version control system(s) it's ignorable.
501       # FIXME: for now, this does only one level
502       parent=`dirname "$dst_dir"`
503       for dot_ig in x $vc_ignore; do
504         test $dot_ig = x && continue
505         ig=$parent/$dot_ig
506         insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
507       done
508     fi
509
510     if $copy; then
511       {
512         test ! -h "$dst" || {
513           echo "$0: rm -f $dst" &&
514           rm -f "$dst"
515         }
516       } &&
517       test -f "$dst" &&
518       cmp -s "$src" "$dst" || {
519         echo "$0: cp -fp $src $dst" &&
520         cp -fp "$src" "$dst"
521       }
522     else
523       test -h "$dst" &&
524       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
525       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
526       test "$src_i" = "$dst_i" || {
527         dot_dots=
528         case $src in
529         /*) ;;
530         *)
531           case /$dst/ in
532           *//* | */../* | */./* | /*/*/*/*/*/)
533              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
534              exit 1;;
535           /*/*/*/*/)    dot_dots=../../../;;
536           /*/*/*/)      dot_dots=../../;;
537           /*/*/)        dot_dots=../;;
538           esac;;
539         esac
540
541         echo "$0: ln -fs $dot_dots$src $dst" &&
542         ln -fs "$dot_dots$src" "$dst"
543       }
544     fi
545   }
546 }
547
548 cp_mark_as_generated()
549 {
550   cp_src=$1
551   cp_dst=$2
552
553   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
554     symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
555   elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
556     symlink_to_dir $local_gl_dir "$cp_dst"
557   else
558     case $cp_dst in
559       *.[ch])             c1='/* '; c2=' */';;
560       *.texi)             c1='@c '; c2=     ;;
561       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
562       *)                  c1=     ; c2=     ;;
563     esac
564
565     # If the destination directory doesn't exist, create it.
566     # This is required at least for "lib/uniwidth/cjk.h".
567     dst_dir=`dirname "$cp_dst"`
568     test -d "$dst_dir" || mkdir -p "$dst_dir"
569
570     if test -z "$c1"; then
571       cmp -s "$cp_src" "$cp_dst" || {
572         # Copy the file first to get proper permissions if it
573         # doesn't already exist.  Then overwrite the copy.
574         echo "$0: cp -f $cp_src $cp_dst" &&
575         rm -f "$cp_dst" &&
576         cp "$cp_src" "$cp_dst-t" &&
577         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
578         mv -f "$cp_dst-t" "$cp_dst"
579       }
580     else
581       # Copy the file first to get proper permissions if it
582       # doesn't already exist.  Then overwrite the copy.
583       cp "$cp_src" "$cp_dst-t" &&
584       (
585         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
586         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
587         sed "s!$bt_regex/!!g" "$cp_src"
588       ) > $cp_dst-t &&
589       if cmp -s "$cp_dst-t" "$cp_dst"; then
590         rm -f "$cp_dst-t"
591       else
592         echo "$0: cp $cp_src $cp_dst # with edits" &&
593         mv -f "$cp_dst-t" "$cp_dst"
594       fi
595     fi
596   fi
597 }
598
599 version_controlled_file() {
600   dir=$1
601   file=$2
602   found=no
603   if test -d CVS; then
604     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
605              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
606   elif test -d .git; then
607     git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
608   elif test -d .svn; then
609     svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
610   else
611     echo "$0: no version control for $dir/$file?" >&2
612   fi
613   test $found = yes
614 }
615
616 slurp() {
617   for dir in . `(cd $1 && find * -type d -print)`; do
618     copied=
619     sep=
620     for file in `ls -a $1/$dir`; do
621       case $file in
622       .|..) continue;;
623       .*) continue;; # FIXME: should all file names starting with "." be ignored?
624       esac
625       test -d $1/$dir/$file && continue
626       for excluded_file in $excluded_files; do
627         test "$dir/$file" = "$excluded_file" && continue 2
628       done
629       if test $file = Makefile.am; then
630         copied=$copied${sep}$gnulib_mk; sep=$nl
631         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
632         sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
633           echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
634           rm -f $dir/$gnulib_mk &&
635           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
636         }
637       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
638            version_controlled_file $dir $file; then
639         echo "$0: $dir/$file overrides $1/$dir/$file"
640       else
641         copied=$copied$sep$file; sep=$nl
642         if test $file = gettext.m4; then
643           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
644           rm -f $dir/$file
645           sed '
646             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
647               AC_DEFUN([AM_INTL_SUBDIR], [
648             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
649               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
650             $a\
651               AC_DEFUN([gl_LOCK_EARLY], [])
652           ' $1/$dir/$file >$dir/$file
653         else
654           cp_mark_as_generated $1/$dir/$file $dir/$file
655         fi
656       fi || exit
657     done
658
659     for dot_ig in x $vc_ignore; do
660       test $dot_ig = x && continue
661       ig=$dir/$dot_ig
662       if test -n "$copied"; then
663         insert_sorted_if_absent $ig "$copied"
664         # If an ignored file name ends with .in.h, then also add
665         # the name with just ".h".  Many gnulib headers are generated,
666         # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
667         # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
668         f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
669         insert_sorted_if_absent $ig "$f"
670
671         # For files like sys_stat.in.h and sys_time.in.h, record as
672         # ignorable the directory we might eventually create: sys/.
673         f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
674         insert_sorted_if_absent $ig "$f"
675       fi
676     done
677   done
678 }
679
680
681 # Create boot temporary directories to import from gnulib and gettext.
682 rm -fr $bt $bt2 &&
683 mkdir $bt $bt2 || exit
684
685 # Import from gnulib.
686
687 gnulib_tool_options="\
688  --import\
689  --no-changelog\
690  --aux-dir $bt/$build_aux\
691  --doc-base $bt/$doc_base\
692  --lib $gnulib_name\
693  --m4-base $bt/$m4_base/\
694  --source-base $bt/$source_base/\
695  --tests-base $bt/$tests_base\
696  --local-dir $local_gl_dir\
697  $gnulib_tool_option_extras\
698 "
699 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
700 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
701 slurp $bt || exit
702
703 for file in $gnulib_files; do
704   symlink_to_dir "$GNULIB_SRCDIR" $file || exit
705 done
706
707
708 # Import from gettext.
709 with_gettext=yes
710 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
711     with_gettext=no
712
713 if test $with_gettext = yes; then
714   echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
715   cp configure.ac $bt2 &&
716   (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
717   slurp $bt2 $bt || exit
718 fi
719 rm -fr $bt $bt2 || exit
720
721 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
722 # gnulib-populated directories.  Such .m4 files would cause aclocal to fail.
723 # The following requires GNU find 4.2.3 or newer.  Considering the usual
724 # portability constraints of this script, that may seem a very demanding
725 # requirement, but it should be ok.  Ignore any failure, which is fine,
726 # since this is only a convenience to help developers avoid the relatively
727 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
728 # between successive runs of this script.
729 find "$m4_base" "$source_base" \
730   -depth \( -name '*.m4' -o -name '*.[ch]' \) \
731   -type l -xtype l -delete > /dev/null 2>&1
732
733 # Reconfigure, getting other files.
734
735 # Skip autoheader if it's not needed.
736 grep -E '^[      ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
737   AUTOHEADER=true
738
739 for command in \
740   libtool \
741   "${ACLOCAL-aclocal} --force -I m4" \
742   "${AUTOCONF-autoconf} --force" \
743   "${AUTOHEADER-autoheader} --force" \
744   "${AUTOMAKE-automake} --add-missing --copy --force-missing"
745 do
746   if test "$command" = libtool; then
747     use_libtool=0
748     # We'd like to use grep -E, to see if any of LT_INIT,
749     # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
750     # but that's not portable enough (e.g., for Solaris).
751     grep '^[     ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
752       && use_libtool=1
753     grep '^[     ]*LT_INIT' configure.ac >/dev/null \
754       && use_libtool=1
755     test $use_libtool = 0 \
756       && continue
757     command="${LIBTOOLIZE-libtoolize} -c -f"
758   fi
759   echo "$0: $command ..."
760   $command || exit
761 done
762
763
764 # Get some extra files from gnulib, overriding existing files.
765 for file in $gnulib_extra_files; do
766   case $file in
767   */INSTALL) dst=INSTALL;;
768   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
769   *) dst=$file;;
770   esac
771   symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
772 done
773
774 if test $with_gettext = yes; then
775   # Create gettext configuration.
776   echo "$0: Creating po/Makevars from po/Makevars.template ..."
777   rm -f po/Makevars
778   sed '
779     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
780     /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
781     /^XGETTEXT_OPTIONS *=/{
782       s/$/ \\/
783       a\
784           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
785     }
786   ' po/Makevars.template >po/Makevars
787
788   if test -d runtime-po; then
789     # Similarly for runtime-po/Makevars, but not quite the same.
790     rm -f runtime-po/Makevars
791     sed '
792       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
793       /^subdir *=.*/s/=.*/= runtime-po/
794       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
795       /^XGETTEXT_OPTIONS *=/{
796         s/$/ \\/
797         a\
798             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
799       }
800     ' <po/Makevars.template >runtime-po/Makevars
801
802     # Copy identical files from po to runtime-po.
803     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
804   fi
805 fi
806
807 bootstrap_epilogue
808
809 echo "$0: done.  Now you can run './configure'."
810
811 # Local Variables:
812 # indent-tabs-mode: nil
813 # End: