Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


Detailed build instructions are provided for in both HTML
and APT format in releases.  The APT sources are 
available in Subversion checkouts.

autotools:
site/building/autotools.html
src/site/apt/building/autotools.apt

Apache Ant:
site/building/ant.html
src/site/apt/building/ant.apt

Apache Maven 2:
site/building/maven.html
src/site/apt/building/maven.apt

Microsoft Visual Studio:
site/building/vstudio.html
src/site/apt/building/vstudio.apt

Apple Xcode:
site/building/xcode.html
src/site/apt/building/xcode.apt




Introduction
============
Apache log4cxx is a C++ transliteration of Apache log4j.



Maven 2:
==================

Maven 2  used to prepare site documentation and will be used to package the release.
TODO: add more documentation.


Ant + cpptasks build:
==================

The Ant build script is the definitive build script for log4cxx and
is able to build log4cxx with (at least) gcc, Microsoft Visual C++ 6, 7, 7.1
and Borland C++ 5.5 and produce IDE project files for Microsoft Visual Studio
6, Borland CBuilderX  and Apple Xcode to assist in debugging.

Prerequisites:

Apache Ant 1.6.1 or later
   http://ant.apache.org

cpptasks.jar and ant-contrib.jar on CLASSPATH
   (March 2005 or later releases or CVS HEAD)
   http://ant-contrib.sourceforge.net

JDK 1.4 or later.  Earlier versions might work but
have not been tested.

GNU patch on command path.

GNU sed, gzip and zip on command path (required for tests)

Connection to internet

   - or -

The following files placed in the lib directory:
    apr-1.2.2.tar.gz
    apr-util-1.2.2.tar.gz
 
    http://apr.apache.org
 


Building:

Unix gcc:

$> export CLASSPATH=path_to_cpptasks/cpptasks.jar:path_to_antcontrib/ant-contrib.jar

- or -

$> setenv CLASSPATH path_to_cpptasks/cpptasks.jar:path_to_antcontrib/ant-contrib.jar


$> ant


Microsoft Visual C++:

$> set CLASSPATH=path_to_cpptasks/cpptasks.jar;path_to_antcontrib/ant-contrib.jar
$> path_to_vc\bin\vcvars32
$> ant


Borland C++:

$> set CLASSPATH=path_to_cpptasks/cpptasks.jar;path_to_antcontrib/ant-contrib.jar
$> ant -Dcompiler=bcc



Build options:

     -Dcompiler= see list from http://ant-contrib.sourceforge.net/cc.html
     -Ddebug=[true | false]
     -Dlib.type=[shared | static | dylib]
     -Drtti=[false | true]
     -Dapache.mirror=URL
     -Dapr.lib.type=[static | shared]
     -Daprutil.lib.type=[static | shared]
     -Dapriconv.lib.type=[static | shared]
     -Dhas.wchar_t=[1 | 0]
     -Dlogchar=[wchar_t utf8]
     -Dos.family=cygwin

Build targets:

 build                      Build log4cxx library
 build-all                  Builds all artifacts
 build-examples             Builds example programs
 build-projects-cbx         Builds project files for Borland CBuilderX
 build-projects-vc6         Builds project files for Microsoft Visual C++ 6
 build-projects-xcode       Builds project files for Apple Xcode
 build-shortsocketserver    builds a socket server used by unit tests
 build-standalone-unittest  Builds a unit tests + log4cxx executable
 build-unittest             Builds unit test app
 check                      Runs all diagnostic tests
 clean                      Removes built files
 dist                       Builds a source distribution
 fixcrlf                    repair end-of-line sequences
 header-check               Checks headers against Effective C++ guidelines
 run-standalone-unittest    Runs standalone unit test
 run-unittest               Runs unit test
 usage                      Describes usage of the build script





