Skip to content

Commit

Permalink
Forward port cmake build from apr-1.7 to apr-1.8.
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.8.x@1924301 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
minfrin committed Mar 11, 2025
1 parent cf9d532 commit 8d188f0
Showing 1 changed file with 130 additions and 57 deletions.
187 changes: 130 additions & 57 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,45 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(APR C)

# Enable support for MSVC runtime library selection by abstraction
# if supported by CMake.
IF(POLICY CMP0091)
CMAKE_POLICY(SET CMP0091 NEW)
ENDIF()

# Add simple support CMAKE_WARNING_AS_ERROR if CMake doesn't
# support it.
IF (CMAKE_VERSION VERSION_LESS 3.24)
IF(CMAKE_WARNING_AS_ERROR AND MSVC)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
ENDIF()
ENDIF()

SET(apr_name apr-1)
SET(apr_libname libapr-1)

OPTION(APR_INSTALL_PRIVATE_H "Install selected private .h files (for httpd)" OFF)
OPTION(APR_HAVE_IPV6 "IPv6 support" ON)
OPTION(INSTALL_PDB "Install .pdb files (if generated)" ON)
OPTION(APR_BUILD_TESTAPR "Build the test suite" OFF)
OPTION(APR_BUILD_SHARED "Build shared libraries" ON)
OPTION(APR_BUILD_STATIC "Build static libraries" ON)
OPTION(TEST_STATIC_LIBS "Test programs use APR static libraries instead of shared libraries?" OFF)
SET(MIN_WINDOWS_VER "Vista"
CACHE STRING "Minimum Windows version")

SET(APR_INSTALL_BIN_DIR "bin" CACHE STRING "Install subdirectory for binary files")
SET(APR_INSTALL_LIB_DIR "lib" CACHE STRING "Install subdirectory for library files")
SET(APR_INSTALL_INCLUDE_DIR "include" CACHE STRING "Install subdirectory for include files")

IF(NOT APR_BUILD_SHARED AND NOT APR_BUILD_STATIC)
MESSAGE(FATAL_ERROR "Both APR_BUILD_SHARED and APR_BUILD_STATIC have been disabled")
ENDIF()

IF(NOT APR_BUILD_STATIC AND TEST_STATIC_LIBS)
MESSAGE(FATAL_ERROR "APR_BUILD_STATIC has been disabled, but TEST_STATIC_LIBS is enabled")
ENDIF()

# create 1-or-0 representation of feature tests for apr.h

SET(apr_have_ipv6_10 0)
Expand All @@ -47,6 +78,13 @@ ELSE()
SET(win32_winnt_str ${MIN_WINDOWS_VER})
ENDIF()

# Read current version.
FILE(STRINGS include/apr_version.h VERSION_STRINGS REGEX "#define (APR_MAJOR_VERSION|APR_MINOR_VERSION|APR_PATCH_VERSION)")

STRING(REGEX REPLACE ".*#define APR_MAJOR_VERSION[ \t]+([0-9]+).*" "\\1" APR_MAJOR_VERSION ${VERSION_STRINGS})
STRING(REGEX REPLACE ".*#define APR_MINOR_VERSION[ \t]+([0-9]+).*" "\\1" APR_MINOR_VERSION ${VERSION_STRINGS})
STRING(REGEX REPLACE ".*#define APR_PATCH_VERSION[ \t]+([0-9]+).*" "\\1" APR_PATCH_VERSION ${VERSION_STRINGS})

CONFIGURE_FILE(include/apr.hwc
${PROJECT_BINARY_DIR}/apr.h)

