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