Proton is a library for speaking AMQP, including:

  + The AMQP Messenger API, a simple but powerful interface to send and receive
    messages over AMQP.
  + The AMQP Protocol Engine, a succinct encapsulation of the full
    AMQP protocol machinery.

Proton is designed for maximum embeddability:

  + minimal dependencies
  + minimal assumptions about application threading model

Proton is designed to scale up and down:

  + transparently supports both simple peer to peer messaging and complex
    globally federated topologies

Proton is multi-lingual:

  + Proton-C - a C implementation with lanuage bindings in Python, Php, Perl,
    Ruby, and Java (via JNI).
  + Proton-J - a pure Java implementation

Please see http://qpid.apache.org/proton for a more info.

==== Build Instructions ====

Proton has two separate build systems reflecting the nature of its
two implementations.

   + Proton-C and the language bindings use CMake.
   + Proton-J uses Maven.

The two build systems are independent of one and other, that is, Proton-C
may be built independently of Proton-J, and vice-versa.

=== Proton-C ===

== Build Instructions (Linux) ==

The following prerequesuites are required to do a full build. If you do not
wish to build a given language binding you can omit the package for that
language:

  # required dependencies
  yum install gcc cmake libuuid-devel

  # dependencies needed for ssl support
  yum install openssl-devel

  # dependencies needed for bindings
  yum install swig python-devel ruby-devel php-devel java-1.6.0-openjdk

  # dependencies needed for python docs
  yum install epydoc

From the directory where you found this README file:

  mkdir build
  cd build

  # Set the install prefix. You may need to adjust depending on your
  # system.
  cmake -DCMAKE_INSTALL_PREFIX=/usr ..

  # Omit the docs target if you do not wish to build or install
  # documentation.
  make all docs

  # Note that this step will require root privileges.
  make install

Note that all installed files are stored in the install_manifest.txt
file.

== Build Instructions (Windows) ==

This describes how to build the Proton library on Windows using Microsoft
Visual C++ 2010 Express (VC10).

The Proton build uses the cmake tool to generate the Visual Studio project
files.  These project files can then be loaded into Express and used to build
the Proton library.

Note that these instructions were created using a 32 bit version of Windows 7
Professional. These instructions assume use of a command shell.

The following packages must be installed:

    Visual Studio 2010 Express (or equivalent)
    Python (www.python.org)
    Cmake (www.cmake.org)

    Notes:
        - Be sure to install MSVC Express 2010 Service Pack 1 also!
        - python.exe _must_ be in your path
        - cmake.exe _must_ be in your path


Step 1: Create a 'build' directory - this must be at the same level as the 'src'
        directory.  Example:

     $ cd proton-c
     $ mkdir build

Step 2: cd into the build directory

     $ cd build

Step 3: Generate the Visual Studio project files using cmake.  You must provide:

        1) the name of the compiler you are using [see cmake documentation],
        2) the path to the _directory_ that contains the "CMakeLists.txt"
           file (the parent directory, in this case).
     Example:

     $ cmake -G "Visual Studio 10" ..

     Refer to the cmake documentation for more information.

Step 4: Load the ALL_BUILD project into Visual C++ Express.

     4a: Run the Microsoft Visual C++ Express IDE
     4b: From within the IDE, open the ALL_BUILD project file - it should be in
         the 'build' directory you created above.

Step 5: Build the ALL_BUILD project.

=== Proton-J ===

== Build Instructions (All platforms) ==

The following prerequesuites are required to do a full build.

  + Apache Maven 3.0 (or higher) (http://maven.apache.org/)

From the directory where you found this README file:

  # To compile and package all Java modules (omitting the tests)
  mvn -DskipTests package

  # To install the packages in the local Maven repository (usually ~/.m2/repo)
  mvn -DskipTests install

=== Testing ===

To test Proton, run the system tests (located in the tests subdirectory).
The system tests are applicable to both the Proton-C and Proton-J
implementations.

== Test Instructions (Proton-C only) ==

To run the system tests against Proton-C, from the directory where you found this
README file:

  # Source conifig.sh to set-up the Python path.
  . config.sh

  # Execute the tests
  ./tests/python/proton-test

== Test Instructions (Proton-J and Proton-C) ==

To run the system tests, execute Maven specifying profile 'proton-j' to
test Proton-J, and 'proton-jni' to test the Proton-C implementation via the
JNI bindings.  (To test Proton-C via the JNI Bindings the JNI Binding must have
been built with Cmake as described above).

  # To test Proton-J
  mvn test -P proton-j

  # To test Proton-C via the JNI Bindings
  mvn test -P proton-jni

  # To produce a nicely formated report containing the test results
  # (in tests/target/site/surefire-report.html)
  mvn surefire-report:report

