Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 91 additions & 40 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)")
Expand All @@ -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)
Expand Down Expand Up @@ -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}
Expand Down Expand Up @@ -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} "$<TARGET_PDB_FILE:${mod_name}>")
IF(INSTALL_PDB)
SET(install_modules_pdb ${install_modules_pdb} "$<TARGET_PDB_FILE:${mod_name}>")
ENDIF()
IF("${${mod_name}_install_lib}")
SET(installed_mod_libs_exps
${installed_mod_libs_exps}
Expand All @@ -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?
Expand All @@ -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} $<TARGET_PDB_FILE:libhttpd>)
IF(INSTALL_PDB)
SET(install_bin_pdb ${install_bin_pdb} $<TARGET_PDB_FILE:libhttpd>)
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_PDB_FILE:httpd>)
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} $<TARGET_PDB_FILE:httpd>)
ENDIF()
TARGET_COMPILE_OPTIONS(httpd PRIVATE "${EXTRA_COMPILE_FLAGS}")
SET_TARGET_PROPERTIES(httpd PROPERTIES
LINK_FLAGS "/stack:0x40000"
Expand All @@ -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_PDB_FILE:${pgm}>)
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} $<TARGET_PDB_FILE:${pgm}>)
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} $<TARGET_PDB_FILE:ab>)
IF(INSTALL_PDB)
SET(install_bin_pdb ${install_bin_pdb} $<TARGET_PDB_FILE:ab>)
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} $<TARGET_PDB_FILE:abs>)
IF(INSTALL_PDB)
SET(install_bin_pdb ${install_bin_pdb} $<TARGET_PDB_FILE:abs>)
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()

Expand Down
2 changes: 1 addition & 1 deletion modules/arch/win32/mod_win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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")) {
Expand Down
Loading