| 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. |