		Installing Qpid/C++ on Windows
		==============================

Table of Contents
=================
1. Introduction

2. Prerequisites
   2.1. What to Install
   2.2. Important Environment Variable Settings

3. Building from a Source Distribution
4. Building a Repository Working Copy
5. Tests
6. Doxygen
7. Troubleshooting


1. Introduction
===============
Note that the broker and client API can be built and installed separately.
They both link against a common library.

This document describes how to build the Qpid/C++ broker and client on
Windows using Microsoft Visual Studio 2008 (VC9). It describes how to build
from both a checkout of the source and from a source distribution.

Please see INSTALL for information on building on Linux/UNIX.


2. 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 successful build are given in parentheses.
Take these as a recommended minimum version.

2.1. What to Install
====================

The following libraries and header files must be installed to build
from either a source checkout or a source distribution:

 * boost      <http://www.boost.org>                   	(1.35)(*)

earlier versions of boost e.g. 1.33 also work

To build from a source repository (SVN) checkout you will need boost plus:

 * CMake      <http://www.cmake.org>                    (2.4)
 * python     <http://www.python.org>                   (2.5.2)
 * ruby       <http://www.ruby-lang.org>               	(1.8.4)

Regardless of which type of build you perform, if you wish to run the full
test suite, you will need to have python, listed above, installed.

2.2. Important Environment Variable Settings
============================================
Ensure that all the build tools are available on your path, when they are
manually installed to non-standard locations. For example:

 # set PATH=C:\python25;%PATH%

It is also necessary to set BOOST_ROOT to refer to the base of your Boost
installation. The Visual Studio projects refer to it. For example:

 # set BOOST_ROOT="C:\Program Files\boost\boost_1_35_0"


3. Building from a Source Distribution
======================================
The Qpid client/broker, examples, and tests are built with a single
Visual Studio solution file which is generated by CMake.

From a command prompt:

 # cd qpid\cpp
 # cmake -i -G "Visual Studio 9 2008" .

Output from CMake includes .h files in the include directory, .vcproj
files for executables and dlls, and the qpid-cpp.sln solution file.

Open the qpid-cpp.sln solution, select Debug or Release, and build.
You can build both Release and Debug from the same project.

If you build all the projects you can then "Build" the RUN_TESTS project.
This will run the test suite against the Qpid version just built.


4. Building a Repository Working Copy
=====================================
This section will assume that you will create a directory for your Qpid
work. This directory will be referred to below as C:\qpid.

To get the source code from the subversion repository (trunk) do:

 C:\qpid> svn checkout https://svn.apache.org/repos/asf/qpid/trunk

The first step in the build is to configure and generate the Visual
Studio projects. This step also generates a significant number of source
files that are part of the build. 

- Run CMakeSetup. The CMake binary install often leaves a shortcut to
  CMakeSetup on the desktop - it is named CMake.
- The CMakeSetup window has 2 directory selection areas at the top; one for
  where the source is located (C:\qpid\trunk\qpid\cpp) and one for where you
  wish to place the build. A directory separate from the source directory is
  generally preferred; it can be, but need not be, a subdirectory to the
  source. (C:\qpid\build)
- The first time you run CMakeSetup it will ask you to select a generator.
  You should select the method you prefer to build with: Visual Studio 2008
  or NMake Makefiles.
- The Cache Values area of the window is where the system and build settings
  are displayed. You can change these by clicking on the values if desired.
- Click the Configure button. The first time Qpid is configured this step may
  take a few minutes and you will see lots of messages about generated source
  files. If the Cache Values area has any red lines, change or correct the
  value if needed (it may only be red because it's new - you only need to
  change/correct items that correspond to errors in configuration). Click
  Configure again. Repeat until all the Cache Values are gray.
- Click the OK button to generate the project/make files.

Open the qpid-cpp.sln solution located in the build directory, select Debug
or Release, and build. You can build both Release and Debug from the same
project.

If you build all the projects you can then "Build" the RUN_TESTS project.
This will run the test suite against the Qpid version just built.


5. Tests
========
See src/tests/README.txt for details.


6. 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.

The user-level API documentation can be generated by building the
user-api-docs project from the generated Visual Studio solution. The
documentation is generated into the docs/api/html directory under your
build directory.


7. Troubleshooting
==================

When the broker is executed it will try to store a file in the "qpidd"
subdirectory of the current user's temporary file directory, or in
C:\WINDOWS\TEMP. If the qpidd directory can't be created or accessed the
broker startup will fail.
