bootstrap: Use automake 1.16.1 instead of 1.15.1
[xapian.git] / bootstrap
blobd2323e965df62b3b0584371c022c2fa1e4baf3cd
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 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)] [--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 or curl).
41 FETCH_URL_TOOL=
43 check_checksum() {
44 # This function is expected to be used in 'if' so we can't rely on set -e
45 # being in effect here.
46 checksum=$1
47 tarball=$2
49 if [ -z "$SHA256SUM_TOOL" ] ; then
50 for SHA256SUM_TOOL in \
51 '${SHA256SUM-sha256sum} 2>/dev/null|cut -d\ -f1' \
52 '${SHASUM-shasum} -a256 2>/dev/null|cut -d\ -f1' \
53 '${OPENSSL-openssl} sha256 2>/dev/null|sed "s/.* //"' \
54 '' ; do
55 if [ -z "$SHA256SUM_TOOL" ] ; then
56 echo <<'END'
57 Need sha256sum or shasum or openssl installed to check SHA256 checksums.
58 Set environment variable SHA256SUM, SHASUM or OPENSSL if the tool isn't on
59 your PATH.
60 END
61 exit 1
63 # Sanity check by hashing empty input.
64 r=`:|eval "$SHA256SUM_TOOL"`
65 [ X"$r" != Xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ] || break
66 done
68 r=`< $tarball eval "$SHA256SUM_TOOL"`
69 if [ X"$r" != X"$checksum" ] ; then
70 echo "$tarball: computed SHA256 checksum did NOT match"
71 echo "computed: $r with $SHA256SUM_TOOL"
72 echo "expected: $checksum"
73 ls -l $tarball
74 file $tarball || true
75 mv "$tarball" "$tarball.$r"
76 echo "Renamed $tarball to $tarball.$r"
77 exit 1
81 check_at_least() {
82 # This function is expected to be used in 'if' so we can't rely on set -e
83 # being in effect here.
84 v1=$1
85 v2=$2
86 save_IFS=$IFS
87 IFS=.
88 set x $v1
89 for v in $v2 ; do
90 shift
91 if [ "$1" != "$v" ] ; then
92 if [ -z "$1" ] || [ "$1" -lt "$v" ] ; then
93 IFS=$save_IFS
94 return 1
96 break
98 done
99 IFS=$save_IFS
100 return 0
103 lazy_build() {
104 # This function is expected to be used in 'if' so we can't rely on set -e
105 # being in effect here.
106 package=$1
107 binary=$2
108 version=$3
110 case $download_tools in
111 always) ;;
112 never)
113 return 1
116 if [ -n $binary ] ; then
117 if [ -s "../patches/$package/series" ] ; then
118 echo "There are patches to apply to $package so it has to be built"
119 else
120 # Check if a new enough version is already installed.
121 version_installed=`"$binary" --version 2>/dev/null|sed '1,1 s/.* //p;d'`
122 if [ -n "$version_installed" ] ; then
123 # Fast track equality.
124 if [ "$version_installed" = "$version" ] ; then
125 echo "$binary $version_installed installed, exactly what's needed"
126 return 1
128 if check_at_least "$version_installed" "$version" ; then
129 echo "$binary $version_installed installed >= $version required"
130 return 1
136 esac
138 basename=$package-$version
139 ext=$4
140 checksum=$5
142 if [ "$ext" = "tar.xz" ] ; then
143 if [ -z "$xz_ok" ] ; then
144 if ${XZ-xz} --version > /dev/null 2>&1 ; then
145 xz_ok=1
146 else
147 xz_ok=0
150 if [ "$xz_ok" = 0 ] ; then
151 shift 2
152 ext=$4
153 checksum=$5
156 if [ "$ext" = "tar.bz2" ] ; then
157 if [ -z "$bz2_ok" ] ; then
158 # bzip2 --version doesn't exit with code 0 in upstream version (though
159 # Debian at least patch this bug), so use --help to check it.
160 if bzip2 --help > /dev/null 2>&1 ; then
161 bz2_ok=1
162 else
163 bz2_ok=0
166 if [ "$bz2_ok" = 0 ] ; then
167 shift 2
168 ext=$4
169 checksum=$5
172 tarball=$basename.$ext
173 case $basename in
174 *[24680][a-z]) basename=`echo "$basename"|sed 's/[a-z]$//'` ;;
175 esac
177 # Create the stamp file in INST so that rerunning bootstrap after
178 # "rm -rf INST" recovers nicely.
179 stamp=../INST/$package.stamp
181 # Download the tarball if required.
182 if [ ! -f "$tarball" ] ; then
183 if [ -z "$FETCH_URL_TOOL" ] ; then
184 if ${WGET-wget} --version > /dev/null 2>&1 ; then
185 FETCH_URL_TOOL="${WGET-wget} -O-"
186 elif ${CURL-curl} --version > /dev/null 2>&1 || [ "$?" = 2 ] ; then
187 # curl --version exits with code 2.
188 # -L is needed to follow HTTP redirects.
189 FETCH_URL_TOOL="${CURL-curl} -L"
190 elif ${LWP_REQUEST-lwp-request} -v > /dev/null 2>&1 || [ "$?" = 9 -o "$?" = 255 ] ; then
191 # lwp-request -v exits with code 9 (5.810) or 255 (6.03)
192 FETCH_URL_TOOL="${LWP_REQUEST-lwp-request} -mGET"
193 else
194 cat <<END >&2
195 Neither wget nor curl nor lwp-request found - install one of them or if already
196 installed, set WGET, CURL or LWP_REQUEST to the full path. Alternatively,
197 download $url
198 to directory `pwd`
199 then rerun this script.
201 exit 1
204 url="https://github.com/xapian/xapian-dev-deps/releases/download/current/$tarball"
205 case $basename in
206 file-*)
207 case $download_protocol in
208 ftp) url="ftp://ftp.astron.com/pub/file/$tarball" ;;
209 # We used to use http://fossies.org/ but that now redirects to https.
210 esac ;;
211 *[13579][a-z])
212 # GNU alpha release
213 case $download_protocol in
214 ftp) url="ftp://alpha.gnu.org/gnu/$package/$tarball" ;;
215 http) url="http://alpha.gnu.org/gnu/$package/$tarball" ;;
216 esac ;;
218 case $download_protocol in
219 ftp) url="ftp://ftp.gnu.org/gnu/$package/$tarball" ;;
220 http) url="http://ftpmirror.gnu.org/$package/$tarball" ;;
221 esac ;;
222 esac
223 case $download_protocol,$url in
224 http,https:*)
225 echo "warning: No http: link for $tarball available, using https:"
227 esac
228 rm -f download.tmp
229 echo "Downloading <$url>"
230 $FETCH_URL_TOOL "$url" > download.tmp || exit $?
231 mv download.tmp "$tarball"
234 if [ -f "$stamp" ] ; then
235 find_stdout=`find "$tarball" ../patches/"$package"/* -newer "$stamp" -print 2> /dev/null||true`
236 else
237 find_stdout=force
240 if [ -n "$find_stdout" ] ; then
241 # Verify the tarball's checksum before building it.
242 check_checksum "$checksum" "$tarball"
244 # Remove tarballs of other versions.
245 for f in "$package"-* ; do
246 [ "$f" = "$tarball" ] || rm -rf "$f"
247 done
249 case $ext in
250 tar.xz)
251 ${XZ-xz} -dc "$tarball"| tar xf - || exit $? ;;
252 tar.bz2)
253 bzip2 -dc "$tarball"| tar xf - || exit $? ;;
255 gzip -dc "$tarball"| tar xf - || exit $? ;;
256 esac
258 cd "$basename" || exit $?
260 series="../../patches/$package/series"
261 if [ ! -f "$series" ] ; then
262 cat <<END >&2
263 No patch series file 'patches/$package/series' - if there are no patches,
264 this should just be an empty file.
266 exit 1
268 if [ -s "$series" ] ; then
269 echo "Applying patches from $package/series"
270 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" | \
271 while read p ; do
272 echo "Applying patch $package/$p"
273 patch -p1 < "../../patches/$package/$p" || exit $?
274 done
277 echo "Configuring $package"
278 if test -n "$AUTOCONF" ; then
279 ./configure --prefix "$instdir" AUTOCONF="$AUTOCONF" || exit $?
280 else
281 ./configure --prefix "$instdir" || exit $?
283 echo "Building $package"
284 make || exit $?
285 echo "Installing $package"
286 make install || exit $?
287 echo "Done installing $package"
288 cd .. || exit $?
289 rm -rf "$basename" || exit $?
291 touch "$stamp" || exit $?
293 return 0
296 handle_git_external() {
297 path=$1
298 if [ ! -f "$path/.nobootstrap" ] ; then
299 rev=$2
300 url=$3
301 if [ ! -d "$path" ] ; then
302 git clone --no-checkout -- "$url" "$path"
303 elif (cd "$path" && git reflog "$rev" -- 2>/dev/null) ; then
304 : # Already have that revision locally
305 else
306 (cd "$path" && git fetch)
308 (cd "$path" && git checkout "$rev")
312 update_config() {
313 from=$1
314 to=$2
315 ts_from=`perl -ne '/^timestamp=(\W?)([-\d]+)$1/ and do {$_=$2;y/-//d;print;exit}' "$from"`
316 ts_to=`perl -ne '/^timestamp=(\W?)([-\d]+)$1/ and do {$_=$2;y/-//d;print;exit}' "$to"`
317 if [ "$ts_from" -gt "$ts_to" ] ; then
318 echo "Updating $to ($ts_to) with $from ($ts_from)"
319 # rm first in case the existing file is a symlink.
320 rm -f "$to"
321 cp "$from" "$to"
325 curdir=`pwd`
327 # cd to srcdir if we aren't already there.
328 srcdir=`echo "$0"|sed 's!/*[^/]*$!!'`
329 case $srcdir in
330 ""|.)
331 srcdir=. ;;
333 cd "$srcdir" ;;
334 esac
336 # Commit hash to pass to handle_git_external for swig.
337 swig_git_commit_hash=2c910e47ae788412b95e356c99cef5862808bf9a
339 # Commit hashes to use for common in omega and letor respectively:
340 omega_common_commit_hash=b310f9988f63cdc15b48323f9ac42f6b08c3a36c
341 letor_common_commit_hash=b310f9988f63cdc15b48323f9ac42f6b08c3a36c
343 if [ ! -d .git ] ; then
344 echo "$0: No '.git' directory found - this script should be run from a"
345 echo "git repo cloned from git://git.xapian.org/xapian or a mirror of it"
346 exit 1
349 for emptydir in xapian-applications/omega/m4 xapian-bindings/m4 xapian-letor/m4 ; do
350 if test -d "$emptydir" ; then
352 else
353 parent=`echo "$emptydir"|sed 's,/[^/]*$,,'`
354 if test -d "$parent" ; then
355 mkdir "$emptydir"
358 done
360 if [ -f .git/info/exclude ] ; then
361 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' .git/info/exclude > .git/info/exclude~
362 else
363 [ -d .git/info ] || mkdir .git/info
365 cat <<END >> .git/info/exclude~
366 swig
367 xapian-applications/omega/common
368 xapian-letor/common
370 if [ -f .git/info/exclude ] &&
371 cmp -s .git/info/exclude~ .git/info/exclude ; then
372 rm .git/info/exclude~
373 else
374 mv .git/info/exclude~ .git/info/exclude
377 # If this tree is checked out from the github mirror, use the same access
378 # method for other things checked out from github (e.g. swig) so we avoid
379 # firewall issues. If there's no default remote, the git config command
380 # will exit with status 1, so ignore that failure.
381 origin_url=`git config remote.origin.url||:`
382 case $origin_url in
383 *[@/]github.com[:/]*)
384 github_base_url=`echo "X$origin_url"|sed 's/^X//;s!\([@/]github.com[:/]\).*!\1!'` ;;
386 github_base_url=https://github.com/ ;;
387 esac
388 swig_origin_url=${github_base_url}swig/swig.git
390 if [ -z "$XAPIAN_COMMON_CLONE_URL" ] ; then
391 xapian_common_clone_url=.
392 else
393 xapian_common_clone_url=$XAPIAN_COMMON_CLONE_URL
396 # Set to 'ftp' to use ftp URLs where available and 'http' to use unencrypted
397 # 'http'. By default we prefer https downloads as they are more likely to work
398 # through firewalls and better preserve user privacy.
399 download_protocol=
401 # Set to 'always' to always use a locally installed copy of the autotools
402 # or 'never' to never download.
404 # By default we check for locally installed versions and use them if they are
405 # new enough versions. But e.g. for building releases we want to use a known
406 # set of versions.
407 download_tools=ifneeded
409 while [ "$#" -gt 0 ] ; do
410 case $1 in
411 --download-tools=*)
412 download_tools=`echo "x$1"|sed 's/x--download-tools=//'`
413 shift
414 continue
417 --download-tools)
418 download_tools=$2
419 shift 2
420 continue
423 --ftp)
424 download_protocol=ftp
425 shift
426 continue
429 --http)
430 download_protocol=http
431 shift
432 continue
435 --clean)
436 rm -rf INST
437 shift
438 continue
441 --without-autotools)
442 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"
443 shift
444 continue
448 shift
449 break
453 echo "Unknown option '$1'" 1>&2
454 exit 1
458 break
460 esac
461 done
463 case $download_tools in
464 always|ifneeded) ;;
465 never)
466 echo "warning: If stuff breaks with '--download-tools=never', you get to keep the pieces"
469 echo "Invalid --download-tools value '$download_tools'"
470 exit 1
472 esac
474 [ -d INST ] || mkdir INST
475 instdir=`pwd`/INST
477 [ -d BUILD ] || mkdir BUILD
478 cd BUILD
480 # The hex strings are SHA256 checksums for the preceding extension.
481 if lazy_build autoconf autoconf 2.69 \
482 tar.xz 64ebcec9f8ac5b2487125a86a7760d2591ac9e1d3dbd59489633f9de62a57684 \
483 tar.gz 954bd69b391edc12d6a4a51a2dd1476543da5c6bbf05a95b59dc0dd6fd4c2969 \
484 ; then
485 AUTOCONF=$instdir/bin/autoconf
486 export AUTOCONF
487 AUTORECONF=$instdir/bin/autoreconf
488 export AUTORECONF
489 AUTOHEADER=$instdir/bin/autoheader
490 export AUTOHEADER
491 AUTOM4TE=$instdir/bin/autom4te
492 export AUTOM4TE
494 if lazy_build automake automake 1.16.1 \
495 tar.xz 5d05bb38a23fd3312b10aea93840feec685bdf4a41146e78882848165d3ae921 \
496 tar.gz 608a97523f97db32f1f5d5615c98ca69326ced2054c9f82e65bade7fc4c9dea8 \
497 ; then
498 ACLOCAL=$instdir/bin/aclocal
499 export ACLOCAL
500 AUTOMAKE=$instdir/bin/automake
501 export AUTOMAKE
503 if lazy_build libtool libtool 2.4.6 \
504 tar.xz 7c87a8c2c8c0fc9cd5019e402bed4292462d00a718a7cd5f11218153bf28b26f \
505 tar.gz e3bd4d5d3d025a36c21dd6af7ea818a2afcd4dfc1ea5a17b39d7854bcd0c06e3 \
506 ; then
507 LIBTOOLIZE=$instdir/bin/libtoolize
508 export LIBTOOLIZE
509 libtool_aclocal=$instdir/share/aclocal
510 else
511 libtool_aclocal=`which libtool|sed 's!/bin/[^/]*$!/share/aclocal!'`
513 # If the aclocal we're using is in a different prefix to the libtool we're
514 # using, we probably need to tell aclocal where to look for our libtool's
515 # macros. Our directory may already by specified by other means, but it's
516 # fairly harmless to specify an explicit -I for a directory which is searched
517 # anyway - at worst it changes the search order.
518 if [ "`${ACLOCAL-aclocal} --print-ac-dir`" != "$libtool_aclocal" ] ; then
519 ACLOCAL="${ACLOCAL-aclocal} -I $libtool_aclocal"
520 export ACLOCAL
523 if [ "$1" = "--deps=libmagic" ] ; then
524 shift
525 lazy_build file '' 5.32 \
526 tar.gz 8639dc4d1b21e232285cd483604afc4a6ee810710e00e579dbe9591681722b50
529 cd ..
531 case `${LIBTOOLIZE-libtoolize} --version` in
533 echo "${LIBTOOLIZE-libtoolize} not found"
534 exit 1 ;;
535 "libtoolize (GNU libtool) 1.4.*")
536 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.4 which is too old - libtool 2.2 is required."
537 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
538 exit 1 ;;
539 "libtoolize (GNU libtool) 1.5.*")
540 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.5 which is too old - libtool 2.2 is required."
541 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
542 exit 1 ;;
543 esac
545 ACLOCAL="${ACLOCAL-aclocal} -I `pwd`/xapian-core/m4-macros"
546 export ACLOCAL
548 intree_swig=no
549 modules=
550 for module in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
551 d=$module
552 if [ "$d" = swig ] ; then
553 if [ -f "xapian-bindings/.nobootstrap" ] ; then
554 # No point bootstrapping SWIG if we aren't going to use it.
555 echo "Skipping '$d' due to presence of 'xapian-bindings/.nobootstrap'."
556 continue
558 handle_git_external swig "$swig_git_commit_hash" "$swig_origin_url"
560 if [ -f "$d/configure.ac" -o -f "$d/configure.in" ] ; then
562 else
563 # Skip any directories we can't bootstrap.
564 continue
566 if [ -f "$d/.nobootstrap" ] ; then
567 # Report why to save head scratching when someone forgets they created
568 # a .nobootstrap file.
569 echo "Skipping '$module' due to presence of '$d/.nobootstrap'."
570 continue
572 case $d in
573 xapian-applications/omega|xapian-letor)
574 # If someone's created a directory for common, leave it be.
575 if [ -h "$d/common" ] || [ ! -d "$d/common" ] ; then
576 # Pick omega_common_commit_hash or letor_common_commit_hash:
577 var=`echo "$d"|sed 's!.*[-/]!!g'`_common_commit_hash
578 hash=`eval echo \\\$"$var"`
579 handle_git_external "$d/.common.git" "$hash" "$xapian_common_clone_url"
580 ln -sf .common.git/xapian-core/common "$d/common"
583 esac
585 echo "Bootstrapping \`$module'"
586 [ -f "$d/preautoreconf" ] && "$d/preautoreconf"
588 # If we have a custom INSTALL file, preserve it since autoreconf insists on
589 # replacing INSTALL with "generic installation instructions" when --force
590 # is used. Be careful to replace it if autoreconf fails.
591 if [ -f "$d/INSTALL" ] ; then
592 if grep 'generic installation instructions' "$d/INSTALL" >/dev/null 2>&1 ; then
594 else
595 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
599 autoreconf_rc=
600 if [ swig = "$module" ] ; then
601 # SWIG provides its own bootstrapping script.
602 curdir=`pwd`
603 cd "$d"
604 ./autogen.sh || autoreconf_rc=$?
605 cd "$curdir"
606 # Use the uninstalled wrapper for the in-tree copy of SWIG.
607 intree_swig=yes
608 else
609 # Use --install as debian's autoconf wrapper uses 2.5X if it sees it
610 # (but it doesn't check for -i).
612 # Use --force so that we update files if autoconf, automake, or libtool
613 # has been upgraded.
614 ${AUTORECONF-autoreconf} --install --force "$d" || autoreconf_rc=$?
616 if [ -f "$d/INSTALL.preserved-by-bootstrap" ] ; then
617 mv -f "$d/INSTALL.preserved-by-bootstrap" "$d/INSTALL"
619 if [ -n "$autoreconf_rc" ] ; then
620 exit $autoreconf_rc
622 for f in config.guess config.sub ; do
623 if [ -f "$d/$f" ] ; then
624 update_config "config/$f" "$d/$f"
626 done
627 modules="$modules $module"
628 done
630 # Produce an absolute path to srcdir.
631 srcdir_abs=`pwd`
633 # Generate the top-level configure script.
634 rm -f configure.tmp
635 cat <<TOP_OF_CONFIGURE > configure.tmp
636 #!/bin/sh
637 # configure each submodule in a xapian source tree
638 # Generated by Xapian top-level bootstrap script.
639 #$copyright
640 trap 'echo "configure failed"' EXIT
641 set -e
643 srcdir="$srcdir_abs"
644 modules="$modules"
646 TOP_OF_CONFIGURE
648 cat <<'MIDDLE_OF_CONFIGURE' >> configure.tmp
649 # Produced escaped version of command suitable for pasting back into sh
650 cmd=$0
651 for a ; do
652 case $a in
653 *[^-A-Za-z0-9_+=:@/.,]*)
654 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
655 cmd="$cmd $esc_a" ;;
657 cmd="$cmd $a" ;;
658 esac
659 done
661 here=`pwd`
662 MIDDLE_OF_CONFIGURE
664 vars=
665 if [ yes = "$intree_swig" ] ; then
666 # We want the path to SWIG to point into srcdir, which isn't known until
667 # configure-time, so we need to expand $here in configure.
668 vars=' SWIG=$here/swig/preinst-swig'
669 elif [ -n "$SWIG" ] ; then
670 # User specified SWIG in environment, e.g. with:
671 # SWIG=/opt/swig/bin/swig ./bootstrap
672 vars=" SWIG='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
674 for tool in $autotools ; do
675 eval "val=\$$tool"
676 if [ -n "$val" ] ; then
677 echo ': ${'"$tool='$val'"'}' >> configure.tmp
678 echo "export $tool" >> configure.tmp
679 vars="$vars $tool='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
681 done
682 if [ -n "$vars" ] ; then
683 # $vars will always have a leading space.
684 echo "set$vars "'"$@"' >> configure.tmp
687 cat <<'END_OF_CONFIGURE' >> configure.tmp
688 dirs=
689 revdirs=
690 XAPIAN_CONFIG=$here/xapian-core/xapian-config
691 for d in $modules ; do
692 if [ "$here" = "$srcdir" ] ; then
693 configure=./configure
694 configure_from_here=$d/configure
695 else
696 configure=$srcdir/$d/configure
697 configure_from_here=$configure
699 if [ -f "$configure_from_here" ] ; then
700 if [ -d "$d" ] ; then : ; else
701 case $d in
702 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
703 esac
704 mkdir "$d"
706 echo "Configuring \`$d'"
707 # Use a shared config.cache for speed and to save a bit of diskspace, but
708 # don't share it with SWIG just in case it manages to probe and cache
709 # different answers (e.g. because it uses a C compiler).
710 case $d in
711 swig)
712 case "$*" in
713 *--host=*|*--host" "*)
714 # We're cross-building, but SWIG needs to be built natively.
715 swig_configure_args=
716 skip=
717 for arg in "$@" ; do
718 if [ -n "$skip" ] ; then
719 skip=
720 continue
722 case $arg in
723 --host=*)
724 # Drop --host=xxx
725 continue ;;
726 --host)
727 # Drop --host xxx
728 skip=1
729 continue ;;
730 CC=*|CXX=*)
731 # Drop CC=xxx or CXX=xxx
732 continue ;;
733 CC_FOR_BUILD=*|CXX_FOR_BUILD=*)
734 # CC_FOR_BUILD=xxx -> CC=xxx; CXX_FOR_BUILD=xxx -> CXX=xxx
735 arg=`echo "$arg"|sed 's/_FOR_BUILD//'`
737 SWIG=*)
738 # Drop SWIG=xxx - not useful and could cause problems.
739 continue ;;
740 esac
741 swig_configure_args="$swig_configure_args "\'`echo "x$arg"|sed "s/^x//;s/'/'\\\\\\\\''/g"`\'
742 done
743 # Also handle compilers specified in environment variables. We can
744 # just reassign them unconditionally as CC and CXX are ignored if
745 # empty.
746 cd "$d" && CC=$CC_FOR_BUILD CXX=$CXX_FOR_BUILD "$configure" `eval echo $swig_configure_args`
749 cd "$d" && "$configure" ${1+"$@"}
751 esac
753 xapian-core)
754 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
756 xapian-applications/omega)
757 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking XAPIAN_CONFIG="$XAPIAN_CONFIG" CPPFLAGS="-I$srcdir/INST/include" LDFLAGS="-L$srcdir/INST/lib" ${1+"$@"}
760 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" XAPIAN_CONFIG="$XAPIAN_CONFIG" ${1+"$@"}
762 esac
763 cd "$here"
764 dirs="$dirs $d"
765 revdirs="$d $revdirs"
767 done
769 case " $* " in
770 *" --help "*|*" --version "*)
771 # Don't generate Makefile if --help or --version specified.
772 trap - EXIT
773 exit 0
775 esac
777 rm -f Makefile.tmp
778 cat <<EOF > Makefile.tmp
779 # Makefile generated by:
780 CONFIGURE_COMMAND := $cmd
782 if [ "$srcdir" != . ] ; then
783 cat <<EOF >> Makefile.tmp
785 VPATH = $srcdir
788 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
789 for target in $targets ; do
790 echo
791 echo "$target:"
792 case $target in
793 uninstall|*clean)
794 # When uninstalling or cleaning, process directories in reverse order, so
795 # that we process a directory after any directories which might use it.
796 list=$revdirs ;;
798 list=$dirs ;;
799 esac
800 for d in $list ; do
801 case $d,$target in
802 swig,install*|swig,uninstall)
803 # Nothing to do with swig when installing/uninstalling.
805 swig,dist|swig,check|swig,distcheck|swig,all)
806 # Need to ensure swig is built before "make dist", "make check", etc.
807 echo " cd $d && \$(MAKE)" ;;
808 swig,mostlyclean)
809 echo " cd $d && \$(MAKE) clean" ;;
810 xapian-bindings,distcheck)
811 # FIXME: distcheck doesn't currently work for xapian-bindings because
812 # xapian-core isn't installed.
813 echo " cd $d && \$(MAKE) check && \$(MAKE) dist" ;;
815 echo " cd $d && \$(MAKE) $target" ;;
816 esac
817 done
818 case $target in
819 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
820 esac
821 done >> Makefile.tmp
822 cat <<EOF >> Makefile.tmp
824 recheck:
825 \$(CONFIGURE_COMMAND)
827 Makefile: $srcdir/configure
828 \$(CONFIGURE_COMMAND)
830 $srcdir/configure: \\
831 END_OF_CONFIGURE
833 : > configure.tmp2
835 # We want to rerun bootstrap if a series file changes (patch added or removed)
836 # or an existing patch changes. Since we always have an series file (even if
837 # it is empty), this also handles us adding the first patch for something.
838 patches=
839 for d in patches/* ; do
840 series=$d/series
841 echo "$series:" >> configure.tmp2
842 cat << END
843 $series\\\\
845 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
846 while read p ; do
847 patch=$d/$p
848 cat << END
849 $patch\\\\
851 # Because there's a pipeline, this is a subshell, so use a temporary file
852 # rather than a variable to compile a list of patches to use below.
853 echo "$patch:" >> configure.tmp2
854 done
855 done >> configure.tmp
857 cat <<'END_OF_CONFIGURE' >> configure.tmp
858 $srcdir/bootstrap
859 $srcdir/bootstrap
861 .PHONY: $targets recheck
863 # Dummy dependencies to allow removing patches we no longer need.
864 END_OF_CONFIGURE
866 cat configure.tmp2 >> configure.tmp
868 cat <<'END_OF_CONFIGURE' >> configure.tmp
870 mv -f Makefile.tmp Makefile
871 trap - EXIT
872 echo "Configured successfully - now run \"${MAKE-make}\""
873 END_OF_CONFIGURE
875 rm -f configure.tmp2
877 chmod +x configure.tmp
878 mv -f configure.tmp configure
880 # git defaults to showing 7 character abbreviated hashes if that's enough to be
881 # unique for a particular commit. But you can't paste these into trac as it
882 # needs at least 8 hex digits to recognise a hex string as a commit hash. You
883 # need 9 characters to be unique across all of Xapian at the time of writing,
884 # and 12 for the Linux kernel currently (a much larger number of objects than
885 # Xapian). 12 is a manageable length and decently future-proof, so let's use
886 # that.
887 core_abbrev_recommended=12
888 core_abbrev=`git config --get core.abbrev||:`
889 if [ -z "$core_abbrev" ] ; then
890 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config"
891 git config --local core.abbrev "$core_abbrev_recommended"
892 elif [ "$core_abbrev" -lt "$core_abbrev_recommended" ] ; then
893 if [ -z "`git config --local core.abbrev`" ] ; then
894 # Set globally to < $core_abbrev_recommended, override in this repo.
895 echo "*** Setting core.abbrev=$core_abbrev_recommended in repo config to override global core.abbrev=$core_abbrev"
896 git config --local core.abbrev "$core_abbrev_recommended"
897 else
898 # Just warn.
899 echo "warning: core.abbrev=$core_abbrev set on this repo, at least $core_abbrev_recommended is recommended"
903 trap - EXIT
904 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""