From 04675777237ca3a42349c18a74d449be09e5e60c Mon Sep 17 00:00:00 2001 From: Yann Ylavic Date: Tue, 10 Jun 2025 10:51:35 +0000 Subject: [PATCH] Remove awk dependency when building using CMake. Before this awk was required for -DWITH_MODULES option. * build/build-modules-c.cmake: (generate_builtin_modules_c): Function to generate modules.c. * CMakeLists.txt (): Use generate_builtin_modules_c() instead of `awk -f build/build-modules-c.awk` to generate modules.c file. * README.cmake: (Prerequisites, How to build): Do not mention awk as prerequisite. Follow-up to r1919413: CMake: Use configure_file() instead of file(write) to generate modules.c file because configure_file() doesn't change timestamp of file if contents is the the same. Follow-up to r1919587: CMake: Fix type in variable name (MODULES_SYNMBOLS -> MODULES_SYMBOLS) Merges r1919413, r1919587, r1919602 from trunk Submitted by: ivan Reviewed by: CTR git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1926319 13f79535-47bb-0310-9956-ffa450edef68 --- CMakeLists.txt | 31 ++++++++++++---------------- README.cmake | 3 --- build/build-modules-c.cmake | 27 ++++++++++++++++++++++++ build/modules.c.in | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 21 deletions(-) create mode 100644 build/build-modules-c.cmake create mode 100644 build/modules.c.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b38f699dbe..170076bdd40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) INCLUDE(CheckSymbolExists) INCLUDE(CheckCSourceCompiles) +INCLUDE("build/build-modules-c.cmake") FIND_PACKAGE(LibXml2) FIND_PACKAGE(Lua51) @@ -607,26 +608,20 @@ SET(install_targets) SET(install_bin_pdb) SET(install_modules) # special handling vs. other installed targets SET(install_modules_pdb) -SET(builtin_module_shortnames "win32 mpm_winnt http so") # core added automatically +SET(builtin_module_shortnames) +LIST(APPEND builtin_module_shortnames "win32" "mpm_winnt" "http" "so") # core added automatically SET(extra_builtin_modules) # the ones specified with -DWITH_MODULES= -IF(WITH_MODULES) # modules statically linked with the server - STRING(REPLACE "," ";" WITH_MODULE_LIST ${WITH_MODULES}) - FOREACH(static_mod ${WITH_MODULE_LIST}) - STRING(REGEX MATCH "[^/]+\\.c" mod_basename ${static_mod}) - STRING(REGEX REPLACE "^mod_(.*)\\.c" "\\1" mod_module_name ${mod_basename}) - SET(builtin_module_shortnames "${builtin_module_shortnames} ${mod_module_name}") - CONFIGURE_FILE(${static_mod} ${PROJECT_BINARY_DIR}/ COPYONLY) - SET(extra_builtin_modules ${extra_builtin_modules} ${PROJECT_BINARY_DIR}/${mod_basename}) - ENDFOREACH() - EXECUTE_PROCESS(COMMAND cmd /c "echo ${builtin_module_shortnames}| awk -f ${CMAKE_CURRENT_SOURCE_DIR}/build/build-modules-c.awk > ${PROJECT_BINARY_DIR}/modules.c" RESULT_VARIABLE rv) - IF(rv) - MESSAGE(FATAL_ERROR "build-modules-c.awk failed (${rv})") - ENDIF() -ELSE() - # no extra built-in modules; use the default modules.c to avoid the awk prereq - CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/os/win32/modules.c ${PROJECT_BINARY_DIR}/ COPYONLY) -ENDIF() +STRING(REPLACE "," ";" WITH_MODULE_LIST "${WITH_MODULES}") +FOREACH(static_mod ${WITH_MODULE_LIST}) + STRING(REGEX MATCH "[^/]+\\.c" mod_basename ${static_mod}) + STRING(REGEX REPLACE "^mod_(.*)\\.c" "\\1" mod_module_name ${mod_basename}) + LIST(APPEND builtin_module_shortnames "${mod_module_name}") + CONFIGURE_FILE(${static_mod} ${PROJECT_BINARY_DIR}/ COPYONLY) + SET(extra_builtin_modules ${extra_builtin_modules} ${PROJECT_BINARY_DIR}/${mod_basename}) +ENDFOREACH() + +generate_builtin_modules_c("${PROJECT_BINARY_DIR}/modules.c" "${builtin_module_shortnames}") # for easy reference from .dll/.so builds CONFIGURE_FILE(os/win32/BaseAddr.ref ${PROJECT_BINARY_DIR}/ COPYONLY) diff --git a/README.cmake b/README.cmake index f262c143ec6..cbd3565f7fc 100644 --- a/README.cmake +++ b/README.cmake @@ -34,7 +34,6 @@ The following tools must be in PATH: cmake version 3.1.3 or later is required to work with current OpenSSL releases. (OpenSSL is an optional prerequisite of httpd.) * Perl -* If the WITH_MODULES feature is used: awk * If using a command-line compiler: compiler and linker and related tools (Refer to the cmake documentation for more information.) @@ -100,8 +99,6 @@ How to build 2. Make sure cmake and Perl are in PATH. Additionally, some backends require compile tools in PATH. (Hint: "Visual Studio Command Prompt") - In the unlikely event that you use -DWITH_MODULES, described below, make - sure awk is in PATH. 3. cmake -G "some backend, like 'NMake Makefiles'" -DCMAKE_INSTALL_PREFIX=d:/path/to/httpdinst diff --git a/build/build-modules-c.cmake b/build/build-modules-c.cmake new file mode 100644 index 00000000000..491ff3cd51f --- /dev/null +++ b/build/build-modules-c.cmake @@ -0,0 +1,27 @@ +# 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. + +function(generate_builtin_modules_c output_filename module_list) + list(PREPEND module_list "core") + + foreach(module ${module_list}) + string(APPEND MODULES_EXTERN "extern module ${module}_module;\n") + string(APPEND MODULES_PRELINK " &${module}_module,\n") + string(APPEND MODULES_SYMBOLS " {\"${module}_module\", &${module}_module},\n") + string(APPEND MODULES_PRELOAD " &${module}_module,\n") + endforeach() + + configure_file("build/modules.c.in" ${output_filename}) +endfunction() diff --git a/build/modules.c.in b/build/modules.c.in new file mode 100644 index 00000000000..fa0a9faa2ec --- /dev/null +++ b/build/modules.c.in @@ -0,0 +1,41 @@ +/* + * modules.c --- automatically generated by Apache + * configuration script. DO NOT HAND EDIT!!!!! + */ + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" + +@MODULES_EXTERN@ +/* + * Modules which implicitly form the + * list of activated modules on startup, + * i.e. these are the modules which are + * initially linked into the Apache processing + * [extendable under run-time via AddModule] + */ +AP_DECLARE_DATA module *ap_prelinked_modules[] = { +@MODULES_PRELINK@ + NULL +}; + +/* + * We need the symbols as strings for containers + */ +ap_module_symbol_t ap_prelinked_module_symbols[] = { +@MODULES_SYMBOLS@ + {NULL, NULL} +}; + +/* + * Modules which initially form the + * list of available modules on startup, + * i.e. these are the modules which are + * initially loaded into the Apache process + * [extendable under run-time via LoadModule] + */ +module *ap_preloaded_modules[] = { +@MODULES_PRELOAD@ + NULL +}; -- 2.47.3