
                  Apache UIMA C++ (Unstructured Information Management Architecture) v2.3.0
                  -------------------------------------------------------------------------

Getting Started
----------------

Apache UIMA C++ can be used as a standalone framework, but it is primarily intended to be integrated with the Apache UIMA Java framework. Interoperability is enhanced if the uimacpp SDK package is installed directly under the top level directory of the Apache UIMA Java framework. 

For information about the Apache UIMA C++ package go to index.html in the uimacpp/docs directory. For more information about Apache UIMA, go to http://incubator.apache.org/uima/index.html, or to the documentation in the Apache UIMA Java package.


Supported Platforms
--------------------

Apache UIMA C++ has been tested with gcc v4.0 on Linux and MacOSX, and with VC8 on Windows. Binary distributions are available for selected platforms.


Environment Variables
----------------------

The following environmental variables are needed for UIMA C++ to function properly.

    * UIMACPP_HOME should point to the uimacpp directory of your unpacked Apache UIMA C++
      distribution. UIMACPP_HOME is used when compiling & linking UIMA C++ components.
    * Append $UIMACPP_HOME/bin to your PATH to pick up the runAECpp test driver
      and shared libraries (Windows)
    * Append $UIMACPP_HOME/lib to your LD_LIBRARY_PATH (Linux) or DYLD_LIBRARY_PATH (MacOSX)
      so that the necessary shared libraries can be found.

Also note that UIMA C++ annotators are built as shared libraries, so they must be in a directory in the LD_LIBRARY_PATH, DYLD_LIBRARY_PATH or PATH (as appropriate to your platform) as well. An example of this is given in the next section.

For better runtime integration between Java and C++, the Apache UIMA Java SDK command line utilities and Eclipse run configurations automatically add $UIMA_HOME/uimacpp/lib to LD_LIBRARY_PATH and DYLD_LIBRARY_PATH, and add $UIMA_HOME/uimacpp/bin to PATH.


Verifying Your Installation
----------------------------

The procedure here is to first test that Apache UIMA C++ is installed and operating correctly. Then if desired, check if the code is interoperating properly with Apache UIMA Java.

Set up the environment as described above. Go to $UIMACPP_HOME/examples/src to build the sample code and add the src directory to the appropriate path as follows.

On Linux:
    * make -f DaveDetector.mak
    * LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`

On Windows:
    * devenv DaveDetector.vcproj /build release
    * PATH=%PATH%;%CD%

To test the sample code in the C++ environment, change back to the $UIMACPP_HOME/examples directory and run:
    * runAECpp descriptors/DaveDetector.xml data

The console should show that a Dave was found in some of the files in the data directory.

To test interoperability with Java using the JNI, first verify that Apache UIMA Java is working from the current shell, as described in that package, and then use the runAE.sh utility (use runAE on Windows) from $UIMACPP_HOME/examples:
    * runAE.sh descriptors/DaveDetector.xml data

For more information about the C++ sample code see $UIMACPP_HOME/examples/readme.html.

For more information about UIMA C++ $UIMACPP_HOME/RELEASE_NOTES.html.


Disclaimer
-----------

Apache UIMA is an effort undergoing incubation at The Apache Software
Foundation (ASF). Incubation is required of all newly accepted projects
until a further review indicates that the infrastructure, communications,
and decision making process have stabilized in a manner consistent with
other successful ASF projects. While incubation status is not necessarily
a reflection of the completeness or stability of the code, it does
indicate that the project has yet to be fully endorsed by the ASF.

