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"
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
24 if [ "$1" = "--help" ] ; then
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.
34 trap 'echo "Bootstrap failed"' EXIT
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.
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/.* //"' \
54 if [ -z "$SHA256SUM_TOOL" ] ; then
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
62 # Sanity check by hashing empty input.
63 r
=`:|eval "$SHA256SUM_TOOL"`
64 [ X
"$r" != Xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
] ||
break
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_"
73 file "$tarball_" || true
74 mv "$tarball_" "$tarball_.$r"
75 echo "Renamed $tarball_ to $tarball_.$r"
81 # This function is expected to be used in 'if' so we can't rely on set -e
82 # being in effect here.
90 if [ "$1" != "$v" ] ; then
91 if [ -z "$1" ] ||
[ "$1" -lt "$v" ] ; then
103 # This function is expected to be used in 'if' so we can't rely on set -e
104 # being in effect here.
109 case $download_tools in
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"
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"
127 if check_at_least
"$version_installed" "$version" ; then
128 echo "$binary $version_installed installed >= $version required"
142 basename=$package-$version
146 if [ "$ext" = "tar.xz" ] ; then
147 if [ -z "$xz_ok" ] ; then
148 if ${XZ-xz} --version > /dev
/null
2>&1 ; then
154 if [ "$xz_ok" = 0 ] ; then
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
170 if [ "$bz2_ok" = 0 ] ; then
176 tarball
=$basename.
$ext
178 *[24680][a-z
]) basename=`echo "$basename"|sed 's/[a-z]$//'` ;;
181 # Create the stamp file in INST so that rerunning bootstrap after
182 # "rm -rf INST" recovers nicely.
183 stamp
=..
/INST
/$package.stamp
186 # Download the tarball if required.
187 if [ ! -f "$tarball" ] ; then
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
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
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"
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,
221 then rerun this script.
226 url
="https://github.com/xapian/xapian-dev-deps/releases/download/current/$tarball"
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.
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" ;;
240 case $download_protocol in
241 ftp) url
="ftp://ftp.gnu.org/gnu/$package/$tarball" ;;
242 http
) url
="http://ftpmirror.gnu.org/$package/$tarball" ;;
245 case $download_protocol,$url in
247 echo "warning: No http: link for $tarball available, using https:"
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"
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`
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"
288 */*) ;; # Only expire tarballs from the main worktree.
290 case `git worktree list --porcelain 2>/dev/null|grep -c '^worktree '` in
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"
304 ${XZ-xz} -dc "$tarball"|
tar xf
- ||
exit $?
;;
306 bzip2 -dc "$tarball"|
tar xf
- ||
exit $?
;;
308 gzip -dc "$tarball"|
tar xf
- ||
exit $?
;;
311 cd "$basename" ||
exit $?
313 series
="../../patches/$package/series"
314 if [ ! -f "$series" ] ; then
316 No patch series file 'patches/$package/series' - if there are no patches,
317 this should just be an empty file.
321 if [ -s "$series" ] ; then
322 echo "Applying patches from $package/series"
323 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" | \
325 echo "Applying patch $package/$p"
326 patch -p1 < "../../patches/$package/$p" ||
exit $?
330 echo "Configuring $package"
331 if test -n "$AUTOCONF" ; then
332 .
/configure
--prefix "$instdir" AUTOCONF
="$AUTOCONF" ||
exit $?
334 .
/configure
--prefix "$instdir" ||
exit $?
336 echo "Building $package"
338 echo "Installing $package"
339 make install ||
exit $?
340 echo "Done installing $package"
342 rm -rf "$basename" ||
exit $?
344 touch "$stamp" ||
exit $?
349 handle_git_external
() {
351 if [ ! -f "$path/.nobootstrap" ] ; then
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
359 (cd "$path" && git fetch
)
361 (cd "$path" && git checkout
"$rev")
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.
378 update_bootstrap_sticky_opts
() {
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"
393 # cd to srcdir if we aren't already there.
394 srcdir
=`echo "$0"|sed 's!/*[^/]*$!!'`
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"
420 for emptydir
in xapian-applications
/omega
/m4 xapian-bindings
/m4 xapian-letor
/m4 ; do
421 if test -d "$emptydir" ; then
424 parent
=`echo "$emptydir"|sed 's,/[^/]*$,,'`
425 if test -d "$parent" ; then
431 if [ -f "$gitdir/info/exclude" ] ; then
432 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' "$gitdir/info/exclude" > "$gitdir/info/exclude~"
434 [ -d "$gitdir/info" ] || mkdir
"$gitdir/info"
436 cat <<END >> "$gitdir/info/exclude~"
438 xapian-applications/omega/common
441 if [ -f "$gitdir/info/exclude" ] &&
442 cmp -s "$gitdir/info/exclude~" "$gitdir/info/exclude" ; then
443 rm "$gitdir/info/exclude~"
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||:`
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
/ ;;
459 swig_origin_url
=${github_base_url}swig
/swig.git
461 if [ -z "$XAPIAN_COMMON_CLONE_URL" ] ; then
462 xapian_common_clone_url
=.
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.
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
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
487 update_bootstrap_sticky_opts
"$1"
488 download_tools
=`echo "x$1"|sed 's/^x--download-tools=//'`
494 update_bootstrap_sticky_opts
"$1=$2"
501 bootstrap_sticky_opts
="$bootstrap_sticky_opts $1"
502 download_protocol
=ftp
508 bootstrap_sticky_opts
="$bootstrap_sticky_opts $1"
509 download_protocol
=http
514 --fetch-url-command=*)
515 update_bootstrap_sticky_opts
"$1"
516 FETCH_URL_TOOL
=`echo "x$1"|sed 's/^x--fetch-url-command=//'`
522 update_bootstrap_sticky_opts
"$1=$2"
529 # This probably shouldn't be sticky.
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"
543 bootstrap_sticky_opts
="$bootstrap_sticky_opts $1"
549 echo "Unknown option '$1'" 1>&2
559 if [ "$#" -gt 0 ] ; then
561 update_bootstrap_sticky_opts
"$a"
565 case $download_tools in
568 echo "warning: If stuff breaks with '--download-tools=never', you get to keep the pieces"
571 echo "Invalid --download-tools value '$download_tools'"
576 [ -d INST
] || mkdir INST
579 [ -d BUILD
] || mkdir BUILD
582 # The hex strings are SHA256 checksums for the preceding extension.
584 if need_to_build
$args autoconf
; then
586 tar.xz f14c83cfebcc9427f2c3cea7258bd90df972d92eb26752da4ddad81c87a0faa4 \
587 tar.gz
431075ad0bf529ef13cb41e9042c542381103e80015686222b8a9d4abef42a1c
588 AUTOCONF
=$instdir/bin
/autoconf
590 AUTORECONF
=$instdir/bin
/autoreconf
592 AUTOHEADER
=$instdir/bin
/autoheader
594 AUTOM4TE
=$instdir/bin
/autom4te
597 args
='automake 1.16.5'
598 if need_to_build
$args automake
; then
600 tar.xz f01d58cd6d9d77fbdca9eb4bbd5ead1988228fdb73d6f7a201f5f8d6b118b469 \
601 tar.gz
07bd24ad08a64bc17250ce09ec56e921d6343903943e99ccf63bbf0705e34605
602 ACLOCAL
=$instdir/bin
/aclocal
604 AUTOMAKE
=$instdir/bin
/automake
608 if need_to_build
$args libtool
; then
610 tar.xz
4f7f217f057ce655ff22559ad221a0fd8ef84ad1fc5fcb6990cecc333aa1635d \
611 tar.gz
04e96c2404ea70c590c546eba4202a4e12722c640016c12b9b2f1ce3d481e9a8
612 LIBTOOLIZE
=$instdir/bin
/libtoolize
614 libtool_aclocal
=$instdir/share
/aclocal
616 libtool_aclocal
=`which libtoolize|sed 's!/bin/[^/]*$!/share/aclocal!'`
617 if [ -z "$libtool_aclocal" ] ; then
618 echo "libtoolize not found"
623 if [ "$1" = "--deps=libmagic" ] ; then
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}
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"
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
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"
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"
676 case `${LIBTOOLIZE-libtoolize} --version` in
678 echo "${LIBTOOLIZE-libtoolize} not found"
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."
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."
692 for module
in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
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'."
700 handle_git_external swig
"$swig_git_commit_hash" "$swig_origin_url"
702 if [ -f "$d/configure.ac" ] ||
[ -f "$d/configure.in" ] ; then
705 # Skip any directories we can't bootstrap.
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'."
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.
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"
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
744 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
749 if [ swig
= "$module" ] ; then
750 # SWIG provides its own bootstrapping script.
753 ACLOCAL
=$SWIG_ACLOCAL .
/autogen.sh || autoreconf_rc
=$?
755 # Use the uninstalled wrapper for the in-tree copy of SWIG.
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
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
771 for f
in config.guess config.sub
; do
772 if [ -f "$d/$f" ] ; then
773 update_config
"config/$f" "$d/$f"
776 modules
="$modules $module"
779 # Produce an absolute path to srcdir.
782 # Generate the top-level configure script.
784 cat <<TOP_OF_CONFIGURE > configure.tmp
786 # configure each submodule in a xapian source tree
787 # Generated by Xapian top-level bootstrap script.
789 trap 'echo "configure failed"' EXIT
797 cat <<'MIDDLE_OF_CONFIGURE' >> configure.tmp
798 # Produced escaped version of command suitable for pasting back into sh
800 user_CPPFLAGS=$CPPFLAGS
801 user_LDFLAGS=$LDFLAGS
804 *[^-A-Za-z0-9_+=:@/.,]*)
805 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
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.
816 user_CPPFLAGS=`expr "x$a" : 'xCPPFLAGS=\(.*\)'` ;;
818 user_LDFLAGS=`expr "x$a" : 'xLDFLAGS=\(.*\)'` ;;
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
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'`"'"
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
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
858 configure=$srcdir/$d/configure
859 configure_from_here=$configure
861 if [ -f "$configure_from_here" ] ; then
862 if [ -d "$d" ] ; then : ; else
864 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
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).
877 *--host=*|*--host" "*)
878 # We're cross-building, but SWIG needs to be built natively.
882 if [ -n "$skip" ] ; then
895 # Drop CC=xxx or CXX=xxx
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//'`
902 # Drop SWIG=xxx - not useful and could cause problems.
905 swig_configure_args="$swig_configure_args "\'`printf '%s' "$arg"|sed "s/'/'\\\\\\\\''/g"`\'
907 # Also handle compilers specified in environment variables. We can
908 # just reassign them unconditionally as CC and CXX are ignored if
915 cd "$d" && eval "$configure" $swig_configure_args
919 cd "$d" && "$configure" ${1+"$@"}
924 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
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+"$@"}
937 trap 'echo "configure failed"' EXIT
940 revdirs="$d $revdirs"
945 *" --help "*|*" --version "*)
946 # Don't generate Makefile if --help or --version specified.
953 cat <<EOF > Makefile.tmp
954 # Makefile generated by:
955 CONFIGURE_COMMAND := $cmd
957 if [ "$srcdir" != . ] ; then
958 cat <<EOF >> Makefile.tmp
963 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
964 for target in $targets ; do
969 # When uninstalling or cleaning, process directories in reverse order, so
970 # that we process a directory after any directories which might use it.
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)" ;;
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" ;;
994 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
997 cat <<EOF >> Makefile.tmp
1000 \$(CONFIGURE_COMMAND)
1002 Makefile: $srcdir/configure
1003 \$(CONFIGURE_COMMAND)
1005 $srcdir/configure: \\
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
1015 echo "$series:" >> configure.tmp2
1019 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
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
1029 done >> configure.tmp
1031 cat <<'END_OF_CONFIGURE' >> configure.tmp
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.
1042 cat configure.tmp2
>> configure.tmp
1044 cat <<'END_OF_CONFIGURE' >> configure.tmp
1046 mv -f Makefile.tmp Makefile
1048 echo "Configured successfully - now run \"${MAKE-make}\""
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
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"
1075 echo "warning: core.abbrev=$core_abbrev set on this repo, at least $core_abbrev_recommended is recommended"
1080 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""