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