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 (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015 Olly Betts
7 # This program is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU General Public License as
9 # published by the Free Software Foundation; either version 2 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
22 if [ "$1" = "--help" ] ; then
24 $0 [--ftp] [--without-autotools|--clean] [MODULE...]
26 The default is to bootstrap all known modules. Any modules which have a
27 file called ".nobootstrap" in their top-level will be skipped.
32 trap 'echo "Bootstrap failed"' EXIT
35 # The variables which specify the autotools to use. And doxygen.
36 autotools
="AUTORECONF AUTOCONF AUTOHEADER AUTOM4TE AUTOMAKE ACLOCAL LIBTOOLIZE DOXYGEN"
38 # Tool for downloading a file from a URL (currently wget or curl).
45 if [ -z "$SHA1SUM_TOOL" ] ; then
47 '${SHA1SUM-sha1sum} 2>/dev/null|cut -d\ -f1' \
48 '${SHASUM-shasum} 2>/dev/null|cut -d\ -f1' \
49 '$(OPENSSL-openssl} sha1 2>/dev/null|sed "s/.* //"' \
51 if [ -z "$SHA1SUM_TOOL" ] ; then
53 Need sha1sum or shasum or openssl installed to check SHA1 checksums.
54 Set environment variable SHA1SUM, SHASUM or OPENSSL if the tool isn't on
59 r
=`:|eval "$SHA1SUM_TOOL"`
60 [ X
"$r" != Xda39a3ee5e6b4b0d3255bfef95601890afd80709
] ||
break
63 r
=`< $tarball eval "$SHA1SUM_TOOL"`
64 if [ X
"$r" != X
"$checksum" ] ; then
65 echo "$tarball: computed SHA1 checksum did NOT match"
66 echo "computed: $r with $SHA1SUM_TOOL"
67 echo "expected: $checksum"
70 mv "$tarball" "$tarball.$r"
71 echo "Renamed $tarball to $tarball.$r"
81 if [ "$ext" = "tar.xz" ] ; then
82 if [ -z "$xz_ok" ] ; then
83 if ${XZ-xz} --version > /dev
/null
2>&1 ; then
89 if [ "$xz_ok" = 0 ] ; then
95 if [ "$ext" = "tar.bz2" ] ; then
96 if [ -z "$bz2_ok" ] ; then
97 # bzip2 --version doesn't exit with code 0 in upstream version (though
98 # Debian at least patch this bug), so use --help to check it.
99 if bzip2 --help > /dev
/null
2>&1 ; then
105 if [ "$bz2_ok" = 0 ] ; then
111 tarball
=$basename.
$ext
113 *[24680][a-z
]) basename=`echo "$basename"|sed 's/[a-z]$//'` ;;
116 # Create the stamp file in INST so that rerunning bootstrap after
117 # "rm -rf INST" recovers nicely.
118 stamp
=..
/INST
/$package.stamp
120 # Download the tarball if required.
121 if [ ! -f "$tarball" ] ; then
122 if [ -z "$FETCH_URL_TOOL" ] ; then
123 if ${WGET-wget} --version > /dev
/null
2>&1 ; then
124 FETCH_URL_TOOL
="${WGET-wget} -O-"
125 elif ${CURL-curl} --version > /dev
/null
2>&1 ||
[ "$?" = 2 ] ; then
126 # curl --version exits with code 2.
127 # -L is needed to follow HTTP redirects.
128 FETCH_URL_TOOL
="${CURL-curl} -L"
129 elif ${LWP_REQUEST-lwp-request} -v > /dev
/null
2>&1 ||
[ "$?" = 9 -o "$?" = 255 ] ; then
130 # lwp-request -v exits with code 9 (5.810) or 255 (6.03)
131 FETCH_URL_TOOL
="${LWP_REQUEST-lwp-request} -mGET"
134 Neither wget nor curl nor lwp-request found - install one of them or if already
135 installed, set WGET, CURL or LWP_REQUEST to the full path. Alternatively,
138 then rerun this script.
145 if [ "$use_ftp" = yes ] ; then
146 url
="ftp://ftp.stack.nl/pub/users/dimitri/$tarball"
148 url
="http://ftp.stack.nl/pub/users/dimitri/$tarball"
151 if [ "$use_ftp" = yes ] ; then
152 url
="ftp://ftp.astron.com/pub/file/$tarball"
154 url
="http://fossies.org/unix/misc/$tarball"
158 if [ "$use_ftp" = yes ] ; then
159 url
="ftp://alpha.gnu.org/gnu/$package/$tarball"
161 url
="http://alpha.gnu.org/gnu/$package/$tarball"
164 if [ "$use_ftp" = yes ] ; then
165 url
="ftp://ftp.gnu.org/gnu/$package/$tarball"
167 url
="http://ftpmirror.gnu.org/$package/$tarball"
171 echo "Downloading <$url>"
172 $FETCH_URL_TOOL "$url" > download.tmp
&& mv download.tmp
"$tarball"
175 if [ -f "$stamp" ] ; then
176 find_stdout
=`find "$tarball" ../patches/"$package"/* -newer "$stamp" -print 2> /dev/null||true`
181 if [ -n "$find_stdout" ] ; then
182 # Verify the tarball's checksum before building it.
183 check_sha1sum
"$checksum" "$tarball"
185 # Remove tarballs of other versions.
186 for f
in "$package"-* ; do
187 [ "$f" = "$tarball" ] ||
rm -rf "$f"
192 ${XZ-xz} -dc "$tarball"|
tar xf
- ;;
194 bzip2 -dc "$tarball"|
tar xf
- ;;
196 gzip -dc "$tarball"|
tar xf
- ;;
201 if [ ! -f "../../patches/$package/series" ] ; then
203 No patch series file 'patches/$package/series' - if there are no patches,
204 this should just be an empty file.
208 echo "Applying patches from $package/series"
209 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "../../patches/$package/series" | \
211 echo "Applying patch $package/$p"
212 patch -p1 < "../../patches/$package/$p"
215 # Fix doxygen/Qt stupid and pointless enumerating of Mac OS X releases
216 # which stops it building on each new OS X release.
217 if [ -f qtools
/qglobal.h
] ; then
218 sed 's!^[ ]*#[ ]*\(error\|warning\).*Mac *OS *X is unsupported!// &!' \
219 qtools
/qglobal.h
> qtools
/qglobal.hT
220 mv qtools
/qglobal.hT qtools
/qglobal.h
223 if test -n "$AUTOCONF" ; then
224 .
/configure
--prefix "$instdir" AUTOCONF
="$AUTOCONF"
226 .
/configure
--prefix "$instdir"
237 handle_git_external
() {
239 if [ ! -f "$path/.nobootstrap" ] ; then
242 if [ ! -d "$path" ] ; then
243 git clone
--no-checkout -- "$url" "$path"
244 elif (cd "$path" && git reflog
"$rev" -- 2>/dev
/null
) ; then
245 : # Already have that revision locally
247 (cd "$path" && git fetch
)
249 (cd "$path" && git checkout
"$rev")
256 ts_from
=`perl -ne '/^timestamp=(\W?)([-\d]+)$1/ and do {$_=$2;y/-//d;print;exit}' "$from"`
257 ts_to
=`perl -ne '/^timestamp=(\W?)([-\d]+)$1/ and do {$_=$2;y/-//d;print;exit}' "$to"`
258 if [ "$ts_from" -gt "$ts_to" ] ; then
259 echo "Updating $to ($ts_to) with $from ($ts_from)"
260 # rm first in case the existing file is a symlink.
268 # cd to srcdir if we aren't already there.
269 srcdir
=`echo "$0"|sed 's!/*[^/]*$!!'`
277 # Commit hash to pass to handle_git_external for swig.
278 swig_git_commit_hash
=210266cd7004108b074fac9da4fc97d1df0adc53
280 if [ ! -d .git
] ; then
281 echo "$0: No '.git' directory found - this script should be run from a"
282 echo "git repo cloned from git://git.xapian.org/xapian or a mirror of it"
286 for emptydir
in xapian-applications
/omega
/m4 xapian-bindings
/m4 ; do
287 if test -d "$emptydir" ; then
290 parent
=`echo "$emptydir"|sed 's,/[^/]*$,,'`
291 if test -d "$parent" ; then
297 if [ -f .git
/info
/exclude
] ; then
298 sed '/^\(swig\|xapian-applications\/omega\/common$\)/d' .git
/info
/exclude
> .git
/info
/exclude~
300 [ -d .git
/info
] || mkdir .git
/info
302 cat <<END >> .git/info/exclude~
304 xapian-applications/omega/common
306 if [ -f .git
/info
/exclude
] &&
307 cmp .git
/info
/exclude~ .git
/info
/exclude
2> /dev
/null
; then
308 rm .git
/info
/exclude~
310 mv .git
/info
/exclude~ .git
/info
/exclude
313 # If this tree is checked out from the github mirror, use the same access
314 # method for other things checked out from github (e.g. swig) so we avoid
315 # firewall issues. If there's no default remote, the git config command
316 # will exit with status 1, so ignore that failure.
317 origin_url
=`git config remote.origin.url||:`
319 *[@
/]github.com
[:/]*)
320 github_base_url
=`echo "X$origin_url"|sed 's/^X//;s!\([@/]github.com[:/]\).*!\1!'` ;;
322 github_base_url
=git
://github.com
/ ;;
324 swig_origin_url
=${github_base_url}swig
/swig.git
325 handle_git_external swig
"$swig_git_commit_hash" "$swig_origin_url"
327 # If someone's created a directory for common, leave it be.
328 if [ -h xapian-applications
/omega
/common
] || \
329 [ ! -d xapian-applications
/omega
/common
] ; then
330 handle_git_external xapian-applications
/omega
/.common.git c327a3cb93d1fb3ee1e2a1cea5abc8b95d9e53b2 .
331 ln -sf .common.git
/xapian-core
/common xapian-applications
/omega
/common
334 # Prefer http downloads as they are more likely to work through firewalls.
336 if [ "$1" = "--ftp" ] ; then
341 if [ "$1" = "--without-autotools" ] ; then
344 if [ "$1" = "--clean" ] ; then
349 [ -d INST
] || mkdir INST
352 [ -d BUILD
] || mkdir BUILD
355 # The last field is the SHA1 checksum of the tarball.
356 lazy_build doxygen
1.8.5 \
357 src.
tar.gz
1fc5ceec21122fe5037edee4c308ac94b59ee33e
358 lazy_build autoconf
2.68 \
359 tar.xz
63a3b495400c1c053f2f6b62efb7a5c0ad4156c9 \
360 tar.bz2 b534c293b22048c022b1ff3a372b9c03f26170b4 \
361 tar.gz
843f7dfcc6addf129dc2c8b12f7d72d371478f42
362 AUTOCONF
=$instdir/bin
/autoconf \
363 lazy_build automake
1.11.6 tar.gz
29d7832b148e2157e03ad0d3620fbb7f5a13bc21
364 lazy_build libtool
2.4.6 \
365 tar.xz
3e7504b832eb2dd23170c91b6af72e15b56eb94e \
366 tar.gz
25b6931265230a06f0fc2146df64c04e5ae6ec33
367 if [ "$1" = "--deps=libmagic" ] ; then
369 lazy_build
file 5.25 \
370 tar.gz fea78106dd0b7a09a61714cdbe545135563e84bd
373 for v
in $autotools ; do
374 tool
=`echo "$v"|tr A-Z a-z`
375 eval "$v=\"\$instdir\"/bin/$tool;export $v"
381 case `${LIBTOOLIZE-libtoolize} --version` in
383 echo "${LIBTOOLIZE-libtoolize} not found"
385 "libtoolize (GNU libtool) 1.4.*")
386 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.4 which is too old - libtool 2.2 is required."
387 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
389 "libtoolize (GNU libtool) 1.5.*")
390 echo "${LIBTOOLIZE-libtoolize} is from libtool 1.5 which is too old - libtool 2.2 is required."
391 echo "If you have both installed, set LIBTOOLIZE to point to the correct version."
395 ACLOCAL
="${ACLOCAL-aclocal} -I `pwd`/xapian-core/m4-macros"
400 for module
in ${@:-xapian-core xapian-applications/omega swig xapian-bindings} ; do
402 if [ -f "$d/configure.ac" -o -f "$d/configure.in" ] ; then
405 # Skip any directories we can't bootstrap.
408 if [ -f "$d/.nobootstrap" ] ; then
409 # Report why to save head scratching when someone forgets they created
410 # a .nobootstrap file.
411 echo "Skipping '$module' due to presence of '$d/.nobootstrap'."
414 if [ "$d" = swig
] && [ -f "xapian-bindings/.nobootstrap" ] ; then
415 # No point bootstrapping SWIG if we aren't going to use it.
416 echo "Skipping '$d' due to presence of 'xapian-bindings/.nobootstrap'."
419 echo "Bootstrapping \`$module'"
420 [ -f "$d/preautoreconf" ] && "$d/preautoreconf"
422 # If we have a custom INSTALL file, preserve it since autoreconf insists on
423 # replacing INSTALL with "generic installation instructions" when --force
424 # is used. Be careful to replace it if autoreconf fails.
425 if [ -f "$d/INSTALL" ] ; then
426 if grep 'generic installation instructions' "$d/INSTALL" >/dev
/null
2>&1 ; then
429 mv -f "$d/INSTALL" "$d/INSTALL.preserved-by-bootstrap"
434 if [ swig
= "$module" ] ; then
435 # SWIG provides its own bootstrapping script.
438 .
/autogen.sh || autoreconf_rc
=$?
440 # Use the uninstalled wrapper for the in-tree copy of SWIG.
443 # Use --install as debian's autoconf wrapper uses 2.5X if it sees it
444 # (but it doesn't check for -i).
446 # Use --force so that we update files if autoconf, automake, or libtool
448 ${AUTORECONF-autoreconf} --install --force "$d" || autoreconf_rc
=$?
450 if [ -f "$d/INSTALL.preserved-by-bootstrap" ] ; then
451 mv -f "$d/INSTALL.preserved-by-bootstrap" "$d/INSTALL"
453 if [ -n "$autoreconf_rc" ] ; then
456 for f
in config.guess config.sub
; do
457 if [ -f "$d/$f" ] ; then
458 update_config
"config/$f" "$d/$f"
461 modules
="$modules $module"
464 # Search::Xapian doesn't use autotools.
465 if [ -f "$srcdir/search-xapian/Makefile.PL" ] ; then
466 cd "$srcdir/search-xapian"
467 perl generate-perl-exceptions
469 modules
="$modules search-xapian"
472 # Generate the top-level configure script.
474 cat <<'TOP_OF_CONFIGURE' > configure.tmp
476 # configure each submodule in a xapian source tree
477 # Generated by Xapian top-level bootstrap script.
479 # Copyright (C) 2003,2004,2007,2008 Olly Betts
481 # This program is free software; you can redistribute it and/or
482 # modify it under the terms of the GNU General Public License as
483 # published by the Free Software Foundation; either version 2 of the
484 # License, or (at your option) any later version.
486 # This program is distributed in the hope that it will be useful,
487 # but WITHOUT ANY WARRANTY; without even the implied warranty of
488 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
489 # GNU General Public License for more details.
491 # You should have received a copy of the GNU General Public License
492 # along with this program; if not, write to the Free Software
493 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
496 trap 'echo "configure failed"' EXIT
499 # Produced escaped version of command suitable for pasting back into sh
503 *[^-A-Za-z0-9_+=:@/.,]*)
504 esc_a=`echo "$a"|sed 's!\([^-A-Za-z0-9_+=:@/.,]\)!\\\\\\1!g'`
514 # Produce an absolute path to srcdir.
516 # This section is unquoted so we can substitute variables.
517 cat <<MIDDLE_OF_CONFIGURE >> configure.tmp
523 if [ yes = "$intree_swig" ] ; then
524 # We want the path to SWIG to point into srcdir, which isn't known until
525 # configure-time, so we need to expand $here in configure. We can't just set
526 # SWIG here and let the case below handle it as that would escape the value
527 # such that $here didn't get expanded at all.
528 echo ': ${SWIG="$here/swig/preinst-swig"}' >> configure.tmp
529 echo "export SWIG" >> configure.tmp
530 vars
=' SWIG=$here/swig/preinst-swig'
531 # Kill any existing setting of SWIG so that we don't try to handle it again
535 for tool
in SWIG
$autotools ; do
537 if [ -n "$val" ] ; then
538 echo ': ${'"$tool='$val'"'}' >> configure.tmp
539 echo "export $tool" >> configure.tmp
540 vars
="$vars $tool='"`echo "$val"|sed 's/\(['"\\'"']\)/\\\1/g'`"'"
543 if [ -n "$vars" ] ; then
544 # $vars will always have a leading space.
545 echo "set$vars "'"$@"' >> configure.tmp
548 cat <<'END_OF_CONFIGURE' >> configure.tmp
551 XAPIAN_CONFIG=$here/xapian-core/xapian-config
552 for d in $modules ; do
553 if [ "$here" = "$srcdir" ] ; then
554 configure=./configure
555 configure_from_here=$d/configure
557 configure=$srcdir/$d/configure
558 configure_from_here=$configure
560 if [ -f "$configure_from_here" ] ; then
561 if [ -d "$d" ] ; then : ; else
563 xapian-applications/*) [ -d xapian-applications ] || mkdir xapian-applications ;;
567 echo "Configuring \`$d'"
568 # Use a shared config.cache for speed and to save a bit of diskspace, but
569 # don't share it with SWIG just in case it manages to probe and cache
570 # different answers (e.g. because it uses a C compiler).
573 cd "$d" && "$configure" ${1+"$@"}
576 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" ${1+"$@"}
578 xapian-applications/omega)
579 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking XAPIAN_CONFIG="$XAPIAN_CONFIG" CPPFLAGS="-I$srcdir/INST/include" LDFLAGS="-L$srcdir/INST/lib" ${1+"$@"}
582 cd "$d" && "$configure" --enable-maintainer-mode --disable-option-checking --cache-file="$here/config.cache" XAPIAN_CONFIG="$XAPIAN_CONFIG" ${1+"$@"}
587 revdirs="$d $revdirs"
588 elif [ search-xapian = "$d" ] ; then
589 if [ "$here" = "$srcdir" ] ; then
590 makefilepl=Makefile.PL
592 [ -d "$d" ] || mkdir "$d"
593 makefilepl=$srcdir/$d/Makefile.PL
596 if [ -f "$makefilepl" ] ; then
597 echo "Configuring \`$d'"
598 # Extract any parameters which we know Makefile.PL understands from
599 # from those passed to us.
614 perl "$makefilepl" XAPIAN_CONFIG="$XAPIAN_CONFIG" ${cxx_arg+"$cxx_arg"} \
615 ${cxxflags_arg+"$cxxflags_arg"} ${cppflags_arg+"$cppflags_arg"}
617 revdirs="$d $revdirs"
624 cat <<EOF > Makefile.tmp
625 # Makefile generated by:
626 CONFIGURE_COMMAND := $cmd
628 if [ "$srcdir" != . ] ; then
629 cat <<EOF >> Makefile.tmp
634 targets='all install uninstall install-strip clean distclean mostlyclean maintainer-clean dist check distcheck'
635 for target in $targets ; do
640 # When uninstalling or cleaning, process directories in reverse order, so
641 # that we process a directory after any directories which might use it.
648 swig,install*|swig,uninstall)
649 # Nothing to do with swig when installing/uninstalling.
651 swig,dist|swig,check|swig,distcheck|swig,all)
652 # Need to ensure swig is built before "make dist", "make check", etc.
653 echo " cd $d && \$(MAKE)" ;;
654 swig,mostlyclean|search-xapian,mostlyclean)
655 echo " cd $d && \$(MAKE) clean" ;;
656 search-xapian,install-strip)
657 echo " cd $d && \$(MAKE) install" ;;
658 search-xapian,maintainer-clean)
659 echo " cd $d && \$(MAKE) realclean" ;;
661 echo " cd $d && \$(MAKE) dist GZIP=-f" ;;
662 search-xapian,distcheck)
663 echo " cd $d && \$(MAKE) disttest && \$(MAKE) dist GZIP=-f" ;;
664 xapian-bindings,distcheck)
665 # FIXME: distcheck doesn't currently work for xapian-bindings because
666 # xapian-core isn't installed.
667 echo " cd $d && \$(MAKE) check && \$(MAKE) dist" ;;
669 echo " cd $d && \$(MAKE) $target" ;;
673 distclean|maintainer-clean) echo " rm -f Makefile config.cache" ;;
676 cat <<EOF >> Makefile.tmp
679 \$(CONFIGURE_COMMAND)
681 Makefile: $srcdir/configure
682 \$(CONFIGURE_COMMAND)
684 $srcdir/configure: \\
689 # We want to rerun bootstrap if a series file changes (patch added or removed)
690 # or an existing patch changes. Since we always have an series file (even if
691 # it is empty), this also handles us adding the first patch for something.
693 for d
in patches
/* ; do
695 echo "$series:" >> configure.tmp2
699 sed -n 's/[ ]*\(#.*\)\?$//;/./p' "$series" |\
705 # Because there's a pipeline, this is a subshell, so use a temporary file
706 # rather than a variable to compile a list of patches to use below.
707 echo "$patch:" >> configure.tmp2
709 done >> configure.tmp
711 cat <<'END_OF_CONFIGURE' >> configure.tmp
715 .PHONY: $targets recheck
717 # Dummy dependencies to allow removing patches we no longer need.
720 cat configure.tmp2
>> configure.tmp
722 cat <<'END_OF_CONFIGURE' >> configure.tmp
724 mv -f Makefile.tmp Makefile
726 echo "Configured successfully - now run \"${MAKE-make}\""
731 chmod +x configure.tmp
732 mv -f configure.tmp configure
735 echo "Bootstrapped successfully - now run \"$srcdir/configure\" and \"${MAKE-make}\""