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