Compress empty non-optional table to zero size
[xapian.git] / bootstrap
blob5a5e24bed59d4f30dc152bb629841873f423c5cd
1 #!/bin/sh
2 # bootstrap a xapian source tree obtained from git to produce a tree like
3 # you'd get from unpacking the results of "make dist"
5 copyright='
6 # Copyright (C) 2002-2023 Olly Betts
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License as
10 # published by the Free Software Foundation; either version 2 of the
11 # License, or (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
21 # USA
24 if [ "$1" = "--help" ] ; then
25 cat <<__END__
26 $0 [--ftp|--http] [--download-tools=(always|ifneeded|never)] [--fetch-url-command=CMD] [--clean] [MODULE...]
28 The default is to bootstrap all known modules. Any modules which have a
29 file called ".nobootstrap" in their top-level will be skipped.
30 __END__
31 exit 0
34 trap 'echo "Bootstrap failed"' EXIT
35 set -e
37 # The variables which specify the autotools to use.
38 autotools="AUTORECONF AUTOCONF AUTOHEADER AUTOM4TE AUTOMAKE ACLOCAL LIBTOOLIZE"
40 # Tool for downloading a file from a URL (currently wget, curl, and lwp-request
41 # are probed for in that order). Can be specified with --fetch-url-command.
42 FETCH_URL_TOOL=
44 check_checksum() {
45 checksum_=$1
46 tarball_=$2
48 if [ -z "$SHA256SUM_TOOL" ] ; then
49 for SHA256SUM_TOOL in \
50 '${SHA256SUM-sha256sum} 2>/dev/null|cut -d\ -f1' \
51 '${SHASUM-shasum} -a256 2>/dev/null|cut -d\ -f1' \
52 '${OPENSSL-openssl} sha256 2>/dev/null|sed "s/.* //"' \
53 '' ; do
54 if [ -z "$SHA256SUM_TOOL" ] ; then
55 cat <<'END'
56 Need sha256sum or shasum or openssl installed to check SHA256 checksums.
57 Set environment variable SHA256SUM, SHASUM or OPENSSL if the tool isn't on
58 your PATH.
59 END
60 exit 1
62 # Sanity check by hashing empty input.
63 r=`:|eval "$SHA256SUM_TOOL"`
64 [ X"$r" != Xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ] || break
65 done
67 r=`< "$tarball_" eval "$SHA256SUM_TOOL"`
68 if [ X"$r" != X"$checksum_" ] ; then
69 echo "$tarball_: computed SHA256 checksum did NOT match"
70 echo "computed: $r with $SHA256SUM_TOOL"
71 echo "expected: $checksum_"
72 ls -l "$tarball_"
73 file "$tarball_" || true
74 mv "$tarball_" "$tarball_.$r"
75 echo "Renamed $tarball_ to $tarball_.$r"
76 exit 1
80 check_at_least() {
81 # This function is expected to be used in 'if' so we can't rely on set -e
82 # being in effect here.
83 v1=$1
84 v2=$2
85 save_IFS=$IFS
86 IFS=.
87 set x $v1
88 for v in $v2 ; do
89 shift
90 if [ "$1" != "$v" ] ; then
91 if [ -z "$1" ] || [ "$1" -lt "$v" ] ; then
92 IFS=$save_IFS
93 return 1
95 break
97 done
98 IFS=$save_IFS
99 return 0
102 need_to_build() {
103 # This function is expected to be used in 'if' so we can't rely on set -e
104 # being in effect here.
105 package=$1
106 version=$2
107 binary=$3
109 case $download_tools in
110 always) ;;
111 never)
112 return 1
115 if [ -n "$binary" ] ; then
116 if [ -s "../patches/$package/series" ] ; then
117 echo "There are patches to apply to $package so using private build"
118 else
119 # Check if a new enough version is already installed.
120 version_installed=`"$binary" --version 2>/dev/null|sed '1,1 s/.* //p;d'`
121 if [ -n "$version_installed" ] ; then
122 # Fast track equality.
123 if [ "$version_installed" = "$version" ] ; then
124 echo "$binary $version_installed installed, exactly what's needed"
125 return 1
127 if check_at_least "$version_installed" "$version" ; then
128 echo "$binary $version_installed installed >= $version required"
129 return 1
135 esac
136 return 0
139 lazy_build() {
140 package=$1
141 version=$2
142 basename=$package-$version
143 ext=$3
144 checksum=$4
146 if [ "$ext" = "tar.xz" ] ; then
147 if [ -z "$xz_ok" ] ; then
148 if ${XZ-xz} --version > /dev/null 2>&1 ; then
149 xz_ok=1
150 else
151 xz_ok=0
154 if [ "$xz_ok" = 0 ] ; then
155 shift 2
156 ext=$3
157 checksum=$4
160 if [ "$ext" = "tar.bz2" ] ; then
161 if [ -z "$bz2_ok" ] ; then
162 # bzip2 --version doesn't exit with code 0 in upstream version (though
163 # Debian at least patch this bug), so use --help to check it.
164 if bzip2 --help > /dev/null 2>&1 ; then
165 bz2_ok=1
166 else
167 bz2_ok=0
170 if [ "$bz2_ok" = 0 ] ; then
171 shift 2
172 ext=$3
173 checksum=$4
176 tarball=$basename.$ext
177 case $basename in
178 *[24680][a-z]) basename=`echo "$basename"|sed 's/[a-z]$//'` ;;
179 esac
181 # Create the stamp file in INST so that rerunning bootstrap after
182 # "rm -rf INST" recovers nicely.
183 stamp=../INST/$package.stamp
184 out_of_date=
186 # Download the tarball if required.
187 if [ ! -f "$tarball" ] ; then
188 main_tarball=
189 # Older git versions don't support "git worktree", so discard stderr and
190 # then we'll skip the worktree handling because main_worktree_dir will
191 # be empty.
192 main_worktree_dir=`git worktree list --porcelain 2>/dev/null|sed 's/^worktree //;q'`
193 if [ -n "$main_worktree_dir" ] ; then
194 # Canonicalise main_worktree_dir before comparing with pwd.
195 main_worktree_dir=`cd "$main_worktree_dir" && pwd`
196 if [ "$main_worktree_dir/BUILD" != "`pwd`" ] ; then
197 # If main_tarball is set non-empty, then we're a linked worktree.
198 main_tarball=$main_worktree_dir/BUILD/$tarball
201 if [ -n "$main_tarball" ] && [ -f "$main_tarball" ] ; then
202 # Don't re-download the tarball if the main worktree already has it.
203 tarball=$main_tarball
204 else
205 if [ -z "$FETCH_URL_TOOL" ] ; then
206 if ${WGET-wget} --version > /dev/null 2>&1 ; then
207 FETCH_URL_TOOL="${WGET-wget} -O-"
208 elif ${CURL-curl} --version > /dev/null 2>&1 || [ "$?" = 2 ] ; then
209 # curl --version exits with code 2 (~7.18.2) or 0 (7.35.0).
210 # -L is needed to follow HTTP redirects.
211 FETCH_URL_TOOL="${CURL-curl} -L"
212 elif ${LWP_REQUEST-lwp-request} -v > /dev/null 2>&1 || [ "$?" = 9 ] || [ "$?" = 255 ] ; then
213 # lwp-request -v exits with code 9 (5.810) or 255 (6.03)
214 FETCH_URL_TOOL="${LWP_REQUEST-lwp-request} -mGET"
215 else
216 cat <<END >&2
217 Neither wget nor curl nor lwp-request found - install one of them or if already
218 installed, set WGET, CURL or LWP_REQUEST to the full path. Alternatively,
219 download $url
220 to directory `pwd`
221 then rerun this script.
223 exit 1
226 url="https://github.com/xapian/xapian-dev-deps/releases/download/current/$tarball"
227 case $basename in
228 file-*)
229 case $download_protocol in
230 ftp) url="ftp://ftp.astron.com/pub/file/$tarball" ;;
231 # We used to use http://fossies.org/ but that now redirects to https.
232 esac ;;
233 *[13579][a-z])
234 # GNU alpha release
235 case $download_protocol in
236 ftp) url="ftp://alpha.gnu.org/gnu/$package/$tarball" ;;
237 http) url="http://alpha.gnu.org/gnu/$package/$tarball" ;;
238 esac ;;
240 case $download_protocol in
241 ftp) url="ftp://ftp.gnu.org/gnu/$package/$tarball" ;;
242 http) url="http://ftpmirror.gnu.org/$package/$tarball" ;;
243 esac ;;
244 esac
245 case $download_protocol,$url in
246 http,https:*)
247 echo "warning: No http: link for $tarball available, using https:"
249 esac
251 # Keep the tarball under a quarantined name until we've verified its
252 # checksum. Once verified, if this is a linked git worktree we save
253 # the tarball in the main worktree's BUILD directory so that it can
254 # be shared with other worktrees.
255 if [ -n "$main_tarball" ] ; then
256 tarball=$main_tarball
258 quarantined_tarball=$tarball-quarantine.$$
259 rm -f "$quarantined_tarball"
260 echo "Downloading <$url>"
261 $FETCH_URL_TOOL "$url" > "$quarantined_tarball" || exit $?
262 check_checksum "$checksum" "$quarantined_tarball"
263 mv "$quarantined_tarball" "$tarball"
265 # Force a build.
266 out_of_date=force
270 if [ -z "$out_of_date" ] ; then
271 if [ -f "$stamp" ] ; then
272 # Check if the tarball or the patches we're applying have changed since
273 # the existing build.
274 out_of_date=`find "$tarball" ../patches/"$package"/* -newer "$stamp" -print 2> /dev/null||true`
275 else
276 out_of_date=force
280 if [ -n "$out_of_date" ] ; then
281 # Verify the tarball's checksum before building it. We now check at
282 # download time, but older versions of bootstrap didn't, and this also
283 # protects a user who manually downloads a tarball (which we suggest as an
284 # option if wget, curl, etc aren't found).
285 check_checksum "$checksum" "$tarball"
287 case $tarball in
288 */*) ;; # Only expire tarballs from the main worktree.
290 case `git worktree list --porcelain 2>/dev/null|grep -c '^worktree '` in
291 1|0)
292 # Remove tarballs of other versions if there's only one worktree, or if
293 # using git < 2.5 (before worktrees were added).
294 for f in "$package"-* ; do
295 [ "$f" = "$tarball" ] || rm -rf "$f"
296 done
298 esac
300 esac
302 case $ext in
303 tar.xz)
304 ${XZ-xz} -dc "$tarball"| tar xf - || exit $? ;;
305 tar.bz2)
306 bzip2 -dc "$tarball"| tar xf - || exit $? ;;
308 gzip -dc "$tarball"| tar xf - || exit $? ;;
309 esac
311 cd "$basename" || exit $?
313 series="../../patches/$package/series"
314 if [ ! -f "$series" ] ; then
315 cat <<END >&2
316 No patch series file 'patches/$package/series' - if there are no patches,
317 this should just be an empty file.
319 exit 1
321 if [ -s "$series" ] ; then
322 echo "Applying patches from $package/series"
323 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" | \
324 while read p ; do
325 echo "Applying patch $package/$p"
326 patch -p1 < "../../patches/$package/$p" || exit $?
327 done
330 echo "Configuring $package"
331 if test -n "$AUTOCONF" ; then
332 ./configure --prefix "$instdir" AUTOCONF="$AUTOCONF" || exit $?
333 else
334 ./configure --prefix "$instdir" || exit $?
336 echo "Building $package"
337 make || exit $?
338 echo "Installing $package"
339 make install || exit $?
340 echo "Done installing $package"
341 cd .. || exit $?
342 rm -rf "$basename" || exit $?
344 touch "$stamp" || exit $?
346 return 0
349 handle_git_external() {
350 path=$1
351 if [ ! -f "$path/.nobootstrap" ] ; then
352 rev=$2
353 url=$3
354 if [ ! -d "$path" ] ; then
355 git clone --no-checkout -- "$url" "$path"
356 elif (cd "$path" && git reflog "$rev" -- 2>/dev/null) ; then
357 : # Already have that revision locally
358 else
359 (cd "$path" && git fetch)
361 (cd "$path" && git checkout "$rev")
365 update_config() {
366 from=$1
367 to=$2
368 ts_from=`perl -ne '/^timestamp=(\W?)([-\d]+)$1/ and do {$_=$2;y/-//d;print;exit}' "$from"`
369 ts_to=`perl -ne '/^timestamp=(\W?)([-\d]+)$1/ and do {$_=$2;y/-//d;print;exit}' "$to"`
370 if [ "$ts_from" -gt "$ts_to" ] ; then
371 echo "Updating $to ($ts_to) with $from ($ts_from)"
372 # rm first in case the existing file is a symlink.
373 rm -f "$to"
374 cp "$from" "$to"
378 update_bootstrap_sticky_opts() {
379 arg=$1
380 case $arg in
381 *[!-A-Za-z0-9_+=:@/.,]*)
382 # Quote for the shell and escape $ to $$ for make.
383 bootstrap_sticky_opts="$bootstrap_sticky_opts '"`echo "$arg"|sed "s/'/'\\\\\\''/g;"'s/[$]/\\\\$\\\\$/g'`"'"
386 bootstrap_sticky_opts="$bootstrap_sticky_opts $arg"
388 esac
391 curdir=`pwd`
393 # cd to srcdir if we aren't already there.
394 srcdir=`echo "$0"|sed 's!/*[^/]*$!!'`
395 case $srcdir in
396 ""|.)
397 srcdir=. ;;
399 cd "$srcdir" ;;
400 esac
402 # Commit hash to pass to handle_git_external for swig. Equivalent to
403 # SWIG 4.1.1 (we need at least SWIG 4.1.0 for Ruby 2.7 and PHP 8).
404 swig_git_commit_hash=77323a0f07562b7d90d36181697a72a909b9519a
406 # Commit hashes to use for common in omega and letor respectively:
407 omega_common_commit_hash=501bddf177275d87a46f7a659aa3a0b0d85ee4c8
408 letor_common_commit_hash=501bddf177275d87a46f7a659aa3a0b0d85ee4c8
410 gitdir=`git rev-parse --git-dir`
412 if [ ! -d "$gitdir" ] ; then
413 echo "$0: No '.git' directory found - this script should be run from a"
414 echo "git repo cloned from git://git.xapian.org/xapian or a mirror of it"
415 exit 1
418 for emptydir in xapian-applications/omega/m4 xapian-bindings/m4 xapian-letor/m4 ; do
419 if test -d "$emptydir" ; then
421 else
422 parent=`echo "$emptydir"|sed 's,/[^/]*$,,'`
423 if test -d "$parent" ; then
424 mkdir "$emptydir"
427 done
429 if [ -f "$gitdir/info/exclude" ] ; then
430 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' "$gitdir/info/exclude" > "$gitdir/info/exclude~"
431 else
432 [ -d "$gitdir/info" ] || mkdir "$gitdir/info"
434 cat <<END >> "$gitdir/info/exclude~"
435 swig
436 xapian-applications/omega/common
437 xapian-letor/common
439 if [ -f "$gitdir/info/exclude" ] &&
440 cmp -s "$gitdir/info/exclude~" "$gitdir/info/exclude" ; then
441 rm "$gitdir/info/exclude~"
442 else
443 mv "$gitdir/info/exclude~" "$gitdir/info/exclude"
446 # If this tree is checked out from the github mirror, use the same access
447 # method for other things checked out from github (e.g. swig) so we avoid
448 # firewall issues. If there's no default remote, the git config command
449 # will exit with status 1, so ignore that failure.
450 origin_url=`git config remote.origin.url||:`
451 case $origin_url in
452 *[@/]github.com[:/]*)
453 github_base_url=`echo "X$origin_url"|sed 's/^X//;s!\([@/]github.com[:/]\).*!\1!'` ;;
455 github_base_url=https://github.com/ ;;
456 esac
457 swig_origin_url=${github_base_url}swig/swig.git
459 if [ -z "$XAPIAN_COMMON_CLONE_URL" ] ; then
460 xapian_common_clone_url=.
461 else
462 xapian_common_clone_url=$XAPIAN_COMMON_CLONE_URL
465 # Set to 'ftp' to use ftp URLs where available and 'http' to use unencrypted
466 # 'http'. By default we prefer https downloads as they are more likely to work
467 # through firewalls and better preserve user privacy.
468 download_protocol=
470 # Set to 'always' to always use a locally installed copy of the autotools
471 # or 'never' to never download.
473 # By default we check for locally installed versions and use them if they are
474 # new enough versions. But e.g. for building releases we want to use a known
475 # set of versions.
476 download_tools=ifneeded
478 # Save options which should be sticky for when "make" needs to rerun bootstrap.
479 # This should be empty or start with a space.
480 bootstrap_sticky_opts=
482 while [ "$#" -gt 0 ] ; do
483 case $1 in
484 --download-tools=*)
485 update_bootstrap_sticky_opts "$1"
486 download_tools=`echo "x$1"|sed 's/^x--download-tools=//'`
487 shift
488 continue
491 --download-tools)
492 update_bootstrap_sticky_opts "$1=$2"
493 download_tools=$2
494 shift 2
495 continue
498 --ftp)
499 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
500 download_protocol=ftp
501 shift
502 continue
505 --http)
506 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
507 download_protocol=http
508 shift
509 continue
512 --fetch-url-command=*)
513 update_bootstrap_sticky_opts "$1"
514 FETCH_URL_TOOL=`echo "x$1"|sed 's/^x--fetch-url-command=//'`
515 shift
516 continue
519 --fetch-url-command)
520 update_bootstrap_sticky_opts "$1=$2"
521 FETCH_URL_TOOL=$2
522 shift 2
523 continue
526 --clean)
527 # This probably shouldn't be sticky.
528 rm -rf INST
529 shift
530 continue
533 --without-autotools)
534 # This shouldn't be sticky.
535 echo "warning: Ignoring old option '$1' - new default is to use installed versions of tools if new enough. Use '--download-tools=never' to prevent ever downloading"
536 shift
537 continue
541 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
542 shift
543 break
547 echo "Unknown option '$1'" 1>&2
548 exit 1
552 break
554 esac
555 done
557 if [ "$#" -gt 0 ] ; then
558 for a in "$@" ; do
559 update_bootstrap_sticky_opts "$a"
560 done
563 case $download_tools in
564 always|ifneeded) ;;
565 never)
566 echo "warning: If stuff breaks with '--download-tools=never', you get to keep the pieces"
569 echo "Invalid --download-tools value '$download_tools'"
570 exit 1
572 esac
574 [ -d INST ] || mkdir INST
575 instdir=`pwd`/INST
577 [ -d BUILD ] || mkdir BUILD
578 cd BUILD
580 # The hex strings are SHA256 checksums for the preceding extension.
581 args='autoconf 2.71'
582 if need_to_build $args autoconf ; then
583 lazy_build $args \
584 tar.xz f14c83cfebcc9427f2c3cea7258bd90df972d92eb26752da4ddad81c87a0faa4 \
585 tar.gz 431075ad0bf529ef13cb41e9042c542381103e80015686222b8a9d4abef42a1c
586 AUTOCONF=$instdir/bin/autoconf
587 export AUTOCONF
588 AUTORECONF=$instdir/bin/autoreconf
589 export AUTORECONF
590 AUTOHEADER=$instdir/bin/autoheader
591 export AUTOHEADER
592 AUTOM4TE=$instdir/bin/autom4te
593 export AUTOM4TE
595 args='automake 1.16.5'
596 if need_to_build $args automake ; then
597 lazy_build $args \
598 tar.xz f01d58cd6d9d77fbdca9eb4bbd5ead1988228fdb73d6f7a201f5f8d6b118b469 \
599 tar.gz 07bd24ad08a64bc17250ce09ec56e921d6343903943e99ccf63bbf0705e34605
600 ACLOCAL=$instdir/bin/aclocal
601 export ACLOCAL
602 AUTOMAKE=$instdir/bin/automake
603 export AUTOMAKE
605 args='libtool 2.4.6'
606 if need_to_build $args libtool ; then
607 lazy_build $args \
608 tar.xz 7c87a8c2c8c0fc9cd5019e402bed4292462d00a718a7cd5f11218153bf28b26f \
609 tar.gz e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3
610 LIBTOOLIZE=$instdir/bin/libtoolize
611 export LIBTOOLIZE
612 libtool_aclocal=$instdir/share/aclocal
613 else
614 libtool_aclocal=`which libtoolize|sed 's!/bin/[^/]*$!/share/aclocal!'`
615 if [ -z "$libtool_aclocal" ] ; then
616 echo "libtoolize not found"
617 exit 1
621 if [ "$1" = "--deps=libmagic" ] ; then
622 shift
623 lazy_build file 5.3.2 \
624 tar.gz 8639dc4d1b21e232285cd483604afc4a6ee810710e00e579dbe9591681722b50
627 # Save the unadorned aclocal for bootstrapping SWIG. In particular SWIG
628 # uses a modified old version of AX_CXX_COMPILE_STDCXX_11 which isn't
629 # compatible with the current version which might be in a system directory.
630 SWIG_ACLOCAL=${ACLOCAL-aclocal}
632 cd ..
634 # Add -I for in-tree macro directory first, so we use that xapian.m4 in
635 # preference to one in any directories which may be added below.
636 ACLOCAL="${ACLOCAL-aclocal} -I `pwd`/xapian-core/m4-macros -I `pwd`/xapian-letor/m4-macros"
637 export ACLOCAL
639 aclocal_ac_dir=`${ACLOCAL-aclocal} --print-ac-dir`
640 aclocal_system_needed=
641 if [ ! -r "$aclocal_ac_dir/pkg.m4" ] ; then
642 if [ -r /usr/share/aclocal/pkg.m4 ] ; then
643 aclocal_system_needed=/usr/share/aclocal
644 elif [ -r /usr/local/share/aclocal/pkg.m4 ] ; then
645 aclocal_system_needed=/usr/local/share/aclocal
646 elif [ -r /opt/local/share/aclocal/pkg.m4 ] ; then
647 aclocal_system_needed=/opt/local/share/aclocal
651 # If the aclocal we're using is in a different prefix to the libtool we're
652 # using, we probably need to tell aclocal where to look for our libtool's
653 # macros. We also need to do this if we add -I /usr/share/aclocal below
654 # since otherwise the system libtool's macros may be used in preference.
655 if [ "$aclocal_ac_dir" != "$libtool_aclocal" ] || [ -n "$aclocal_system_needed" ]; then
656 ACLOCAL="${ACLOCAL-aclocal} -I $libtool_aclocal"
657 export ACLOCAL
660 # If we're using a non-system automake, check if pkg.m4 is in the directory
661 # aclocal looks in by default. If not and there's a system pkg.m4, tell
662 # aclocal to also look in the system aclocal directory.
663 if [ -n "$aclocal_system_needed" ] ; then
664 ACLOCAL="${ACLOCAL-aclocal} -I $aclocal_system_needed"
665 export ACLOCAL
668 case `${LIBTOOLIZE-libtoolize} --version` in
670 echo "${LIBTOOLIZE-libtoolize} not found"
671 exit 1 ;;
672 "libtoolize (GNU libtool) 1.4.*")
673 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.4 which is too old - libtool 2.2 is required."
674 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
675 exit 1 ;;
676 "libtoolize (GNU libtool) 1.5.*")
677 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.5 which is too old - libtool 2.2 is required."
678 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
679 exit 1 ;;
680 esac
682 intree_swig=no
683 modules=
684 for module in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
685 d=$module
686 if [ "$d" = swig ] ; then
687 if [ -f "xapian-bindings/.nobootstrap" ] ; then
688 # No point bootstrapping SWIG if we aren't going to use it.
689 echo "Skipping '$d' due to presence of 'xapian-bindings/.nobootstrap'."
690 continue
692 handle_git_external swig "$swig_git_commit_hash" "$swig_origin_url"
694 if [ -f "$d/configure.ac" ] || [ -f "$d/configure.in" ] ; then
696 else
697 # Skip any directories we can't bootstrap.
698 continue
700 if [ -f "$d/.nobootstrap" ] ; then
701 # Report why to save head scratching when someone forgets they created
702 # a .nobootstrap file.
703 echo "Skipping '$module' due to presence of '$d/.nobootstrap'."
704 continue
706 case $d in
707 xapian-applications/omega|xapian-letor)
708 # If someone's created a directory for common, leave it be.
709 if [ -h "$d/common" ] || [ ! -d "$d/common" ] ; then
710 # Pick omega_common_commit_hash or letor_common_commit_hash:
711 var=`echo "$d"|sed 's!.*[-/]!!g'`_common_commit_hash
712 hash=`eval echo \\\$"$var"`
713 if [ -f "$gitdir/shallow" ] ; then
714 if git reflog "$hash" -- 2> /dev/null ; then
715 : # Already have the desired commit.
716 else
717 git fetch --unshallow
720 handle_git_external "$d/.common.git" "$hash" "$xapian_common_clone_url"
721 ln -sf .common.git/xapian-core/common "$d/common"
724 esac
726 echo "Bootstrapping \`$module'"
727 [ -f "$d/preautoreconf" ] && perl "$d/preautoreconf"
729 # If we have a custom INSTALL file, preserve it since autoreconf insists on
730 # replacing INSTALL with "generic installation instructions" when --force
731 # is used. Be careful to replace it if autoreconf fails.
732 if [ -f "$d/INSTALL" ] ; then
733 if grep 'generic installation instructions' "$d/INSTALL" >/dev/null 2>&1 ; then
735 else
736 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
740 autoreconf_rc=
741 if [ swig = "$module" ] ; then
742 # SWIG provides its own bootstrapping script.
743 curdir=`pwd`
744 cd "$d"
745 ACLOCAL=$SWIG_ACLOCAL ./autogen.sh || autoreconf_rc=$?
746 cd "$curdir"
747 # Use the uninstalled wrapper for the in-tree copy of SWIG.
748 intree_swig=yes
749 else
750 # Use --install as debian's autoconf wrapper uses 2.5X if it sees it
751 # (but it doesn't check for -i).
753 # Use --force so that we update files if autoconf, automake, or libtool
754 # has been upgraded.
755 ${AUTORECONF-autoreconf} --install --force "$d" || autoreconf_rc=$?
757 if [ -f "$d/INSTALL.preserved-by-bootstrap" ] ; then
758 mv -f "$d/INSTALL.preserved-by-bootstrap" "$d/INSTALL"
760 if [ -n "$autoreconf_rc" ] ; then
761 exit $autoreconf_rc
763 for f in config.guess config.sub ; do
764 if [ -f "$d/$f" ] ; then
765 update_config "config/$f" "$d/$f"
767 done
768 modules="$modules $module"
769 done
771 # Produce an absolute path to srcdir.
772 srcdir_abs=`pwd`
774 # Generate the top-level configure script.
775 rm -f configure.tmp
776 cat <<TOP_OF_CONFIGURE > configure.tmp
777 #!/bin/sh
778 # configure each submodule in a xapian source tree
779 # Generated by Xapian top-level bootstrap script.
780 #$copyright
781 trap 'echo "configure failed"' EXIT
782 set -e
784 srcdir="$srcdir_abs"
785 modules="$modules"
787 TOP_OF_CONFIGURE
789 cat <<'MIDDLE_OF_CONFIGURE' >> configure.tmp
790 # Produced escaped version of command suitable for pasting back into sh
791 cmd=$0
792 user_CPPFLAGS=$CPPFLAGS
793 user_LDFLAGS=$LDFLAGS
794 for a ; do
795 case $a in
796 *[^-A-Za-z0-9_+=:@/.,]*)
797 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
798 cmd="$cmd $esc_a" ;;
800 cmd="$cmd $a" ;;
801 esac
802 # Capture any command-line settings of CPPFLAGS or LDFLAGS so we can override
803 # for omega. We follow the behaviour of autoconf-generated configure scripts
804 # in that command-line setting beats environment variable setting, and the
805 # last of multiple command-line settings is used.
806 case $a in
807 CPPFLAGS=*)
808 user_CPPFLAGS=`expr "x$a" : 'xCPPFLAGS=\(.*\)'` ;;
809 LDFLAGS=*)
810 user_LDFLAGS=`expr "x$a" : 'xLDFLAGS=\(.*\)'` ;;
811 esac
812 done
814 here=`pwd`
815 MIDDLE_OF_CONFIGURE
817 vars=
818 if [ yes = "$intree_swig" ] ; then
819 # We want the path to SWIG to point into srcdir, which isn't known until
820 # configure-time, so we need to expand $here in configure.
821 vars=' SWIG=$here/swig/preinst-swig'
822 elif [ -n "$SWIG" ] ; then
823 # User specified SWIG in environment, e.g. with:
824 # SWIG=/opt/swig/bin/swig ./bootstrap
825 vars=" SWIG='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
827 for tool in $autotools ; do
828 eval "val=\$$tool"
829 if [ -n "$val" ] ; then
830 echo ': ${'"$tool='$val'"'}' >> configure.tmp
831 echo "export $tool" >> configure.tmp
832 vars="$vars $tool='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
834 done
835 if [ -n "$vars" ] ; then
836 # $vars will always have a leading space.
837 echo "set$vars "'"$@"' >> configure.tmp
840 cat <<'END_OF_CONFIGURE' >> configure.tmp
841 dirs=
842 revdirs=
843 XAPIAN_CONFIG=$here/xapian-core/xapian-config
844 XAPIANLETOR_CONFIG=$here/xapian-letor/xapianletor-config
845 for d in $modules ; do
846 if [ "$here" = "$srcdir" ] ; then
847 configure=./configure
848 configure_from_here=$d/configure
849 else
850 configure=$srcdir/$d/configure
851 configure_from_here=$configure
853 if [ -f "$configure_from_here" ] ; then
854 if [ -d "$d" ] ; then : ; else
855 case $d in
856 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
857 esac
858 mkdir "$d"
860 echo "Configuring \`$d'"
861 # Replace EXIT trap with one which shows `config.log`.
862 trap 'if [ -f config.log ]; then echo "configure failed, config.log was:"; sed "s/^/| /" config.log; else echo "configure failed"; fi' EXIT
863 # Use a shared config.cache for speed and to save a bit of diskspace, but
864 # don't share it with SWIG just in case it manages to probe and cache
865 # different answers (e.g. because it uses a C compiler).
866 case $d in
867 swig)
868 case "$*" in
869 *--host=*|*--host" "*)
870 # We're cross-building, but SWIG needs to be built natively.
871 swig_configure_args=
872 skip=
873 for arg in "$@" ; do
874 if [ -n "$skip" ] ; then
875 skip=
876 continue
878 case $arg in
879 --host=*)
880 # Drop --host=xxx
881 continue ;;
882 --host)
883 # Drop --host xxx
884 skip=1
885 continue ;;
886 CC=*|CXX=*)
887 # Drop CC=xxx or CXX=xxx
888 continue ;;
889 CC_FOR_BUILD=*|CXX_FOR_BUILD=*)
890 # CC_FOR_BUILD=xxx -> CC=xxx; CXX_FOR_BUILD=xxx -> CXX=xxx
891 arg=`echo "$arg"|sed 's/_FOR_BUILD//'`
893 SWIG=*)
894 # Drop SWIG=xxx - not useful and could cause problems.
895 continue ;;
896 esac
897 swig_configure_args="$swig_configure_args "\'`printf '%s' "$arg"|sed "s/'/'\\\\\\\\''/g"`\'
898 done
899 # Also handle compilers specified in environment variables. We can
900 # just reassign them unconditionally as CC and CXX are ignored if
901 # empty.
903 CC=$CC_FOR_BUILD
904 CXX=$CC_FOR_BUILD
905 export CC
906 export CXX
907 cd "$d" && eval "$configure" $swig_configure_args
911 cd "$d" && "$configure" ${1+"$@"}
913 esac
915 xapian-core)
916 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
918 xapian-letor)
919 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking XAPIAN_CONFIG="$XAPIAN_CONFIG" --cache-file="$here/config.cache" ${1+"$@"}
921 xapian-applications/omega)
922 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking XAPIAN_CONFIG="$XAPIAN_CONFIG" CPPFLAGS="-I$srcdir/INST/include $user_CPPFLAGS" LDFLAGS="-L$srcdir/INST/lib $user_LDFLAGS" ${1+"$@"}
925 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" XAPIAN_CONFIG="$XAPIAN_CONFIG" XAPIANLETOR_CONFIG="$XAPIANLETOR_CONFIG" ${1+"$@"}
927 esac
928 # Restore EXIT trap.
929 trap 'echo "configure failed"' EXIT
930 cd "$here"
931 dirs="$dirs $d"
932 revdirs="$d $revdirs"
934 done
936 case " $* " in
937 *" --help "*|*" --version "*)
938 # Don't generate Makefile if --help or --version specified.
939 trap - EXIT
940 exit 0
942 esac
944 rm -f Makefile.tmp
945 cat <<EOF > Makefile.tmp
946 # Makefile generated by:
947 CONFIGURE_COMMAND := $cmd
949 if [ "$srcdir" != . ] ; then
950 cat <<EOF >> Makefile.tmp
952 VPATH = $srcdir
955 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
956 for target in $targets ; do
957 echo
958 echo "$target:"
959 case $target in
960 uninstall|*clean)
961 # When uninstalling or cleaning, process directories in reverse order, so
962 # that we process a directory after any directories which might use it.
963 list=$revdirs ;;
965 list=$dirs ;;
966 esac
967 for d in $list ; do
968 case $d,$target in
969 swig,install*|swig,uninstall)
970 # Nothing to do with swig when installing/uninstalling.
972 swig,dist|swig,check|swig,distcheck|swig,all)
973 # Need to ensure swig is built before "make dist", "make check", etc.
974 echo " cd $d && \$(MAKE)" ;;
975 swig,mostlyclean)
976 echo " cd $d && \$(MAKE) clean" ;;
977 xapian-bindings,distcheck)
978 # FIXME: distcheck doesn't currently work for xapian-bindings because
979 # xapian-core isn't installed.
980 echo " cd $d && \$(MAKE) check && \$(MAKE) dist" ;;
982 echo " cd $d && \$(MAKE) $target" ;;
983 esac
984 done
985 case $target in
986 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
987 esac
988 done >> Makefile.tmp
989 cat <<EOF >> Makefile.tmp
991 recheck:
992 \$(CONFIGURE_COMMAND)
994 Makefile: $srcdir/configure
995 \$(CONFIGURE_COMMAND)
997 $srcdir/configure: \\
998 END_OF_CONFIGURE
1000 : > configure.tmp2
1002 # We want to rerun bootstrap if a series file changes (patch added or removed)
1003 # or an existing patch changes. Since we always have an series file (even if
1004 # it is empty), this also handles us adding the first patch for something.
1005 for d in patches/* ; do
1006 series=$d/series
1007 echo "$series:" >> configure.tmp2
1008 cat << END
1009 $series\\\\
1011 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
1012 while read p ; do
1013 patch=$d/$p
1014 cat << END
1015 $patch\\\\
1017 # Because there's a pipeline, this is a subshell, so use a temporary file
1018 # rather than a variable to compile a list of patches to use below.
1019 echo "$patch:" >> configure.tmp2
1020 done
1021 done >> configure.tmp
1023 cat <<'END_OF_CONFIGURE' >> configure.tmp
1024 $srcdir/bootstrap
1025 END_OF_CONFIGURE
1026 echo " \$srcdir/bootstrap$bootstrap_sticky_opts" >> configure.tmp
1027 cat <<'END_OF_CONFIGURE' >> configure.tmp
1029 .PHONY: $targets recheck
1031 # Dummy dependencies to allow removing patches we no longer need.
1032 END_OF_CONFIGURE
1034 cat configure.tmp2 >> configure.tmp
1036 cat <<'END_OF_CONFIGURE' >> configure.tmp
1038 mv -f Makefile.tmp Makefile
1039 trap - EXIT
1040 echo "Configured successfully - now run \"${MAKE-make}\""
1041 END_OF_CONFIGURE
1043 rm -f configure.tmp2
1045 chmod +x configure.tmp
1046 mv -f configure.tmp configure
1048 # git defaults to showing 7 character abbreviated hashes if that's enough to be
1049 # unique for a particular commit. But you can't paste these into trac as it
1050 # needs at least 8 hex digits to recognise a hex string as a commit hash. You
1051 # need 9 characters to be unique across all of Xapian at the time of writing,
1052 # and 12 for the Linux kernel currently (a much larger number of objects than
1053 # Xapian). 12 is a manageable length and decently future-proof, so let's use
1054 # that.
1055 core_abbrev_recommended=12
1056 core_abbrev=`git config --get core.abbrev||:`
1057 if [ -z "$core_abbrev" ] ; then
1058 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config"
1059 git config --local core.abbrev "$core_abbrev_recommended"
1060 elif [ "$core_abbrev" -lt "$core_abbrev_recommended" ] ; then
1061 if [ -z "`git config --local core.abbrev`" ] ; then
1062 # Set globally to < $core_abbrev_recommended, override in this repo.
1063 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config to override global core.abbrev=$core_abbrev"
1064 git config --local core.abbrev "$core_abbrev_recommended"
1065 else
1066 # Just warn.
1067 echo "warning: core.abbrev=$core_abbrev set on this repo, at least $core_abbrev_recommended is recommended"
1071 trap - EXIT
1072 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""