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