Expand All @@ -71,16 +109,15 @@ ADD_CUSTOM_TARGET(
# you've generated apr.h before using a different build

SET(APR_INCLUDE_DIRECTORIES
${PROJECT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/include/arch/win32
${CMAKE_CURRENT_SOURCE_DIR}/include/arch/unix
${CMAKE_CURRENT_SOURCE_DIR}/include/private
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/arch/win32>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/arch/unix>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/private>
)

SET(APR_SYSTEM_LIBS
ws2_32
mswsock
rpcrt4
)

Expand All @@ -91,6 +128,7 @@ SET(APR_PUBLIC_HEADERS_STATIC
include/apr_atomic.h
include/apr_cstr.h
include/apr_dso.h
include/apr_encode.h
include/apr_env.h
include/apr_errno.h
include/apr_escape.h
Expand Down Expand Up @@ -178,7 +216,6 @@ SET(APR_SOURCES
network_io/unix/sockaddr.c
network_io/unix/socket_util.c
network_io/win32/sendrecv.c
network_io/win32/socket_pipe.c
network_io/win32/sockets.c
network_io/win32/sockopt.c
passwd/apr_getpass.c
Expand Down Expand Up @@ -269,27 +306,55 @@ IF (MSVC)
ENDIF()

# libapr-1 is shared, apr-1 is static
ADD_LIBRARY(libapr-1 SHARED ${APR_SOURCES} ${APR_PUBLIC_HEADERS_GENERATED} libapr.rc)
SET(install_targets ${install_targets} libapr-1)
SET(install_bin_pdb ${install_bin_pdb} ${PROJECT_BINARY_DIR}/libapr-1.pdb)
TARGET_LINK_LIBRARIES(libapr-1 ${APR_SYSTEM_LIBS})
SET_TARGET_PROPERTIES(libapr-1 PROPERTIES COMPILE_DEFINITIONS "APR_DECLARE_EXPORT;WINNT")
ADD_DEPENDENCIES(libapr-1 test_char_header)

ADD_LIBRARY(apr-1 STATIC ${APR_SOURCES} ${APR_PUBLIC_HEADERS_GENERATED})
SET(install_targets ${install_targets} apr-1)
TARGET_LINK_LIBRARIES(apr-1 ${APR_SYSTEM_LIBS})
SET_TARGET_PROPERTIES(apr-1 PROPERTIES COMPILE_DEFINITIONS "APR_DECLARE_STATIC;WINNT")
ADD_DEPENDENCIES(apr-1 test_char_header)
IF (APR_BUILD_SHARED)
ADD_LIBRARY(${apr_libname} SHARED ${APR_SOURCES} ${APR_PUBLIC_HEADERS_GENERATED} libapr.rc)
LIST(APPEND install_targets ${apr_libname})
LIST(APPEND install_bin_pdb $<TARGET_PDB_FILE:${apr_libname}>)
TARGET_LINK_LIBRARIES(${apr_libname}
PRIVATE ${APR_SYSTEM_LIBS})
TARGET_COMPILE_DEFINITIONS(${apr_libname}
PRIVATE "APR_DECLARE_EXPORT;WINNT"
INTERFACE "APR_DECLARE_IMPORT;WINNT")
TARGET_INCLUDE_DIRECTORIES(${apr_libname}
PRIVATE ${APR_INCLUDE_DIRECTORIES}
INTERFACE $<INSTALL_INTERFACE:${APR_INSTALL_INCLUDE_DIR}> ${APR_INCLUDE_DIRECTORIES}
)
ADD_DEPENDENCIES(${apr_libname} test_char_header)
ENDIF()

IF (APR_BUILD_STATIC)
ADD_LIBRARY(${apr_name} STATIC ${APR_SOURCES} ${APR_PUBLIC_HEADERS_GENERATED})
LIST(APPEND install_targets ${apr_name})
TARGET_LINK_LIBRARIES(${apr_name}
PRIVATE ${APR_SYSTEM_LIBS})
TARGET_COMPILE_DEFINITIONS(${apr_name}
PRIVATE "APR_DECLARE_STATIC;WINNT"
INTERFACE "APR_DECLARE_STATIC;WINNT")
TARGET_INCLUDE_DIRECTORIES(${apr_name}
PRIVATE ${APR_INCLUDE_DIRECTORIES}
INTERFACE $<INSTALL_INTERFACE:${APR_INSTALL_INCLUDE_DIR}> ${APR_INCLUDE_DIRECTORIES}
)
ADD_DEPENDENCIES(${apr_name} test_char_header)
ENDIF()

# libaprapp-1 and aprapp-1 are static
ADD_LIBRARY(libaprapp-1 STATIC misc/win32/apr_app.c misc/win32/internal.c ${APR_PUBLIC_HEADERS_GENERATED})
SET(install_targets ${install_targets} libaprapp-1)
SET_TARGET_PROPERTIES(libaprapp-1 PROPERTIES COMPILE_DEFINITIONS "APR_APP;WINNT")
IF (APR_BUILD_SHARED)
ADD_LIBRARY(libaprapp-1 STATIC misc/win32/apr_app.c misc/win32/internal.c ${APR_PUBLIC_HEADERS_GENERATED})
LIST(APPEND install_targets libaprapp-1)
SET_TARGET_PROPERTIES(libaprapp-1 PROPERTIES COMPILE_DEFINITIONS "APR_APP;WINNT")
TARGET_INCLUDE_DIRECTORIES(libaprapp-1
PRIVATE ${APR_INCLUDE_DIRECTORIES}
)
ENDIF()

ADD_LIBRARY(aprapp-1 STATIC misc/win32/apr_app.c misc/win32/internal.c ${APR_PUBLIC_HEADERS_GENERATED})
SET(install_targets ${install_targets} aprapp-1)
SET_TARGET_PROPERTIES(aprapp-1 PROPERTIES COMPILE_DEFINITIONS "APR_DECLARE_STATIC;APR_APP;WINNT")
IF (APR_BUILD_STATIC)
ADD_LIBRARY(aprapp-1 STATIC misc/win32/apr_app.c misc/win32/internal.c ${APR_PUBLIC_HEADERS_GENERATED})
LIST(APPEND install_targets aprapp-1)
SET_TARGET_PROPERTIES(aprapp-1 PROPERTIES COMPILE_DEFINITIONS "APR_DECLARE_STATIC;APR_APP;WINNT")
TARGET_INCLUDE_DIRECTORIES(aprapp-1
PRIVATE ${APR_INCLUDE_DIRECTORIES}
)
ENDIF()

IF(APR_BUILD_TESTAPR)
ENABLE_TESTING()
Expand All @@ -305,26 +370,18 @@ IF(APR_BUILD_TESTAPR)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different
${PROJECT_SOURCE_DIR}/test/data/mmap_datafile.txt
${PROJECT_BINARY_DIR}/data/mmap_datafile.txt)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different
${PROJECT_SOURCE_DIR}/test/data/mmap_large_datafile.txt
${PROJECT_BINARY_DIR}/data/mmap_large_datafile.txt)

IF(TEST_STATIC_LIBS)
SET(whichapr apr-1)
SET(whichapr ${apr_name})
SET(whichaprapp aprapp-1)
SET(apiflag -DAPR_DECLARE_STATIC)
ELSE()
SET(whichapr libapr-1)
SET(whichapr ${apr_libname})
SET(whichaprapp libaprapp-1)
SET(apiflag)
ENDIF()

ADD_EXECUTABLE(testapp test/testapp.c)
TARGET_LINK_LIBRARIES(testapp ${whichapr} ${whichaprapp} ${APR_SYSTEM_LIBS})
TARGET_LINK_LIBRARIES(testapp ${whichapr} ${whichaprapp})
SET_TARGET_PROPERTIES(testapp PROPERTIES LINK_FLAGS /entry:wmainCRTStartup)
IF(apiflag)
SET_TARGET_PROPERTIES(testapp PROPERTIES COMPILE_FLAGS ${apiflag})
ENDIF()
ADD_TEST(NAME testapp COMMAND testapp)

SET (APR_TEST_SOURCES
Expand All @@ -337,27 +394,21 @@ IF(APR_BUILD_TESTAPR)
ENDFOREACH()

ADD_EXECUTABLE(testall ${APR_TEST_SOURCES})
TARGET_LINK_LIBRARIES(testall ${whichapr} ${APR_SYSTEM_LIBS})
TARGET_LINK_LIBRARIES(testall ${whichapr} ws2_32.lib)
SET_TARGET_PROPERTIES(testall PROPERTIES COMPILE_DEFINITIONS "BINPATH=$<TARGET_FILE_DIR:testall>")
IF(apiflag)
SET_TARGET_PROPERTIES(testall PROPERTIES COMPILE_FLAGS ${apiflag})
ENDIF()

FOREACH(test ${APR_TEST_SUITES})
ADD_TEST(NAME ${test} COMMAND testall -v ${test})
ENDFOREACH()

ADD_LIBRARY(mod_test MODULE test/mod_test.c)
TARGET_LINK_LIBRARIES(mod_test ${whichapr} ${APR_SYSTEM_LIBS})
TARGET_LINK_LIBRARIES(mod_test ${whichapr})
SET_PROPERTY(TARGET mod_test APPEND PROPERTY LINK_FLAGS /export:print_hello)
# nasty work-around for difficulties adding more than one additional flag
# (they get joined in a bad way behind the scenes)
GET_PROPERTY(link_flags TARGET mod_test PROPERTY LINK_FLAGS)
SET(link_flags "${link_flags} /export:count_reps")
SET_TARGET_PROPERTIES(mod_test PROPERTIES LINK_FLAGS ${link_flags})
IF(apiflag)
SET_TARGET_PROPERTIES(mod_test PROPERTIES COMPILE_FLAGS ${apiflag})
ENDIF()

# Build all the single-source executable files with no special build
# requirements.
Expand All @@ -381,11 +432,10 @@ IF(APR_BUILD_TESTAPR)
FOREACH(sourcefile ${single_source_programs})
STRING(REGEX REPLACE ".*/([^\\]+)\\.c" "\\1" proggie ${sourcefile})
ADD_EXECUTABLE(${proggie} ${sourcefile})
TARGET_LINK_LIBRARIES(${proggie} ${whichapr} ${APR_SYSTEM_LIBS})
TARGET_LINK_LIBRARIES(${proggie} ${whichapr})
SET_TARGET_PROPERTIES(${proggie} PROPERTIES COMPILE_DEFINITIONS "BINPATH=$<TARGET_FILE_DIR:${proggie}>")
IF(apiflag)
SET_TARGET_PROPERTIES(${proggie} PROPERTIES COMPILE_FLAGS ${apiflag})
ENDIF()

ADD_DEPENDENCIES(testall ${proggie})
ENDFOREACH()

# Add tests for programs that run by themselves with no arguments.
Expand All @@ -411,20 +461,38 @@ IF(APR_BUILD_TESTAPR)
ENDIF (APR_BUILD_TESTAPR)

# Installation
INCLUDE(CMakePackageConfigHelpers)

INSTALL(TARGETS ${install_targets}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
string(TOLOWER "${PROJECT_NAME}" project_name_lower)

write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}-config-version.cmake"
VERSION ${APR_MAJOR_VERSION}.${APR_MINOR_VERSION}.${APR_PATCH_VERSION}
COMPATIBILITY SameMajorVersion
)

INSTALL(TARGETS ${install_targets} EXPORT apr-config
RUNTIME DESTINATION ${APR_INSTALL_BIN_DIR}
LIBRARY DESTINATION ${APR_INSTALL_LIB_DIR}
ARCHIVE DESTINATION ${APR_INSTALL_LIB_DIR}
)

INSTALL(EXPORT apr-config
NAMESPACE apr::
DESTINATION "lib/cmake/${project_name_lower}"
FILE "${project_name_lower}-config.cmake"
)

INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}-config-version.cmake"
DESTINATION "lib/cmake/${project_name_lower}"
)

