~~ 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.
 ------
 Building Apache log4cxx with autotools
 ------
 ------
 ------

Building Apache log4cxx with autotools

* Quick start:

  Make sure autoconf 2.50+, libtool, g++ and make are available, install or
  build apr 1.x, apr-util 1.x, gzip and zip.

+------------+
$ apt-get install build-essential automake libtool libapr1-dev libaprutil1-dev gzip zip
$ cd apache-log4cxx-x.x.x
$[./autogen.sh]
$ ./configure
$ make
$ make check
$ sudo make install
+------------+

  Those lines in brackets are only necessary if you directly build from source.

* configure options

*-------------------+---------------------------------------------------------------------------------------------+
| --with-apr        |  path to non-default location for APR.                                                      |
*-------------------+---------------------------------------------------------------------------------------------+
| --with-apr-util   | path to non-default location for APR-Util.                                                  |
*-------------------+---------------------------------------------------------------------------------------------+
| --enable-wchar_t  | Enable wchar_t API methods, choice of yes (default), no.                                    |
*-------------------+---------------------------------------------------------------------------------------------+
| --enable-unichar  | Enable UniChar API methods, choice of yes, no (default).                                    |
*-------------------+---------------------------------------------------------------------------------------------+
| --enable-cfstring | Enable CFString API methods, requires Mac OS/X CoreFoundation, choice of yes, no (default). |
*-------------------+---------------------------------------------------------------------------------------------+
| --with-logchar    | Interal character representation, choice of utf-8 (default), wchar_t , unichar.             |
*-------------------+---------------------------------------------------------------------------------------------+
| --with-charset    | Exteral character encoding, choice of utf-8, iso-8859-1, usascii, ebcdic,  auto (default).  |
*-------------------+---------------------------------------------------------------------------------------------+
| --with-SMTP       | SMTP implementation for SMTPAppender, choice of libesmtp, no (default).                     |
*-------------------+---------------------------------------------------------------------------------------------+
| --with-ODBC       | OBDC implementation for ODBCAppender, choice of unixODBC, iODBC, Microsoft, no (default).   |
*-------------------+---------------------------------------------------------------------------------------------+
| -help             | Display help showing all options and exit.                                                  |
*-------------------+---------------------------------------------------------------------------------------------+

   SMTP and ODBC options can depend on libraries that
   that have different licenses.
   You should review the corresponding licenses and understand
   the implications before redistribution.

* Platform specific notes:

** Mac OS/X:

  APR and APR-Util are provided by the platform in Mac OS/X 10.5 and iODBC in 10.4.

** Debian:

  APR, APR-Util, gzip and zip may be installed by:

+----+
$ sudo apt-get install libapr1-dev libaprutil1-dev gzip zip
+----+

** FreeBSD:

  APR, APR-Util, gzip and zip may be installed from the ports collection by:

+----+
# cd /usr/ports/archivers/zip
# make
# make install
# cd /usr/ports/archivers/gzip
# make
# make install
# cd /usr/ports/devel/apr
# make
# make install
+----+

** Cygwin:

  Install zip (used by RollingFileAppender) and sed (used to normalize
  output files for comparison in the unit tests).  The prepackaged
  APR currently available from Cygwin has APR_HAS_THREADS == 0.
  Some appenders will not be available and some may operate
  with reduced functionality.  There have been reports of
  building APR on Cygwin with threads enabled.

** MinGW:

   Recent APR 1.2.x releases fail ./configure with a error
   of "decision on anonymous shared memory failed".  That issue
   has been fixed in the current APR SVN HEAD.  The follow
   sequence worked with MSYS (with Python on Path):

+----+
$ cd expat-2.0.1
$ ./configure
$ make install
$ cd ..
$ svn co https://svn.apache.org/repos/asf/apr/apr/trunk apr
$ cd apr
$ ./buildconf.sh
$ ./configure
$ make install
$ cd ..
$ svn co \
   https://svn.apache.org/repos/asf/apr/apr-util/trunk \
   apr-util
$ cd apr-util
$ ./buildconf.sh
$ ./configure --with-apr=/usr/local --with-expat=/usr/local
$ make install
$ cd ../apache-log4cxx-0.10.0
$ ./configure --with-apr=/usr/local \
   --with-apr-util=/usr/local --with-logchar=wchar_t
$ make install
+----+

   Running "make check" was observed to fail with unexpected exceptions
   in streamtestcase and datetimedateformattestcase.
   See {{{https://issues.apache.org/jira/browse/LOGCXX-244}LOGCXX-244}}.
