| Qpid C++ is a C++ implementation of the AMQP protcol described at | |
| http://amqp.org/ | |
| The Qpid project also provides Java, Ruby and Python implementations. | |
| For additional software or information on the Qpid project go to: | |
| http://incubator.apache.org/qpid/index.html | |
| Available documentation: | |
| qpidd(1) man page - how to run the broker daemon. | |
| html/index.html - C++ client API. | |
| Note the daemon and client API can be installed separately. | |
| This README describes how to build the Qpid C++ broker and client, either | |
| from a checkout of the source or from a source distribution. | |
| == Prerequisites == | |
| We prefer to avoid spending time accommodating older versions of these | |
| packages, so please make sure that you have the latest stable versions. | |
| Known version numbers for a succesfull build are given in brackets, take | |
| these as a recommended minimum version. Older unix versions, for example, | |
| Redhat Linux 3, will almost certainly require some packages to be upgraded. | |
| Qpid can be built using the gcc compiler: | |
| # gcc <http://gcc.gnu.org/> (3.2.3) | |
| Qpid is compiled against libraries: | |
| * apr <http://apr.apache.org> (1.2.7) | |
| * boost <http://www.boost.org> (1.33.1) | |
| * cppunit <http://cppunit.sourceforge.net> (1.11.4) | |
| Using tools: | |
| * boost-jam <http://boost.sourceforge.net/> (3.1.13) | |
| * GNU make <http://www.gnu.org/software/make/> (3.8.0) | |
| * autoconf <http://www.gnu.org/software/autoconf/> (2.61) | |
| * automake <http://www.gnu.org/software/automake/> (1.9.6) | |
| * help2man <http://www.gnu.org/software/help2man/> (1.36.4) | |
| * libtool <http://www.gnu.org/software/libtool/> (1.5.22) | |
| * pkgconfig <http://pkgconfig.freedesktop.org/wiki/> (0.21) | |
| * doxygen <ftp://ftp.stack.nl/pub/users/dimitri/> (1.5.1) | |
| * graphviz <http://www.graphviz.org/> (2.12) | |
| * JDK 5.0 <http://java.sun.com/j2se/1.5.0/> (1.5.0.11) | |
| === Optional tools === | |
| Building from a source distribution does not require: | |
| * autoconf | |
| * automake | |
| * JDK 5.0 | |
| Building without testing does not require: | |
| * cppunit | |
| Building without documentaion does not require: | |
| * help2man | |
| * doxygen | |
| * graphviz | |
| === Installing as root === | |
| On linux most packages can be installed using your distribution's package | |
| management tool. For example on Fedora: | |
| # yum install apr-devel boost-devel cppunit-devel | |
| # yum install pkgconfig doxygen graphviz help2man | |
| Follow the manual installation instruction below for any packages not | |
| available through yum. | |
| === Building and installing packages manually or as non-root user === | |
| Required dependencies can be installed and built from source distributions. | |
| It is recommended that you create a directory to install them to, for example, | |
| ~/qpid-tools. To build and install the dependency pakcages: | |
| 1. Unzip and untar them and cd to the untared directory. | |
| 2. do: | |
| # ./configure --prefix=~/qpid-tools | |
| # make install | |
| The exceptions to this are boost and JDK 5.0. | |
| To build the boost library: | |
| 1. Unpack boost-jam. | |
| 2. Add bjam in the unpacked directory to your path. | |
| 3. Unpack boost and cd to the boost untarred directory. | |
| 4. do: | |
| # bjam -sTOOLS=gcc --prefix=~/qpid-tools | |
| To install JDK 5.0 download and run its install script, or whatever | |
| alternative instructions may be on the sun website. | |
| Ensure that all the build tools are available on your path, when they are | |
| manually installed to non-standard locations. For example: | |
| # export PATH=~/qpid-tools/bin:$PATH | |
| Ensure that pkg-config is set up correctly. For example: | |
| # export PKG_CONFIG_PATH=~/qpid-tools/lib/pkgconfig:/usr/local/pkgconfig | |
| # export PKG_CONFIG=~/qpid-tools/bin/pkg-config | |
| Ensure that the boost libraries are made available on the gcc library path. | |
| For example: | |
| # export CXXFLAGS=-I~/qpid-tools/include/boost-1_33_1 | |
| Ensure that JDK 5.0 has its home location set up correctly and is added to | |
| the path. For example: | |
| # export PATH=~/jdk1.5.0_11/bin:$PATH | |
| == Building from a source distribution. == | |
| In the distribution directory | |
| Build and install with: | |
| # ./configure --prefix=<install_location> | |
| # make all | |
| # make install | |
| To build and test everything: | |
| # make | |
| # make check | |
| This builds in the source tree. You can have multiple builds in the | |
| same working copy with different configuration. For example you can do | |
| the following to build twice, once for debug, the other with | |
| optimization: | |
| # make distclean | |
| # mkdir .build-dbg .build-opt | |
| # (cd .build-opt ../configure --prefix=/tmp/x && make && make check) | |
| # (cd .build-dbg ../configure CXXFLAGS=-g --prefix=/tmp/x \ | |
| && make && make check) | |
| == For Qpid developers: building a repository working copy == | |
| === Installing the latest autotools === | |
| If you don't have sufficiently up-to-date autotools you can get the | |
| latest by running run the script qpid-autotools-install. | |
| 1. Decide where you would like to install the tools. It should be in a | |
| local directory so that you do not need root privileges. (Suggest | |
| $HOME/qpid-tools.) Create an empty directory. | |
| 2. Modify your environment variable PATH to ensure that the bin directory | |
| within this directory comes first in the PATH string: | |
| PATH=$HOME/qpid-tools/bin:$PATH | |
| 3. Set PKG_CONFIG_PATH=$HOME/qpid-tools/lib/pkgconfig:/usr/lib/pkgconfig | |
| (or if it already exists, make sure that the above path to your | |
| qpid-tools directory is first). | |
| 4. Run the install utility from the cpp directory: | |
| ./qpid-autotools-install --prefix=$HOME/qpid-tools --skip-check | |
| (Note that --prefix will only accept an absolute path, so don't use | |
| ~/qpid-tools.) The utility will download, compile and install the | |
| required tools into the qpid-tools directory (this may take a little | |
| time). Watch for any notices about paths at the end of the install - | |
| this means that your environment is not correct - see steps 2 and 3 | |
| above. | |
| NOTE: If you omit the --skip-check option, the check of the build | |
| can add up to an hour to what is normally a few minutes of install | |
| time. | |
| 5. Perform a check: from the command-line run "which automake" and | |
| ensure that it finds the automake in your qpid-tools directory. If not, | |
| check that the build completed normally and your environment. | |
| 6. (Optional) If having the build artifacts lying around bothers you, delete | |
| the (hidden) build directory cpp/.build-auto-tools. | |
| To see help, run ./qpid-autotools-install --help. | |
| === Building a checkout === | |
| To get the source code from the subversion repository (trunk) do: | |
| # svn checkout https://svn.apache.org/repos/asf/incubator/qpid/trunk/ . | |
| To build a fresh checkout: | |
| Cd to qpid/cpp subdirectory. Before running make on a fresh checkout do: | |
| # ./bootstrap | |
| This generates config, makefiles and the like - check the script for | |
| details. You only need to do this once, "make" will keep everything up | |
| to date thereafter (including re-generating configuration & Makefiles | |
| if the automake templates change etc.) | |
| If you are developing code yourself, or if you want to help | |
| us keep the code as tight and robust as possible, consider enabling | |
| the use of valgrind. If you configure like this: | |
| # ./configure --enable-valgrind | |
| That will arrange (assuming you have valgrind installed) for "make check" | |
| to run tests via valgrind. That makes the tests run more slowly, but | |
| helps detect certain types of bugs, as well as memory leaks. If you run | |
| "make check" and valgrind detects a leak that is not listed as being | |
| "ignorable-for-now", the test script in question will fail. However, | |
| recording whether a leak is ignorable is not easy, when the stack | |
| signature, libraries, compiler, O/S, architecture, etc., may all vary, | |
| so if you see a new leak, try to figure out if it's one you can fix | |
| before adding it to the list. | |
| Now follow instruction for building from a source distribution. | |
| === Portability === | |
| All system calls are abstracted by classes under lib/common/sys. This | |
| provides an object-oriented C++ API and contains platform-specific | |
| code. | |
| These wrappers are mainly inline by-value classes so they impose no | |
| run-time penalty compared do direct system calls. | |
| Initially we will have a full linux implementation and a portable | |
| implementation sufficient for the client using the APR portability | |
| library. The implementations may change in future but the interface | |
| for qpid code outside the qpid/sys namespace should remain stable. | |
| === Unit tests === | |
| Unit tests are built as .so files containing CppUnit plugins. | |
| DllPlugInTester is provided as part of cppunit. You can use it to run | |
| any subset of the unit tests. See Makefile for examples. | |
| NOTE: If foobar.so is a test plugin in the current directory then | |
| surprisingly this will fail with "can't load plugin": | |
| # DllPluginTester foobar.so | |
| Instead you need to say: | |
| # DllPluginTester ./foobar.so | |
| Reason: DllPluginTester uses dlopen() which only searches for shlibs | |
| in the standard places unless the filename contains a "/". In that | |
| case it just tries to open the filename. | |
| === System tests === | |
| The Python test suite ../python/run_tests is the main set of broker | |
| system tests. | |
| There are some C++ client test executables built under client/test. | |
| == Doxygen == | |
| Doxygen generates documentation in several formats from source code | |
| using special comments. You can use javadoc style comments if you know | |
| javadoc, if you don't or want to know the fully story on doxygen | |
| markup see http://www.stack.nl/~dimitri/doxygen/ | |
| Even even if the code is completely uncommented, doxygen generates | |
| UML-esque dependency diagrams that are ''extremely'' useful in navigating | |
| around the code, especially for newcomers. | |
| To try it out "make doxygen" then open doxygen/html/index.html | |
| This README describes how to build the Qpid C++ broker and client, either | |
| from a checkout of the source or from a source distribution. |