Update for 1.4.15
[xapian.git] / bootstrap
blob0f392b2b436e43cfa8d18dcadb86f3f78040b261
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 hash to use for common in omega:
406 omega_common_commit_hash=93d22819704846273079d38d12fbd5e344228407
408 if [ ! -r .git ] ; then
409 echo "$0: '.git' not found - this script should be run from a git repo cloned"
410 echo "from git://git.xapian.org/xapian or a mirror of it"
411 exit 1
414 for emptydir in xapian-applications/omega/m4 xapian-bindings/m4 ; do
415 if test -d "$emptydir" ; then
417 else
418 parent=`echo "$emptydir"|sed 's,/[^/]*$,,'`
419 if test -d "$parent" ; then
420 mkdir "$emptydir"
423 done
425 if [ -f .git ] ; then
426 : # Looks like we're in a git worktree.
427 else
428 if [ -f .git/info/exclude ] ; then
429 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' .git/info/exclude > .git/info/exclude~
430 else
431 [ -d .git/info ] || mkdir .git/info
433 cat <<END >> .git/info/exclude~
434 swig
435 xapian-applications/omega/common
437 if [ -f .git/info/exclude ] &&
438 cmp -s .git/info/exclude~ .git/info/exclude ; then
439 rm .git/info/exclude~
440 else
441 mv .git/info/exclude~ .git/info/exclude
445 # If this tree is checked out from the github mirror, use the same access
446 # method for other things checked out from github (e.g. swig) so we avoid
447 # firewall issues. If there's no default remote, the git config command
448 # will exit with status 1, so ignore that failure.
449 origin_url=`git config remote.origin.url||:`
450 case $origin_url in
451 *[@/]github.com[:/]*)
452 github_base_url=`echo "X$origin_url"|sed 's/^X//;s!\([@/]github.com[:/]\).*!\1!'` ;;
454 github_base_url=https://github.com/ ;;
455 esac
456 swig_origin_url=${github_base_url}swig/swig.git
458 if [ -z "$XAPIAN_COMMON_CLONE_URL" ] ; then
459 xapian_common_clone_url=.
460 else
461 xapian_common_clone_url=$XAPIAN_COMMON_CLONE_URL
464 # Set to 'ftp' to use ftp URLs where available and 'http' to use unencrypted
465 # 'http'. By default we prefer https downloads as they are more likely to work
466 # through firewalls and better preserve user privacy.
467 download_protocol=
469 # Set to 'always' to always use a locally installed copy of the autotools
470 # or 'never' to never download.
472 # By default we check for locally installed versions and use them if they are
473 # new enough versions. But e.g. for building releases we want to use a known
474 # set of versions.
475 download_tools=ifneeded
477 # Save options which should be sticky for when "make" needs to rerun bootstrap.
478 # This should be empty or start with a space.
479 bootstrap_sticky_opts=
481 while [ "$#" -gt 0 ] ; do
482 case $1 in
483 --download-tools=*)
484 update_bootstrap_sticky_opts "$1"
485 download_tools=`echo "x$1"|sed 's/^x--download-tools=//'`
486 shift
487 continue
490 --download-tools)
491 update_bootstrap_sticky_opts "$1=$2"
492 download_tools=$2
493 shift 2
494 continue
497 --ftp)
498 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
499 download_protocol=ftp
500 shift
501 continue
504 --http)
505 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
506 download_protocol=http
507 shift
508 continue
511 --fetch-url-command=*)
512 update_bootstrap_sticky_opts "$1"
513 FETCH_URL_TOOL=`echo "x$1"|sed 's/^x--fetch-url-command=//'`
514 shift
515 continue
518 --fetch-url-command)
519 update_bootstrap_sticky_opts "$1=$2"
520 FETCH_URL_TOOL=$2
521 shift 2
522 continue
525 --clean)
526 # This probably shouldn't be sticky.
527 rm -rf INST
528 shift
529 continue
532 --without-autotools)
533 # This shouldn't be sticky.
534 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"
535 shift
536 continue
540 bootstrap_sticky_opts="$bootstrap_sticky_opts $1"
541 shift
542 break
546 echo "Unknown option '$1'" 1>&2
547 exit 1
551 break
553 esac
554 done
556 if [ "$#" -gt 0 ] ; then
557 for a in "$@" ; do
558 update_bootstrap_sticky_opts "$a"
559 done
562 case $download_tools in
563 always|ifneeded) ;;
564 never)
565 echo "warning: If stuff breaks with '--download-tools=never', you get to keep the pieces"
568 echo "Invalid --download-tools value '$download_tools'"
569 exit 1
571 esac
573 [ -d INST ] || mkdir INST
574 instdir=`pwd`/INST
576 [ -d BUILD ] || mkdir BUILD
577 cd BUILD
579 # The hex strings are SHA256 checksums for the preceding extension.
580 args='autoconf 2.69'
581 if need_to_build $args autoconf ; then
582 lazy_build $args \
583 tar.xz 64ebcec9f8ac5b2487125a86a7760d2591ac9e1d3dbd59489633f9de62a57684 \
584 tar.gz 954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969
585 AUTOCONF=$instdir/bin/autoconf
586 export AUTOCONF
587 AUTORECONF=$instdir/bin/autoreconf
588 export AUTORECONF
589 AUTOHEADER=$instdir/bin/autoheader
590 export AUTOHEADER
591 AUTOM4TE=$instdir/bin/autom4te
592 export AUTOM4TE
594 args='automake 1.15.1'
595 if need_to_build $args automake ; then
596 lazy_build $args \
597 tar.xz af6ba39142220687c500f79b4aa2f181d9b24e4f8d8ec497cea4ba26c64bedaf \
598 tar.gz 988e32527abe052307d21c8ca000aa238b914df363a617e38f4fb89f5abf6260
599 ACLOCAL=$instdir/bin/aclocal
600 export ACLOCAL
601 AUTOMAKE=$instdir/bin/automake
602 export AUTOMAKE
604 args='libtool 2.4.6'
605 if need_to_build $args libtool ; then
606 lazy_build $args \
607 tar.xz 7c87a8c2c8c0fc9cd5019e402bed4292462d00a718a7cd5f11218153bf28b26f \
608 tar.gz e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3
609 LIBTOOLIZE=$instdir/bin/libtoolize
610 export LIBTOOLIZE
611 libtool_aclocal=$instdir/share/aclocal
612 else
613 libtool_aclocal=`which libtoolize|sed 's!/bin/[^/]*$!/share/aclocal!'`
614 if [ -z "$libtool_aclocal" ] ; then
615 echo "libtoolize not found"
616 exit 1
619 # If the aclocal we're using is in a different prefix to the libtool we're
620 # using, we probably need to tell aclocal where to look for our libtool's
621 # macros. Our directory may already by specified by other means, but it's
622 # fairly harmless to specify an explicit -I for a directory which is searched
623 # anyway - at worst it changes the search order.
624 if [ "`${ACLOCAL-aclocal} --print-ac-dir`" != "$libtool_aclocal" ] ; then
625 ACLOCAL="${ACLOCAL-aclocal} -I $libtool_aclocal"
626 export ACLOCAL
629 if [ "$1" = "--deps=libmagic" ] ; then
630 shift
631 lazy_build file 5.3.2 \
632 tar.gz 8639dc4d1b21e232285cd483604afc4a6ee810710e00e579dbe9591681722b50
635 # Save the unadorned aclocal for bootstrapping SWIG. In particular SWIG
636 # uses a modified old version of AX_CXX_COMPILE_STDCXX_11 which isn't
637 # compatible with the current version which might be in a system directory.
638 SWIG_ACLOCAL=${ACLOCAL-aclocal}
640 cd ..
642 case `${LIBTOOLIZE-libtoolize} --version` in
644 echo "${LIBTOOLIZE-libtoolize} not found"
645 exit 1 ;;
646 "libtoolize (GNU libtool) 1.4.*")
647 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.4 which is too old - libtool 2.2 is required."
648 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
649 exit 1 ;;
650 "libtoolize (GNU libtool) 1.5.*")
651 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.5 which is too old - libtool 2.2 is required."
652 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
653 exit 1 ;;
654 esac
656 ACLOCAL="${ACLOCAL-aclocal} -I `pwd`/xapian-core/m4-macros"
657 export ACLOCAL
659 intree_swig=no
660 modules=
661 for module in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
662 d=$module
663 if [ "$d" = swig ] ; then
664 if [ -f "xapian-bindings/.nobootstrap" ] ; then
665 # No point bootstrapping SWIG if we aren't going to use it.
666 echo "Skipping '$d' due to presence of 'xapian-bindings/.nobootstrap'."
667 continue
669 handle_git_external swig "$swig_git_commit_hash" "$swig_origin_url"
671 if [ -f "$d/configure.ac" -o -f "$d/configure.in" ] ; then
673 else
674 # Skip any directories we can't bootstrap.
675 continue
677 if [ -f "$d/.nobootstrap" ] ; then
678 # Report why to save head scratching when someone forgets they created
679 # a .nobootstrap file.
680 echo "Skipping '$module' due to presence of '$d/.nobootstrap'."
681 continue
683 case $d in
684 xapian-applications/omega)
685 # If someone's created a directory for common, leave it be.
686 if [ -h "$d/common" ] || [ ! -d "$d/common" ] ; then
687 hash=$omega_common_commit_hash
688 if [ -f .git/shallow ] ; then
689 if git reflog "$hash" -- 2> /dev/null ; then
690 : # Already have the desired commit.
691 else
692 git fetch --unshallow
695 handle_git_external "$d/.common.git" "$hash" "$xapian_common_clone_url"
696 ln -sf .common.git/xapian-core/common "$d/common"
699 esac
701 echo "Bootstrapping \`$module'"
702 [ -f "$d/preautoreconf" ] && perl "$d/preautoreconf"
704 # If we have a custom INSTALL file, preserve it since autoreconf insists on
705 # replacing INSTALL with "generic installation instructions" when --force
706 # is used. Be careful to replace it if autoreconf fails.
707 if [ -f "$d/INSTALL" ] ; then
708 if grep 'generic installation instructions' "$d/INSTALL" >/dev/null 2>&1 ; then
710 else
711 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
715 autoreconf_rc=
716 if [ swig = "$module" ] ; then
717 # SWIG provides its own bootstrapping script.
718 curdir=`pwd`
719 cd "$d"
720 ACLOCAL=$SWIG_ACLOCAL ./autogen.sh || autoreconf_rc=$?
721 cd "$curdir"
722 # Use the uninstalled wrapper for the in-tree copy of SWIG.
723 intree_swig=yes
724 else
725 # Use --install as debian's autoconf wrapper uses 2.5X if it sees it
726 # (but it doesn't check for -i).
728 # Use --force so that we update files if autoconf, automake, or libtool
729 # has been upgraded.
730 ${AUTORECONF-autoreconf} --install --force "$d" || autoreconf_rc=$?
732 if [ -f "$d/INSTALL.preserved-by-bootstrap" ] ; then
733 mv -f "$d/INSTALL.preserved-by-bootstrap" "$d/INSTALL"
735 if [ -n "$autoreconf_rc" ] ; then
736 exit $autoreconf_rc
738 for f in config.guess config.sub ; do
739 if [ -f "$d/$f" ] ; then
740 update_config "config/$f" "$d/$f"
742 done
743 modules="$modules $module"
744 done
746 # Produce an absolute path to srcdir.
747 srcdir_abs=`pwd`
749 # Generate the top-level configure script.
750 rm -f configure.tmp
751 cat <<TOP_OF_CONFIGURE > configure.tmp
752 #!/bin/sh
753 # configure each submodule in a xapian source tree
754 # Generated by Xapian top-level bootstrap script.
755 #$copyright
756 trap 'echo "configure failed"' EXIT
757 set -e
759 srcdir="$srcdir_abs"
760 modules="$modules"
762 TOP_OF_CONFIGURE
764 cat <<'MIDDLE_OF_CONFIGURE' >> configure.tmp
765 # Produced escaped version of command suitable for pasting back into sh
766 cmd=$0
767 user_CPPFLAGS=$CPPFLAGS
768 user_LDFLAGS=$LDFLAGS
769 for a ; do
770 case $a in
771 *[^-A-Za-z0-9_+=:@/.,]*)
772 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
773 cmd="$cmd $esc_a" ;;
775 cmd="$cmd $a" ;;
776 esac
777 # Capture any command-line settings of CPPFLAGS or LDFLAGS so we can override
778 # for omega. We follow the behaviour of autoconf-generated configure scripts
779 # in that command-line setting beats environment variable setting, and the
780 # last of multiple command-line settings is used.
781 case $a in
782 CPPFLAGS=*)
783 user_CPPFLAGS=`expr "x$a" : 'xCPPFLAGS=\(.*\)'` ;;
784 LDFLAGS=*)
785 user_LDFLAGS=`expr "x$a" : 'xLDFLAGS=\(.*\)'` ;;
786 esac
787 done
789 here=`pwd`
790 MIDDLE_OF_CONFIGURE
792 vars=
793 if [ yes = "$intree_swig" ] ; then
794 # We want the path to SWIG to point into srcdir, which isn't known until
795 # configure-time, so we need to expand $here in configure.
796 vars=' SWIG=$here/swig/preinst-swig'
797 elif [ -n "$SWIG" ] ; then
798 # User specified SWIG in environment, e.g. with:
799 # SWIG=/opt/swig/bin/swig ./bootstrap
800 vars=" SWIG='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
802 for tool in $autotools ; do
803 eval "val=\$$tool"
804 if [ -n "$val" ] ; then
805 echo ': ${'"$tool='$val'"'}' >> configure.tmp
806 echo "export $tool" >> configure.tmp
807 vars="$vars $tool='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
809 done
810 if [ -n "$vars" ] ; then
811 # $vars will always have a leading space.
812 echo "set$vars "'"$@"' >> configure.tmp
815 cat <<'END_OF_CONFIGURE' >> configure.tmp
816 dirs=
817 revdirs=
818 XAPIAN_CONFIG=$here/xapian-core/xapian-config
819 for d in $modules ; do
820 if [ "$here" = "$srcdir" ] ; then
821 configure=./configure
822 configure_from_here=$d/configure
823 else
824 configure=$srcdir/$d/configure
825 configure_from_here=$configure
827 if [ -f "$configure_from_here" ] ; then
828 if [ -d "$d" ] ; then : ; else
829 case $d in
830 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
831 esac
832 mkdir "$d"
834 echo "Configuring \`$d'"
835 # Use a shared config.cache for speed and to save a bit of diskspace, but
836 # don't share it with SWIG just in case it manages to probe and cache
837 # different answers (e.g. because it uses a C compiler).
838 case $d in
839 swig)
840 case "$*" in
841 *--host=*|*--host" "*)
842 # We're cross-building, but SWIG needs to be built natively.
843 swig_configure_args=
844 skip=
845 for arg in "$@" ; do
846 if [ -n "$skip" ] ; then
847 skip=
848 continue
850 case $arg in
851 --host=*)
852 # Drop --host=xxx
853 continue ;;
854 --host)
855 # Drop --host xxx
856 skip=1
857 continue ;;
858 CC=*|CXX=*)
859 # Drop CC=xxx or CXX=xxx
860 continue ;;
861 CC_FOR_BUILD=*|CXX_FOR_BUILD=*)
862 # CC_FOR_BUILD=xxx -> CC=xxx; CXX_FOR_BUILD=xxx -> CXX=xxx
863 arg=`echo "$arg"|sed 's/_FOR_BUILD//'`
865 SWIG=*)
866 # Drop SWIG=xxx - not useful and could cause problems.
867 continue ;;
868 esac
869 swig_configure_args="$swig_configure_args "\'`echo "x$arg"|sed "s/^x//;s/'/'\\\\\\\\''/g"`\'
870 done
871 # Also handle compilers specified in environment variables. We can
872 # just reassign them unconditionally as CC and CXX are ignored if
873 # empty.
874 cd "$d" && CC=$CC_FOR_BUILD CXX=$CXX_FOR_BUILD "$configure" `eval echo $swig_configure_args`
877 cd "$d" && "$configure" ${1+"$@"}
879 esac
881 xapian-core)
882 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
884 xapian-applications/omega)
885 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+"$@"}
888 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" XAPIAN_CONFIG="$XAPIAN_CONFIG" ${1+"$@"}
890 esac
891 cd "$here"
892 dirs="$dirs $d"
893 revdirs="$d $revdirs"
895 done
897 case " $* " in
898 *" --help "*|*" --version "*)
899 # Don't generate Makefile if --help or --version specified.
900 trap - EXIT
901 exit 0
903 esac
905 rm -f Makefile.tmp
906 cat <<EOF > Makefile.tmp
907 # Makefile generated by:
908 CONFIGURE_COMMAND := $cmd
910 if [ "$srcdir" != . ] ; then
911 cat <<EOF >> Makefile.tmp
913 VPATH = $srcdir
916 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
917 for target in $targets ; do
918 echo
919 echo "$target:"
920 case $target in
921 uninstall|*clean)
922 # When uninstalling or cleaning, process directories in reverse order, so
923 # that we process a directory after any directories which might use it.
924 list=$revdirs ;;
926 list=$dirs ;;
927 esac
928 for d in $list ; do
929 case $d,$target in
930 swig,install*|swig,uninstall)
931 # Nothing to do with swig when installing/uninstalling.
933 swig,dist|swig,check|swig,distcheck|swig,all)
934 # Need to ensure swig is built before "make dist", "make check", etc.
935 echo " cd $d && \$(MAKE)" ;;
936 swig,mostlyclean)
937 echo " cd $d && \$(MAKE) clean" ;;
938 xapian-bindings,distcheck)
939 # FIXME: distcheck doesn't currently work for xapian-bindings because
940 # xapian-core isn't installed.
941 echo " cd $d && \$(MAKE) check && \$(MAKE) dist" ;;
943 echo " cd $d && \$(MAKE) $target" ;;
944 esac
945 done
946 case $target in
947 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
948 esac
949 done >> Makefile.tmp
950 cat <<EOF >> Makefile.tmp
952 recheck:
953 \$(CONFIGURE_COMMAND)
955 Makefile: $srcdir/configure
956 \$(CONFIGURE_COMMAND)
958 $srcdir/configure: \\
959 END_OF_CONFIGURE
961 : > configure.tmp2
963 # We want to rerun bootstrap if a series file changes (patch added or removed)
964 # or an existing patch changes. Since we always have an series file (even if
965 # it is empty), this also handles us adding the first patch for something.
966 patches=
967 for d in patches/* ; do
968 series=$d/series
969 echo "$series:" >> configure.tmp2
970 cat << END
971 $series\\\\
973 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
974 while read p ; do
975 patch=$d/$p
976 cat << END
977 $patch\\\\
979 # Because there's a pipeline, this is a subshell, so use a temporary file
980 # rather than a variable to compile a list of patches to use below.
981 echo "$patch:" >> configure.tmp2
982 done
983 done >> configure.tmp
985 cat <<'END_OF_CONFIGURE' >> configure.tmp
986 $srcdir/bootstrap
987 END_OF_CONFIGURE
988 echo " \$srcdir/bootstrap$bootstrap_sticky_opts" >> configure.tmp
989 cat <<'END_OF_CONFIGURE' >> configure.tmp
991 .PHONY: $targets recheck
993 # Dummy dependencies to allow removing patches we no longer need.
994 END_OF_CONFIGURE
996 cat configure.tmp2 >> configure.tmp
998 cat <<'END_OF_CONFIGURE' >> configure.tmp
1000 mv -f Makefile.tmp Makefile
1001 trap - EXIT
1002 echo "Configured successfully - now run \"${MAKE-make}\""
1003 END_OF_CONFIGURE
1005 rm -f configure.tmp2
1007 chmod +x configure.tmp
1008 mv -f configure.tmp configure
1010 # git defaults to showing 7 character abbreviated hashes if that's enough to be
1011 # unique for a particular commit. But you can't paste these into trac as it
1012 # needs at least 8 hex digits to recognise a hex string as a commit hash. You
1013 # need 9 characters to be unique across all of Xapian at the time of writing,
1014 # and 12 for the Linux kernel currently (a much larger number of objects than
1015 # Xapian). 12 is a manageable length and decently future-proof, so let's use
1016 # that.
1017 core_abbrev_recommended=12
1018 core_abbrev=`git config --get core.abbrev||:`
1019 if [ -z "$core_abbrev" ] ; then
1020 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config"
1021 git config --local core.abbrev "$core_abbrev_recommended"
1022 elif [ "$core_abbrev" -lt "$core_abbrev_recommended" ] ; then
1023 if [ -z "`git config --local core.abbrev`" ] ; then
1024 # Set globally to < $core_abbrev_recommended, override in this repo.
1025 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config to override global core.abbrev=$core_abbrev"
1026 git config --local core.abbrev "$core_abbrev_recommended"
1027 else
1028 # Just warn.
1029 echo "warning: core.abbrev=$core_abbrev set on this repo, at least $core_abbrev_recommended is recommended"
1033 trap - EXIT
1034 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""