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