Experimental cmake-based build support for Apache httpd on Microsoft Windows

Status
------

This build support is currently intended only for Microsoft Windows.

This build support is experimental.  Specifically,

* It does not support all features of Apache httpd.
* Some components may not be built correctly and/or in a manner
  compatible with the previous Windows build support.
* Build interfaces, such as the mechanisms which are used to enable
  optional functionality or specify prerequisites, may change from
  release to release as feedback is received from users and bugs and
  limitations are resolved.

Important: Refer to the "Known Bugs and Limitations" section for further
           information.

           It is beyond the scope of this document to document or explain
           how to utilize the various cmake features, such as different
           build backends or provisions for finding support libraries.

           Please refer to the cmake documentation for additional information
           that applies to building any project with cmake.

Prerequisites
-------------

The following tools must be in PATH:

* cmake, version 2.8 or later
  cmake version 3.1.3 or later is required to work with current OpenSSL
  releases.  (OpenSSL is an optional prerequisite of httpd.)
* Perl
* If using a command-line compiler: compiler and linker and related tools
  (Refer to the cmake documentation for more information.)

The following support libraries are mandatory:

* APR, built with cmake
  + Either APR 2.0-dev (trunk) or APR 1.5.x and APR-Util 1.5.x.
  + When building APR (but not APR-Util), specify the build option
    APR_INSTALL_PRIVATE_H so that non-standard files required for building
    Apache httpd are installed.
  + Additional APR settings affect httpd but are not mandatory, such as
    APR_HAVE_IPV6.
* PCRE (version 6.7 or higher)

Certain optional features of APR 2.0-dev (trunk) or APR-Util 1.5.x
allow some optional features of httpd to be enabled.  For example,
APU_HAVE_CRYPTO is required for mod_session_crypto.

Additional support libraries allow some optional features of httpd to be
enabled:

* libxml2 (e.g., mod_proxy_html)
* lua 5.1 (mod_lua)
* nghttp2 (mod_http2)
* openssl (mod_ssl and https support for ab)
* zlib (mod_deflate)

OpenSSL
-------

If you have a binary install of OpenSSL in a well-known directory (e.g.,
%HOME%\OpenSSL-Win64) and you wish to build httpd against a different
install of OpenSSL, the cmake build may unexpectedly select OpenSSL
libraries in the well-known directory even if the expected include files
are used.  Check the cmake output from your httpd build to confirm that
the expected OpenSSL libraries and include files are used.

The cmake FindOpenSSL module searches for OpenSSL libraries in a "VC"
subdirectory of the OpenSSL install with filenames that indicate the build
type (e.g., "<PREFIX>/lib/VC/ssleay32MD.lib"); defining CMAKE_PREFIX_PATH
or OPENSSL_ROOT_DIR or even OPENSSL_LIBRARIES does not circumvent finding
these libraries.

To work around this issue, rename the well-known OpenSSL directory while
building httpd.  Let us know if you find a better solution.

nghttp2
-------

This is required for mod_http2.

cmake-based build support for nghttp2 for Windows can be found at
https://github.com/trawick/nghttp2-minimal-cmake.  That easily fits into
a build system that already uses cmake for httpd, apr, and perhaps other
packages.  A dynamic build of nghttp2 using its normal Windows build
system should also be usable by nghttp2.

How to build
------------

1. cd to a clean directory for building (i.e., don't build in your
   source tree)

2. Make sure cmake and Perl are in PATH.  Additionally, some backends 
   require compile tools in PATH.  (Hint: "Visual Studio Command Prompt")

