Stop using AI_V4MAPPED
[xapian.git] / bootstrap
blob60d824391d6bfff17be350e7490490ffd33027b6
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,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018 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 echo <<'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 it has to be built"
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 -o "$?" = 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|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.
403 swig_git_commit_hash=2c910e47ae788412b95e356c99cef5862808bf9a
405 # Commit hashes to use for common in omega and letor respectively:
406 omega_common_commit_hash=fbf717afcdbe04438932d37d18b63e888413e257
407 letor_common_commit_hash=fbf717afcdbe04438932d37d18b63e888413e257
409 if [ ! -r .git ] ; then
410 echo "$0: '.git' not found - this script should be run from a git repo cloned"
411 echo "from git://git.xapian.org/xapian or a mirror of it"
412 exit 1
415 for emptydir in xapian-applications/omega/m4 xapian-bindings/m4 xapian-letor/m4 ; do
416 if test -d "$emptydir" ; then
418 else
419 parent=`echo "$emptydir"|sed 's,/[^/]*$,,'`
420 if test -d "$parent" ; then
421 mkdir "$emptydir"
424 done
426 if [ -f .git ] ; then
427 : # Looks like we're in a git worktree.
428 else
429 if [ -f .git/info/exclude ] ; then
430 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' .git/info/exclude > .git/info/exclude~
431 else
432 [ -d .git/info ] || mkdir .git/info
434 cat <<END >> .git/info/exclude~
435 swig
436 xapian-applications/omega/common
437 xapian-letor/common
439 if [ -f .git/info/exclude ] &&
440 cmp -s .git/info/exclude~ .git/info/exclude ; then
441 rm .git/info/exclude~
442 else
443 mv .git/info/exclude~ .git/info/exclude
447 # If this tree is checked out from the github mirror, use the same access
448 # method for other things checked out from github (e.g. swig) so we avoid
449 # firewall issues. If there's no default remote, the git config command
450 # will exit with status 1, so ignore that failure.
451 origin_url=`git config remote.origin.url||:`
452 case $origin_url in
453 *[@/]github.com[:/]*)
454 github_base_url=`echo "X$origin_url"|sed 's/^X//;s!\([@/]github.com[:/]\).*!\1!'` ;;
456 github_base_url=https://github.com/ ;;
457 esac
458 swig_origin_url=${github_base_url}swig/swig.git
460 if [ -z "$XAPIAN_COMMON_CLONE_URL" ] ; then
461 xapian_common_clone_url=.
462 else
463 xapian_common_clone_url=$XAPIAN_COMMON_CLONE_URL
466 # Set to 'ftp' to use ftp URLs where available and 'http' to use unencrypted
467 # 'http'. By default we prefer https downloads as they are more likely to work
468 # through firewalls and better preserve user privacy.
469 download_protocol=
471 # Set to 'always' to always use a locally installed copy of the autotools
472 # or 'never' to never download.
474 # By default we check for locally installed versions and use them if they are
475 # new enough versions. But e.g. for building releases we want to use a known
476 # set of versions.
477 download_tools=ifneeded
479 # Save options which should be sticky for when "make" needs to rerun bootstrap.
480 # This should be empty or start with a space.
481 bootstrap_sticky_opts=
483 while [ "$#" -gt 0 ] ; do
484 case $1 in
485 --download-tools=*)
486 update_bootstrap_sticky_opts "$1"
487 download_tools=`echo "x$1"|sed 's/^x--download-tools=//'`
488 shift
489 continue
492 --download-tools)
493 update_bootstrap_sticky_opts "$1=$2"
494 download_tools=$2
495 shift 2
496 continue
499 --ftp)
500 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
501 download_protocol=ftp
502 shift
503 continue
506 --http)
507 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
508 download_protocol=http
509 shift
510 continue
513 --fetch-url-command=*)
514 update_bootstrap_sticky_opts "$1"
515 FETCH_URL_TOOL=`echo "x$1"|sed 's/^x--fetch-url-command=//'`
516 shift
517 continue
520 --fetch-url-command)
521 update_bootstrap_sticky_opts "$1=$2"
522 FETCH_URL_TOOL=$2
523 shift 2
524 continue
527 --clean)
528 # This probably shouldn't be sticky.
529 rm -rf INST
530 shift
531 continue
534 --without-autotools)
535 # This shouldn't be sticky.
536 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"
537 shift
538 continue
542 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
543 shift
544 break
548 echo "Unknown option '$1'" 1>&2
549 exit 1
553 break
555 esac
556 done
558 if [ "$#" -gt 0 ] ; then
559 for a in "$@" ; do
560 update_bootstrap_sticky_opts "$a"
561 done
564 case $download_tools in
565 always|ifneeded) ;;
566 never)
567 echo "warning: If stuff breaks with '--download-tools=never', you get to keep the pieces"
570 echo "Invalid --download-tools value '$download_tools'"
571 exit 1
573 esac
575 [ -d INST ] || mkdir INST
576 instdir=`pwd`/INST
578 [ -d BUILD ] || mkdir BUILD
579 cd BUILD
581 # The hex strings are SHA256 checksums for the preceding extension.
582 args='autoconf 2.69'
583 if need_to_build $args autoconf ; then
584 lazy_build $args \
585 tar.xz 64ebcec9f8ac5b2487125a86a7760d2591ac9e1d3dbd59489633f9de62a57684 \
586 tar.gz 954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969
587 AUTOCONF=$instdir/bin/autoconf
588 export AUTOCONF
589 AUTORECONF=$instdir/bin/autoreconf
590 export AUTORECONF
591 AUTOHEADER=$instdir/bin/autoheader
592 export AUTOHEADER
593 AUTOM4TE=$instdir/bin/autom4te
594 export AUTOM4TE
596 args='automake 1.16.1'
597 if need_to_build $args automake ; then
598 lazy_build $args \
599 tar.xz 5d05bb38a23fd3312b10aea93840feec685bdf4a41146e78882848165d3ae921 \
600 tar.gz 608a97523f97db32f1f5d5615c98ca69326ced2054c9f82e65bade7fc4c9dea8
601 ACLOCAL=$instdir/bin/aclocal
602 export ACLOCAL
603 AUTOMAKE=$instdir/bin/automake
604 export AUTOMAKE
606 args='libtool 2.4.6'
607 if need_to_build $args libtool ; then
608 lazy_build $args \
609 tar.xz 7c87a8c2c8c0fc9cd5019e402bed4292462d00a718a7cd5f11218153bf28b26f \
610 tar.gz e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3
611 LIBTOOLIZE=$instdir/bin/libtoolize
612 export LIBTOOLIZE
613 libtool_aclocal=$instdir/share/aclocal
614 else
615 libtool_aclocal=`which libtoolize|sed 's!/bin/[^/]*$!/share/aclocal!'`
616 if [ -z "$libtool_aclocal" ] ; then
617 echo "libtoolize not found"
618 exit 1
621 # If the aclocal we're using is in a different prefix to the libtool we're
622 # using, we probably need to tell aclocal where to look for our libtool's
623 # macros. Our directory may already by specified by other means, but it's
624 # fairly harmless to specify an explicit -I for a directory which is searched
625 # anyway - at worst it changes the search order.
626 if [ "`${ACLOCAL-aclocal} --print-ac-dir`" != "$libtool_aclocal" ] ; then
627 ACLOCAL="${ACLOCAL-aclocal} -I $libtool_aclocal"
628 export ACLOCAL
631 if [ "$1" = "--deps=libmagic" ] ; then
632 shift
633 lazy_build file 5.3.2 \
634 tar.gz 8639dc4d1b21e232285cd483604afc4a6ee810710e00e579dbe9591681722b50
637 cd ..
639 case `${LIBTOOLIZE-libtoolize} --version` in
641 echo "${LIBTOOLIZE-libtoolize} not found"
642 exit 1 ;;
643 "libtoolize (GNU libtool) 1.4.*")
644 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.4 which is too old - libtool 2.2 is required."
645 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
646 exit 1 ;;
647 "libtoolize (GNU libtool) 1.5.*")
648 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.5 which is too old - libtool 2.2 is required."
649 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
650 exit 1 ;;
651 esac
653 ACLOCAL="${ACLOCAL-aclocal} -I `pwd`/xapian-core/m4-macros"
654 export ACLOCAL
656 intree_swig=no
657 modules=
658 for module in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
659 d=$module
660 if [ "$d" = swig ] ; then
661 if [ -f "xapian-bindings/.nobootstrap" ] ; then
662 # No point bootstrapping SWIG if we aren't going to use it.
663 echo "Skipping '$d' due to presence of 'xapian-bindings/.nobootstrap'."
664 continue
666 handle_git_external swig "$swig_git_commit_hash" "$swig_origin_url"
668 if [ -f "$d/configure.ac" -o -f "$d/configure.in" ] ; then
670 else
671 # Skip any directories we can't bootstrap.
672 continue
674 if [ -f "$d/.nobootstrap" ] ; then
675 # Report why to save head scratching when someone forgets they created
676 # a .nobootstrap file.
677 echo "Skipping '$module' due to presence of '$d/.nobootstrap'."
678 continue
680 case $d in
681 xapian-applications/omega|xapian-letor)
682 # If someone's created a directory for common, leave it be.
683 if [ -h "$d/common" ] || [ ! -d "$d/common" ] ; then
684 # Pick omega_common_commit_hash or letor_common_commit_hash:
685 var=`echo "$d"|sed 's!.*[-/]!!g'`_common_commit_hash
686 hash=`eval echo \\\$"$var"`
687 handle_git_external "$d/.common.git" "$hash" "$xapian_common_clone_url"
688 ln -sf .common.git/xapian-core/common "$d/common"
691 esac
693 echo "Bootstrapping \`$module'"
694 [ -f "$d/preautoreconf" ] && perl "$d/preautoreconf"
696 # If we have a custom INSTALL file, preserve it since autoreconf insists on
697 # replacing INSTALL with "generic installation instructions" when --force
698 # is used. Be careful to replace it if autoreconf fails.
699 if [ -f "$d/INSTALL" ] ; then
700 if grep 'generic installation instructions' "$d/INSTALL" >/dev/null 2>&1 ; then
702 else
703 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
707 autoreconf_rc=
708 if [ swig = "$module" ] ; then
709 # SWIG provides its own bootstrapping script.
710 curdir=`pwd`
711 cd "$d"
712 ./autogen.sh || autoreconf_rc=$?
713 cd "$curdir"
714 # Use the uninstalled wrapper for the in-tree copy of SWIG.
715 intree_swig=yes
716 else
717 # Use --install as debian's autoconf wrapper uses 2.5X if it sees it
718 # (but it doesn't check for -i).
720 # Use --force so that we update files if autoconf, automake, or libtool
721 # has been upgraded.
722 ${AUTORECONF-autoreconf} --install --force "$d" || autoreconf_rc=$?
724 if [ -f "$d/INSTALL.preserved-by-bootstrap" ] ; then
725 mv -f "$d/INSTALL.preserved-by-bootstrap" "$d/INSTALL"
727 if [ -n "$autoreconf_rc" ] ; then
728 exit $autoreconf_rc
730 for f in config.guess config.sub ; do
731 if [ -f "$d/$f" ] ; then
732 update_config "config/$f" "$d/$f"
734 done
735 modules="$modules $module"
736 done
738 # Produce an absolute path to srcdir.
739 srcdir_abs=`pwd`
741 # Generate the top-level configure script.
742 rm -f configure.tmp
743 cat <<TOP_OF_CONFIGURE > configure.tmp
744 #!/bin/sh
745 # configure each submodule in a xapian source tree
746 # Generated by Xapian top-level bootstrap script.
747 #$copyright
748 trap 'echo "configure failed"' EXIT
749 set -e
751 srcdir="$srcdir_abs"
752 modules="$modules"
754 TOP_OF_CONFIGURE
756 cat <<'MIDDLE_OF_CONFIGURE' >> configure.tmp
757 # Produced escaped version of command suitable for pasting back into sh
758 cmd=$0
759 user_CPPFLAGS=$CPPFLAGS
760 user_LDFLAGS=$LDFLAGS
761 for a ; do
762 case $a in
763 *[^-A-Za-z0-9_+=:@/.,]*)
764 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
765 cmd="$cmd $esc_a" ;;
767 cmd="$cmd $a" ;;
768 esac
769 # Capture any command-line settings of CPPFLAGS or LDFLAGS so we can override
770 # for omega. We follow the behaviour of autoconf-generated configure scripts
771 # in that command-line setting beats environment variable setting, and the
772 # last of multiple command-line settings is used.
773 case $a in
774 CPPFLAGS=*)
775 user_CPPFLAGS=`expr "x$a" : 'xCPPFLAGS=\(.*\)'` ;;
776 LDFLAGS=*)
777 user_LDFLAGS=`expr "x$a" : 'xLDFLAGS=\(.*\)'` ;;
778 esac
779 done
781 here=`pwd`
782 MIDDLE_OF_CONFIGURE
784 vars=
785 if [ yes = "$intree_swig" ] ; then
786 # We want the path to SWIG to point into srcdir, which isn't known until
787 # configure-time, so we need to expand $here in configure.
788 vars=' SWIG=$here/swig/preinst-swig'
789 elif [ -n "$SWIG" ] ; then
790 # User specified SWIG in environment, e.g. with:
791 # SWIG=/opt/swig/bin/swig ./bootstrap
792 vars=" SWIG='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
794 for tool in $autotools ; do
795 eval "val=\$$tool"
796 if [ -n "$val" ] ; then
797 echo ': ${'"$tool='$val'"'}' >> configure.tmp
798 echo "export $tool" >> configure.tmp
799 vars="$vars $tool='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
801 done
802 if [ -n "$vars" ] ; then
803 # $vars will always have a leading space.
804 echo "set$vars "'"$@"' >> configure.tmp
807 cat <<'END_OF_CONFIGURE' >> configure.tmp
808 dirs=
809 revdirs=
810 XAPIAN_CONFIG=$here/xapian-core/xapian-config
811 for d in $modules ; do
812 if [ "$here" = "$srcdir" ] ; then
813 configure=./configure
814 configure_from_here=$d/configure
815 else
816 configure=$srcdir/$d/configure
817 configure_from_here=$configure
819 if [ -f "$configure_from_here" ] ; then
820 if [ -d "$d" ] ; then : ; else
821 case $d in
822 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
823 esac
824 mkdir "$d"
826 echo "Configuring \`$d'"
827 # Use a shared config.cache for speed and to save a bit of diskspace, but
828 # don't share it with SWIG just in case it manages to probe and cache
829 # different answers (e.g. because it uses a C compiler).
830 case $d in
831 swig)
832 case "$*" in
833 *--host=*|*--host" "*)
834 # We're cross-building, but SWIG needs to be built natively.
835 swig_configure_args=
836 skip=
837 for arg in "$@" ; do
838 if [ -n "$skip" ] ; then
839 skip=
840 continue
842 case $arg in
843 --host=*)
844 # Drop --host=xxx
845 continue ;;
846 --host)
847 # Drop --host xxx
848 skip=1
849 continue ;;
850 CC=*|CXX=*)
851 # Drop CC=xxx or CXX=xxx
852 continue ;;
853 CC_FOR_BUILD=*|CXX_FOR_BUILD=*)
854 # CC_FOR_BUILD=xxx -> CC=xxx; CXX_FOR_BUILD=xxx -> CXX=xxx
855 arg=`echo "$arg"|sed 's/_FOR_BUILD//'`
857 SWIG=*)
858 # Drop SWIG=xxx - not useful and could cause problems.
859 continue ;;
860 esac
861 swig_configure_args="$swig_configure_args "\'`echo "x$arg"|sed "s/^x//;s/'/'\\\\\\\\''/g"`\'
862 done
863 # Also handle compilers specified in environment variables. We can
864 # just reassign them unconditionally as CC and CXX are ignored if
865 # empty.
866 cd "$d" && CC=$CC_FOR_BUILD CXX=$CXX_FOR_BUILD "$configure" `eval echo $swig_configure_args`
869 cd "$d" && "$configure" ${1+"$@"}
871 esac
873 xapian-core)
874 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
876 xapian-applications/omega)
877 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+"$@"}
880 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" XAPIAN_CONFIG="$XAPIAN_CONFIG" ${1+"$@"}
882 esac
883 cd "$here"
884 dirs="$dirs $d"
885 revdirs="$d $revdirs"
887 done
889 case " $* " in
890 *" --help "*|*" --version "*)
891 # Don't generate Makefile if --help or --version specified.
892 trap - EXIT
893 exit 0
895 esac
897 rm -f Makefile.tmp
898 cat <<EOF > Makefile.tmp
899 # Makefile generated by:
900 CONFIGURE_COMMAND := $cmd
902 if [ "$srcdir" != . ] ; then
903 cat <<EOF >> Makefile.tmp
905 VPATH = $srcdir
908 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
909 for target in $targets ; do
910 echo
911 echo "$target:"
912 case $target in
913 uninstall|*clean)
914 # When uninstalling or cleaning, process directories in reverse order, so
915 # that we process a directory after any directories which might use it.
916 list=$revdirs ;;
918 list=$dirs ;;
919 esac
920 for d in $list ; do
921 case $d,$target in
922 swig,install*|swig,uninstall)
923 # Nothing to do with swig when installing/uninstalling.
925 swig,dist|swig,check|swig,distcheck|swig,all)
926 # Need to ensure swig is built before "make dist", "make check", etc.
927 echo " cd $d && \$(MAKE)" ;;
928 swig,mostlyclean)
929 echo " cd $d && \$(MAKE) clean" ;;
930 xapian-bindings,distcheck)
931 # FIXME: distcheck doesn't currently work for xapian-bindings because
932 # xapian-core isn't installed.
933 echo " cd $d && \$(MAKE) check && \$(MAKE) dist" ;;
935 echo " cd $d && \$(MAKE) $target" ;;
936 esac
937 done
938 case $target in
939 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
940 esac
941 done >> Makefile.tmp
942 cat <<EOF >> Makefile.tmp
944 recheck:
945 \$(CONFIGURE_COMMAND)
947 Makefile: $srcdir/configure
948 \$(CONFIGURE_COMMAND)
950 $srcdir/configure: \\
951 END_OF_CONFIGURE
953 : > configure.tmp2
955 # We want to rerun bootstrap if a series file changes (patch added or removed)
956 # or an existing patch changes. Since we always have an series file (even if
957 # it is empty), this also handles us adding the first patch for something.
958 patches=
959 for d in patches/* ; do
960 series=$d/series
961 echo "$series:" >> configure.tmp2
962 cat << END
963 $series\\\\
965 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
966 while read p ; do
967 patch=$d/$p
968 cat << END
969 $patch\\\\
971 # Because there's a pipeline, this is a subshell, so use a temporary file
972 # rather than a variable to compile a list of patches to use below.
973 echo "$patch:" >> configure.tmp2
974 done
975 done >> configure.tmp
977 cat <<'END_OF_CONFIGURE' >> configure.tmp
978 $srcdir/bootstrap
979 END_OF_CONFIGURE
980 echo " \$srcdir/bootstrap$bootstrap_sticky_opts" >> configure.tmp
981 cat <<'END_OF_CONFIGURE' >> configure.tmp
983 .PHONY: $targets recheck
985 # Dummy dependencies to allow removing patches we no longer need.
986 END_OF_CONFIGURE
988 cat configure.tmp2 >> configure.tmp
990 cat <<'END_OF_CONFIGURE' >> configure.tmp
992 mv -f Makefile.tmp Makefile
993 trap - EXIT
994 echo "Configured successfully - now run \"${MAKE-make}\""
995 END_OF_CONFIGURE
997 rm -f configure.tmp2
999 chmod +x configure.tmp
1000 mv -f configure.tmp configure
1002 # git defaults to showing 7 character abbreviated hashes if that's enough to be
1003 # unique for a particular commit. But you can't paste these into trac as it
1004 # needs at least 8 hex digits to recognise a hex string as a commit hash. You
1005 # need 9 characters to be unique across all of Xapian at the time of writing,
1006 # and 12 for the Linux kernel currently (a much larger number of objects than
1007 # Xapian). 12 is a manageable length and decently future-proof, so let's use
1008 # that.
1009 core_abbrev_recommended=12
1010 core_abbrev=`git config --get core.abbrev||:`
1011 if [ -z "$core_abbrev" ] ; then
1012 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config"
1013 git config --local core.abbrev "$core_abbrev_recommended"
1014 elif [ "$core_abbrev" -lt "$core_abbrev_recommended" ] ; then
1015 if [ -z "`git config --local core.abbrev`" ] ; then
1016 # Set globally to < $core_abbrev_recommended, override in this repo.
1017 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config to override global core.abbrev=$core_abbrev"
1018 git config --local core.abbrev "$core_abbrev_recommended"
1019 else
1020 # Just warn.
1021 echo "warning: core.abbrev=$core_abbrev set on this repo, at least $core_abbrev_recommended is recommended"
1025 trap - EXIT
1026 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""