The release comes in two forms, source and binary. 

To get both the binary and source distribution, you need libxml2 from http://xmlsoft.org/downloads.html
(NOTE: most Linux systems has libxml2 by default. On Windows you need to download and install libxml2)

Table of Contents
=================
1. Getting Axis2C working with the binary release on Linux
2. Getting Axis2C working with the source release on Linux
3. Getting Axis2C working with the binary release on Windows (win32)
	3.1 Requirements
	3.2 Binaries in the release
	3.3 Running the binaries
4. Getting Axis2c working with the source release on Windows (win32)
	4.1 Requirements
	4.2 Editing Configure.in file
	4.3 Compiling the source
	4.4 Running the binaries
5. Installing Apache2 Web Server integration module (mod_axis2)
	

1. Getting Axis2C working with the binary release on Linux.
==========================================================
1. Extract the binary tar package to a folder. 
   Set AXIS2C_HOME environment variable pointing to the location where you have extracted Axis2C
        AXIS2C_HOME='/your_path_to_axis2c'
        export AXIS2C_HOME
   Note: You will need to set AXIS2C_HOME only if you need to run axis2c samples or tests. The
    reason is that from sample and test codes it used AXIS2C_HOME to get path to axis2c. To write
    your own services or clients this is not a requirement.

2. Run the simple axis server:
        cd /your_path_to_axis2c/bin
        ./axis2_http_server
This will start the simple axis server on port 9090. To see the possible command line options run
        ./axis2_http_server -h
NOTE: If you run into shared lib problems, set the LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path_to_axis2c/lib
3. Run the sample clients in a new shell
        cd /your_path_to_axis2c/bin/samples
        ./echo
This will invoke the echo service.
        ./math
This will invoke the math service.
To see the possible command line options for sample clients run them with '-h' option
NOTE: If you run into shared lib problems, set the LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path_to_axis2c/lib

2. Getting Axis2C working with the source release on Linux.
==========================================================
1. Extract the source tar package to a folder. 
2. Set AXIS2C_HOME environment variable pointing to the location where you want to install Axis2C.
        AXIS2C_HOME='/your_desired_path_to_axis2c_installation'
        export AXIS2C_HOME
NOTE: If you run into shared lib problems, set the LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path_to_axis2c/lib

3. Then go to the folder where you extracted the source
        cd /your_path_to_axis2c_source
4. Set parser location
    Include path and library path to parser should be set. For libxml2 this is automatically
    resolved by configure script.
5. Build the source
This can be done using the following command sequence:
        ./configure
        make
        make install
use './configure --help' for options.

NOTE: If you don't provide a --prefix configure option, it will by default install into
/usr/local/axis2c folder.

If you need to get the samples working, you also need to give the configure option
    --enable-samples=yes

6. go to where you installed axis2c.

7. Start simple axis server
        cd axis2c/bin
        ./axis2_http_server
This will start the simple axis server on port 9090. To see the posible command line options run:
        ./axis2_http_server -h
8. Run the sample clients in a new shell
        cd bin/samples
        ./echo
This will invoke the echo service.
        ./math
This will invoke the math service.
To see the possible command line options for sample clients run them with '-h' option


3. Getting Axis2C working with the binary release on Windows.
============================================================

3.1 Requirements
----------------

* the binaries shipped with this version is compiled with Microsoft visual studio compiler (cl) 
(Note: you can download microsoft VSExpress2005 editon from microsoft website and intall it to run these binaries)