IF(INSTALL_PDB)
INSTALL(FILES ${install_bin_pdb}
DESTINATION bin
DESTINATION ${APR_INSTALL_BIN_DIR}
CONFIGURATIONS RelWithDebInfo Debug)
ENDIF()

INSTALL(FILES ${APR_PUBLIC_HEADERS_STATIC} ${APR_PUBLIC_HEADERS_GENERATED} DESTINATION include)
INSTALL(FILES ${APR_PUBLIC_HEADERS_STATIC} ${APR_PUBLIC_HEADERS_GENERATED} DESTINATION ${APR_INSTALL_INCLUDE_DIR})
IF(APR_INSTALL_PRIVATE_H)
# Kludges for unexpected dependencies of httpd 2.x, not installed by default
SET(APR_PRIVATE_H_FOR_HTTPD
Expand All @@ -433,8 +501,8 @@ IF(APR_INSTALL_PRIVATE_H)
include/arch/win32/apr_arch_utf8.h
include/arch/win32/apr_private.h
)
INSTALL(FILES ${APR_PRIVATE_H_FOR_HTTPD} DESTINATION include/arch/win32)
INSTALL(FILES include/arch/apr_private_common.h DESTINATION include/arch)
INSTALL(FILES ${APR_PRIVATE_H_FOR_HTTPD} DESTINATION ${APR_INSTALL_INCLUDE_DIR}/arch/win32)
INSTALL(FILES include/arch/apr_private_common.h DESTINATION ${APR_INSTALL_INCLUDE_DIR}/arch)
ENDIF()

