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