Hi,
On 2026/04/30 0:02, Timofei Zhakov wrote:
> Hello all,
>
> There is a somewhat minimal untested support for compiling the modules
> for Apache Httpd in cmake. However, I found that the Unix version
> works in a fundamentally different way than Windows (that I was
> testing on initially); It appears there is no libhttpd in its package.
>
> The recommended way to compile is to use the apxs tool [1]. 'make'
> does just call it. We could use it in cmake as well, but I believe it
> wouldn't be the optimal way in cmake. It would not respect the user
> specified compiler and other configurations. I rather think we should
> work around it and link all the required libs manually.
>
> Does anyone know where (and why) it puts all that code from libhttpd
> on a Unix build? I'm confused a little bit...
>
> [1] https://httpd.apache.org/docs/2.4/programs/apxs.html
Could you please try attached patch for building Apache modules using
apxs via cmake?
I think it is needed to use add_library(... INTERFACE ...) for the Apache
modules. I confirmed quickly that the built modules work with Apache on
Ubuntu and Windows.
Also, I'd suggest to use LF rather than CRLF for newlines in
build/cmake/FindHttpd.cmake.
--
Jun Omae <[email protected]> (大前 潤)
commit de3b0885447e3fc6e5dc489642dfbe290e570e17
Author: Jun Omae <[email protected]>
Date: Sun May 3 20:06:36 2026 +0900
cmake: Use apxs for building Apache modules on Unix environments
diff --git a/build/cmake/FindHttpd.cmake b/build/cmake/FindHttpd.cmake
index 7808a321e..8e915a81f 100644
--- a/build/cmake/FindHttpd.cmake
+++ b/build/cmake/FindHttpd.cmake
@@ -1,62 +1,97 @@
-find_path(HTTPD_INCLUDE_DIR
- NAMES httpd.h
- PATH_SUFFIXES
- include
-)
+if(WIN32)
+ find_path(HTTPD_INCLUDE_DIR
+ NAMES httpd.h
+ PATH_SUFFIXES
+ include
+ )
-find_library(HTTPD_LIBRARY
- NAMES libhttpd
- PATH_SUFFIXES lib
-)
+ find_library(HTTPD_LIBRARY
+ NAMES libhttpd
+ PATH_SUFFIXES lib
+ )
-find_file(HTTPD_DLL
- NAMES libhttpd.dll
- PATH_SUFFIXES bin
-)
+ find_library(MOD_DAV_LIBRARY
+ NAMES mod_dav
+ PATH_SUFFIXES lib
+ )
-find_library(MOD_DAV_LIBRARY
- NAMES mod_dav
- PATH_SUFFIXES lib
-)
+ if (HTTPD_INCLUDE_DIR AND EXISTS "${HTTPD_INCLUDE_DIR}/ap_release.h")
+ file(
+ STRINGS "${HTTPD_INCLUDE_DIR}/ap_release.h" VERSION_STRINGS
+ REGEX "#define
(AP_SERVER_MAJORVERSION_NUMBER|AP_SERVER_MINORVERSION_NUMBER|AP_SERVER_PATCHLEVEL_NUMBER)"
+ )
-if (HTTPD_INCLUDE_DIR AND EXISTS "${HTTPD_INCLUDE_DIR}/ap_release.h")
- file(
- STRINGS "${HTTPD_INCLUDE_DIR}/ap_release.h" VERSION_STRINGS
- REGEX "#define
(AP_SERVER_MAJORVERSION_NUMBER|AP_SERVER_MINORVERSION_NUMBER|AP_SERVER_PATCHLEVEL_NUMBER)"
- )
+ string(REGEX REPLACE ".*AP_SERVER_MAJORVERSION_NUMBER +([0-9]+).*" "\\1"
HTTPD_VERSION_MAJOR ${VERSION_STRINGS})
+ string(REGEX REPLACE ".*AP_SERVER_MINORVERSION_NUMBER +([0-9]+).*" "\\1"
HTTPD_VERSION_MINOR ${VERSION_STRINGS})
+ string(REGEX REPLACE ".*AP_SERVER_PATCHLEVEL_NUMBER +([0-9]+).*" "\\1"
HTTPD_VERSION_PATCH ${VERSION_STRINGS})
+
+ set(HTTPD_VERSION
"${HTTPD_VERSION_MAJOR}.${HTTPD_VERSION_MINOR}.${HTTPD_VERSION_PATCH}")
+ endif()
+ set(HTTPD_MODULES_DIR "${CMAKE_INSTALL_BINDIR}")
+
+else()
+ find_program(APXS_EXECUTABLE
+ NAMES apxs2 apxs
+ PATH /usr/local/apache2/bin /usr/local/apache/bin /usr/bin
/usr/sbin)
- string(REGEX REPLACE ".*AP_SERVER_MAJORVERSION_NUMBER +([0-9]+).*" "\\1"
HTTPD_VERSION_MAJOR ${VERSION_STRINGS})
- string(REGEX REPLACE ".*AP_SERVER_MINORVERSION_NUMBER +([0-9]+).*" "\\1"
HTTPD_VERSION_MINOR ${VERSION_STRINGS})
- string(REGEX REPLACE ".*AP_SERVER_PATCHLEVEL_NUMBER +([0-9]+).*" "\\1"
HTTPD_VERSION_PATCH ${VERSION_STRINGS})
+ function(_APXS_CONFIG_VAR VARNAME OUTVAR)
+ execute_process(COMMAND "${APXS_EXECUTABLE}" -q ${VARNAME}
+ RESULT_VARIABLE _APXS_SUCCESS
+ OUTPUT_VARIABLE _APXS_OUTPUT
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET)
+ set(${OUTVAR} "${_APXS_OUTPUT}" PARENT_SCOPE)
+ endfunction()
+
+ if(APXS_EXECUTABLE)
+ _APXS_CONFIG_VAR("HTTPD_VERSION" HTTPD_VERSION)
+ _APXS_CONFIG_VAR("INCLUDEDIR" HTTPD_INCLUDE_DIR)
+ _APXS_CONFIG_VAR("LIBEXECDIR" HTTPD_MODULES_DIR)
+ set(HTTPD_FOUND TRUE)
+ endif()
- set(HTTPD_VERSION
"${HTTPD_VERSION_MAJOR}.${HTTPD_VERSION_MINOR}.${HTTPD_VERSION_PATCH}")
endif()
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(
+find_package_handle_standard_args(
Httpd
REQUIRED_VARS
- HTTPD_LIBRARY
HTTPD_INCLUDE_DIR
- MOD_DAV_LIBRARY
+ HTTPD_MODULES_DIR
VERSION_VAR
HTTPD_VERSION
)
if(HTTPD_FOUND)
if(NOT TARGET httpd::httpd)
- add_library(httpd::httpd SHARED IMPORTED)
+ add_library(httpd::httpd INTERFACE IMPORTED)
set_target_properties(httpd::httpd PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${HTTPD_INCLUDE_DIR}
- IMPORTED_LOCATION ${HTTPD_DLL}
- IMPORTED_IMPLIB ${HTTPD_LIBRARY}
)
+ if(WIN32)
+ set_target_properties(httpd::httpd PROPERTIES
+ INTERFACE_LINK_LIBRARIES ${HTTPD_LIBRARY}
+ )
+ elseif(APPLE)
+ target_link_options(httpd::httpd INTERFACE
+ "-Wl,-undefined,dynamic_lookup"
+ )
+ endif()
endif()
if(NOT TARGET httpd::mod_dav)
- add_library(httpd::mod_dav STATIC IMPORTED)
+ add_library(httpd::mod_dav INTERFACE IMPORTED)
set_target_properties(httpd::mod_dav PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${HTTPD_INCLUDE_DIR}
- IMPORTED_LOCATION ${MOD_DAV_LIBRARY}
)
+ if(WIN32)
+ set_target_properties(httpd::mod_dav PROPERTIES
+ INTERFACE_LINK_LIBRARIES ${MOD_DAV_LIBRARY}
+ )
+ elseif(APPLE)
+ target_link_options(httpd::mod_dav INTERFACE
+ "-Wl,-undefined,dynamic_lookup"
+ )
+ endif()
endif()
+
endif()
diff --git a/build/generator/templates/targets.cmake.ezt
b/build/generator/templates/targets.cmake.ezt
index c51190a11..2edf8beee 100644
--- a/build/generator/templates/targets.cmake.ezt
+++ b/build/generator/templates/targets.cmake.ezt
@@ -91,6 +91,8 @@ if ([targets.enable_condition])[is targets.type "swig"]
if (WIN32)
target_sources([targets.name] PRIVATE build/win32/svn.rc)
endif()[if-any targets.install_target]
- install(TARGETS [targets.name])[end][end]
+ install(TARGETS [targets.name][if-any targets.is_apache_mod]
+ LIBRARY DESTINATION "${HTTPD_MODULES_DIR}"
+ [end])[end][end]
endif()
[end]