3. cmake -G "some backend, like 'NMake Makefiles'"
     -DCMAKE_INSTALL_PREFIX=d:/path/to/httpdinst
     -DENABLE_foo=A|I|O|a|i
     -DENABLE_MODULES=A|I|O|a|i
     d:/path/to/httpdsource

   Alternately, you can use the cmake-gui and update settings in the GUI.

   PCRE_INCLUDE_DIR, PCRE_LIBRARIES, APR_INCLUDE_DIR, APR_LIBRARIES,
     NGHTTP2_INCLUDE_DIR, NGHTTP2_LIBRARIES:

       cmake doesn't bundle FindXXX for these packages, so the crucial
       information has to be specified in this manner if they aren't found
       in their default location.

     -DPCRE_INCLUDE_DIR=d:/path/to/pcreinst/include
     -DPCRE_LIBRARIES=d:/path/to/pcreinst/lib/pcre[d].lib

       These will have to be specified only if PCRE is installed to a different
       directory than httpd, or if debug *and* release builds of PCRE were
       installed there and you want to control which is used.  (Currently the
       build will use pcred.lib (debug) if it is found in the default location
       and not overridden with -DPCRE_LIBRARIES.)

     -DAPR_INCLUDE_DIR=d:/path/to/aprinst/include
     -DAPR_LIBRARIES="d:/path/to/aprinst/lib/libapr-1.lib;d:/path/to/aprinst/lib/libaprutil-1.lib"

       These will have to be specified if APR[-Util] was installed to a
       different directory than httpd.

       When building with APR trunk (future APR 2.x, with integrated APR-Util),
       specify just the path to libapr-2.lib:

           -DAPR_LIBRARIES=d:/path/to/aprinst/lib/libapr-2.lib

       APR+APR-Util 1.x vs. APR trunk will be detected automatically if they
       are installed to the same location as httpd.

       APR-Util 1.x has an optional LDAP library.  If APR-Util has LDAP enabled
       and httpd's mod_ldap and mod_authnz_ldap are being used, include the
       path to the LDAP library in the APR_LIBRARIES setting.  (If APR and
       APR-Util are found in the default location, the LDAP library will be
       included if it is present.

     -DNGHTTP2_INCLUDE_DIR=d:/path/to/nghttp2inst/include  (which has nghttp2/*.h)
     -DNGHTTP2_LIBRARIES="d:/path/to/nghttp2inst/lib/nghttp2.lib"

       These will have to be specified if nghttp2 was installed to a different
       directory than httpd.

   LIBXML2_ICONV_INCLUDE_DIR, LIBXML2_ICONV_LIBRARIES

      If using a module that requires libxml2 *and* the build of libxml2 requires
      iconv, set these variables to allow iconv includes and libraries to be
      used.  For example:

      -DLIBXML2_ICONV_INCLUDE_DIR=c:\iconv-1.9.2.win32\include
      -DLIBXML2_ICONV_LIBRARIES=c:\iconv-1.9.2.win32\lib\iconv.lib

   CMAKE_C_FLAGS_RELEASE, _DEBUG, _RELWITHDEBINFO, _MINSIZEREL
   CMAKE_BUILD_TYPE

       For NMake Makefiles the choices are at least DEBUG, RELEASE,
       RELWITHDEBINFO, and MINSIZEREL
       Other backends may have other selections.

   ENABLE_foo:

       Each module has a default setting which can be overridden with one of
       the following values:
           A        build and Activate module
           a        build and Activate module IFF prereqs are available; if
                    prereqs are unavailable, don't build it
           I        build module but leave it Inactive (commented-out
                    LoadModule directive)
           i        build module but leave it Inactive IFF prereqs are
                    available; if prereqs are unavailable, don't build it
           O        Omit module completely

       Examples: -DENABLE_ACCESS_COMPAT=O
                 -DENABLE_PROXY_HTML=i

   ENABLE_MODULES:

       This changes the *minimum* enablement of all modules to the specified
       value (one of A, a, I, i, O, as described under ENABLE_foo above).

       The ranking of enablement from lowest to highest is O, i, I, a, A.
       If a specific module has a higher rank enablement setting, either from
       a built-in default or from -DENABLE_foo, ENABLE_MODULES won't affect
       that module.  However, if a specific module has a lower-rank enablement
       setting, presumably from a built-in default, the value of ENABLE_MODULES
       will be used for that module.

       Explanations for possible values:

       -DENABLE_MODULES=a      build and activate all possible modules,
                               ignoring any with missing prereqs
                               (doesn't affect modules with A for ENABLE_foo)

       -DENABLE_MODULES=i      build but leave inactive all possible
                               modules, ignoring any with missing
                               prereqs
                               (doesn't affect modules with A, a, or I for 
                               ENABLE_foo)

       -DENABLE_MODULES=O      no impact, since all modules are either
                               already disabled or have a higher setting

       -DENABLE_MODULES=A      build and activate all possible modules,
                               failing the build if any module is missing
                               a prereq

       -DENABLE_MODULES=I      similar to -DENABLE_MODULES=A
                               (doesn't affect modules with A or a for
                               ENABLE_foo)

   WITH_MODULES:

       Comma-separated paths to single file modules to statically linked into
       the server, like the --with-module=modpath:/path/to/mod_foo.c with
       the autoconf-based build.  Key differences: The modpath (e.g., 
       "generators") isn't provided or used, and the copy of the module
       source being built is automatically updated when it changes.
       See also EXTRA_COMPILE_FLAGS, EXTRA_INCLUDES, and EXTRA_LIBS.

   EXTRA_COMPILE_FLAGS:

       Space-delimited compile flags to define with the build.

   EXTRA_INCLUDES:

       List of additional directories to search for .h files.  This may
       be necessary when including third-party modules in the httpd build
       via WITH_MODULES.

   EXTRA_LIBS:

       List of additional libraries to link with.  This may be necessary when
       including third-party modules in the httpd build via WITH_MODULES.

   Port and SSLPort:

       Port numbers for substitution into default .conf files.  (The defaults
       are 80 and 443.)

   INSTALL_PDB:

       If .pdb files are generated for debugging, install them.
       Default: ON

       The .pdb files are generally needed for debugging low-level code
       problems.  If they aren't installed, they are still available in the
       build directory for use by alternate packaging implementations or when
       debugging on the build machine.

   INSTALL_MANUAL:

       Install the Apache HTTP Server manual.
       Default: ON

       This could be turned off when developing changes in order to speed up
       installation time.

4. Build using the chosen generator (e.g., "nmake install" for cmake's "NMake
   Makefiles" generator).

Running the server and support programs
---------------------------------------

This build system does not copy binaries such as dlls from other projects
into the httpd install location.  Without taking some precautions, httpd
and support programs can fail to start or modules can fail to load because
a support library can't be found in PATH or in the directory of the httpd
binary.

This can be resolved in several different ways:

* Install httpd and the various support libraries to a common install
  prefix so that support libraries and httpd programs are installed in
  the same bin directory and are found without setting PATH.

* Update PATH to include the bin directories of all necessary support
  libraries.

  Depending on where PATH is set, it may not affect starting httpd as
  a service.

* Maintain a script which combines required binaries into a common 
  location, such as the httpd installion bin directory, and use that
  script after building or otherwise installing or updating support
  libraries.

* AVOID THE USE of any unrepeatable process of copying dll files around
  from different install locations until something starts working.  The
  result is that when you later update a support library to pick up a
  security fix, httpd will likely continue to use the old, vulnerable
  library file.

Known Bugs and Limitations
--------------------------

* no standard script or makefile is provided to tie together the builds
  of httpd and support libraries in a manner suitable for typical users
* no logic to find support libraries or otherwise build these modules:
  + mod_socache_dc (requires distcache), mod_serf (requires serf)
  + additionally, mod_lbmethod_rr and mod_firehose don't compile on Windows
    anyway
* buildmark.c isn't necessarily rebuilt when httpd.exe is regenerated
* ApacheMonitor has a build error and is disabled
* CGI examples aren't installed
* dbmmanage.pl and wintty aren't built/installed
* module enablement defaults are not in sync with the autoconf-based build
* no support for static support library builds; unclear if that is a
  requirement; if so: taking PCRE as an example, we'd need to detect that it
  is static and then turn on PCRE_STATIC for the libhttpd build

Generally:

* Many httpd features have not been tested with this build.
* Developers need to examine the existing Windows build in great detail and see
  what is missing from the cmake-based build, whether a feature or some build
  nuance.
* Any feedback you can provide on your experiences with this build will be
  helpful.
