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