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