Document xapian-compact --blocksize takes an argument
[xapian.git] / xapian-core / HACKING
blob29b774c4a9b652827409d4b319366f304e2d2c73
1 Instructions for hacking on Xapian
2 ==================================
4 .. contents:: Table of contents
6 This file is aimed to help developers get started with working on
7 Xapian.  The documentation contains a section covering various internal
8 aspects of the library - this can also be found on the Xapian website
9 <http://xapian.org/>.
11 Extra options to give to configure
12 ==================================
14 Note: Non-developer configure options are described in INSTALL
16 You will probably want to use some of these if you're going to be developing
17 Xapian.
19 --enable-assertions
20         This enables compiling of assertion code which will throw
21         Xapian::AssertionError if the code detects violating of
22         preconditions, postconditions, or fails other consistency checks.
24 --enable-assertions=partial
25         This option enables a subset of the assertions enabled by
26         "--enable-assertions", but not the most expensive.  The intention is
27         that it should be suitable for use in a real-world system for tracking
28         down problems without imposing too much of an overhead (but note that
29         we haven't yet performed timings to measure the overhead...)
31 --enable-log
32         This enables compiling code into the library which generates verbose
33         debugging messages.  See "Debugging Messages", below.
35 --enable-log=profile
36         In 1.2.0 and earlier, this used to use the debug logging macros to
37         report to stderr how long each method takes to execute.  This feature
38         was removed in 1.2.1 - you are likely to get better results using
39         dedicated profiling tools - for more information see:
40         http://trac.xapian.org/wiki/ProfilingXapian
42 --enable-maintainer-mode
43         This tells configure to enable make dependencies for regenerating build
44         system files (such as configure, Makefile.in, and Makefile) and other
45         generated files (such as the stemmers and query parser) when required.
46         These are disabled by default as some make programs try to rebuild them
47         when it's not appropriate (e.g. BSD make doesn't handle VPATH except
48         for implicit rules).  For this reason, we recommend GNU make if you
49         enable maintainer mode.  You'll also need a non-cross-compiling C
50         compiler for compiling the Lemon parser generator and the Snowball
51         stemming algorithm compiler.  The configure script will attempt to
52         locate one, but you can override this autodetection by passing
53         CC_FOR_BUILD on the command line like so::
55         ./configure CC_FOR_BUILD=/opt/bin/gcc
57 --enable-documentation
58         This tells configure to enable make dependencies for regenerating
59         documentation files.  By default it uses the same setting as
60         --enable-maintainer-mode.
62 Debugging Messages
63 ==================
65 If you configure with --enable-log, lots of places in the code generate
66 debugging messages to tell us what they're up to - this information can be
67 very useful for debugging both the Xapian library and code which uses it.  But
68 the quantity of information generated is potentially vast so there's a
69 mechanism to allow you to select where to store the log and which types of
70 message you're interested by setting environment variables.  You can:
72  * set XAPIAN_DEBUG_LOG to be the path to a file that you would like debugging
73    output to be appended to, or to the special value ``-`` to indicate that you
74    would like debugging output to be sent to stderr.  Unless XAPIAN_DEBUG_LOG
75    is set, no debug logging will be performed.  Occurrences of %p in
76    XAPIAN_DEBUG_LOG will be replaced with the current process-id.
78  * set XAPIAN_DEBUG_FLAGS to a string of capital letters indicating the types
79    of debugging message you would like to display (the default is to log calls
80    to API functions and methods).  These letters are shown in the first column
81    of the log output, and are also listed in ``common/debuglog.h``.  If the
82    first character is ``-``, then the letters indicate those categories of
83    message *not* be shown instead.  As a consequence of this, setting
84    ``XAPIAN_DEBUG_FLAGS=-`` will give you all debugging messages.
86 These environment variables only have any effect if you ran configure with the
87 --enable-log option.
89 The format is::
91     <message type> <pid> [<this>] <message>
93 For example::
95     A 16747 [0x57ad1e0] void Xapian::Query::Internal::validate_query()
97 Each nested call adds another space before the ``[`` so you can easily see
98 which function call and return messages correspond.
100 Debugging memory allocations
101 ============================
103 The testsuite can make use of valgrind 3.3.0 or newer to check for memory
104 leaks, reads from uninitialised memory, and some other bugs during tests.
106 Valgrind doesn't support every platform, but Xapian contains very little
107 platform specific code (and most of what there is is Microsoft Windows
108 specific) so even just testing with valgrind on one platform gives good
109 coverage.
111 If you have a new enough version of valgrind installed, it's automatically
112 detected by configure and used when running the testsuite.  The testsuite runs
113 more slowly under valgrind, so if you wish to disable this auto-detection you
114 can run configure with:
116 ./configure VALGRIND=
118 Or you can disable use of valgrind during a particular run of "make check"
119 like so:
121 make check VALGRIND=
123 Or disable it while running a test directly (under sh or bash):
125 VALGRIND= ./runtest ./apitest
127 Running test programs
128 =====================
130 To run all tests, use ``make check``.  You can also run just the subset of
131 tests which exercise the inmemory, remote progserver, remote TCP,
132 multi-database, glass, or chert backends using ``make check-inmemory``,
133 ``make check-remoteprog``, ``make check-remotetcp``, ``make check-multi``,
134 ``make check-glass``, or ``make check-chert``
135 respectively.
137 Also, ``make check-remote`` will run the tests on both variants of the remote
138 backend, and ``make check-none`` will run those tests which don't use any
139 backend.  These are handy shortcuts when doing development work on a particular
140 backend.
142 The runtest script (in the tests subdirectory) takes care of the details of
143 running the test programs (including setting up the environment so they work
144 when srcdir != builddir and handling libtool dynamically linked binaries).  To
145 run a test program by hand (rather than via make) just use:
147 ./runtest ./apitest
149 You can specify options and arguments.  Individual test programs optionally
150 take one or more test names as arguments, and you can also pass ``-v`` to get
151 more verbose output from failing tests, e.g.:
153 ./runtest ./apitest -v deldoc1
155 If the number of the test is omitted, all tests with that basename are run,
156 so to run deldoc1, deldoc2, etc:
158 ./runtest ./apitest deldoc
160 You can also use runtest to run a test program under gdb (or most other tools):
162 ./runtest gdb ./apitest -v deldoc1
163 ./runtest valgrind ./apitest -v deldoc1
165 Some test programs take special arguments - for example, you can restrict
166 apitest to the chert backend using ``-bchert``.
168 There are a few environmental variables which the testsuite harness checks for
169 which you might find useful:
171   XAPIAN_TESTSUITE_SIG_DFL:
172     By default, the testsuite harness catches signals and handles them
173     gracefully - the current test is failed, and the testsuite moves onto the
174     next test.  If you want to suppress this (some debugging tools may work
175     better if the signal is not caught) set the environment variable
176     XAPIAN_TESTSUITE_SIG_DFL to any value to prevent the testsuite harness
177     from installing its own signal handling.
179   XAPIAN_TESTSUITE_OUTPUT:
180     By default, the testsuite harness uses ANSI escape sequences to give
181     colour output if stdout is a tty.  You can disable this feature by setting
182     XAPIAN_TESTSUITE_OUTPUT=plain (alternatively, piping the output (e.g.
183     through ``cat`` or ``more``) will have the same effect).  Auto-detection
184     can be explicitly specified with XAPIAN_TESTSUITE_OUTPUT=auto (or empty).
185     Any other value forces the use of colour.  Colour output is always disabled
186     on Microsoft Windows, so XAPIAN_TESTSUITE_OUTPUT has no effect there.
188   XAPIAN_TESTSUITE_LD_PRELOAD:
189     The runtest script will add this to LD_PRELOAD if it is set, allowing you
190     to easily load LD_PRELOAD libraries when running the testsuite.  The
191     original intended use was to allow use of libeatmydata
192     (https://www.flamingspork.com/projects/libeatmydata/) which makes fsync
193     and related calls no-ops, but configure now checks for the eatmydata
194     wrapper script and this is used automatically.  However, there may be
195     other LD_PRELOAD libraries which are useful, so we've left the machinery
196     in place.
198 Speeding up the testsuite with eatmydata
199 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
201 The testsuite does a lot of small database operations, and the calls to fsync,
202 fdatasync, etc which Xapian makes by default can slow down testsuite runs
203 substantially.  There's a handy LD_PRELOAD library called eatmydata
204 (http://www.flamingspork.com/projects/libeatmydata/), which can help here, by
205 turning fsync and related calls into no-ops.
207 You need a version of eatmydata with the eatmydata wrapper script (version 37
208 or newer), and then configure should auto-detect it and it'll get used when
209 running the testsuite (via runtest).  If you wish to disable this
210 auto-detection for some reason, you can run configure with:
212 ./configure EATMYDATA=
214 Or you can disable use of eatmydata during a particular run of "make check"
215 like so:
217 make check EATMYDATA=
219 Or disable it while running a test directly (under sh or bash):
221 EATMYDATA= ./runtest ./apitest
223 Using various debugging, profiling, and leak-finding tools
224 ==========================================================
226 GCC's libstdc++ supports a debug mode, which checks for various misuses of
227 the STL - to enable this, define _GLIBCXX_DEBUG when building Xapian:
229   ./configure CPPFLAGS=-D_GLIBCXX_DEBUG
231 For documentation of this option, see:
232 http://gcc.gnu.org/onlinedocs/libstdc++/debug.html
234 Note: all C++ code must be compiled with this defined or you'll get problems.
235 Xapian's API headers include a check that the same setting is used when
236 building code using Xapian as was used to build Xapian.
238 To use valgrind (http://www.valgrind.org/), no special build options are
239 required, but make sure you compile with debugging information (on by default
240 for GCC) and the valgrind documentation recommends disabling optimisation (with
241 optimisation, line numbers in error messages can be confusing due to code
242 inlining, etc):
244   ./configure CXXFLAGS='-O0 -g'
246 To use gdb (http://www.gnu.org/software/gdb/), no special build options are
247 required, but make sure you compile with debugging information (on by default
248 for GCC).  You'll probably find debugging easier if you compile without
249 optimisation (with optimisation, line numbers in error messages can be
250 confusing due to code inlining, etc, and the values of some variables can't be
251 printed because they've been eliminated from the code completely):
253   ./configure CXXFLAGS='-O0 -g'
255 To enable profiling for gprof:
257   ./configure CXXFLAGS=-pg LDFLAGS=-pg
259 To use Purify (a proprietary tool):
261   ./configure CXXLD='purify c++' --disable-shared
263 To use Insure (another proprietary tool):
265   ./configure CXX=insure
267 To use lcov (at least version 1.10) to generate a test coverage report (see
268 `lcov.xapian.org <http://lcov.xapian.org/>`_ for reports) there are two make
269 targets:
271   * coverage-reconfigure: reruns configure in the source tree.  See
272     Makefile.am for details of the configure options used and why they
273     are needed.
274   
275   * coverage-check: runs "make check" and generates an HTML report in a
276     directory called "lcov".  You can specify extra arguments to pass to the
277     ``genhtml`` tool using GENHTML_ARGS, like so::
279     make coverage-check GENHTML_ARGS=--html-gzip
281 If you have runes for using other tools, please add them above, or send them
282 to us so we can.
284 Snapshots
285 =========
287 If you want to try unreleased Xapian code, you can fetch it from our git
288 repository.  For convenience, we also provide bootstrapped tarballs (much like
289 the sourcecode download for any release version) which get built every 20
290 minutes if there have been any changes checked in.  These tarballs need to
291 pass "make distcheck" to be automatically uploaded, so using them will help
292 to assure that you don't pick a "bad" version.  The snapshots are available
293 from the "Bleeding Edge" page of the Xapian website.
295 Building from git
296 =================
298 When building from a git checkout, we *strongly* recommend that you use
299 the ``bootstrap`` script in the top level directory to set up the tree ready
300 for building.  This script will check which directories you have checked out,
301 so you can bootstrap a partial tree.  You can also ``touch .nobootstrap`` in
302 a subdirectory to tell bootstrap to ignore it.
304 You will need the following tools installed to build from git:
306 * GNU m4 (for autoconf)
307 * perl 5 (for automake; also for various maintainer scripts)
308 * python >= 2.3 (for generating the Python bindings)
309 * GNU make (or another make which support VPATH for explicit rules)
310 * GNU flex (for building doxygen)
311 * GNU bison (for building doxygen)
312 * Tcl (to generate unicode/unicode-data.cc)
314 For a recent version of Debian or Ubuntu, this command should ensure you have
315 all the necessary tools and libraries::
317     apt-get install build-essential m4 perl python zlib1g-dev uuid-dev wget flex bison tcl
319 If you want to build Omega, you'll also need::
321     apt-get install libpcre3-dev libmagic-dev
323 On Fedora, the uuid library can be installed by doing::
325     yum install libuuid-devel
327 On Mac OS X, if you're using macports you'll want the following:
329   * file (magic.h in configure)
331 If you're using homebrew you'll want the following::
333     brew install libmagic pcre
335 If you're doing much development work, you'll probably also want the following
336 tools installed:
338 * valgrind for better testsuite error finding
339 * ccache for faster rebuilds
340 * eatmydata for faster testsuite runs
342 The repository does not contain any automatically generated files
343 (such as configure, Makefile.in, Snowball-generated stemmers, Lemon-generated
344 parsers, SWIG-generated code, etc) because experience shows it's best to keep
345 these out of version control.  To avoid requiring you to install the correct
346 versions of the tools required, we either include the source to these tools in
347 the repo directly (in the case of Snowball and Lemon), or the bootstrap script
348 will download them as tarballs (autoconf, automake, libtool, and doxygen) or
349 from git (SWIG), build them, and install them within the source tree.
351 To download source tarballs, bootstrap will use wget, curl or lwp-request if
352 installed.  If not, it will give an error telling you the URL to download from
353 by hand and where to copy the file to.
355 Bootstrap will then run autoreconf on each of the checked-out subdirectories,
356 and generate a top-level configure script.  This configure script allows you to
357 configure xapian-core and any other modules you've checked out with single
358 simple command, such that the other modules link against the uninstalled
359 xapian-core (which is very handy for development work and a bit fiddly to set
360 up by hand).  It automatically passes --enable-maintainer-mode to the
361 subprojects so that the autotools will be rerun if configure.ac, Makefile.am,
362 etc are modified.
364 The bootstrap script doesn't care what the current directory is.  The top-level
365 configure script generated by it supports building in a separate directory to
366 the sources: simply create the directory you want to build in, and then run the
367 configure script from inside that directory.  For example, to build in a
368 directory called "build" (starting in the top level source directory)::
370   ./bootstrap
371   mkdir build
372   cd build
373   ../configure
375 When running bootstrap, if you need to add any extra macro directories to the
376 path searched by aclocal (which is part of automake), you can do this by
377 specifying these in the ACLOCAL_FLAGS environment variable, e.g.::
379   ACLOCAL_FLAGS=-I/extra/macro/directory ./bootstrap
381 If you wish to prevent bootstrap from downloading and building the autotools
382 pass the --without-autotools option.  You can force it to delete the downloaded
383 and installed versions by passing --clean.
385 If you are tracking development in git, there will sometimes be changes
386 to the build system sources which require regeneration of the generated
387 makefiles and associated machinery.  We aim to make the build system
388 automatically regenerate the necessary files, but in the event that a build
389 fails after an update, it may be worth re-running the bootstrap script to
390 regenerate the build system from scratch, before looking for the cause of the
391 error elsewhere.
393 Tools required to build documentation
394 -------------------------------------
396 If you want to be able to build distribution tarballs (with "make dist") then
397 you'll also need some further tools.  If you don't want to have to install all
398 these tools, then pass --disable-documentation to configure to disable these
399 rules (the default state of this follows the setting of
400 --enable-maintainer-mode, so in a non-maintainer-mode tree, you can pass
401 --enable-documentation to enable these rules).  Without the documentation,
402 "make dist" will fail (to prevent accidentally distributing tarballs without
403 documentation), but you can configure and build.
405 The documentation tools are:
407 * doxygen (v1.8.8 is used for 1.3.x snapshots and releases; 1.7.6.1 fails to
408   process trunk after PL2Weight was added).
409 * dot (part of Graphviz.  Doxygen's DOT_MULTI_TARGETS option apparently needs
410   ">1.8.10")
411 * help2man
412 * rst2html or rst2html.py (in python-docutils on Debian/Ubuntu)
413 * pngcrush (optional - used to reduce the size of PNG files in the HTML
414   apidocs)
415 * sphinx-doc (in python-sphinx and python3-sphinx on Debian/Ubuntu, or as
416   sphinx via pip install)
418 For a recent version of Debian or Ubuntu, this command should install all the
419 required documentation tools::
421     apt-get install doxygen graphviz help2man python-docutils pngcrush python-sphinx python3-sphinx
423 Documentation builds on OS X
424 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
426 On Mac OS X, if you're using homebrew, you'll want the following::
428     brew install doxygen help2man graphviz pngcrush
430 (Ensure you're up to date with brew, as earlier packaging of graphviz
431 didn't properly install dot.)
433 You also need sphinx and docutils, which are python packages; you can
434 install them via pip::
436     pip install sphinx docutils
438 You may find it easier to use homebrew to install python first, so
439 these packages are separate from the system python::
441     brew install python
443 If you install both python (v2) and python3 (v3) via homebrew, you
444 will be able to build bindings for both; you'll then need to install
445 sphinx for python3::
447     pip3 install sphinx
449 PDF versions of docs
450 ~~~~~~~~~~~~~~~~~~~~
452 As of 1.3.2, we no longer build PDF versions of the API docs by default, but
453 you can build them yourself with::
455     make -C docs apidoc.pdf
457 Additional tools are needed for these:
459 * gs (part of Ghostscript)
460 * pdflatex (in texlive-latex-base on Debian/Ubuntu)
461 * epstopdf (in texlive-extra-utils on Debian/Ubuntu)
462 * makeindex (in texlive-binaries on Debian/Ubuntu, or texlive-base-bin for older releases)
464 Note that pdflatex, epstopdf, gs, and makeindex must all currently be on your
465 path (as specified by the environmental variable PATH), since doxygen will look
466 for them there.
468 For a recent version of Debian or Ubuntu, this command should install these
469 extra tools::
471     apt-get install ghostscript texlive-latex-base texlive-extra-utils texlive-binaries texlive-fonts-extra texlive-fonts-recommended texlive-latex-extra texlive-latex-recommended
473 On Mac OS X, if you're using macports you'll want the following:
475   * texlive (pdflatex during build)
476   * texlive-basic (for makeindex in configure)
477   * texlive-latex-extra (latex style)
479 Alternatively, you can install MacTeX from http://www.tug.org/mactex/ instead
480 of texlive, texlive-basic and texlive-latex-extra.
482 The homebrew texlive package only supports 32 bit systems, so even if you're
483 using homebrew, you'll probably want to install MacTeX from
484 http://www.tug.org/mactex/ instead.
486 Autotools versions
487 ------------------
489 * autoconf 2.68 is used to generate snapshots and releases.
491   autoconf 2.64 is a hard minimum requirement.
493   autoconf 2.60 is required for docdir support and AC_TYPE_SSIZE_T.
495   autoconf 2.62 generates faster configure scripts and warns about unrecognised
496   options passed to configure.
498   autoconf 2.63 fixes a regression in AC_C_BIGENDIAN introduced in 2.62
499   (Omega uses this macro).
501   autoconf 2.64 generates smaller configure scripts by using shell functions.
503 * automake 1.15 is used to generate snapshots and releases.
505   automake 1.12.2 is a hard minimum requirement.  This version fixes a
506   security issue (CVE-2012-3386) in the generated `make distcheck` rules.
508   automake 1.12 is needed to support using LOG_COMPILER to specify a testsuite
509   driver (used by xapian-bindings).
511 * libtool 2.4.6 is used to generate snapshots and releases.
513   libtool 2.2.8 is the current hard minimum requirement.
515   libtool 2.2 is required for us to be able to override link_all_deplibs_CXX
516   and sys_lib_dlsearch_path_spec in configure.  It also fixes some
517   long-standing issues and is significantly faster.
519 Please tell us if you find that newer versions of any of these tools work or
520 fail to work.
522 There is a good GNU autotools tutorial at
523 <http://www.lrde.epita.fr/~adl/autotools.html>.
525 Building from git on Windows with MSVC
526 --------------------------------------
528 The windows build process is maintained in the xapian-maintainer-tools
529 directory in the Xapian git repository.  See the win32msvc/README file in that
530 directory for details of how to build from git.
532 Using a Vagrant-driven Ubuntu virtual machine
533 ---------------------------------------------
535 Note: Vagrant support is experimental. Please report bugs in the
536 normal fashion, to http://trac.xapian.org/newticket, or ask for help
537 on the #xapian IRC channel on Freenode.
539 If you have Vagrant (http://www.vagrantup.com/, tested on version
540 1.5.2) and VirtualBox (https://www.virtualbox.org/, tested on version
541 4.3.10) installed, `vagrant up` will make a virtual machine suitable
542 for developing Xapian:
544  * Ubuntu 13.04 with all packages needed to build Xapian and its
545    documentation
547  * eatmydata (to speed up test runs) and valgrind (for debugging
548    memory allocations) both also installed
550  * source code from this checkout in /vagrant; edit it on your host
551    operating system and changes are reflected in the VM. The source
552    tree is bootstrapped automatically (ensuring that the right
553    versions of the build tools are available on the VM)
555  * build tree in /home/vagrant/build, configured to install into
556    /home/vagrant/install, with maintainer mode and documentation
557    both enabled
559 Setting up can take a long time, as it downloads a minimal base box
560 and then installs all the required packages; once this is done you
561 don't have to wait so long if you need to reprovision the VM. (Once
562 Ubuntu 14.04 is released the plan is to build our own base box with
563 these packages already installed, which should make the process much
564 faster.)
566 `vagrant ssh` will log you into the VM, and you can type `cd build &&
567 make` to build Xapian. `make check` will run the tests.
569 (As noted above, in maintainer mode most changes that require
570 reconfiguration will happen automatically. If you need to do it by
571 hand you can either run the configure command yourself, or you can run
572 `vagrant provision`, which also checks for any system package
573 updates.)
575 The VM has a single 64 bit virtual processor, with 384M of memory; it
576 takes about 8G of disk space once up and running.
578 Use of C++ Features
579 ===================
581 * As of Xapian 1.3.3, a compiler with decent support for C++11 is required to
582   build Xapian.  We currently aim to allow users to use a non-C++11 compiler
583   to build code which uses Xapian.
585   There are now several compilers with good C++11 support, but there are a
586   few shortfalls in commonly deployed versions of most of them.  Often we can
587   work around this, and we should do where the effort is low compared to the
588   gain (so a compiler version which is widely used is more worth supporting
589   than one which is hardly used by anyone).
591   However, we shouldn't have to jump through hoops to cater for compilers where
592   their authors aren't putting in the effort to keep up with the language
593   standards.
595   Please avoid the following C++11 features for the time being:
597   * ``std::to_string()`` - this is completely missing on current versions of
598     mingw and cygwin - in the library, you can ``#include "str.h"`` and then
599     use the ``str()`` function instead for most cases.  This is also usually
600     faster than ``std::to_string()``.
602 * C++ features we currently assume:
604   * We assume <sstream> is available.  GCC < 2.95.3 didn't have it but GCC
605     2.95.3 includes a backported version.  We aren't aware of any other
606     compilers still in use which lack it.
608   * Non-".h" versions of standard ISO C++ headers (e.g. ``#include <list>``
609     rather than ``#include <list.h>``).  We aren't aware of any compiler still
610     in use which lacks these, and GCC 4.3 no longer has the old versions.  If
611     there are any, we could add a directory full of forwarding headers to work
612     around this issue.
614   * Standard header ``<limits>`` (for ``numeric_limits<>``) - for GCC, this was
615     added in GCC 3.0.
617   * Standard header ``<streambuf>`` (GCC < 3.0 only has ``<streambuf.h>``).
619   * Working auto_ptr in header ``<memory>`` (some old version of some compiler
620     had a buggy implementation - the details are lost to history, but it may
621     have been GCC 2.95, or perhaps EGCS).
623 * RTTI (dynamic_cast<>, typeid, etc):  Needing to use RTTI features in the
624   library most likely indicates a design flaw, and you should avoid use
625   of these features.  Where necessary, you can use a technique similar to
626   Database::as_networkdatabase() to replace dynamic_cast<>.
628 * Exceptions: In hindsight, throwing exceptions in the library seems to have
629   been a poor design decision.  GCC on Solaris can't cope with exceptions in
630   shared libraries (though it appears this may have been fixed in more recent
631   versions), and we've also had test failures on other platforms which only
632   occur with shared libraries - possibly with a similar cause.  Exceptions can
633   also be a pain to handle elegantly in the bindings.  We intend to investigate
634   modifying the library to return error codes internally, and then offering the
635   user the choice of exception throwing or error code returning API methods
636   (with the exception being thrown by an inlined wrapper in the externally
637   visible header files).  With this in mind, please don't complicate the
638   internal handling of exceptions...
640 * "using namespace std;" and "using std::XXX;" - it's OK to use these in
641   applications, library code, and internal library headers.  But in externally
642   visible headers (such as anything included by "#include <xapian.h>") you MUST
643   use explicit "std::" qualifiers - it's not acceptable to pull anything from
644   namespace std into the namespace of an application which uses Xapian.
646 * Use C++ style casts (static_cast<>, reinterpret_cast<>, and const_cast<>)
647   or constructor-syntax (e.g. ``double(value)``) in preference to C style
648   casts.  The syntax of the C++ casts is ugly, but they do make the intent much
649   clearer which is definitely a good thing.
651 * std::pair<> with an STL class as one (or both) of the members can produce
652   very long symbols (over 4KB!) after name mangling - long enough to overflow
653   the size limits of some vendor compilers or toolchains (so this can affect
654   GCC if it is using the system ld or as).  Even where the compiler works, the
655   symbol bloat in an unstripped build is probably best avoided, so it's
656   preferable to use a simple two member struct instead.  The code is probably
657   more readable anyway, and easier to extend if more members are needed later.
659 * We try to avoid putting the full definition of virtual methods in header
660   files.  This is because current compilers can't (as far as we know) inline
661   virtual methods, so putting the definition in the header file simply slows
662   down compilation (and, because method definitions often require further
663   header files to be included, this can result in many more files needing
664   recompilation after a change to a header file than is really necessary).
665   Just put the declaration in the header file, and put the definition in a .cc
666   file with the same basename.
668 Include ordering for source files
669 ---------------------------------
671 To help us move towards a consistent ordering of #include lines in source
672 files, please follow the following policy when ordering them:
674 * #include <config.h> should be first, and use <> not "" (as recommended by the
675   autoconf manual).  Always include config.h from C/C++ source files, but don't
676   include it from header files - the autoconf manual recommends that it should
677   be included first, so including it from headers is either redundant, or may
678   hide a missing config.h include in the source file the header was included
679   from (better to get an error in this case).
681 * The header corresponding to the source file should be next. This means that
682   compilation of the library ensures that each header with a corresponding
683   source file is "self supporting" (i.e. it implicitly or explicitly includes
684   all of the headers it requires).
686 * External xapian-core headers, alphabetically. When included from other
687   external headers, use <> to reduce problems with finding headers in the
688   user's source tree by mistake. In sources and internal headers, use "" (?) -
689   practically this makes no difference as we have -I for srcdir and builddir,
690   but <> suggests installed header files so "" seems more natural).
692 * Internal headers, alphabetically (using "").
694 * "Safe" versions of library headers (include these first to avoid issues if
695   other library headers include the ones we want to wrap). Use "" and order
696   alphabetically.
698 * Library headers, alphabetically.
700 * Standard C++ headers, alphabetically. Use the modern (no .h suffix) names.
702 C++ Portability Issues
703 ======================
705 Web Resources
706 -------------
708 The "C++ FAQ Lite" covers many frequently asked C++ questions:
709 http://www.parashift.com/c++-faq-lite/
711 Header Portability Issues
712 -------------------------
714 <fcntl.h>:
715 ----------
717 Don't directly '#include <fcntl.h>' - instead '#include "safefcntl.h"'.
719 The main reason for this is that when using certain compilers on certain
720 versions of Solaris, fcntl.h does '#define open open64'.  Sadly this breaks C++
721 code which has methods called open (as we do).  There's a cunning workaround
722 for this problem in common/safefcntl.h.
724 Also, safefcntl.h ensures the O_BINARY is defined (to 0 if not required) so
725 calls to open() and creat() can specify O_BINARY unconditionally for the
726 benefit of platforms which discriminate between text and binary files.
728 <windows.h>:
729 ------------
731 Don't directly '#include <windows.h>' - instead '#include "safewindows.h"'
732 which reduces the bloat of header files included and prevents some of the
733 more egregious namespace pollution.  It also defines any constants we need
734 which might be missing in older versions of the mingw headers.
736 <winsock2.h>:
737 -------------
739 Don't directly '#include <winsock2.h>' - instead '#include "safewinsock2.h"'.
740 This ensure that safewindows.h is included before <winsock2.h> to avoid
741 winsock2.h including windows.h without our namespace pollution reducing
742 workarounds.
744 <errno.h>:
745 ----------
747 Don't directly '#include <errno.h>' - instead '#include "safeerrno.h"' which
748 works around a problem with Compaq's C++ compiler.
750 <sys/select.h>:
751 ---------------
753 Don't directly '#include <sys/select.h>' - instead '#include "safesysselect.h"'
754 which supports older UNIX platforms which predate POSIX 1003.1-2001 and works
755 around a problem on Solaris.
757 <sys/socket.h>:
758 ---------------
760 Don't directly '#include <sys/socket.h>' - instead '#include "safesyssocket.h"'
761 which supports older UNIX platforms which predate POSIX 1003.1-2001 and works
762 on Windows too.
764 <sys/stat.h>:
765 -------------
767 Don't directly '#include <sys/stat.h>' - instead '#include "safesysstat.h"'
768 which under MSVC enables stat to work on files > 2GB, defines the missing
769 POSIX macros S_ISDIR and S_ISREG, pulls in <direct.h> for mkdir() (which is
770 provided by sys/stat.h under UNIX) and provides a compatibility wrapper for
771 mkdir() which takes 2 arguments (so code using mkdir can always just pass
772 two arguments).
774 <sys/wait.h>:
775 -------------
777 To get `WEXITSTATUS` or `WIFEXITED` defined, '#include "safesyswait.h"'.
778 Note that this won't provide `waitpid()`, etc on Microsoft Windows, since
779 these functions are only really useful to use when `fork()` is available.
781 <unistd.h>:
782 -----------
784 Don't directly '#include <unistd.h>' - instead '#include "safeunistd.h"'
785 - MSVC doesn't even HAVE unistd.h!
787 The various "safe" headers are maintained in xapian-core/common, but also used
788 by Omega.  Currently bootstrap sorts out setting up a copy of this subdirectory
789 via a secondary git checkout.
791 Warning-Free Compilation
792 ------------------------
794 Compiling without warnings on every platform is our goal, though it's not
795 always possible to achieve.  For example, some GCC 3.x compilers produce the
796 occasional bogus warning (e.g.  warning that a variable may be used
797 uninitialised, despite it being initialised at the point of declaration!)
799 You should consider configure-ing with:
801 ./configure CXXFLAGS=-Werror
803 when doing development work on Xapian.  This promotes warnings to errors,
804 which should ensure you at least don't introduce new warnings for the compiler
805 you're using.
807 If you configure with --enable-maintainer-mode, and are using GCC 4.1 or newer,
808 this is done for you automatically.  This is intended to be an aid rather than
809 a form of automated punishment - it's all too easy to miss a new warning as
810 once a file is compiled, you don't see it unless you modify that file or one of
811 its dependencies.
813 With Intel's C++ compiler, --enable-maintainer-mode also enables -Werror.
814 If you know the equivalent of -Werror for other compilers, please add a note
815 here, or tell us so that we can add a note.
817 Miscellaneous Portability Issues
818 --------------------------------
820 Make sure that the last line of any source file ends with a linefeed character
821 since it's undefined behaviour if it doesn't (most compilers accept it, though
822 at least GCC gives a warning).
824 Branch Prediction Hints
825 =======================
827 For compilers which support ``__builtin_expect()`` (GCC >= 3.0 and some others)
828 you can provide manual hints to assist branch prediction.  We've wrapped these
829 in macros which evaluate to just their argument for compilers which don't
830 support ``__builtin_expect()__``.
832 Within the xapian-core library code, you can mark the expressions in ``if`` and
833 ``while`` statements as ``rare`` (if the condition is rarely true) or ``usual``
834 (if the condition is usually true).
836 For example::
838     if (rare(something_unusual())) deal_with_it();
840     while (usual(!end_condition()) keep_going();
842 It's easy to make incorrect assumptions about where hotspots are and which
843 branches are usually taken or not, so except for really obvious cases (such
844 as ``if (!consistency_check()) throw_exception();``) you should benchmark
845 that new ``rare`` and ``usual`` hints help rather than hinder before committing
846 them to the repository.  It's also likely to be a waste of effort to add them
847 outside of areas of code which are executed very frequently.
849 Don't expect miracles - the first 15 uses added saved approximately 1%.
851 If you know how to implement the ``rare`` and ``usual`` macros for other
852 compilers, please let us know.
854 Configure Options
855 =================
857 Especially for a library, compile-time options aren't a good solution for
858 how to integrate a new feature.  An increasingly large number of users install
859 pre-built binary packages rather than building from source, and unless the
860 package is capable of being split into modules, the packager has to choose a
861 set of compile-time options to use.  And they'll tend to choose either the
862 standard ones, or perhaps a broader set to try to keep everyone happy.  For a
863 library, similar issues occur when installing from source as well - the
864 sysadmin must choose the options which will keep all users happy.
866 Another problem with compile-time options is that it's hard to ensure that
867 a change doesn't break compilation under some combination of options without
868 actually building and running the test-suite on all combinations.  The fewer
869 compile-time options, the more likely the code will compile with every
870 combination of them.
872 So please think carefully before adding more compile-time options.  They're
873 probably OK for experimental features (but should go away once a feature is no
874 longer experimental).  Options to instrument a build for special purposes
875 (debug, profiling, etc) are also acceptable.  Disabling whole features probably
876 isn't (e.g. the --disable-backend-XXX options we already have are dubious,
877 though being able to disable the remote backend can be useful when trying to
878 get Xapian going on a platform).
880 Makefile Portability
881 ====================
883 We don't want to force those building Xapian from the source distribution to
884 have to use GNU make.  Requiring GNU make for "make dist" isn't such a problem
885 but it's probably better to use portable constructs everywhere to avoid
886 problems when people move or copy code between targets.  If you do make use
887 of non-portable constructs where it's OK, add a comment noting the special
888 circumstances which justify doing so.
890 Here's an incomplete list of things to avoid:
892 * Don't use "$(RM)" - it's defined by GNU make, but using it actually harms
893   portability as other makes don't define it.  Use plain "rm" instead.
895 * Don't use "%" pattern rules - these are GNU make specific.  Use an
896   implicit rule (e.g. ".c.o:") if you can.  Otherwise, write out each version
897   explicitly.
899 * Don't use "$<" except in implicit rules.  This is an annoying restriction,
900   as using "$<" makes it much easier to make VPATH builds work.  But it's only
901   portable in implicit rules.  Tips for rewriting - if it's a source file,
902   write it as::
904     $(srcdir)/foo.ext
906   If it's a generated object file or similar, just write the name as is.  The
907   tricky case is a generated file which isn't in git but is shipped in the
908   distribution tarball, as such a file could be in either the source or build
909   tree.  Use this trick to make sure it's found whichever directory it's in::
911     `test -f foo.ext || echo '$(srcdir)/'`foo.ext
913 * Don't use "exit 0" to make a rule fail.  Use "false" instead.  BSD make
914   doesn't like "exit 0" in a rule.
916 * Don't use make conditionals.  Automake offers conditionals which may be
917   of use, and these are implemented to work with any make.  See the automake
918   manual for details, and a few caveats.
920 * The list of portable utilities is:
922     cat cmp cp diff echo egrep expr false grep install-info
923     ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch true
925   Note that versions of these (GNU versions in particular) support switches
926   which aren't portable - notably, "test -r" isn't portable; neither is
927   "cp -a".  And note that "mkdir -p" isn't portable - the semantics vary.
928   The autoconf manual has some useful information about writing portable
929   shell code (most of it not specific to autoconf)::
931     http://www.gnu.org/software/autoconf/manual/autoconf.html#Portable-Shell
933 * Don't use "include" - it's not present in BSD make (at least some versions
934   have ".include" instead, but that doesn't really seem to help...)  Automake
935   provides a configure-time include, which may provide a replacement for some
936   uses of "include".
938 * It appears that BSD make only supports VPATH for implicit rules (e.g.
939   ".c.o:") - there's certainly a restriction there which is not present in GNU
940   make.  We used to try to work around this, but now we use AM_MAINTAINER_MODE
941   to disable rules which are only needed by those developing Xapian (these were
942   the rules which caused problems).  And we recommend those developing Xapian
943   use GNU make to avoid problems.
945 * Rules with multiple targets can cause problems for parallel builds.  These
946   rules are really just a shorthand for multiple rules with the same
947   prerequisites and commands, and it is fine to use them in this way.  However,
948   a common temptation is to use them when a single invocation of a command
949   generates multiple output files, by adding each of the output files as a
950   target.  Eg, if a swig language module generates xapian_wrap.cc and
951   xapian_wrap.h, it is tempting to add a single rule something like::
953     # This rule has a problem
954     xapian_wrap.cc xapian_wrap.h: xapian.i
955             SWIG_commands
957   This can result in SWIG_commands being run twice, in parallel.  If
958   SWIG_commands generates any temporary files, the two invocations can
959   interfere causing one of them to fail.
961   Instead of this rule, one solution is to pick one of the output files as a
962   primary target, and add a dependency for the second output file on the first
963   output file::
965     # This rule also has a problem
966     xapian_wrap.h: xapian_wrap.cc
967     xapian_wrap.cc: xapian.i
968             SWIG_commands
970   This ensures that make knows that only one invocation of SWIG_commands is
971   necessary, but could result in problems if the invocation of SWIG_commands
972   failed after creating xapian_wrap.cc, but before creating xapian_wrap.h.
973   Instead, we recommend creating an intermediate target::
974   
975     # This rule works in most cases
976     xapian_wrap.cc xapian_wrap.h: xapian_wrap.stamp
977     xapian_wrap.stamp: xapian.i
978             SWIG_commands
979             touch $@
981   Because the intermediate target is only touched after the commands have
982   executed successfully, subsequent builds will always retry the commands if an
983   error occurs.  Note that the intermediate target cannot be a "phony" target
984   because this would result in the commands being re-run for every build.
986   However, this rule still has a problem - if the xapian_wrap.cc and
987   xapian_wrap.h files are removed, but the xapian_wrap.stamp file is not, the
988   .cc and .h files will not be regenerated.   There is no simple solution to
989   this, but the following is a recipe taken from the automake manual which
990   works.  For details of *why* it works, see the section in the automake manual
991   titled "Multiple Outputs"::
993     # This rule works even if some of the output files were removed
994     xapian_wrap.cc xapian_wrap.h: xapian_wrap.stamp
995     ## Recover from the removal of $@.  A full explanation of these rules is in
996     ## the automake manual under the heading "Multiple Outputs".
997             @if test -f $@; then :; else \
998               trap 'rm -rf xapian_wrap.lock xapian_wrap.stamp' 1 2 13 15; \
999               if mkdir xapian_wrap.lock 2>/dev/null; then \
1000                 rm -f xapian_wrap.stamp; \
1001                 $(MAKE) $(AM_MAKEFLAGS) xapian_wrap.stamp; \
1002                 rmdir xapian_wrap.lock; \
1003               else \
1004                 while test -d xapian_wrap.lock; do sleep 1; done; \
1005                 test -f xapian_wrap.stamp; exit $$?; \
1006               fi; \
1007             fi
1008     xapian_wrap.stamp: xapian.i
1009             SWIG_commands
1010             touch $@
1012 * This is actually a robustness point, not portability per se.  Rules which
1013   generate files should be careful not to leave a partial file in place if
1014   there's an error as it will have a timestamp which leads make to believe it's
1015   up-to-date.  So this is bad:
1017   foo.cc: script.pl
1018         $PERL script.pl > foo.cc
1020   This is better:
1022   foo.cc: script.pl
1023         $PERL script.pl > foo.tmp
1024         mv foo.tmp foo.cc
1026   Alternatively, pass the output filename to the script and make sure you
1027   delete the output on error or a signal (although this approach can leave
1028   a partial file in place if the power fails).  All used Makefile.am-s and
1029   scripts have been checked (and fixed if required) as of 2003-07-10 (didn't
1030   check xapian-bindings).
1032 * Another robustness point - if you add a non-file target to a makefile, you
1033   should also list it in ".PHONY".  Otherwise your target won't get remade
1034   reliably if someone creates a file with the same name in their tree.  For
1035   example:
1037   .PHONY: hello goodbye
1039   hello:
1040         echo hello
1042   goodbye:
1043         echo goodbye
1045 And lastly a style point - using "@" to suppress echoing of commands being
1046 executed removes choice from the user - they may want to see what commands
1047 are being executed.  And if they don't want to, many versions of make support
1048 the use "make -s" to suppress the echoing of commands.
1050 Using @echo on a message sent to stdout or stderr is acceptable (since it
1051 avoids showing the message twice).  Otherwise don't use "@" - it makes it
1052 harder to track down problems in the makefiles.
1054 Naming of Scripts
1055 =================
1057 Scripts generally should *not* have an extension indicating the language they
1058 are currently implemented in (e.g. ``runtest`` rather than ``runtest.sh`` or
1059 ``runtest.pl``).  The problem with such an extension is that if we decide
1060 to reimplement the script in a different language, we either have to rename
1061 the script (which is annoying as people will be used to the name, and may
1062 have embedded it in their own scripts), or we have a script with a confusing
1063 name (e.g. a Python script with extension ``.pl``).
1065 The above reasoning doesn't apply to scripts which have to be in a particular
1066 language for some reason, though for consistency they probably shouldn't get
1067 an extension either, unless there's a good reason to have one.
1069 Use of Assert
1070 =============
1072 Use Assert to perform internal consistency checks, and to check for invalid
1073 arguments to functions and methods (e.g. passing a NULL pointer when this isn't
1074 permitted).  It should *NOT* be used to check for error conditions such as
1075 file read errors, memory allocation failing, etc (since we want to perform such
1076 checks in non-debug builds too).
1078 File format errors should also not be tested with Assert - we want to catch
1079 a corrupted database or a malformed input file in a non-debug build too.
1081 There are several variants of Assert:
1083 - Assert(P) -- asserts that expression P is true.
1085 - AssertRel(a,rel,b) -- asserts that (a rel b) is true - rel can be a boolean
1086   relational operator, i.e. one of ``==``, ``!=``, ``>``, ``>=``, ``<``,
1087   ``<=``.  The message given if the assertion fails reports the values of
1088   a and b, so ``AssertRel(a,<,b);`` is more helpful than ``Assert(a < b);``
1090 - AssertEq(a,b) -- shorthand for AssertRel(a,==,b).
1092 - AssertEqDouble(a,b) -- asserts a and b differ by less than DBL_EPSILON
1094 - AssertParanoid(P) -- a particularly expensive assertion.  If you want a build
1095   with Asserts enabled, but without a great performance overhead, then
1096   passing --enable-assertions=partial to configure and AssertParanoids
1097   won't be checked, but Asserts will.  You can also use AssertRelParanoid
1098   and AssertEqParanoid.
1100 - CompileTimeAssert(P) -- this has now been removed, since we require C++11
1101   support from the compuiler, and C++11 added ``static_assert``.
1103 Marking Features as Deprecated
1104 ==============================
1106 In the API headers, a feature (a class, method, function, enum, typedef, etc)
1107 can be marked as deprecated by using the XAPIAN_DEPRECATED() or
1108 XAPIAN_DEPRECATED_CLASS macros.  Note that you can't deprecate a preprocessor
1109 macro.
1111 For compilers with a suitable mechanism (currently GCC 3.1 or later, and
1112 MSVC 7.0 or later) this causes compile-time warning messages to be emitted for
1113 any use of the deprecated feature.  For compilers without support, the macro
1114 just expands to its argument.
1116 Sometimes a deprecated feature will also be removed from the library itself
1117 (particularly something like a typedef), but if the feature is still used
1118 inside the library (for example, so we can define class methods), then use
1119 XAPIAN_DEPRECATED_EX() or XAPIAN_DEPRECATED_CLASS_EX instead, which will only
1120 issue a warning in user code (this relies on user code including xapian.h
1121 and library code including individual headers)
1123 You must add this line to any API header which uses XAPIAN_DEPRECATED() or
1124 XAPIAN_DEPRECATED_CLASS::
1126     #include <xapian/deprecated.h>
1128 When marking a feature as deprecated, document the deprecation in
1129 docs/deprecation.rst.  When actually removing deprecated features, please tidy
1130 up by removing the inclusion of <xapian/deprecated.h> from any file which no
1131 longer marks any features as deprecated.
1133 The XAPIAN_DEPRECATED() macro should wrap the whole declaration except for the
1134 semicolon and any "definition" part, for example::
1136     XAPIAN_DEPRECATED(int old_function(double arg));
1138     class Foo {
1139       public:
1140         XAPIAN_DEPRECATED(int old_method());
1142         XAPIAN_DEPRECATED(int old_const_method() const);
1144         XAPIAN_DEPRECATED(virtual int old_virt_method()) = 0;
1146         XAPIAN_DEPRECATED(static int old_static_method());
1148         XAPIAN_DEPRECATED(static const int OLD_CONSTANT) = 42;
1149     };
1151 Mark a class as deprecated by inserting ``XAPIAN_DEPRECATED_CLASS`` after the
1152 class keyword like so::
1154     class XAPIAN_DEPRECATED_CLASS Foo {
1155       public:
1156         Foo() { }
1158         // ...
1159     };
1161 With recent versions of GCC (4.4.7 allows this, 3.3.5 doesn't), you can
1162 simply mark a method defined inline in a class with ``XAPIAN_DEPRECATED()``
1163 like so:
1164     
1165     class Foo {
1166       public:
1167         // This fails to compile with GCC 3.3.5, so don't do this!
1168         XAPIAN_DEPRECATED(int old_inline_method()) { return 42; }
1169     };
1170     
1171 Xapian 1.3.x and later require at least GCC 4.6, so you can just use the
1172 approach above.  Xapian 1.2.x aims to support GCC 3.1 and later, so in the
1173 unlikely event of needing to adjust deprecation markers in 1.2.x, you need to
1174 rewrite the above like so:
1176     class Foo {
1177       public:
1178         XAPIAN_DEPRECATED(int old_inline_method());
1179     };
1181     inline int Foo::old_inline_method() { return 42; }
1183 Submitting Patches:
1184 ===================
1186 If you have a patch to fix a problem in Xapian, or to add a new feature,
1187 please send it to us for inclusion.  Any major changes should be discussed
1188 on the xapian-devel mailing list first:
1189 <http://xapian.org/lists>
1191 Also, please read the following section on licensing of patches before
1192 submitting a patch.
1194 We find patches in unified diff format easiest to read.  If you're using
1195 git, then "git diff" is good (or "git format-patch" for a patch series).  If
1196 you're working from a tarball, you can unpack a second clean copy of the files
1197 and compare the two versions with "diff -pruN" (-p reports the function name
1198 for each chunk, -r acts recursively, -u does a unified diff, and -N shows
1199 new files in the diff).  Alternatively "ptardiff" (which comes with perl, at
1200 least on Debian and Ubuntu) can diff against the original tarball, unpacking
1201 it on the fly.
1203 Please set the width of a tab character in your editor to 8 spaces, and use
1204 Unix line endings (i.e. LF, not CR+LF).  Failing to do so will make it much
1205 harder for us to merge in your changes.
1207 We don't currently have a formal coding standards document, but please try
1208 to follow the style of the existing code.  In particular:
1210 * Indent C++ code by 4 spaces for a new indentation level, and set your editor
1211   to tab-fill indentation (with a tab being 8 spaces wide).
1213   As an exception, "public", "protected" and "private" declarations in classes
1214   and structs should be indented by 2 spaces, and the following code should be
1215   indented by 2 more spaces::
1217     class Foo {
1218       public:
1219         method();
1220     };
1222   The rationale for this exception is that class definitions in header files
1223   often have fairly long lines, so losing an indent level to the access
1224   specifier tends to make class definitions less readable.
1226   The default access for a class is always "private", so there's no need
1227   to specify that explicitly - in other words, write this::
1228   
1229     class Foo {
1230         int internal_method();
1232       public:
1233         int external_method();
1234     };
1236   Don't write this::
1238     class Foo {
1239       private:
1240         int internal_method();
1242       public:
1243         int external_method();
1244     };
1246   If a class only contains public methods and data, consider declaring it as a
1247   "struct" (the only difference in C++ is that the default access for a
1248   struct is "public").
1250 * Put a space before the "(" after control flow constructs like "for", "if",
1251   "while", etc.  Don't put a space before the "(" in function calls.  So
1252   write "if (strlen(p) > 10)" not "if(strlen (p) > 10)".
1254 * When "if", "else", "for", "while", "do," "switch", "case", "default", "try",
1255   or "catch" is followed by a block enclosed in braces, the opening brace
1256   should be on the same line, like so::
1258     if (x > 12) {
1259         foo(x);
1260         x = 12;
1261     } else {
1262         bar(x);
1263     }
1265   The rationale for this is that it conserves vertical space (allowing more
1266   code to fit on screen) without reducing readability.
1268 * If you have an empty loop body, use `{ }` rather than `;` as the former
1269   stands out more clearly to the reader (but also consider if the code might be
1270   clearer written a different way).
1272 * Prefer "++i;" to "i++;", "i += 1;", or "i = i + 1".  For simple integer
1273   variables these should generate equivalent (if not identical) code, but if i
1274   is an iterator object then the pre-increment form can be more efficient in
1275   some cases with some compilers.  It's simpler and more consistent to always
1276   use the pre-increment form (unless you make use of the old value which the
1277   post-increment form returns).  For the same reasons, prefer "--i;" to "i--;",
1278   "i -= 1;", or "i = i - 1;".
1280 * Prefer "container.empty()" to "container.size() == 0" (and
1281   "!container.empty()" to "container.size() != 0" or "container.size() > 0").
1282   Finding the size of a container may not be a constant time operation for
1283   all containers (e.g. std::list may not be, and indeed isn't for GCC - see
1284   https://gcc.gnu.org/onlinedocs/libstdc++/manual/containers.html#sequences.list.size).
1285   Also the "empty()" form makes the intent of the test more explicit.
1287 * Prefer not to use "else" when the control flow is diverted elsewhere at the
1288   end of the "if" block (e.g. by "return", "continue", "break", "throw").  This
1289   eliminates a level of indentation from the code in the "else" block, and
1290   typically makes the control flow logic clearer.  For example::
1292     if (x == 0) {
1293         foo();
1294         return;
1295     }
1297     while (x--) {
1298         bar();
1299     }
1301   rather than::
1303     if (x == 0) {
1304         foo();
1305         return;
1306     } else {
1307         while (x--) {
1308             bar();
1309         }
1310     }
1312 * For standard ISO C headers, prefer the C++ form for ISO C headers (e.g.
1313   "#include <cstdlib>" rather than "#include <stdlib.h>") unless there's a good
1314   reason (e.g. portability) to do otherwise.  Be sure to document such
1315   exceptions to avoid another developer changing them to the standard form.
1316   Global exceptions: <signal.h> (lots of POSIX stuff which e.g. Sun's compiler
1317   doesn't provide in <csignal>).
1319 * For standard ISO C++ headers, *always* use the ISO C++ form '#include <list>'
1320   (pre-ISO compilers used '#include <list.h>', but GCC has generated a warning
1321   for this form for years, and GCC 4.3 dropped support entirely).
1323 * Some guidelines for efficient use of std::string:
1325   + When passing an empty string to a method expecting ``const std::string &``
1326     prefer ``std::string()`` to ``""`` or ``std::string("")`` as the first form
1327     is more likely to directly use a special "empty string representation" (it
1328     does with GCC at least).
1330   + To make a string object empty, ``s.resize(0)`` (if you want to keep the
1331     current reserved space) or ``s = string()`` (if you don't) seem the best
1332     options.
1334   + Use ``std::string::assign()`` rather than building a temporary string
1335     object and assigning that.  For example, ``foo = std::string(ptr, len);``
1336     is better written as ``foo.assign(ptr, len);``.
1338   + It's generally better to build up strings using ``+=`` rather than
1339     combining series of components with ``+``.  So ``foo = a + " and " + c`` is
1340     better written as ``foo = a; foo += " and "; foo += c;``.  It's possible
1341     for compilers to handle the former without a lot of temporary string
1342     objects by returning a proxy object to allow the concatenation to happen
1343     lazily, but not all compilers do this, and it's likely to still have some
1344     overhead.  Note that GCC 4.1 seems to produce larger code in some cases for
1345     the latter approach, but it's a definite win with GCC 4.4.
1347   * ``std::string(1, '\0')`` seems to be slightly more efficient than
1348     ``std::string("", 1)`` for constructing a std::string containing a single
1349     ASCII nul character.
1351 * Prefer ``new SomeClass`` to ``new SomeClass()``, since the latter tends to
1352   lead one to write ``SomeClass foo();` which is a function prototype, and not
1353   equivalent to the variable definition ``SomeClass foo``.  However, note that
1354   ``new SomePODType()`` is *not* the same as ``new SomePODType`` (if
1355   SomePODType is a POD (Plain Old Data) type) - the former will zero-initialise
1356   scalar members of SomePODType.
1358 * When catching an exception which is an object, do it by const reference, so
1359   like this::
1361       try {
1362           foo();
1363       } catch (const ErrorClass &e) {
1364           bar(e);
1365       }
1367   Catching by value is bad because it "slices" the object if an object of a
1368   derived type is thrown.  Even if derived types aren't a worry, it also causes
1369   the copy constructor to be called needlessly.
1371   See also: http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.7
1373   A const reference is preferable to a non-const reference as it stops the
1374   object being inadvertently modified.  In the rare cases when you want to
1375   modify the caught object, a non-const reference is OK.
1377 We will do our best to give credit where credit is due - if we have used
1378 patches from you, or received helpful reports or advice, we will add your name
1379 to the AUTHORS file (unless you specifically request us not to).  If you see we
1380 have forgotten to do this, please draw it to our attention so that we can
1381 address the omission.
1383 Licensing of patches
1384 ====================
1386 If you want a patch to be considered for inclusion in the Xapian sources, you
1387 must own the copyright on this patch.  Employers often claim copyright on code
1388 written by their employees (even if the code is written in their spare time),
1389 so please check with your employer if this applies.  Be aware that even if you
1390 are a student your university may try and claim some rights on code which you
1391 write.
1393 Patches which are submitted to Xapian will only be included if the copyright
1394 holder(s) dual-license them under each of the following licences:
1396  - GPL version 2 and all later versions (see the file "COPYING" for details).
1397  - MIT/X license::
1399  Copyright (c) <year> <copyright holders>
1401  Permission is hereby granted, free of charge, to any person obtaining a copy
1402  of this software and associated documentation files (the "Software"), to
1403  deal in the Software without restriction, including without limitation the
1404  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1405  sell copies of the Software, and to permit persons to whom the Software is
1406  furnished to do so, subject to the following conditions:
1408  The above copyright notice and this permission notice shall be included in
1409  all copies or substantial portions of the Software.
1411  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1412  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1413  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1414  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1415  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1416  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
1417  IN THE SOFTWARE.
1419 The current distribution of Xapian contains many files which are only licensed
1420 under the GPL, but we are working towards being able to distribute Xapian under
1421 a more permissive license, and are not willing to accept patches which we will
1422 have to rewrite before this can happen.
1424 Tips for Submitting a Good Patch
1425 ================================
1427 1) Make sure that the documentation is updated
1428 ----------------------------------------------
1430  * API classes, methods, functions, and types must be documented by
1431    documentation comments alongside the declaration in ``include/xapian/*.h``.
1432    These are collated by doxygen - see doxygen's documentation for details
1433    of the supported syntax.  We've decided to prefer to use @ rather than \
1434    to introduce doxygen commands (the choice is essentially arbitrary, but
1435    \ introduces C/C++ escape sequences so @ is likely to make for easier to
1436    read mark up for C/C++ coders).
1438  * The documentation comments don't give users a good overview, so we also
1439    need documentation which gives a good overview of how to achieve particular
1440    tasks.  In particularly, major new functionality should have its own "topic"
1441    document, or extend an existing topic document if more appropriate.
1443  * Internal classes, etc should also be documented by documentation comments
1444    where they are declared.
1446 2) Make sure the tests are right
1447 --------------------------------
1449  * If you're adding a feature, also add feature tests for it.  These both
1450    ensure that the feature isn't broken to start with and detect if later
1451    changes stop it working as intended.
1453  * If you've fixed a bug, make sure there's a regression test which
1454    fails on the existing code and succeeds after your changes.
1456  * Make sure all existing tests continue to pass.
1458 If you don't know how to write tests using the Xapian test rig, then
1459 ask.  It's reasonably simple once you've done it once.  There is a brief
1460 introduction to the Xapian test system in ``docs/tests.html``.
1462 3) Make sure the attributions are right
1463 ---------------------------------------
1465  * If necessary, modify the copyright statement at the top of any
1466    files you've altered. If there is no copyright statement, you may
1467    add one (there are a couple of Makefile.am's and similar that don't
1468    have copyright statements; anything that small doesn't really need
1469    one anyway, so it's a judgement call).  If you've added files which
1470    you've written from scratch, they should include the GPL boilerplate
1471    with your name only.
1473  * If you're not in there, add yourself to the AUTHORS file.
1475 4) Commit
1476 ---------
1478  * Commit:
1479   
1480    + If there's a trac ticket or other reference for the bug, mention it in the
1481      commit message - it's a great help to future developers trying to work out
1482      why a change was made.
1484 5) Consider backporting
1485 -----------------------
1487  * If there's an active release branch, check if the bug is present in that
1488    branch, and if the fix is appropriate to backport - if the fix breaks ABI
1489    compatibility or is very invasive, you need to fix it in a different way
1490    for the release branch, or decide not to backport the fix.
1492 6) Update trac
1493 --------------
1495  * If there's a related trac ticket, update it (if the issue is completely
1496    addressed by the changes you've made, then close it).
1498  * Update the release notes for the most recent release with a copy of the
1499    patch.  If the commit from git applies cleanly, you can just link to
1500    it.  If it fails to apply, please attach an adjusted patch which does.
1501    If there are conflicts in test cases which aren't easy to resolve, it is
1502    acceptable to just drop those changes from the patch if we can still be
1503    confident that the issue is actually fixed by the patch.
1505 API Structure Notes
1506 ===================
1508 We use reference counted pointers for most API classes.  These are implemented
1509 using Xapian::Internal::intrusive_ptr, the implementation of which is exposed
1510 for efficiency, and because it's unlikely we'll need to change it frequently,
1511 if at all.
1513 For the reference counted classes, the API class (e.g. Xapian::Enquire) is
1514 really just a wrapper around a reference counted pointer.  This points to an
1515 internal class (e.g. Xapian::Enquire::Internal).  The reference counted
1516 pointer is a member variable of the API class called internal.  Conceptually
1517 this member is private, though it typically isn't declared as private (this
1518 is to avoid littering the external headers with friend declarations for
1519 non-API classes).
1521 There are a few exceptions to the reference counted structure, such as
1522 MSetIterator and ESetIterator which have an exposed implementation.  Tests show
1523 this makes a substantial difference to speed (it's ~20% faster) in typical
1524 cases of iterator use.
1526 The postfix operator++ for iterators should be implemented inline in terms
1527 of the prefix form as described by Joe Buck on the gcc mailing list
1528 - excerpt from http://article.gmane.org/gmane.comp.gcc.devel:50201 ::
1530         class some_iterator {
1531         public:
1532             // ...
1533             some_iterator& operator++();
1535             some_iterator operator++(int) {
1536                 some_iterator tmp = *this;
1537                 operator++();
1538                 return tmp;
1539             }
1540         };
1542     The compiler is allowed to assume that the copy constructor only does
1543     a copy, and to optimize away unneeded copy operations.  The result
1544     in this case should be that, for some_iterator above, using the
1545     postfix operator without using the result should give code equivalent
1546     to using the prefix operator.
1548     Now, for [GCC 3.4], you'll find that the dead uses of tmp are only
1549     completely optimized away if tmp has only one data member that can fit in a
1550     register.  [GCC 4.0 will do] better, and you should find that this style
1551     comes very close to eliminating any penalty from "incorrect" use of the
1552     postfix form.
1554 Xapian's PostingIterator, TermIterator, PositionIterator, and ValueIterator all
1555 have only one data member which fits in a register.
1557 Handy tips for aiding development
1558 =================================
1560 If you are find you are repeatedly changing the API headers (in include/)
1561 during development, then you may become annoyed that the docs/ subdirectory
1562 will rebuild the doxygen documentation every time you run "make" since this
1563 takes a while.  You can disable this temporarily (if you're using GNU make),
1564 by creating a file "docs/GNUmakefile" containing these two lines::
1567         @echo "Skipping 'make $@' in docs"
1569 Note that the whitespace at the start of the second line needs to be a
1570 single "tab" character!
1572 Don't forget to remove (or rename) this and check the documentation builds
1573 before committing or generating a patch though!
1575 If you are using an editor or other tool capable of running syntax checks as you
1576 work there you can use the `make` target 'check-syntax'. For 'emacs' users this
1577 works well with 'flymake'. Usage from a shell::
1579     make check-syntax check_sources=api/omdatabase.cc
1582 How to make a release
1583 =====================
1585 This is a (hopefully complete) list of the jobs which need doing:
1587 * Email Fabrice Colin and Tim Brody so they can check RPM packaging.
1589 * Check if `config/config.guess` and `config/config.sub` need updating to
1590   more recent versions from http://git.savannah.gnu.org/gitweb/?p=config.git
1592 * Check the revision currently specified in the bootstrap for the common
1593   subdirectory.  Unless there's a good reason, we should release
1594   xapian-core and omega with synchronised versions of the shared files.
1596 * Make sure that any new/changed/removed API methods in xapian-core have been
1597   wrapped/updated/removed in xapian-bindings.
1599 * Update the lists of deprecated/removed API methods in docs/deprecation.rst
1601 * Update the NEWS files using information from the ChangeLog files
1603 * Update the version in configure.ac for each module (xapian-core, omega, and
1604   xapian-bindings), and the library version info in xapian-core's configure.ac
1606 * Make sure the submitters of fixed bugs are mentioned in the "thanks" list in
1607   xapian-core/AUTHORS.  Check the list for the appropriate milestone::
1609    http://trac.xapian.org/query?col=id&col=summary&col=reporter&milestone=1.0.14
1611 * On atreus, tag the source trees for the new revision - use the
1612   git-tag-release script, running it with the new version number, for example:
1614   xapian-maintainer-tools/git-tag-release 1.0.14
1616   This script also generates tarballs for the new release and copies them
1617   across to the website.
1619 * Add the new version to the list of versions in trac:
1620   http://trac.xapian.org/admin/ticket/versions
1622 * Add a new milestone for the version after this one:
1623   http://trac.xapian.org/admin/ticket/milestones
1625 * Mark the current milestone as completed.  In order to do so, any unfixed bugs
1626   with this milestone will need to be moved to another milestone (most likely
1627   the milestone you just added).
1629 * Update the wiki:
1631   Create a new page http://wiki.xapian.org/ReleaseNotes/X.Y.Z and link it into
1632   http://wiki.xapian.org/ReleaseNotes in place of the old current release link,
1633   which should be moved to the archived section.
1635   Also update the roadmap at http://wiki.xapian.org/RoadMap by recording the
1636   date of this release and adding an entry for the next release with an
1637   estimated release date.
1639 * Update the website: `generate` in the CVS module www.xapian.org contains the
1640   latest version and the date it was released.
1642 * Run /home/olly/tmp/xapian-website-update/update_website.sh
1644 * Announce the new version on xapian-discuss
1646 * Have a nice cup of tea!
1648 How to make Debian packages for a new release
1649 =============================================
1651 Debian control files are stored in separate git repositories:
1653 * http://anonscm.debian.org/cgit/collab-maint/xapian-bindings.git
1654 * http://anonscm.debian.org/cgit/collab-maint/xapian-core.git
1655 * http://anonscm.debian.org/cgit/collab-maint/xapian-omega.git
1657 To package a new upstream release, these should be updated as follows:
1659 * If there are any patch files in "debian/patches", check if these have been
1660   incorporated into the new release, and if so remove them and update
1661   "debian/patches/series".
1663 * Update the debian/changelog file, being sure to keep it in the
1664   standard Debian format (the easiest way is to use the dch utility
1665   like so: "dch -v 1.2.19-1".  The new version number should be the
1666   version number of the release followed by "-1" (i.e., a debian
1667   patch number of 1).  The changelog message should indicate that
1668   there is a new upstream release, and should mention any significant
1669   changes in the new release.
1671 * Tag using: ``git tag -s -m 1.2.19-1 1.2.19-1``
1673 * FIXME: Document how to make source packages, or update
1674   ``make-source-packages``.
1676 * FIXME: Document how to build binary packages, or update ``build-packages``.
1678 * Test the packages.
1680 * Run ``debsign build/*_amd64.changes`` to GPG sign the packages.
1682 * Run ``dput build/*_amd64.changes`` to upload them to Debian.
1684 * For the Ubuntu backports::
1686    ./backport-source-packages xapian-core 1.2.19-1 ubuntu
1687    ./backport-source-packages xapian-omega 1.2.19-1 ubuntu
1688    ./backport-source-packages xapian-bindings 1.2.19-1 ubuntu
1690   And once libsearch-xapian-perl is uploaded to Debian unstable::
1692    ./backport-source-packages libsearch-xapian-perl 1.2.19.0-1 ubuntu
1694   Then sign::
1696    debsign build/*99*_source.changes
1698   Upload::
1700    dput xapian-backports build/xapian-core*99*_source.changes
1702   Wait for that to have a chance to build, and then::
1704    dput xapian-backports build/xapian-[bo]*99*_source.changes
1705    dput xapian-backports build/libsearch-xapian-perl*_source.changes
1707 .. vim: syntax=rst