Building with CMake {#build-cmake}
===
<!--
 Note: License header cannot be first, as doxygen does not generate
 cleanly if it before the '==='
-->
<!--
 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.
-->
[TOC]

# Supported options

| Option                 | Usage |
|------------------------|-------|
| LOG4CXX_WCHAR_T=no   | Enable wchar_t API methods, choice of yes (default), no.                                    |
| LOG4CXX_UNICHAR=yes  | Enable UniChar API methods, choice of yes, no (default).                                    |
| LOG4CXX_CFSTRING=yes | Enable CFString API methods, requires Mac OS/X CoreFoundation, choice of yes, no (default). |
| BUILD_TESTING=off    | Do not build tests.  Tests are built by default                                             |
| BUILD_FUZZERS        | Enabled by default if `BUILD_TESTING=ON` and libFuzzer is found.                            |
| BUILD_SITE=OFF       | Set to `ON` to enable the project website build. Requires Doxygen.                          |
| BUILD_SHARED_LIBS=off| Build Log4cxx as a static library. A dynamically linked Log4cxx library is built by default. Any compilation unit that includes a Log4cxx header must define LOG4CXX_STATIC.             |
| APU_STATIC=yes       | Link to the APR-Util static library. By default, the Log4cxx shared library is linked to the APR-Util shared library. If BUILD_SHARED_LIBS=off, the static APR-Util library is used.     |
| APR_STATIC=yes       | Link to the APR static library. By default, the Log4cxx shared library is linked to the APR shared library. If BUILD_SHARED_LIBS=off, the static APR library is always used.        |
| LOG4CXX_TEST_PROGRAM_PATH=path | An extra path to prepend to the PATH for test programs.  Log4cxx requires zip, sed, and grep on the PATH in order for the tests to work properly.                          |
| PREFER_BOOST=on      | Prefer the Boost version of dependent libraries over standard library |
| LOG4CXX_QT_SUPPORT=ON | Enable QString API and log4cxx::qt namespace methods, requires QtCore, choice of ON, OFF (default).                   |
| LOG4CXX_EVENTS_AT_EXIT=ON | Prevent static data cleanup to allow event logging during application exit. |
| LOG4CXX_FORMAT_NAMESPACE=std | Make the `LOG4CXX_[level]_FMT` macros use [std::format](https://en.cppreference.com/w/cpp/utility/format/format) by default.  |

# Examples

## Unix type systems {#Linux}

Make sure cmake (3.13+), g++, gzip, zip and make are available.
On a Debian system these may be installed by:
~~~
$ sudo apt-get install build-essential cmake gzip zip
~~~

1. Using the distro provided APR libraries
and the cmake cursors UI to configure Log4cxx options.
~~~
$ apt-get install libapr1-dev libaprutil1-dev
$ wget ${LOG4CXX_DISTRIBUTION_URL}.tar.gz
$ tar xf ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME}.tar.gz
$ cd ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME}
$ mkdir build
$ cd build
$ ccmake ..
$ make
$ sudo make install
~~~

2. Install libraries locally in $HOME/libraries and
statically bind APR into the Log4cxx DSO.
~~~
$ wget ${APR_SOURCE_PACKAGE_FILE_URL}.tar.bz2
$ tar xf ${APR_SOURCE_PACKAGE_FILE_NAME}.tar.bz2
$ cd ${APR_SOURCE_PACKAGE_FILE_NAME}
$ CFLAGS=-fPIC ./configure --prefix=$HOME/libraries
$ make install
$ cd $HOME
$ wget ${APR_UTIL_SOURCE_PACKAGE_FILE_URL}.tar.bz2
$ tar xf ${APR_UTIL_SOURCE_PACKAGE_FILE_NAME}.tar.bz2
$ cd ${APR_UTIL_SOURCE_PACKAGE_FILE_NAME}
$ CFLAGS=-fPIC ./configure --with-apr=$HOME/libraries --prefix=$HOME/libraries
$ make install
$ cd $HOME
$ wget ${LOG4CXX_DISTRIBUTION_URL}.tar.gz
$ tar xf ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME}.tar.gz
$ cmake -S ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME} -B build/log4cxx -DAPR_STATIC=yes -DAPU_STATIC=yes -DCMAKE_PREFIX_PATH=$HOME/libraries -DCMAKE_INSTALL_PREFIX=$HOME/Libraries -DCMAKE_BUILD_TYPE=Release
$ cmake --build build/log4cxx --target install
~~~

