diff --git a/CMakeLists.txt b/CMakeLists.txt index 46811e0d87d..9a22bca6b1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,7 +124,7 @@ SET(CHECK_LIBRARIES "${default_check_libraries}" CACHE STRING "Check lib # end support library configuration # Misc. options -OPTION(INSTALL_PDB "Install .pdb files (if generated)" ON) +OPTION(INSTALL_PDB "Install .pdb files (if generated)" ${MSVC}) OPTION(INSTALL_MANUAL "Install manual" ON) SET(ENABLE_MODULES "O" CACHE STRING "Minimum module enablement (e.g., \"i\" to build all but those without prerequisites)") @@ -142,6 +142,37 @@ FOREACH(onelib ${APR_LIBRARIES}) ENDIF() ENDFOREACH() +# Generate a per-target wrapper .rc file with the given preprocessor +# definitions baked in, to avoid passing values with spaces on the +# windres command line where quoting is not handled correctly. +# For MinGW, compile the .rc via a custom command with only the +# needed include paths, since windres also cannot handle -I paths +# containing spaces. +FUNCTION(GENERATE_RC_FILE target_name rc_path_var) + SET(_rc_file "${CMAKE_BINARY_DIR}/rc/${target_name}_httpd.rc") + SET(_content "") + FOREACH(_def ${ARGN}) + STRING(APPEND _content "#define ${_def}\n") + ENDFOREACH() + STRING(APPEND _content "#include \"${CMAKE_SOURCE_DIR}/build/win32/httpd.rc\"\n") + FILE(WRITE "${_rc_file}" "${_content}") + IF(MINGW) + SET(_rc_obj "${CMAKE_BINARY_DIR}/rc/${target_name}_httpd.obj") + ADD_CUSTOM_COMMAND( + OUTPUT "${_rc_obj}" + COMMAND ${CMAKE_RC_COMPILER} -O coff + -I "${CMAKE_SOURCE_DIR}/include" + "${_rc_file}" "${_rc_obj}" + DEPENDS "${_rc_file}" + "${CMAKE_SOURCE_DIR}/build/win32/httpd.rc" + "${CMAKE_SOURCE_DIR}/include/ap_release.h" + ) + SET(${rc_path_var} "${_rc_obj}" PARENT_SCOPE) + ELSE() + SET(${rc_path_var} "${_rc_file}" PARENT_SCOPE) + ENDIF() +ENDFUNCTION() + MACRO(GET_MOD_ENABLE_RANK macro_modname macro_mod_enable_val macro_output_rank) IF(${macro_mod_enable_val} STREQUAL "O") SET(${macro_output_rank} 0) @@ -731,6 +762,12 @@ SET(LIBHTTPD_SOURCES CONFIGURE_FILE(os/win32/win32_config_layout.h ${PROJECT_BINARY_DIR}/ap_config_layout.h) +# Generate an empty ap_config_auto.h for MinGW, where ap_config.h +# expects it but autoconf is not used with the CMake build. +IF(MINGW) + FILE(WRITE ${PROJECT_BINARY_DIR}/ap_config_auto.h "") +ENDIF() + SET(HTTPD_INCLUDE_DIRECTORIES ${PROJECT_BINARY_DIR} ${EXTRA_INCLUDES} @@ -852,9 +889,15 @@ FOREACH (mod ${MODULE_PATHS}) SET(tmp_mod_main_source ${${mod_main_source}}) ENDIF() SET(all_mod_sources ${tmp_mod_main_source} ${${mod_extra_sources}}) - ADD_LIBRARY(${mod_name} SHARED ${all_mod_sources} build/win32/httpd.rc) + GENERATE_RC_FILE(${mod_name} _mod_rc + "LONG_NAME ${mod_name} for Apache HTTP Server" + "BIN_NAME ${mod_name}.so" + ) + ADD_LIBRARY(${mod_name} SHARED ${all_mod_sources} ${_mod_rc}) SET(install_modules ${install_modules} ${mod_name}) - SET(install_modules_pdb ${install_modules_pdb} "$") + IF(INSTALL_PDB) + SET(install_modules_pdb ${install_modules_pdb} "$") + ENDIF() IF("${${mod_name}_install_lib}") SET(installed_mod_libs_exps ${installed_mod_libs_exps} @@ -868,10 +911,6 @@ FOREACH (mod ${MODULE_PATHS}) LINK_FLAGS /base:@${PROJECT_BINARY_DIR}/BaseAddr.ref,${mod_name}.so ) TARGET_LINK_LIBRARIES(${mod_name} ${${mod_extra_libs}} libhttpd ${EXTRA_LIBS} ${APR_LIBRARIES} ${HTTPD_SYSTEM_LIBS}) - TARGET_COMPILE_DEFINITIONS(${mod_name} PRIVATE - "LONG_NAME=${mod_name} for Apache HTTP Server" - "BIN_NAME=${mod_name}.so" - ) TARGET_COMPILE_OPTIONS(${mod_name} PRIVATE "${EXTRA_COMPILE_FLAGS}") # Extra defines? @@ -892,31 +931,37 @@ FOREACH (mod ${MODULE_PATHS}) ENDFOREACH() ########### HTTPD LIBRARIES ############ -ADD_LIBRARY(libhttpd SHARED ${LIBHTTPD_SOURCES} build/win32/httpd.rc) +GENERATE_RC_FILE(libhttpd _libhttpd_rc + "LONG_NAME Apache HTTP Server Core" + "BIN_NAME libhttpd.dll" +) +ADD_LIBRARY(libhttpd SHARED ${LIBHTTPD_SOURCES} ${_libhttpd_rc}) SET_TARGET_PROPERTIES(libhttpd PROPERTIES LINK_FLAGS /base:@${PROJECT_BINARY_DIR}/BaseAddr.ref,libhttpd.dll ) SET(install_targets ${install_targets} libhttpd) -SET(install_bin_pdb ${install_bin_pdb} $) +IF(INSTALL_PDB) + SET(install_bin_pdb ${install_bin_pdb} $) +ENDIF() TARGET_LINK_LIBRARIES(libhttpd ${EXTRA_LIBS} ${APR_LIBRARIES} ${PCRE_LIBRARIES} ${HTTPD_SYSTEM_LIBS}) TARGET_COMPILE_DEFINITIONS(libhttpd PRIVATE - "LONG_NAME=Apache HTTP Server Core" - "BIN_NAME=libhttpd.dll" "AP_DECLARE_EXPORT" ) TARGET_COMPILE_OPTIONS(libhttpd PRIVATE ${PCRE_CFLAGS} ${EXTRA_COMPILE_FLAGS}) ADD_DEPENDENCIES(libhttpd test_char_header) ########### HTTPD EXECUTABLES ########## -ADD_EXECUTABLE(httpd server/main.c build/win32/httpd.rc) -SET(install_targets ${install_targets} httpd) -SET(install_bin_pdb ${install_bin_pdb} $) -TARGET_COMPILE_DEFINITIONS(httpd PRIVATE +GENERATE_RC_FILE(httpd _httpd_rc "APP_FILE" - "LONG_NAME=Apache HTTP Server" - "BIN_NAME=httpd.exe" - "ICON_FILE=${CMAKE_SOURCE_DIR}/build/win32/apache.ico" + "LONG_NAME Apache HTTP Server" + "BIN_NAME httpd.exe" + "ICON_FILE ${CMAKE_SOURCE_DIR}/build/win32/apache.ico" ) +ADD_EXECUTABLE(httpd server/main.c ${_httpd_rc}) +SET(install_targets ${install_targets} httpd) +IF(INSTALL_PDB) + SET(install_bin_pdb ${install_bin_pdb} $) +ENDIF() TARGET_COMPILE_OPTIONS(httpd PRIVATE "${EXTRA_COMPILE_FLAGS}") SET_TARGET_PROPERTIES(httpd PROPERTIES LINK_FLAGS "/stack:0x40000" @@ -938,42 +983,48 @@ SET(htpasswd_extra_sources support/passwd_common.c) FOREACH(pgm ${standard_support}) SET(extra_sources ${pgm}_extra_sources) - ADD_EXECUTABLE(${pgm} support/${pgm}.c ${${extra_sources}} build/win32/httpd.rc) - SET(install_targets ${install_targets} ${pgm}) - SET(install_bin_pdb ${install_bin_pdb} $) - TARGET_COMPILE_DEFINITIONS(${pgm} PRIVATE - "APP_FILE" - "LONG_NAME=Apache HTTP Server ${pgm} program" - "BIN_NAME=${pgm}.exe" + GENERATE_RC_FILE(${pgm} _pgm_rc + "APP_FILE" + "LONG_NAME Apache HTTP Server ${pgm} program" + "BIN_NAME ${pgm}.exe" ) - TARGET_COMPILE_OPTIONS(${mod_name} PRIVATE "${EXTRA_COMPILE_FLAGS}") + ADD_EXECUTABLE(${pgm} support/${pgm}.c ${${extra_sources}} ${_pgm_rc}) + SET(install_targets ${install_targets} ${pgm}) + IF(INSTALL_PDB) + SET(install_bin_pdb ${install_bin_pdb} $) + ENDIF() + TARGET_COMPILE_OPTIONS(${pgm} PRIVATE "${EXTRA_COMPILE_FLAGS}") TARGET_LINK_LIBRARIES(${pgm} ${EXTRA_LIBS} ${APR_LIBRARIES}) ENDFOREACH() -ADD_EXECUTABLE(ab support/ab.c build/win32/httpd.rc) +GENERATE_RC_FILE(ab _ab_rc + "APP_FILE" + "LONG_NAME Apache HTTP Server ab program" + "BIN_NAME ab.exe" +) +ADD_EXECUTABLE(ab support/ab.c ${_ab_rc}) SET(install_targets ${install_targets} ab) -SET(install_bin_pdb ${install_bin_pdb} $) +IF(INSTALL_PDB) + SET(install_bin_pdb ${install_bin_pdb} $) +ENDIF() SET(tmp_includes ${HTTPD_INCLUDE_DIRECTORIES}) SET_TARGET_PROPERTIES(ab PROPERTIES INCLUDE_DIRECTORIES "${tmp_includes}") -TARGET_COMPILE_DEFINITIONS(ab PRIVATE - "APP_FILE" - "LONG_NAME=Apache HTTP Server ab program" - "BIN_NAME=ab.exe" -) TARGET_LINK_LIBRARIES(ab ${EXTRA_LIBS} ${APR_LIBRARIES} Ws2_32.lib) IF(OPENSSL_FOUND) - ADD_EXECUTABLE(abs support/ab.c build/win32/httpd.rc) + GENERATE_RC_FILE(abs _abs_rc + "APP_FILE" + "LONG_NAME Apache HTTP Server ab/SSL program" + "BIN_NAME abs.exe" + ) + ADD_EXECUTABLE(abs support/ab.c ${_abs_rc}) SET(install_targets ${install_targets} abs) - SET(install_bin_pdb ${install_bin_pdb} $) + IF(INSTALL_PDB) + SET(install_bin_pdb ${install_bin_pdb} $) + ENDIF() SET_TARGET_PROPERTIES(abs PROPERTIES COMPILE_DEFINITIONS HAVE_OPENSSL) SET(tmp_includes ${HTTPD_INCLUDE_DIRECTORIES} ${OPENSSL_INCLUDE_DIR}) SET_TARGET_PROPERTIES(abs PROPERTIES INCLUDE_DIRECTORIES "${tmp_includes}") - TARGET_COMPILE_DEFINITIONS(abs PRIVATE - "APP_FILE" - "LONG_NAME=Apache HTTP Server ab/SSL program" - "BIN_NAME=abs.exe" - ) TARGET_LINK_LIBRARIES(abs ${EXTRA_LIBS} ${APR_LIBRARIES} ${OPENSSL_LIBRARIES} Ws2_32.lib) ENDIF() diff --git a/modules/arch/win32/mod_win32.c b/modules/arch/win32/mod_win32.c index bddc60d9f9d..0670f70b5e9 100644 --- a/modules/arch/win32/mod_win32.c +++ b/modules/arch/win32/mod_win32.c @@ -74,7 +74,7 @@ static void *merge_win32_dir_configs(apr_pool_t *p, void *basev, void *addv) } static const char *set_interpreter_source(cmd_parms *cmd, void *dv, - char *arg) + const char *arg) { win32_dir_conf *d = (win32_dir_conf *)dv; if (!strcasecmp(arg, "registry")) {