STRING(TOUPPER "${CMAKE_BUILD_TYPE}" buildtype)
Expand All @@ -446,9 +514,14 @@ MESSAGE(STATUS "")
MESSAGE(STATUS " Build type ...................... : ${CMAKE_BUILD_TYPE}")
MESSAGE(STATUS " Install .pdb (if available)...... : ${INSTALL_PDB}")
MESSAGE(STATUS " Install prefix .................. : ${CMAKE_INSTALL_PREFIX}")
MESSAGE(STATUS " Directory for binary files .... : PREFIX/${APR_INSTALL_BIN_DIR}")
MESSAGE(STATUS " Directory for library files ... : PREFIX/${APR_INSTALL_LIB_DIR}")
MESSAGE(STATUS " Directory for include files ... : PREFIX/${APR_INSTALL_INCLUDE_DIR}")
MESSAGE(STATUS " C compiler ...................... : ${CMAKE_C_COMPILER}")
MESSAGE(STATUS " IPv6 ............................ : ${APR_HAVE_IPV6}")
MESSAGE(STATUS " Minimum Windows version ......... : ${MIN_WINDOWS_VER}")
MESSAGE(STATUS " Build shared libs ............... : ${APR_BUILD_SHARED}")
MESSAGE(STATUS " Build static libs ............... : ${APR_BUILD_STATIC}")
MESSAGE(STATUS " Build test suite ................ : ${APR_BUILD_TESTAPR}")
IF(TEST_STATIC_LIBS)
MESSAGE(STATUS " (testing static libraries)")
Expand Down

0 comments on commit 8d188f0

Please sign in to comment.