## Windows {#Windows}

1. The easiest way to get dependencies installed is to use vcpkg.

 Use these commands to build and install Log4cxx.
~~~
> cd "%HOMEPATH%/Libraries"
> git clone https://github.com/Microsoft/vcpkg.git
> cd vcpkg
> .\bootstrap-vcpkg.bat
> vcpkg install log4cxx
~~~

 To link to Log4cxx to your application,
add "-DCMAKE_TOOLCHAIN_FILE=%HOMEPATH%/Libraries/vcpkg/scripts/buildsystems/vcpkg.cmake"
to your cmake command line arguments.

2. Build from source in \%HOMEPATH\%/Libraries.

 Use your browser to download Windows source:
 * Expat from ${EXPAT_DOWNLOAD_URL},
 * APR and APR-Util from ${APACHE_APR_DOWNLOAD_URL} and
 * Log4cxx from ${LOG4CXX_SOURCE_MIRROR_URL}.

 Extract the source code into directories in \%HOMEPATH\%/Libraries named:
 * ${EXPAT_SOURCE_PACKAGE_FILE_NAME}
 * ${APR_SOURCE_PACKAGE_FILE_NAME}
 * ${APR_UTIL_SOURCE_PACKAGE_FILE_NAME}
 * ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME}.

 Use these commands to build and install dependencies.
~~~
> cd "%HOMEPATH%/Libraries"
> cmake -S ${EXPAT_SOURCE_PACKAGE_FILE_NAME} -B buildtrees/expat "-DCMAKE_INSTALL_PREFIX=%HOMEPATH%/Libraries/installed"
> cmake --build buildtrees/expat --target install --config Release
> cmake -S ${APR_SOURCE_PACKAGE_FILE_NAME} -B buildtrees/apr "-DCMAKE_INSTALL_PREFIX=%HOMEPATH%/Libraries/installed"
> cmake --build buildtrees/apr --target install --config Release
> set "CMAKE_PREFIX_PATH=%HOMEPATH%/Libraries/installed"
> cmake -S ${APR_UTIL_SOURCE_PACKAGE_FILE_NAME} -B buildtrees/apr-util "-DCMAKE_INSTALL_PREFIX=%HOMEPATH%/Libraries/installed"
> cmake --build buildtrees/apr-util --target install --config Release
~~~

 Use these commands to build and install Log4cxx.
~~~
> cd "%HOMEPATH%/Libraries"
> cmake -S ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME} -B buildtrees/log4cxx "-DCMAKE_INSTALL_PREFIX=%HOMEPATH%/Libraries/installed" -DBUILD_TESTING=off
> cmake --build buildtrees/log4cxx --target install --config Release
~~~

3. Build and run unit tests in \%HOMEPATH\%/Libraries.
The location of command-line utilities must be provided
to the Log4cxx cmake build in the LOG4CXX_TEST_PROGRAM_PATH cmake variable.
Command-line utilities (zip, grep, sed) are available in Msys2 which can be downloaded
from: https://www.msys2.org/ and by default will be installed under C:/msys64/usr/bin.

 Build and install dependencies using the above commands, then use these commands to build Log4cxx and run Log4cxx unit tests.
~~~
> cd "%HOMEPATH%/Libraries"
> cmake -S ${LOG4CXX_SOURCE_PACKAGE_FILE_NAME} -B buildtrees/log4cxx "-DCMAKE_INSTALL_PREFIX=%HOMEPATH%/Libraries/installed" "-DLOG4CXX_TEST_PROGRAM_PATH=C:/msys64/usr/bin"
> cmake --build buildtrees/log4cxx --config Debug
> cd buildtrees/log4cxx
> ctest -C Debug --output-on-failure
~~~

## Mac OS/X {#MacOS}

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

cmake can be installed by typing "brew install cmake".

CMake can be built from source by typing:

~~~
$ wget https://github.com/Kitware/CMake/releases/download/v3.27.2/cmake-3.27.2.tar.gz
$ tar xf cmake-3.27.2.tar.gz
$ cd cmake-3.27.2
$ ./bootstrap
$ make
$ sudo make install
~~~

## FreeBSD {#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
~~~