* You also need the following dlls
	- libxml2.dll [http://www.xmlsoft.org - download the version >=  libxml2-2.6.20.win32]
	- iconv.dll [http://www.xmlsoft.org - download the version >= iconv-1.9.1.win32]
	- zlib1.dll [http://www.xmlsoft.org - download the version >= zlib-1.2.3.win32]

3.2 Binaries in the release
---------------------------

Extract the binary distribution to a folder of your choice. (example: C:\axis2c-M0.4)

The c:\axis2c-M0.4 folder structure is as follows.

     axis2c-M0.4
	|- bin        - server and other executables
       	|- samples - samples go here
        	|	
 	|- lib	      - library modules
 	|- services   - deployed services 
	|- modules    - deployed modules 
	|- include    - all include files of axis2 
	|- logs       - system and client logs are written to this folder

Copy libxml2.dll, iconv.dll and zlib1.dll downloaded to C:\axis2c-M0.4\lib

3.3 Running the binaries
------------------------

You need to set couple of environment variables before you can run the server and samples.

Set the varibale AXIS2C_HOME to the deploy folder (C:\axis2c-M0.4)
Add the path to lib directory to PATH variable (%AXIS2C_HOME%\lib)

Now everything is set to run the server!

C:\axis2c-M0.4\bin>axis2_http_server.exe 

You should see the message
Started Simple Axis2 HTTP Server...

The log is by default created under %AXIS2C_HOME%\logs folder with the name axis2.log.
(Note: you may provide command line options to change the default behaviour. Type "axis2_http_server.exe -h" to learn about  the usage)

Now you can run any sample client deployed under %AXIS2C_HOME%\bin\samples\
Example:
C:\axis2c-M0.4\bin\samples>echo.exe



4. Getting Axis2C working with the source release on Windows.
============================================================

4.1 Requirements
----------------

* the makefile shipped with this version needs Microsoft visual studio compiler (cl) and nmake build tool 
(Note: you can download microsoft VSExpress2005 editon and Platform SDK from microsoft website. You will need to add the path  to Platform SDK Include and Lib folders to makefile)

* You also need 
	- libxml2 [http://www.xmlsoft.org - download the version >=  libxml2-2.6.20.win32]
	- iconv [http://www.xmlsoft.org - download the version >= iconv-1.9.1.win32]
	- zlib [http://www.xmlsoft.org - download the version >= zlib-1.2.3.win32]

4.2 Editing configure.in file
-----------------------------

The default places for libxml2 and iconv are speceficed in configure.in. 

Example:
Default location for libxml2 is C:\libxml2
	You can either extract libxml2 to this folder. Folder structure should look like the following.
	C:\libxml2
		|- include
		|- bin
		|- lib
	Or extract to whatever place of your choice and edit the configure.in accordingly.

You need to have zlib1.dll in a library path. You may copy this dll to libxml2/lib.
	

4.3 Compiling the source
------------------------

Extract the source distribution to a folder of your choice. (Example: C:\axis2c)
Open a DOS shell
cd C:\axis2c\build\win32
C:\axis2c\build\win32>vcvars32.bat to access .Net tools (Note: You may need to set the environment PATH variable to  vcvars32.bat if windows complaints that it cannot find this bat)
C:\axis2c\build\win32>nmake install


Thats it! This will build the system and create a directory named deploy under build directory.
The deploy folder structure is as follows.

     deploy
	|- bin        - server and other executables
       	|   |- samples - samples go here
        	|	
 	|- lib	      - library modules
 	|- services   - deployed services 
	|- modules    - deployed modules 
	|- include    - all include files of axis2 
	|- logs       - system and client logs are written to this folder


4.4 Running the binaries
------------------------

You need to set couple of environment variables before you can run the server and samples.

Set the varibale AXIS2C_HOME to the deploy folder (C:\axis2c\build\deploy)
Add the path to lib directory to PATH variable (%AXIS2C_HOME%\lib)

Copy libxml2.dll, iconv.dll and zlib1.dll to axis2c lib folder (%AXIS2C_HOME%\lib)

Now everything is set to run the server!

C:\axis2c\build\deploy\bin>axis2_http_server.exe 

You should see the message
Started Simple Axis2 HTTP Server...

The log is by default created under %AXIS2C_HOME%\logs folder with the name axis2.log.
(Note: you may provide command line options to change the default behaviour. Type "axis2_http_server.exe -h" to learn about  the usage)

Now you can run any sample client deployed under %AXIS2C_HOME%\bin\samples\
Example:
C:\axis2c\build\deploy\bin\samples>echo.exe


5. Installing Apache2 Web Server integration module (mod_axis2)
---------------------------------------------------------------
5.1 Building mod_axis2 from source tree

* Provide the apache2 include files location as configure option
  ./configure --with-apache2="<apache2 include files location>" [other configure options]
  - Some apache2 distributions install APR (Apache Portable Runtime) include files in a seperate location which is requred to build mod_axis2. In that case use
  ./configure --with-apache2="<apache2 include files location>" --with-apr="apr include files location>" [other configure options]
* Then build the source tree
    make
    make install
  - This will install mod_axis2.so into your "<your_path_to_axis2c>/lib"

5.1 Deploying in Apache2 Web Server

Note: To do the following tasks you might need super user privileges in your machine.

* Copy the libmod_axis2.so.0.0.0 to "<apache2 modules directory>" (eg: /usr/lib/apache2/modules) as mod_axis2.so 
    eg: cp $AXIS2C_HOME/lib/libmod_axis2.so.0.0.0 /usr/lib/apache2/modules/mod_axis2.so
* Edit the Apache2's configuration file (generally httpd.conf) and add the following directives

    LoadModule axis2_module   <apache2 modules directory>/mod_axis2.so
    <Location /axis2>
        SetHandler axis2_module
        RepoPath <axis2 repository path>
        LogFile <axis2 log file path>
    </Location>

* Make sure that the apache2 user has correct permissions to above paths
    - Read permission to the repository
    - Write permission to the log file

* Restart apache2 and test whether mod_axis2 module is loaded by typing the URL
    http://localhost/axis2/services

Hope you would enjoy this first working version of Axis2C soap engine :)
