[omega] Compute date spans in days
[xapian.git] / bootstrap
blob6b165ab0ce1147e43899e0513ea71d1b87ca7c1d
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-2024 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.2.1 plus 68 commits, in order to get typemaps for std::string_view
404 # including a fix for a regression in handling a function taking multiple
405 # std::string_view parameters.
406 swig_git_commit_hash=6226d58065005a31f3737530ae93eaa628ae4995
408 # Commit hashes to use for common in omega and letor respectively:
409 omega_common_commit_hash=501bddf177275d87a46f7a659aa3a0b0d85ee4c8
410 letor_common_commit_hash=501bddf177275d87a46f7a659aa3a0b0d85ee4c8
412 gitdir=`git rev-parse --git-dir`
414 if [ ! -d "$gitdir" ] ; then
415 echo "$0: No '.git' directory found - this script should be run from a"
416 echo "git repo cloned from git://git.xapian.org/xapian or a mirror of it"
417 exit 1
420 for emptydir in xapian-applications/omega/m4 xapian-bindings/m4 xapian-letor/m4 ; do
421 if test -d "$emptydir" ; then
423 else
424 parent=`echo "$emptydir"|sed 's,/[^/]*$,,'`
425 if test -d "$parent" ; then
426 mkdir "$emptydir"
429 done
431 if [ -f "$gitdir/info/exclude" ] ; then
432 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' "$gitdir/info/exclude" > "$gitdir/info/exclude~"
433 else
434 [ -d "$gitdir/info" ] || mkdir "$gitdir/info"
436 cat <<END >> "$gitdir/info/exclude~"
437 swig
438 xapian-applications/omega/common
439 xapian-letor/common
441 if [ -f "$gitdir/info/exclude" ] &&
442 cmp -s "$gitdir/info/exclude~" "$gitdir/info/exclude" ; then
443 rm "$gitdir/info/exclude~"
444 else
445 mv "$gitdir/info/exclude~" "$gitdir/info/exclude"
448 # If this tree is checked out from the github mirror, use the same access
449 # method for other things checked out from github (e.g. swig) so we avoid
450 # firewall issues. If there's no default remote, the git config command
451 # will exit with status 1, so ignore that failure.
452 origin_url=`git config remote.origin.url||:`
453 case $origin_url in
454 *[@/]github.com[:/]*)
455 github_base_url=`echo "X$origin_url"|sed 's/^X//;s!\([@/]github.com[:/]\).*!\1!'` ;;
457 github_base_url=https://github.com/ ;;
458 esac
459 swig_origin_url=${github_base_url}swig/swig.git
461 if [ -z "$XAPIAN_COMMON_CLONE_URL" ] ; then
462 xapian_common_clone_url=.
463 else
464 xapian_common_clone_url=$XAPIAN_COMMON_CLONE_URL
467 # Set to 'ftp' to use ftp URLs where available and 'http' to use unencrypted
468 # 'http'. By default we prefer https downloads as they are more likely to work
469 # through firewalls and better preserve user privacy.
470 download_protocol=
472 # Set to 'always' to always use a locally installed copy of the autotools
473 # or 'never' to never download.
475 # By default we check for locally installed versions and use them if they are
476 # new enough versions. But e.g. for building releases we want to use a known
477 # set of versions.
478 download_tools=ifneeded
480 # Save options which should be sticky for when "make" needs to rerun bootstrap.
481 # This should be empty or start with a space.
482 bootstrap_sticky_opts=
484 while [ "$#" -gt 0 ] ; do
485 case $1 in
486 --download-tools=*)
487 update_bootstrap_sticky_opts "$1"
488 download_tools=`echo "x$1"|sed 's/^x--download-tools=//'`
489 shift
490 continue
493 --download-tools)
494 update_bootstrap_sticky_opts "$1=$2"
495 download_tools=$2
496 shift 2
497 continue
500 --ftp)
501 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
502 download_protocol=ftp
503 shift
504 continue
507 --http)
508 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
509 download_protocol=http
510 shift
511 continue
514 --fetch-url-command=*)
515 update_bootstrap_sticky_opts "$1"
516 FETCH_URL_TOOL=`echo "x$1"|sed 's/^x--fetch-url-command=//'`
517 shift
518 continue
521 --fetch-url-command)
522 update_bootstrap_sticky_opts "$1=$2"
523 FETCH_URL_TOOL=$2
524 shift 2
525 continue
528 --clean)
529 # This probably shouldn't be sticky.
530 rm -rf INST
531 shift
532 continue
535 --without-autotools)
536 # This shouldn't be sticky.
537 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"
538 shift
539 continue
543 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
544 shift
545 break
549 echo "Unknown option '$1'" 1>&2
550 exit 1
554 break
556 esac
557 done
559 if [ "$#" -gt 0 ] ; then
560 for a in "$@" ; do
561 update_bootstrap_sticky_opts "$a"
562 done
565 case $download_tools in
566 always|ifneeded) ;;
567 never)
568 echo "warning: If stuff breaks with '--download-tools=never', you get to keep the pieces"
571 echo "Invalid --download-tools value '$download_tools'"
572 exit 1
574 esac
576 [ -d INST ] || mkdir INST
577 instdir=`pwd`/INST
579 [ -d BUILD ] || mkdir BUILD
580 cd BUILD
582 # The hex strings are SHA256 checksums for the preceding extension.
583 args='autoconf 2.71'
584 if need_to_build $args autoconf ; then
585 lazy_build $args \
586 tar.xz f14c83cfebcc9427f2c3cea7258bd90df972d92eb26752da4ddad81c87a0faa4 \
587 tar.gz 431075ad0bf529ef13cb41e9042c542381103e80015686222b8a9d4abef42a1c
588 AUTOCONF=$instdir/bin/autoconf
589 export AUTOCONF
590 AUTORECONF=$instdir/bin/autoreconf
591 export AUTORECONF
592 AUTOHEADER=$instdir/bin/autoheader
593 export AUTOHEADER
594 AUTOM4TE=$instdir/bin/autom4te
595 export AUTOM4TE
597 args='automake 1.16.5'
598 if need_to_build $args automake ; then
599 lazy_build $args \
600 tar.xz f01d58cd6d9d77fbdca9eb4bbd5ead1988228fdb73d6f7a201f5f8d6b118b469 \
601 tar.gz 07bd24ad08a64bc17250ce09ec56e921d6343903943e99ccf63bbf0705e34605
602 ACLOCAL=$instdir/bin/aclocal
603 export ACLOCAL
604 AUTOMAKE=$instdir/bin/automake
605 export AUTOMAKE
607 args='libtool 2.4.7'
608 if need_to_build $args libtool ; then
609 lazy_build $args \
610 tar.xz 4f7f217f057ce655ff22559ad221a0fd8ef84ad1fc5fcb6990cecc333aa1635d \
611 tar.gz 04e96c2404ea70c590c546eba4202a4e12722c640016c12b9b2f1ce3d481e9a8
612 LIBTOOLIZE=$instdir/bin/libtoolize
613 export LIBTOOLIZE
614 libtool_aclocal=$instdir/share/aclocal
615 else
616 libtool_aclocal=`which libtoolize|sed 's!/bin/[^/]*$!/share/aclocal!'`
617 if [ -z "$libtool_aclocal" ] ; then
618 echo "libtoolize not found"
619 exit 1
623 if [ "$1" = "--deps=libmagic" ] ; then
624 shift
625 lazy_build file 5.3.2 \
626 tar.gz 8639dc4d1b21e232285cd483604afc4a6ee810710e00e579dbe9591681722b50
629 # Save the unadorned aclocal for bootstrapping SWIG. In particular SWIG
630 # uses a modified old version of AX_CXX_COMPILE_STDCXX_11 which isn't
631 # compatible with the current version which might be in a system directory.
632 SWIG_ACLOCAL=${ACLOCAL-aclocal}
634 cd ..
636 # Add -I for in-tree macro directory first, so we use that xapian.m4 in
637 # preference to one in any directories which may be added below.
638 ACLOCAL="${ACLOCAL-aclocal} -I `pwd`/xapian-core/m4-macros -I `pwd`/xapian-letor/m4-macros"
639 export ACLOCAL
641 # It seems we also need to specify the local macros dir via -I, since
642 # even with AC_CONFIG_MACRO_DIRS([m4]) in configure.ac macros there
643 # won't be used if a version is installed in a directory specifed by
644 # -I.
645 ACLOCAL="${ACLOCAL-aclocal} -I m4"
647 aclocal_ac_dir=`${ACLOCAL-aclocal} --print-ac-dir`
648 aclocal_system_needed=
649 if [ ! -r "$aclocal_ac_dir/pkg.m4" ] ; then
650 if [ -r /usr/share/aclocal/pkg.m4 ] ; then
651 aclocal_system_needed=/usr/share/aclocal
652 elif [ -r /usr/local/share/aclocal/pkg.m4 ] ; then
653 aclocal_system_needed=/usr/local/share/aclocal
654 elif [ -r /opt/local/share/aclocal/pkg.m4 ] ; then
655 aclocal_system_needed=/opt/local/share/aclocal
659 # If the aclocal we're using is in a different prefix to the libtool we're
660 # using, we probably need to tell aclocal where to look for our libtool's
661 # macros. We also need to do this if we add -I /usr/share/aclocal below
662 # since otherwise the system libtool's macros may be used in preference.
663 if [ "$aclocal_ac_dir" != "$libtool_aclocal" ] || [ -n "$aclocal_system_needed" ]; then
664 ACLOCAL="${ACLOCAL-aclocal} -I $libtool_aclocal"
665 export ACLOCAL
668 # If we're using a non-system automake, check if pkg.m4 is in the directory
669 # aclocal looks in by default. If not and there's a system pkg.m4, tell
670 # aclocal to also look in the system aclocal directory.
671 if [ -n "$aclocal_system_needed" ] ; then
672 ACLOCAL="${ACLOCAL-aclocal} -I $aclocal_system_needed"
673 export ACLOCAL
676 case `${LIBTOOLIZE-libtoolize} --version` in
678 echo "${LIBTOOLIZE-libtoolize} not found"
679 exit 1 ;;
680 "libtoolize (GNU libtool) 1.4.*")
681 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.4 which is too old - libtool 2.2 is required."
682 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
683 exit 1 ;;
684 "libtoolize (GNU libtool) 1.5.*")
685 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.5 which is too old - libtool 2.2 is required."
686 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
687 exit 1 ;;
688 esac
690 intree_swig=no
691 modules=
692 for module in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
693 d=$module
694 if [ "$d" = swig ] ; then
695 if [ -f "xapian-bindings/.nobootstrap" ] ; then
696 # No point bootstrapping SWIG if we aren't going to use it.
697 echo "Skipping '$d' due to presence of 'xapian-bindings/.nobootstrap'."
698 continue
700 handle_git_external swig "$swig_git_commit_hash" "$swig_origin_url"
702 if [ -f "$d/configure.ac" ] || [ -f "$d/configure.in" ] ; then
704 else
705 # Skip any directories we can't bootstrap.
706 continue
708 if [ -f "$d/.nobootstrap" ] ; then
709 # Report why to save head scratching when someone forgets they created
710 # a .nobootstrap file.
711 echo "Skipping '$module' due to presence of '$d/.nobootstrap'."
712 continue
714 case $d in
715 xapian-applications/omega|xapian-letor)
716 # If someone's created a directory for common, leave it be.
717 if [ -h "$d/common" ] || [ ! -d "$d/common" ] ; then
718 # Pick omega_common_commit_hash or letor_common_commit_hash:
719 var=`echo "$d"|sed 's!.*[-/]!!g'`_common_commit_hash
720 hash=`eval echo \\\$"$var"`
721 if [ -f "$gitdir/shallow" ] ; then
722 if git reflog "$hash" -- 2> /dev/null ; then
723 : # Already have the desired commit.
724 else
725 git fetch --unshallow
728 handle_git_external "$d/.common.git" "$hash" "$xapian_common_clone_url"
729 ln -sf .common.git/xapian-core/common "$d/common"
732 esac
734 echo "Bootstrapping \`$module'"
735 [ -f "$d/preautoreconf" ] && perl "$d/preautoreconf"
737 # If we have a custom INSTALL file, preserve it since autoreconf insists on
738 # replacing INSTALL with "generic installation instructions" when --force
739 # is used. Be careful to replace it if autoreconf fails.
740 if [ -f "$d/INSTALL" ] ; then
741 if grep 'generic installation instructions' "$d/INSTALL" >/dev/null 2>&1 ; then
743 else
744 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
748 autoreconf_rc=
749 if [ swig = "$module" ] ; then
750 # SWIG provides its own bootstrapping script.
751 curdir=`pwd`
752 cd "$d"
753 ACLOCAL=$SWIG_ACLOCAL ./autogen.sh || autoreconf_rc=$?
754 cd "$curdir"
755 # Use the uninstalled wrapper for the in-tree copy of SWIG.
756 intree_swig=yes
757 else
758 # Use --install as debian's autoconf wrapper uses 2.5X if it sees it
759 # (but it doesn't check for -i).
761 # Use --force so that we update files if autoconf, automake, or libtool
762 # has been upgraded.
763 ${AUTORECONF-autoreconf} --install --force "$d" || autoreconf_rc=$?
765 if [ -f "$d/INSTALL.preserved-by-bootstrap" ] ; then
766 mv -f "$d/INSTALL.preserved-by-bootstrap" "$d/INSTALL"
768 if [ -n "$autoreconf_rc" ] ; then
769 exit $autoreconf_rc
771 for f in config.guess config.sub ; do
772 if [ -f "$d/$f" ] ; then
773 update_config "config/$f" "$d/$f"
775 done
776 modules="$modules $module"
777 done
779 # Produce an absolute path to srcdir.
780 srcdir_abs=`pwd`
782 # Generate the top-level configure script.
783 rm -f configure.tmp
784 cat <<TOP_OF_CONFIGURE > configure.tmp
785 #!/bin/sh
786 # configure each submodule in a xapian source tree
787 # Generated by Xapian top-level bootstrap script.
788 #$copyright
789 trap 'echo "configure failed"' EXIT
790 set -e
792 srcdir="$srcdir_abs"
793 modules="$modules"
795 TOP_OF_CONFIGURE
797 cat <<'MIDDLE_OF_CONFIGURE' >> configure.tmp
798 # Produced escaped version of command suitable for pasting back into sh
799 cmd=$0
800 user_CPPFLAGS=$CPPFLAGS
801 user_LDFLAGS=$LDFLAGS
802 for a ; do
803 case $a in
804 *[^-A-Za-z0-9_+=:@/.,]*)
805 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
806 cmd="$cmd $esc_a" ;;
808 cmd="$cmd $a" ;;
809 esac
810 # Capture any command-line settings of CPPFLAGS or LDFLAGS so we can override
811 # for omega. We follow the behaviour of autoconf-generated configure scripts
812 # in that command-line setting beats environment variable setting, and the
813 # last of multiple command-line settings is used.
814 case $a in
815 CPPFLAGS=*)
816 user_CPPFLAGS=`expr "x$a" : 'xCPPFLAGS=\(.*\)'` ;;
817 LDFLAGS=*)
818 user_LDFLAGS=`expr "x$a" : 'xLDFLAGS=\(.*\)'` ;;
819 esac
820 done
822 here=`pwd`
823 MIDDLE_OF_CONFIGURE
825 vars=
826 if [ yes = "$intree_swig" ] ; then
827 # We want the path to SWIG to point into srcdir, which isn't known until
828 # configure-time, so we need to expand $here in configure.
829 vars=' SWIG=$here/swig/preinst-swig'
830 elif [ -n "$SWIG" ] ; then
831 # User specified SWIG in environment, e.g. with:
832 # SWIG=/opt/swig/bin/swig ./bootstrap
833 vars=" SWIG='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
835 for tool in $autotools ; do
836 eval "val=\$$tool"
837 if [ -n "$val" ] ; then
838 echo ': ${'"$tool='$val'"'}' >> configure.tmp
839 echo "export $tool" >> configure.tmp
840 vars="$vars $tool='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
842 done
843 if [ -n "$vars" ] ; then
844 # $vars will always have a leading space.
845 echo "set$vars "'"$@"' >> configure.tmp
848 cat <<'END_OF_CONFIGURE' >> configure.tmp
849 dirs=
850 revdirs=
851 XAPIAN_CONFIG=$here/xapian-core/xapian-config
852 XAPIANLETOR_CONFIG=$here/xapian-letor/xapianletor-config
853 for d in $modules ; do
854 if [ "$here" = "$srcdir" ] ; then
855 configure=./configure
856 configure_from_here=$d/configure
857 else
858 configure=$srcdir/$d/configure
859 configure_from_here=$configure
861 if [ -f "$configure_from_here" ] ; then
862 if [ -d "$d" ] ; then : ; else
863 case $d in
864 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
865 esac
866 mkdir "$d"
868 echo "Configuring \`$d'"
869 # Replace EXIT trap with one which shows `config.log`.
870 trap 'if [ -f config.log ]; then echo "configure failed, config.log was:"; sed "s/^/| /" config.log; else echo "configure failed"; fi' EXIT
871 # Use a shared config.cache for speed and to save a bit of diskspace, but
872 # don't share it with SWIG just in case it manages to probe and cache
873 # different answers (e.g. because it uses a C compiler).
874 case $d in
875 swig)
876 case "$*" in
877 *--host=*|*--host" "*)
878 # We're cross-building, but SWIG needs to be built natively.
879 swig_configure_args=
880 skip=
881 for arg in "$@" ; do
882 if [ -n "$skip" ] ; then
883 skip=
884 continue
886 case $arg in
887 --host=*)
888 # Drop --host=xxx
889 continue ;;
890 --host)
891 # Drop --host xxx
892 skip=1
893 continue ;;
894 CC=*|CXX=*)
895 # Drop CC=xxx or CXX=xxx
896 continue ;;
897 CC_FOR_BUILD=*|CXX_FOR_BUILD=*)
898 # CC_FOR_BUILD=xxx -> CC=xxx; CXX_FOR_BUILD=xxx -> CXX=xxx
899 arg=`echo "$arg"|sed 's/_FOR_BUILD//'`
901 SWIG=*)
902 # Drop SWIG=xxx - not useful and could cause problems.
903 continue ;;
904 esac
905 swig_configure_args="$swig_configure_args "\'`printf '%s' "$arg"|sed "s/'/'\\\\\\\\''/g"`\'
906 done
907 # Also handle compilers specified in environment variables. We can
908 # just reassign them unconditionally as CC and CXX are ignored if
909 # empty.
911 CC=$CC_FOR_BUILD
912 CXX=$CC_FOR_BUILD
913 export CC
914 export CXX
915 cd "$d" && eval "$configure" $swig_configure_args
919 cd "$d" && "$configure" ${1+"$@"}
921 esac
923 xapian-core)
924 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
926 xapian-letor)
927 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking XAPIAN_CONFIG="$XAPIAN_CONFIG" --cache-file="$here/config.cache" ${1+"$@"}
929 xapian-applications/omega)
930 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+"$@"}
933 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" XAPIAN_CONFIG="$XAPIAN_CONFIG" XAPIANLETOR_CONFIG="$XAPIANLETOR_CONFIG" ${1+"$@"}
935 esac
936 # Restore EXIT trap.
937 trap 'echo "configure failed"' EXIT
938 cd "$here"
939 dirs="$dirs $d"
940 revdirs="$d $revdirs"
942 done
944 case " $* " in
945 *" --help "*|*" --version "*)
946 # Don't generate Makefile if --help or --version specified.
947 trap - EXIT
948 exit 0
950 esac
952 rm -f Makefile.tmp
953 cat <<EOF > Makefile.tmp
954 # Makefile generated by:
955 CONFIGURE_COMMAND := $cmd
957 if [ "$srcdir" != . ] ; then
958 cat <<EOF >> Makefile.tmp
960 VPATH = $srcdir
963 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
964 for target in $targets ; do
965 echo
966 echo "$target:"
967 case $target in
968 uninstall|*clean)
969 # When uninstalling or cleaning, process directories in reverse order, so
970 # that we process a directory after any directories which might use it.
971 list=$revdirs ;;
973 list=$dirs ;;
974 esac
975 for d in $list ; do
976 case $d,$target in
977 swig,install*|swig,uninstall)
978 # Nothing to do with swig when installing/uninstalling.
980 swig,dist|swig,check|swig,distcheck|swig,all)
981 # Need to ensure swig is built before "make dist", "make check", etc.
982 echo " cd $d && \$(MAKE)" ;;
983 swig,mostlyclean)
984 echo " cd $d && \$(MAKE) clean" ;;
985 xapian-bindings,distcheck)
986 # FIXME: distcheck doesn't currently work for xapian-bindings because
987 # xapian-core isn't installed.
988 echo " cd $d && \$(MAKE) check && \$(MAKE) dist" ;;
990 echo " cd $d && \$(MAKE) $target" ;;
991 esac
992 done
993 case $target in
994 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
995 esac
996 done >> Makefile.tmp
997 cat <<EOF >> Makefile.tmp
999 recheck:
1000 \$(CONFIGURE_COMMAND)
1002 Makefile: $srcdir/configure
1003 \$(CONFIGURE_COMMAND)
1005 $srcdir/configure: \\
1006 END_OF_CONFIGURE
1008 : > configure.tmp2
1010 # We want to rerun bootstrap if a series file changes (patch added or removed)
1011 # or an existing patch changes. Since we always have an series file (even if
1012 # it is empty), this also handles us adding the first patch for something.
1013 for d in patches/* ; do
1014 series=$d/series
1015 echo "$series:" >> configure.tmp2
1016 cat << END
1017 $series\\\\
1019 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
1020 while read p ; do
1021 patch=$d/$p
1022 cat << END
1023 $patch\\\\
1025 # Because there's a pipeline, this is a subshell, so use a temporary file
1026 # rather than a variable to compile a list of patches to use below.
1027 echo "$patch:" >> configure.tmp2
1028 done
1029 done >> configure.tmp
1031 cat <<'END_OF_CONFIGURE' >> configure.tmp
1032 $srcdir/bootstrap
1033 END_OF_CONFIGURE
1034 echo " \$srcdir/bootstrap$bootstrap_sticky_opts" >> configure.tmp
1035 cat <<'END_OF_CONFIGURE' >> configure.tmp
1037 .PHONY: $targets recheck
1039 # Dummy dependencies to allow removing patches we no longer need.
1040 END_OF_CONFIGURE
1042 cat configure.tmp2 >> configure.tmp
1044 cat <<'END_OF_CONFIGURE' >> configure.tmp
1046 mv -f Makefile.tmp Makefile
1047 trap - EXIT
1048 echo "Configured successfully - now run \"${MAKE-make}\""
1049 END_OF_CONFIGURE
1051 rm -f configure.tmp2
1053 chmod +x configure.tmp
1054 mv -f configure.tmp configure
1056 # git defaults to showing 7 character abbreviated hashes if that's enough to be
1057 # unique for a particular commit. But you can't paste these into trac as it
1058 # needs at least 8 hex digits to recognise a hex string as a commit hash. You
1059 # need 9 characters to be unique across all of Xapian at the time of writing,
1060 # and 12 for the Linux kernel currently (a much larger number of objects than
1061 # Xapian). 12 is a manageable length and decently future-proof, so let's use
1062 # that.
1063 core_abbrev_recommended=12
1064 core_abbrev=`git config --get core.abbrev||:`
1065 if [ -z "$core_abbrev" ] ; then
1066 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config"
1067 git config --local core.abbrev "$core_abbrev_recommended"
1068 elif [ "$core_abbrev" -lt "$core_abbrev_recommended" ] ; then
1069 if [ -z "`git config --local core.abbrev`" ] ; then
1070 # Set globally to < $core_abbrev_recommended, override in this repo.
1071 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config to override global core.abbrev=$core_abbrev"
1072 git config --local core.abbrev "$core_abbrev_recommended"
1073 else
1074 # Just warn.
1075 echo "warning: core.abbrev=$core_abbrev set on this repo, at least $core_abbrev_recommended is recommended"
1079 trap - EXIT
1080 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""