Build instructions for the Apache Lucy C library
================================================

Clownfish dependency
--------------------

IMPORTANT: The Apache Lucy C library depends on the Clownfish object system
which must be built first. Please read this section, or your build will
probably FAIL.

Lucy needs the following Clownfish components:

    * The command-line Clownfish compiler 'cfc'.
    * The Clownfish header files of the Clownfish runtime.
    * The 'libcfish' shared library.

If you installed Clownfish to /usr/local or /usr on UNIX, no further action
should be required. If you installed Clownfish to an alternate location,
make sure to use the --clownfish-prefix configure option:

    $ ./configure --clownfish-prefix=clownfish-install-dir

It's also possible to build Lucy with an uninstalled Clownfish build from
the Clownfish source directory. To setup the required environment variables,
source the file devel/bin/setup_env.sh from the Clownfish source tree:

    $ source path_to_clownfish/devel/bin/setup_env.sh

Or, if you're on the Windows shell:

    $ path_to_clownfish/devel/bin/setup_env.bat

Building under UNIX and derivatives or Cygwin
---------------------------------------------

    $ ./configure
    $ make
    $ make test

Building under Windows
----------------------

You need MSVC or gcc as C compiler and nmake or mingw32-make as make utility.

When using cmd.exe configure with:

    $ configure.bat

When using the MSYS shell configure with:

    $ ./configure

When building with nmake run:

    $ nmake
    $ nmake test

When building with mingw32-make run:

    $ mingw32-make
    $ mingw32-make test

Configuration
-------------

    ./configure [ options ] [ -- cflags ]

Options include

    --enable-coverage
        Enable code coverage. Create HTML pages with coverage data using
        lcov by running "make coverage".
    --disable-threads
        Disable thread support.
    --clownfish-prefix=path
        Specify an alternative location for Clownfish if it isn't installed
        in a system directory.

