Improve documentation of gnutls_record_send()
[gd/gnutls] / bootstrap
1 #! /bin/sh
2 # Print a version string.
3 scriptversion=2019-01-04.17; # UTC
4
5 # Bootstrap this package from checked-out sources.
6
7 # Copyright (C) 2003-2019 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 a
166 # specified directory.  Fill in the first %s with the destination
167 # directory and the second with the domain name.
168 po_download_command_format=\
169 "wget --mirror --level=1 -nd -q -A.po -P '%s' \
170  https://translationproject.org/latest/%s/"
171
172 # Prefer a non-empty tarname (4th argument of AC_INIT if given), else
173 # fall back to the package name (1st argument with munging)
174 extract_package_name='
175   /^AC_INIT(\[*/{
176      s///
177      /^[^,]*,[^,]*,[^,]*,[ []*\([^][ ,)]\)/{
178        s//\1/
179        s/[],)].*//
180        p
181        q
182      }
183      s/[],)].*//
184      s/^GNU //
185      y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
186      s/[^abcdefghijklmnopqrstuvwxyz0123456789_]/-/g
187      p
188   }
189 '
190 package=$(sed -n "$extract_package_name" configure.ac) \
191   || die 'cannot find package name in configure.ac'
192 gnulib_name=lib$package
193
194 build_aux=build-aux
195 source_base=lib
196 m4_base=m4
197 doc_base=doc
198 tests_base=tests
199 gnulib_extra_files="
200         build-aux/install-sh
201         build-aux/mdate-sh
202         build-aux/texinfo.tex
203         build-aux/depcomp
204         build-aux/config.guess
205         build-aux/config.sub
206         doc/INSTALL
207 "
208
209 # Additional gnulib-tool options to use.  Use "\newline" to break lines.
210 gnulib_tool_option_extras=
211
212 # Other locale categories that need message catalogs.
213 EXTRA_LOCALE_CATEGORIES=
214
215 # Additional xgettext options to use.  Use "\\\newline" to break lines.
216 XGETTEXT_OPTIONS='\\\
217  --flag=_:1:pass-c-format\\\
218  --flag=N_:1:pass-c-format\\\
219  --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
220 '
221
222 # Package bug report address and copyright holder for gettext files
223 COPYRIGHT_HOLDER='Free Software Foundation, Inc.'
224 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
225
226 # Files we don't want to import.
227 excluded_files=
228
229 # File that should exist in the top directory of a checked out hierarchy,
230 # but not in a distribution tarball.
231 checkout_only_file=README-hacking
232
233 # Whether to use copies instead of symlinks.
234 copy=false
235
236 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
237 # those files to be generated in directories like lib/, m4/, and po/.
238 # Or set it to 'auto' to make this script select which to use based
239 # on which version control system (if any) is used in the source directory.
240 vc_ignore=auto
241
242 # Set this to true in bootstrap.conf to enable --bootstrap-sync by
243 # default.
244 bootstrap_sync=false
245
246 # Use git to update gnulib sources
247 use_git=true
248
249 check_exists() {
250   if test "$1" = "--verbose"; then
251     ($2 --version </dev/null) >/dev/null 2>&1
252     if test $? -ge 126; then
253       # If not found, run with diagnostics as one may be
254       # presented with env variables to set to find the right version
255       ($2 --version </dev/null)
256     fi
257   else
258     ($1 --version </dev/null) >/dev/null 2>&1
259   fi
260
261   test $? -lt 126
262 }
263
264 # find_tool ENVVAR NAMES...
265 # -------------------------
266 # Search for a required program.  Use the value of ENVVAR, if set,
267 # otherwise find the first of the NAMES that can be run.
268 # If found, set ENVVAR to the program name, die otherwise.
269 #
270 # FIXME: code duplication, see also gnu-web-doc-update.
271 find_tool ()
272 {
273   find_tool_envvar=$1
274   shift
275   find_tool_names=$@
276   eval "find_tool_res=\$$find_tool_envvar"
277   if test x"$find_tool_res" = x; then
278     for i; do
279       if check_exists $i; then
280         find_tool_res=$i
281         break
282       fi
283     done
284   fi
285   if test x"$find_tool_res" = x; then
286     warn_ "one of these is required: $find_tool_names;"
287     die   "alternatively set $find_tool_envvar to a compatible tool"
288   fi
289   eval "$find_tool_envvar=\$find_tool_res"
290   eval "export $find_tool_envvar"
291 }
292
293 # Override the default configuration, if necessary.
294 # Make sure that bootstrap.conf is sourced from the current directory
295 # if we were invoked as "sh bootstrap".
296 case "$0" in
297   */*) test -r "$0.conf" && . "$0.conf" ;;
298   *) test -r "$0.conf" && . ./"$0.conf" ;;
299 esac
300
301 if test "$vc_ignore" = auto; then
302   vc_ignore=
303   test -d .git && vc_ignore=.gitignore
304   test -d CVS && vc_ignore="$vc_ignore .cvsignore"
305 fi
306
307 if test x"$gnulib_modules$gnulib_files$gnulib_extra_files" = x; then
308   use_gnulib=false
309 else
310   use_gnulib=true
311 fi
312
313 # Translate configuration into internal form.
314
315 # Parse options.
316
317 for option
318 do
319   case $option in
320   --help)
321     usage
322     exit;;
323   --gnulib-srcdir=*)
324     GNULIB_SRCDIR=${option#--gnulib-srcdir=};;
325   --skip-po)
326     SKIP_PO=t;;
327   --force)
328     checkout_only_file=;;
329   --copy)
330     copy=true;;
331   --bootstrap-sync)
332     bootstrap_sync=true;;
333   --no-bootstrap-sync)
334     bootstrap_sync=false;;
335   --no-git)
336     use_git=false;;
337   *)
338     die "$option: unknown option";;
339   esac
340 done
341
342 $use_git || test -d "$GNULIB_SRCDIR" \
343   || die "Error: --no-git requires --gnulib-srcdir"
344
345 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
346   die "Bootstrapping from a non-checked-out distribution is risky."
347 fi
348
349 # Strip blank and comment lines to leave significant entries.
350 gitignore_entries() {
351   sed '/^#/d; /^$/d' "$@"
352 }
353
354 # If $STR is not already on a line by itself in $FILE, insert it at the start.
355 # Entries are inserted at the start of the ignore list to ensure existing
356 # entries starting with ! are not overridden.  Such entries support
357 # whitelisting exceptions after a more generic blacklist pattern.
358 insert_if_absent() {
359   file=$1
360   str=$2
361   test -f $file || touch $file
362   test -r $file || die "Error: failed to read ignore file: $file"
363   duplicate_entries=$(gitignore_entries $file | sort | uniq -d)
364   if [ "$duplicate_entries" ] ; then
365     die "Error: Duplicate entries in $file: " $duplicate_entries
366   fi
367   linesold=$(gitignore_entries $file | wc -l)
368   linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l)
369   if [ $linesold != $linesnew ] ; then
370     { echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \
371       || die "insert_if_absent $file $str: failed"
372   fi
373 }
374
375 # Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
376 # insert_if_absent.
377 insert_vc_ignore() {
378   vc_ignore_file="$1"
379   pattern="$2"
380   case $vc_ignore_file in
381   *.gitignore)
382     # A .gitignore entry that does not start with '/' applies
383     # recursively to subdirectories, so prepend '/' to every
384     # .gitignore entry.
385     pattern=$(echo "$pattern" | sed s,^,/,);;
386   esac
387   insert_if_absent "$vc_ignore_file" "$pattern"
388 }
389
390 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
391 found_aux_dir=no
392 grep '^[         ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
393     >/dev/null && found_aux_dir=yes
394 grep '^[         ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
395     >/dev/null && found_aux_dir=yes
396 test $found_aux_dir = yes \
397   || die "configure.ac lacks 'AC_CONFIG_AUX_DIR([$build_aux])'; add it"
398
399 # If $build_aux doesn't exist, create it now, otherwise some bits
400 # below will malfunction.  If creating it, also mark it as ignored.
401 if test ! -d $build_aux; then
402   mkdir $build_aux
403   for dot_ig in x $vc_ignore; do
404     test $dot_ig = x && continue
405     insert_vc_ignore $dot_ig $build_aux
406   done
407 fi
408
409 # Note this deviates from the version comparison in automake
410 # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
411 # but this should suffice as we won't be specifying old
412 # version formats or redundant trailing .0 in bootstrap.conf.
413 # If we did want full compatibility then we should probably
414 # use m4_version_compare from autoconf.
415 sort_ver() { # sort -V is not generally available
416   ver1="$1"
417   ver2="$2"
418
419   # split on '.' and compare each component
420   i=1
421   while : ; do
422     p1=$(echo "$ver1" | cut -d. -f$i)
423     p2=$(echo "$ver2" | cut -d. -f$i)
424     if [ ! "$p1" ]; then
425       echo "$1 $2"
426       break
427     elif [ ! "$p2" ]; then
428       echo "$2 $1"
429       break
430     elif [ ! "$p1" = "$p2" ]; then
431       if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
432         echo "$2 $1"
433       elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
434         echo "$1 $2"
435       else # numeric, then lexicographic comparison
436         lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
437         if [ "$lp" = "$p2" ]; then
438           echo "$1 $2"
439         else
440           echo "$2 $1"
441         fi
442       fi
443       break
444     fi
445     i=$(($i+1))
446   done
447 }
448
449 get_version_sed='
450 # Move version to start of line.
451 s/.*[v ]\([0-9]\)/\1/
452
453 # Skip lines that do not start with version.
454 /^[0-9]/!d
455
456 # Remove characters after the version.
457 s/[^.a-z0-9-].*//
458
459 # The first component must be digits only.
460 s/^\([0-9]*\)[a-z-].*/\1/
461
462 #the following essentially does s/5.005/5.5/
463 s/\.0*\([1-9]\)/.\1/g
464 p
465 q'
466
467 get_version() {
468   app=$1
469
470   $app --version >/dev/null 2>&1 || { $app --version; return 1; }
471
472   $app --version 2>&1 | sed -n "$get_version_sed"
473 }
474
475 check_versions() {
476   ret=0
477
478   while read app req_ver; do
479     # We only need libtoolize from the libtool package.
480     if test "$app" = libtool; then
481       app=libtoolize
482     fi
483     # Exempt git if --no-git is in effect.
484     if test "$app" = git; then
485       $use_git || continue
486     fi
487     # Honor $APP variables ($TAR, $AUTOCONF, etc.)
488     appvar=$(echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_')
489     test "$appvar" = TAR && appvar=AMTAR
490     case $appvar in
491         GZIP) ;; # Do not use $GZIP:  it contains gzip options.
492         PERL::*) ;; # Keep perl modules as-is
493         *) eval "app=\${$appvar-$app}" ;;
494     esac
495
496     # Handle the still-experimental Automake-NG programs specially.
497     # They remain named as the mainstream Automake programs ("automake",
498     # and "aclocal") to avoid gratuitous incompatibilities with
499     # pre-existing usages (by, say, autoreconf, or custom autogen.sh
500     # scripts), but correctly identify themselves (as being part of
501     # "GNU automake-ng") when asked their version.
502     case $app in
503       automake-ng|aclocal-ng)
504         app=${app%-ng}
505         ($app --version | grep '(GNU automake-ng)') >/dev/null 2>&1 || {
506           warn_ "Error: '$app' not found or not from Automake-NG"
507           ret=1
508           continue
509         } ;;
510       # Another check is for perl modules.  These can be written as
511       # e.g. perl::XML::XPath in case of XML::XPath module, etc.
512       perl::*)
513         # Extract module name
514         app="${app#perl::}"
515         if ! $PERL -m"$app" -e 'exit 0' >/dev/null 2>&1; then
516           warn_ "Error: perl module '$app' not found"
517           ret=1
518         fi
519         continue
520         ;;
521     esac
522     if [ "$req_ver" = "-" ]; then
523       # Merely require app to exist; not all prereq apps are well-behaved
524       # so we have to rely on $? rather than get_version.
525       if ! check_exists --verbose $app; then
526         warn_ "Error: '$app' not found"
527         ret=1
528       fi
529     else
530       # Require app to produce a new enough version string.
531       inst_ver=$(get_version $app)
532       if [ ! "$inst_ver" ]; then
533         warn_ "Error: '$app' not found"
534         ret=1
535       else
536         latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
537         if [ ! "$latest_ver" = "$inst_ver" ]; then
538           warnf_ '%s\n'                                        \
539               "Error: '$app' version == $inst_ver is too old"  \
540               "       '$app' version >= $req_ver is required"
541           ret=1
542         fi
543       fi
544     fi
545   done
546
547   return $ret
548 }
549
550 print_versions() {
551   echo "Program    Min_version"
552   echo "----------------------"
553   printf %s "$buildreq"
554   echo "----------------------"
555   # can't depend on column -t
556 }
557
558 # Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6.
559 # Also find the compatible sha1 utility on the BSDs
560 if test x"$SKIP_PO" = x; then
561   find_tool SHA1SUM sha1sum gsha1sum shasum sha1
562 fi
563
564 use_libtool=0
565 # We'd like to use grep -E, to see if any of LT_INIT,
566 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
567 # but that's not portable enough (e.g., for Solaris).
568 grep '^[         ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
569   && use_libtool=1
570 grep '^[         ]*LT_INIT' configure.ac >/dev/null \
571   && use_libtool=1
572 if test $use_libtool = 1; then
573   find_tool LIBTOOLIZE glibtoolize libtoolize
574 fi
575
576 # gnulib-tool requires at least automake and autoconf.
577 # If either is not listed, add it (with minimum version) as a prerequisite.
578 case $buildreq in
579   *automake*) ;;
580   *) buildreq="automake 1.9
581 $buildreq" ;;
582 esac
583 case $buildreq in
584   *autoconf*) ;;
585   *) buildreq="autoconf 2.59
586 $buildreq" ;;
587 esac
588
589 # When we can deduce that gnulib-tool will require patch,
590 # and when patch is not already listed as a prerequisite, add it, too.
591 if test -d "$local_gl_dir" \
592     && ! find "$local_gl_dir" -name '*.diff' -exec false {} +; then
593   case $buildreq in
594     *patch*) ;;
595     *) buildreq="patch -
596 $buildreq" ;;
597   esac
598 fi
599
600 if ! printf "$buildreq" | check_versions; then
601   echo >&2
602   if test -f README-prereq; then
603     die "See README-prereq for how to get the prerequisite programs"
604   else
605     die "Please install the prerequisite programs"
606   fi
607 fi
608
609 # Warn the user if autom4te appears to be broken; this causes known
610 # issues with at least gettext 0.18.3.
611 probe=$(echo 'm4_quote([hi])' | autom4te -l M4sugar -t 'm4_quote:$%' -)
612 if test "x$probe" != xhi; then
613   warn_ "WARNING: your autom4te wrapper eats stdin;"
614   warn_ "if bootstrap fails, consider upgrading your autotools"
615 fi
616
617 echo "$0: Bootstrapping from checked-out $package sources..."
618
619 # See if we can use gnulib's git-merge-changelog merge driver.
620 if $use_git && test -d .git && check_exists git; then
621   if git config merge.merge-changelog.driver >/dev/null ; then
622     :
623   elif check_exists git-merge-changelog; then
624     echo "$0: initializing git-merge-changelog driver"
625     git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
626     git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
627   else
628     echo "$0: consider installing git-merge-changelog from gnulib"
629   fi
630 fi
631
632
633 cleanup_gnulib() {
634   status=$?
635   rm -fr "$gnulib_path"
636   exit $status
637 }
638
639 git_modules_config () {
640   test -f .gitmodules && git config --file .gitmodules "$@"
641 }
642
643 if $use_gnulib; then
644   if $use_git; then
645     gnulib_path=$(git_modules_config submodule.gnulib.path)
646     test -z "$gnulib_path" && gnulib_path=gnulib
647   fi
648
649   # Get gnulib files.  Populate $GNULIB_SRCDIR, possibly updating a
650   # submodule, for use in the rest of the script.
651
652   case ${GNULIB_SRCDIR--} in
653   -)
654     # Note that $use_git is necessarily true in this case.
655     if git_modules_config submodule.gnulib.url >/dev/null; then
656       echo "$0: getting gnulib files..."
657       git submodule init -- "$gnulib_path" || exit $?
658       git submodule update -- "$gnulib_path" || exit $?
659
660     elif [ ! -d "$gnulib_path" ]; then
661       echo "$0: getting gnulib files..."
662
663       trap cleanup_gnulib 1 2 13 15
664
665       shallow=
666       if test -z "$GNULIB_REVISION"; then
667         git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
668       fi
669       git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \
670         || cleanup_gnulib
671
672       trap - 1 2 13 15
673     fi
674     GNULIB_SRCDIR=$gnulib_path
675     ;;
676   *)
677     # Use GNULIB_SRCDIR directly or as a reference.
678     if $use_git && test -d "$GNULIB_SRCDIR"/.git && \
679           git_modules_config submodule.gnulib.url >/dev/null; then
680       echo "$0: getting gnulib files..."
681       if git submodule -h|grep -- --reference > /dev/null; then
682         # Prefer the one-liner available in git 1.6.4 or newer.
683         git submodule update --init --reference "$GNULIB_SRCDIR" \
684           "$gnulib_path" || exit $?
685       else
686         # This fallback allows at least git 1.5.5.
687         if test -f "$gnulib_path"/gnulib-tool; then
688           # Since file already exists, assume submodule init already complete.
689           git submodule update -- "$gnulib_path" || exit $?
690         else
691           # Older git can't clone into an empty directory.
692           rmdir "$gnulib_path" 2>/dev/null
693           git clone --reference "$GNULIB_SRCDIR" \
694             "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
695             && git submodule init -- "$gnulib_path" \
696             && git submodule update -- "$gnulib_path" \
697             || exit $?
698         fi
699       fi
700       GNULIB_SRCDIR=$gnulib_path
701     fi
702     ;;
703   esac
704
705   if test -d "$GNULIB_SRCDIR"/.git && test -n "$GNULIB_REVISION" \
706      && ! git_modules_config submodule.gnulib.url >/dev/null; then
707     (cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib
708   fi
709
710   # $GNULIB_SRCDIR now points to the version of gnulib to use, and
711   # we no longer need to use git or $gnulib_path below here.
712
713   if $bootstrap_sync; then
714     cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
715       echo "$0: updating bootstrap and restarting..."
716       case $(sh -c 'echo "$1"' -- a) in
717         a) ignored=--;;
718         *) ignored=ignored;;
719       esac
720       exec sh -c \
721         'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
722         $ignored "$GNULIB_SRCDIR/build-aux/bootstrap" \
723         "$0" "$@" --no-bootstrap-sync
724     }
725   fi
726
727   gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
728   <$gnulib_tool || exit $?
729 fi
730
731 # Get translations.
732
733 download_po_files() {
734   subdir=$1
735   domain=$2
736   echo "$me: getting translations into $subdir for $domain..."
737   cmd=$(printf "$po_download_command_format" "$subdir" "$domain")
738   eval "$cmd"
739 }
740
741 # Mirror .po files to $po_dir/.reference and copy only the new
742 # or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
743 # Note po files that exist locally only are left in $po_dir but will
744 # not be included in LINGUAS and hence will not be distributed.
745 update_po_files() {
746   # Directory containing primary .po files.
747   # Overwrite them only when we're sure a .po file is new.
748   po_dir=$1
749   domain=$2
750
751   # Mirror *.po files into this dir.
752   # Usually contains *.s1 checksum files.
753   ref_po_dir="$po_dir/.reference"
754
755   test -d $ref_po_dir || mkdir $ref_po_dir || return
756   download_po_files $ref_po_dir $domain \
757     && ls "$ref_po_dir"/*.po 2>/dev/null |
758       sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
759
760   langs=$(cd $ref_po_dir && echo *.po | sed 's/\.po//g')
761   test "$langs" = '*' && langs=x
762   for po in $langs; do
763     case $po in x) continue;; esac
764     new_po="$ref_po_dir/$po.po"
765     cksum_file="$ref_po_dir/$po.s1"
766     if ! test -f "$cksum_file" ||
767         ! test -f "$po_dir/$po.po" ||
768         ! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then
769       echo "$me: updated $po_dir/$po.po..."
770       cp "$new_po" "$po_dir/$po.po" \
771           && $SHA1SUM < "$new_po" > "$cksum_file" || return
772     fi
773   done
774 }
775
776 case $SKIP_PO in
777 '')
778   if test -d po; then
779     update_po_files po $package || exit
780   fi
781
782   if test -d runtime-po; then
783     update_po_files runtime-po $package-runtime || exit
784   fi;;
785 esac
786
787 symlink_to_dir()
788 {
789   src=$1/$2
790   dst=${3-$2}
791
792   test -f "$src" && {
793
794     # If the destination directory doesn't exist, create it.
795     # This is required at least for "lib/uniwidth/cjk.h".
796     dst_dir=$(dirname "$dst")
797     if ! test -d "$dst_dir"; then
798       mkdir -p "$dst_dir"
799
800       # If we've just created a directory like lib/uniwidth,
801       # tell version control system(s) it's ignorable.
802       # FIXME: for now, this does only one level
803       parent=$(dirname "$dst_dir")
804       for dot_ig in x $vc_ignore; do
805         test $dot_ig = x && continue
806         ig=$parent/$dot_ig
807         insert_vc_ignore $ig "${dst_dir##*/}"
808       done
809     fi
810
811     if $copy; then
812       {
813         test ! -h "$dst" || {
814           echo "$me: rm -f $dst" &&
815           rm -f "$dst"
816         }
817       } &&
818       test -f "$dst" &&
819       cmp -s "$src" "$dst" || {
820         echo "$me: cp -fp $src $dst" &&
821         cp -fp "$src" "$dst"
822       }
823     else
824       # Leave any existing symlink alone, if it already points to the source,
825       # so that broken build tools that care about symlink times
826       # aren't confused into doing unnecessary builds.  Conversely, if the
827       # existing symlink's timestamp is older than the source, make it afresh,
828       # so that broken tools aren't confused into skipping needed builds.  See
829       # <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>.
830       test -h "$dst" &&
831       src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
832       dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
833       test "$src_i" = "$dst_i" &&
834       both_ls=$(ls -dt "$src" "$dst") &&
835       test "X$both_ls" = "X$dst$nl$src" || {
836         dot_dots=
837         case $src in
838         /*) ;;
839         *)
840           case /$dst/ in
841           *//* | */../* | */./* | /*/*/*/*/*/)
842              die "invalid symlink calculation: $src -> $dst";;
843           /*/*/*/*/)    dot_dots=../../../;;
844           /*/*/*/)      dot_dots=../../;;
845           /*/*/)        dot_dots=../;;
846           esac;;
847         esac
848
849         echo "$me: ln -fs $dot_dots$src $dst" &&
850         ln -fs "$dot_dots$src" "$dst"
851       }
852     fi
853   }
854 }
855
856 version_controlled_file() {
857   parent=$1
858   file=$2
859   if test -d .git; then
860     git rm -n "$file" > /dev/null 2>&1
861   elif test -d .svn; then
862     svn log -r HEAD "$file" > /dev/null 2>&1
863   elif test -d CVS; then
864     grep -F "/${file##*/}/" "$parent/CVS/Entries" 2>/dev/null |
865              grep '^/[^/]*/[0-9]' > /dev/null
866   else
867     warn_ "no version control for $file?"
868     false
869   fi
870 }
871
872 # NOTE: we have to be careful to run both autopoint and libtoolize
873 # before gnulib-tool, since gnulib-tool is likely to provide newer
874 # versions of files "installed" by these two programs.
875 # Then, *after* gnulib-tool (see below), we have to be careful to
876 # run autoreconf in such a way that it does not run either of these
877 # two just-pre-run programs.
878
879 # Import from gettext.
880 with_gettext=yes
881 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
882     with_gettext=no
883
884 if test $with_gettext = yes || test $use_libtool = 1; then
885
886   tempbase=.bootstrap$$
887   trap "rm -f $tempbase.0 $tempbase.1" 1 2 13 15
888
889   > $tempbase.0 > $tempbase.1 &&
890   find . ! -type d -print | sort > $tempbase.0 || exit
891
892   if test $with_gettext = yes; then
893     # Released autopoint has the tendency to install macros that have been
894     # obsoleted in current gnulib, so run this before gnulib-tool.
895     echo "$0: $AUTOPOINT --force"
896     $AUTOPOINT --force || exit
897   fi
898
899   # Autoreconf runs aclocal before libtoolize, which causes spurious
900   # warnings if the initial aclocal is confused by the libtoolized
901   # (or worse out-of-date) macro directory.
902   # libtoolize 1.9b added the --install option; but we support back
903   # to libtoolize 1.5.22, where the install action was default.
904   if test $use_libtool = 1; then
905     install=
906     case $($LIBTOOLIZE --help) in
907       *--install*) install=--install ;;
908     esac
909     echo "running: $LIBTOOLIZE $install --copy"
910     $LIBTOOLIZE $install --copy
911   fi
912
913   find . ! -type d -print | sort >$tempbase.1
914   old_IFS=$IFS
915   IFS=$nl
916   for file in $(comm -13 $tempbase.0 $tempbase.1); do
917     IFS=$old_IFS
918     parent=${file%/*}
919     version_controlled_file "$parent" "$file" || {
920       for dot_ig in x $vc_ignore; do
921         test $dot_ig = x && continue
922         ig=$parent/$dot_ig
923         insert_vc_ignore "$ig" "${file##*/}"
924       done
925     }
926   done
927   IFS=$old_IFS
928
929   rm -f $tempbase.0 $tempbase.1
930   trap - 1 2 13 15
931 fi
932
933 # Import from gnulib.
934
935 if $use_gnulib; then
936   gnulib_tool_options="\
937    --no-changelog\
938    --aux-dir=$build_aux\
939    --doc-base=$doc_base\
940    --lib=$gnulib_name\
941    --m4-base=$m4_base/\
942    --source-base=$source_base/\
943    --tests-base=$tests_base\
944    --local-dir=$local_gl_dir\
945    $gnulib_tool_option_extras\
946   "
947   if test $use_libtool = 1; then
948     case "$gnulib_tool_options " in
949       *' --libtool '*) ;;
950       *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
951     esac
952   fi
953   echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
954   $gnulib_tool $gnulib_tool_options --import $gnulib_modules \
955     || die "gnulib-tool failed"
956
957   for file in $gnulib_files; do
958     symlink_to_dir "$GNULIB_SRCDIR" $file \
959       || die "failed to symlink $file"
960   done
961 fi
962
963 bootstrap_post_import_hook \
964   || die "bootstrap_post_import_hook failed"
965
966 # Don't proceed if there are uninitialized submodules.  In particular,
967 # the next step will remove dangling links, which might be links into
968 # uninitialized submodules.
969 #
970 # Uninitialized submodules are listed with an initial dash.
971 #if $use_git && git submodule | grep '^-' >/dev/null; then
972 #  die "some git submodules are not initialized. "     \
973 #      "Run 'git submodule init' and bootstrap again."
974 #fi
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: