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]

Reply via email to