| # =================================================================== |
| # 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. |
| # =================================================================== |
| |
| # =================================================================== |
| # The following variables can be set to locate dependencies that |
| # are not installed in standard paths. These variables are used |
| # by the find_package() modules. |
| # |
| # APR_ROOT - Path to APR's install area |
| # APRUtil_ROOT - Path to APR-Util's install area |
| # OPENSSL_ROOT_DIR - Path to OpenSSL's install area |
| # ZLIB_ROOT - Path to zlib's install area |
| # Brotli_ROOT - Path to Brotli's install area |
| # GSSAPI_ROOT - Path to GSSAPI's install area |
| # =================================================================== |
| |
| cmake_minimum_required(VERSION 3.12) |
| |
| # Enable CMP0092 if supported: MSVC warning flags are not in |
| # CMAKE_<LANG>_FLAGS by default. |
| if(POLICY CMP0092) |
| cmake_policy(SET CMP0092 NEW) |
| endif() |
| |
| set(SERF_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") |
| set(CMAKE_MODULE_PATH "${SERF_SOURCE_DIR}/build") |
| include(SerfVersion) |
| |
| project("Serf" VERSION ${SERF_VERSION} LANGUAGES C) |
| message(WARNING |
| "Serf's CMake build is considered EXPERIMENTAL. " |
| "Some features are not supported and the build " |
| "has not been tested on many supported platforms.") |
| |
| # Build options |
| option(DEBUG "Enable debugging info and strict compile warnings" OFF) |
| option(DOT_CLANGD "Generate a .clangd file at the root of the source tree" OFF) |
| option(SKIP_SHARED "Disable building shared Serf libraries" OFF) |
| option(SKIP_STATIC "Disable building static Serf libraries" OFF) |
| option(DISABLE_LOGGING "Disable the logging framework at compile time" OFF) |
| option(SKIP_TESTS "Disable building the unit tests and utilities" OFF) |
| option(ENABLE_SLOW_TESTS "Enable long-running unit tests" OFF) |
| |
| # Platform-specific build options |
| option(APR_STATIC "Windows: Link with static APR/-Util libraries" OFF) |
| option(EXPAT "Windows: optional path to Expat's install area for APR_STATIC" "") |
| option(RELATIVE_RPATH "macOS: Use @rpath in installed shared library" OFF) |
| option(USE_HOMEBREW "macOS: Use dependencies from Homebrew" OFF) |
| option(USE_MACPORTS "macOS: Use dependencies from MacPorts" OFF) |
| |
| if(SKIP_SHARED AND SKIP_STATIC) |
| message(FATAL_ERROR "You have disabled both shared and static library builds.") |
| endif() |
| |
| if(USE_HOMEBREW AND USE_MACPORTS) |
| message(FATAL_ERROR "You requested both Homebrew and McPorts dependencies.") |
| endif() |
| |
| # Initialize the build type if it was not set on the command line. |
| if(NOT CMAKE_BUILD_TYPE) |
| if(DEBUG) |
| set(CMAKE_BUILD_TYPE Debug CACHE STRING "Default to debug build." FORCE) |
| set(SERF_MAINTAINER_MODE TRUE) |
| else() |
| set(CMAKE_BUILD_TYPE Release CACHE STRING "Default to release build." FORCE) |
| endif() |
| endif() |
| |
| include(GNUInstallDirs) |
| include(SerfPlatform) |
| |
| # On the Mac: Use dependencies from Homebrew or MacPorts |
| if(USE_HOMEBREW OR USE_MACPORTS) |
| if(SERF_DARWIN) |
| include(SerfMacOS) |
| serf_macos_find_packages() |
| else() |
| if(USE_HOMEBREW) |
| message(WARNING "option USE_HOMEBREW is not implemented on this platform") |
| endif() |
| if(USE_MACPORTS) |
| message(WARNING "option USE_MACPORTS is not implemented on this platform") |
| endif() |
| endif(SERF_DARWIN) |
| endif(USE_HOMEBREW OR USE_MACPORTS) |
| |
| # Install directories |
| if(NOT SERF_WINDOWS) |
| set(SERF_INCLUDE_SUBDIR "serf-${SERF_MAJOR_VERSION}") |
| set(SERF_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}/${SERF_INCLUDE_SUBDIR}") |
| else() |
| set(SERF_INSTALL_HEADERS "${CMAKE_INSTALL_INCLUDEDIR}") |
| endif() |
| set(SERF_INSTALL_LIBRARIES "${CMAKE_INSTALL_LIBDIR}") |
| set(SERF_INSTALL_RUNTIME "${CMAKE_INSTALL_BINDIR}") |
| set(SERF_INSTALL_PKGCONFIG "${CMAKE_INSTALL_LIBDIR}/pkgconfig") |
| |
| # Public headers |
| list(APPEND HEADERS |
| "serf.h" |
| "serf_bucket_types.h" |
| "serf_bucket_util.h" |
| ) |
| |
| # List of symbols that should not be exported from the shared library. |
| list(APPEND EXPORTS_BLACKLIST |
| "serf_connection_switch_protocol" |
| "serf_http_protocol_create" |
| "serf_https_protocol_create" |
| "serf_http_request_queue" |
| ) |
| |
| # Serf library source files |
| list(APPEND SOURCES |
| "src/config_store.c" |
| "src/context.c" |
| "src/deprecated.c" |
| "src/incoming.c" |
| "src/init_once.c" |
| "src/logging.c" |
| "src/outgoing.c" |
| "src/outgoing_request.c" |
| "src/pump.c" |
| "src/ssltunnel.c" |
| "auth/auth.c" |
| "auth/auth_basic.c" |
| "auth/auth_digest.c" |
| "auth/auth_spnego.c" |
| "auth/auth_spnego_gss.c" |
| "auth/auth_spnego_sspi.c" |
| "buckets/aggregate_buckets.c" |
| "buckets/allocator.c" |
| "buckets/barrier_buckets.c" |
| "buckets/brotli_buckets.c" |
| "buckets/buckets.c" |
| "buckets/bwtp_buckets.c" |
| "buckets/chunk_buckets.c" |
| "buckets/copy_buckets.c" |
| "buckets/dechunk_buckets.c" |
| "buckets/deflate_buckets.c" |
| "buckets/event_buckets.c" |
| "buckets/fcgi_buckets.c" |
| "buckets/file_buckets.c" |
| "buckets/headers_buckets.c" |
| "buckets/hpack_buckets.c" |
| "buckets/http2_frame_buckets.c" |
| "buckets/iovec_buckets.c" |
| "buckets/limit_buckets.c" |
| "buckets/log_wrapper_buckets.c" |
| "buckets/mmap_buckets.c" |
| "buckets/prefix_buckets.c" |
| "buckets/request_buckets.c" |
| "buckets/response_body_buckets.c" |
| "buckets/response_buckets.c" |
| "buckets/simple_buckets.c" |
| "buckets/socket_buckets.c" |
| "buckets/split_buckets.c" |
| "buckets/ssl_buckets.c" |
| "protocols/fcgi_protocol.c" |
| "protocols/fcgi_stream.c" |
| "protocols/http2_protocol.c" |
| "protocols/http2_stream.c" |
| ) |
| |
| # Generate lists of symbols to export from shared libraries. |
| if(SERF_WINDOWS) |
| set(export_symbols_ext_ "def") |
| set(export_symbols_gen_ SerfWindowsGenDef) |
| set(export_symbols_ldflag "${CMAKE_LINK_DEF_FILE_FLAG}") |
| elseif(SERF_DARWIN) |
| set(export_symbols_ext_ "exp") |
| set(export_symbols_gen_ SerfMachGenExp) |
| set(export_symbols_ldflag "-Wl,-exported_symbols_list,") |
| elseif(SERF_ELF_TARGET) |
| set(export_symbols_ext_ "map") |
| set(export_symbols_gen_ SerfElfGenMap) |
| set(export_symbols_ldflag "-Wl,--version-script,") |
| endif() |
| |
| if(DEFINED export_symbols_gen_) |
| set(SERF_EXPORT_SYMBOLS "${CMAKE_CURRENT_BINARY_DIR}/libserf-${SERF_MAJOR_VERSION}.${export_symbols_ext_}") |
| add_custom_command( |
| OUTPUT "${SERF_EXPORT_SYMBOLS}" |
| DEPENDS ${HEADERS} |
| COMMAND ${CMAKE_COMMAND} |
| -DCMAKE_SYSTEM_NAME="${CMAKE_SYSTEM_NAME}" |
| -DCMAKE_MODULE_PATH="${CMAKE_MODULE_PATH}" |
| -DSERF_EXPORT_BLACKLIST="${EXPORTS_BLACKLIST}" |
| -DSERF_EXPORT_HEADERS="${HEADERS}" |
| -DSERF_EXPORT_SYMBOLS="${SERF_EXPORT_SYMBOLS}" |
| -P "build/${export_symbols_gen_}.cmake" |
| WORKING_DIRECTORY "${SERF_SOURCE_DIR}" |
| ) |
| add_custom_target(serf_export_symbols DEPENDS "${SERF_EXPORT_SYMBOLS}") |
| endif() |
| |
| if(SERF_WINDOWS) |
| set(SHARED_SOURCES "serf.rc") |
| |
| # Static OpenSSL, APR and APR-Util need additional libraries that are not |
| # linked by default by CMake. These will be ignored by the linker if they're |
| # not actually used. |
| set(SERF_STANDARD_LIBRARIES |
| "crypt32.lib" |
| "mswsock.lib" |
| "rpcrt4.lib" |
| "secur32.lib" |
| "ws2_32.lib" |
| ) |
| list(APPEND SERF_C_DEFINES "SERF_HAVE_SSPI") |
| endif() |
| |
| # Process build options for dependency search |
| if(EXPAT) |
| if(SERF_WINDOWS) |
| set(PC_EXPAT_INCLUDE_DIRS "${EXPAT}/include") |
| set(PC_EXPAT_LIBRARY_DIRS "${EXPAT}/lib") |
| else(SERF_WINDOWS) |
| message(WARNING "option EXPAT is not implemented on this platform") |
| endif(SERF_WINDOWS) |
| endif(EXPAT) |
| |
| # Find required dependencies |
| find_package(OpenSSL REQUIRED) |
| find_package(ZLIB REQUIRED) |
| find_package(APR REQUIRED) |
| find_package(APRUtil REQUIRED) |
| |
| # We do not want or need OpenSSL's compatibility macros. |
| list(APPEND SERF_C_DEFINES "OPENSSL_NO_DEPRECATED") |
| |
| # Hide OpenSSL's _fp() API. |
| list(APPEND SERF_C_DEFINES "OPENSSL_NO_STDIO") |
| |
| # Find optional dependencies |
| find_package(Brotli) |
| if(NOT SERF_WINDOWS) |
| find_package(GSSAPI) |
| else() |
| # We use SSPI on Windows and there's no Kerberos/GSSAPI port there. |
| set(GSSAPI_FOUND FALSE) |
| if(DEFINED GSSAPI_ROOT) |
| message(WARNING "option GSSAPI_ROOT is not implemented on this platform") |
| endif() |
| endif() |
| |
| # Calculate the set of private and public targets |
| set(SERF_PRIVATE_TARGETS OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB) |
| if(Brotli_FOUND) |
| list(APPEND SERF_PRIVATE_TARGETS Brotli::Decode) |
| endif() |
| if(GSSAPI_FOUND) |
| list(APPEND SERF_C_DEFINES "SERF_HAVE_GSSAPI") |
| list(APPEND SERF_PRIVATE_TARGETS KRB5::GSSAPI) |
| endif() |
| |
| if(APR_STATIC) |
| if(SERF_WINDOWS) |
| list(APPEND SERF_PUBLIC_TARGETS APR::APR_static) |
| if(NOT APR_CONTAINS_APRUTIL) |
| list(APPEND SERF_PUBLIC_TARGETS APR::APRUtil_static) |
| endif() |
| else(SERF_WINDOWS) |
| message(WARNING "option APR_STATIC is not implemented on this platform") |
| endif(SERF_WINDOWS) |
| else(APR_STATIC) |
| list(APPEND SERF_PUBLIC_TARGETS APR::APR) |
| if(NOT APR_CONTAINS_APRUTIL) |
| list(APPEND SERF_PUBLIC_TARGETS APR::APRUtil) |
| endif() |
| endif(APR_STATIC) |
| |
| # Feature tests |
| include(SerfChecks) |
| CheckNotFunction("BIO_set_init" "NULL, 0" "SERF_NO_SSL_BIO_WRAPPERS" |
| "openssl/bio.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckNotFunction("X509_STORE_get0_param" "NULL" "SERF_NO_SSL_X509_STORE_WRAPPERS" |
| "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckNotFunction("X509_get0_notBefore" "NULL" "SERF_NO_SSL_X509_GET0_NOTBEFORE" |
| "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckNotFunction("X509_get0_notAfter" "NULL" "SERF_NO_SSL_X509_GET0_NOTAFTER" |
| "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckNotFunction("X509_STORE_CTX_get0_chain" "NULL" "SERF_NO_SSL_X509_GET0_CHAIN" |
| "openssl/x509.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckNotFunction("ASN1_STRING_get0_data" "NULL" "SERF_NO_SSL_ASN1_STRING_GET0_DATA" |
| "openssl/asn1.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckFunction("OSSL_STORE_open_ex" |
| "NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL" |
| "SERF_HAVE_OSSL_STORE_OPEN_EX" "openssl/store.h" |
| "${OPENSSL_INCLUDE_DIR}" ${OPENSSL_LIBRARIES} |
| ${SERF_STANDARD_LIBRARIES}) |
| CheckFunction("CRYPTO_set_locking_callback" "NULL" "SERF_HAVE_SSL_LOCKING_CALLBACKS" |
| "openssl/crypto.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckFunction("SSL_set_alpn_protos" "NULL, NULL, 0" "SERF_HAVE_OPENSSL_ALPN" |
| "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckFunction("OpenSSL_version_num" "" "SERF_HAVE_OPENSSL_VERSION_NUM" |
| "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckFunction("OPENSSL_malloc_init" "" "SERF_HAVE_OPENSSL_MALLOC_INIT" |
| "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckFunction("SSL_library_init" "" "SERF_HAVE_OPENSSL_SSL_LIBRARY_INIT" |
| "openssl/ssl.h" "${OPENSSL_INCLUDE_DIR}" |
| ${OPENSSL_LIBRARIES} ${SERF_STANDARD_LIBRARIES}) |
| CheckHeader("stdbool.h" "HAVE_STDBOOL_H=1") |
| CheckType("OSSL_HANDSHAKE_STATE" "openssl/ssl.h" "SERF_HAVE_OSSL_HANDSHAKE_STATE" ${OPENSSL_INCLUDE_DIR}) |
| if(Brotli_FOUND) |
| CheckType("BrotliDecoderResult" "brotli/decode.h" "SERF_HAVE_BROTLI_DECODER_RESULT" ${BROTLI_INCLUDES}) |
| # Check for the function only if the type check succeeded. |
| if("SERF_HAVE_BROTLI_DECODER_RESULT" IN_LIST SERF_C_DEFINES) |
| CheckFunction("BrotliDecoderTakeOutput" "NULL, NULL" "SERF_HAVE_BROTLI" |
| "brotli/decode.h" ${BROTLI_INCLUDES} |
| Brotli::Decode ${SERF_STANDARD_LIBRARIES}) |
| endif() |
| endif() |
| |
| if(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) |
| set(CC_LIKE_GNUC TRUE) |
| endif() |
| |
| # Process other build options |
| if(DEBUG) |
| list(APPEND SERF_C_DEFINES "DEBUG" "_DEBUG") |
| endif() |
| |
| if(DISABLE_LOGGING) |
| list(APPEND SERF_C_DEFINES "SERF_DISABLE_LOGGING") |
| endif() |
| |
| if(ENABLE_SLOW_TESTS) |
| list(APPEND SERF_C_DEFINES "SERF_TEST_DEFLATE_4GBPLUS_BUCKETS") |
| endif() |
| |
| # Set common compiler flags |
| set(CMAKE_C_STANDARD 90) # Use C90. MockHTTP overrides this. |
| set(CMAKE_C_EXTENSIONS OFF) |
| set(CMAKE_C_STANDARD_REQUIRED TRUE) |
| |
| if(NOT MSVC) |
| if(CC_LIKE_GNUC) |
| list(APPEND SERF_C_WARNINGS "-Wall") |
| list(APPEND SERF_C_WARNINGS "-Wdeclaration-after-statement") |
| list(APPEND SERF_C_WARNINGS "-Wmissing-prototypes") |
| list(APPEND SERF_C_WARNINGS "-Wshadow") |
| |
| string(APPEND CMAKE_C_FLAGS_DEBUG " -O0") |
| |
| if(SERF_MAINTAINER_MODE) |
| # This is for clang, which happily accepts unknow warning options. |
| CheckCFlag(SERF_C_WARNINGS "-Werror=unknown-warning-option") |
| # Additional warning flags for more pedantic checks |
| CheckCFlag(SERF_C_WARNINGS "-Wimplicit-function-declaration") |
| CheckCFlag(SERF_C_WARNINGS "-Wmissing-variable-declarations") |
| CheckCFlag(SERF_C_WARNINGS "-Wunreachable-code") |
| CheckCFlag(SERF_C_WARNINGS "-Wshorten-64-to-32") |
| CheckCFlag(SERF_C_WARNINGS "-Wno-system-headers") |
| CheckCFlag(SERF_C_WARNINGS "-Wextra-tokens") |
| CheckCFlag(SERF_C_WARNINGS "-Wnewline-eof") |
| endif() |
| endif() |
| else() |
| # Warning level 4, no unused argument warnings |
| list(APPEND SERF_C_WARNINGS "/W4" "/wd4100") |
| # Conditional expression is constant |
| list(APPEND SERF_C_WARNINGS "/wd4127") |
| # Assignment within conditional expression |
| list(APPEND SERF_C_WARNINGS "/wd4706") |
| # 'function' undefined; assuming extern returning int |
| list(APPEND SERF_C_WARNINGS "/we4013") |
| |
| list(APPEND SERF_C_DEFINES |
| "WIN32" "WIN32_LEAN_AND_MEAN" |
| "NOUSER" "NOGDI" "NONLS" "NOCRYPT" |
| "_CRT_SECURE_NO_WARNINGS" |
| "_CRT_NONSTDC_NO_WARNINGS" |
| ) |
| if(SERF_WIN64) |
| list(APPEND SERF_C_DEFINES "WIN64") |
| endif() |
| |
| set(CMAKE_IMPORT_LIBRARY_PREFIX "${SERF_INSTALL_LIBRARIES}") |
| set(CMAKE_SHARED_LIBRARY_PREFIX "${SERF_INSTALL_LIBRARIES}") |
| endif(NOT MSVC) |
| |
| # Define all targets |
| if(NOT SKIP_SHARED) |
| add_library(serf_shared SHARED ${SOURCES} ${SHARED_SOURCES}) |
| target_compile_options(serf_shared |
| PUBLIC ${APR_CFLAGS} |
| PRIVATE ${SERF_C_WARNINGS}) |
| target_compile_definitions(serf_shared PRIVATE ${SERF_C_DEFINES}) |
| target_include_directories(serf_shared PUBLIC ${SERF_SOURCE_DIR}) |
| target_link_libraries(serf_shared |
| PRIVATE ${SERF_PRIVATE_TARGETS} |
| ${SERF_STANDARD_LIBRARIES} |
| PUBLIC ${SERF_PUBLIC_TARGETS}) |
| set_target_properties(serf_shared PROPERTIES |
| VERSION ${SERF_VERSION} |
| SOVERSION ${SERF_SOVERSION}) |
| if(DEFINED SERF_EXPORT_SYMBOLS) |
| add_dependencies(serf_shared serf_export_symbols) |
| set_target_properties(serf_shared PROPERTIES |
| LINK_FLAGS "${export_symbols_ldflag}${SERF_EXPORT_SYMBOLS}") |
| endif() |
| if(SERF_DARWIN AND NOT RELATIVE_RPATH) |
| set_target_properties(serf_shared PROPERTIES |
| INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${SERF_INSTALL_LIBRARIES}") |
| endif() |
| list(APPEND SERF_TARGETS serf_shared) |
| |
| if(SERF_WINDOWS) |
| string(TOLOWER "${CMAKE_BUILD_TYPE}" config) |
| if(NOT "${config}" STREQUAL "release") |
| install(FILES $<TARGET_PDB_FILE:serf_shared> |
| DESTINATION "${SERF_INSTALL_RUNTIME}") |
| endif() |
| endif() |
| endif() |
| |
| if(NOT SKIP_STATIC) |
| add_library(serf_static STATIC ${SOURCES}) |
| target_compile_options(serf_static |
| PUBLIC ${APR_CFLAGS} |
| PRIVATE ${SERF_C_WARNINGS}) |
| target_compile_definitions(serf_static PRIVATE ${SERF_C_DEFINES}) |
| target_include_directories(serf_static PUBLIC ${SERF_SOURCE_DIR}) |
| target_link_libraries(serf_static |
| ${SERF_PRIVATE_TARGETS} |
| ${SERF_PUBLIC_TARGETS} |
| ${SERF_STANDARD_LIBRARIES}) |
| list(APPEND SERF_TARGETS serf_static) |
| endif() |
| |
| set_target_properties(${SERF_TARGETS} |
| PROPERTIES |
| OUTPUT_NAME "serf-${SERF_MAJOR_VERSION}") |
| |
| # Generate the .clangd file |
| if(DOT_CLANGD) |
| include(SerfGenClangd) |
| endif() |
| |
| # Install targets |
| install(TARGETS ${SERF_TARGETS} |
| ARCHIVE DESTINATION "${SERF_INSTALL_LIBRARIES}" |
| LIBRARY DESTINATION "${SERF_INSTALL_LIBRARIES}" |
| RUNTIME DESTINATION "${SERF_INSTALL_RUNTIME}") |
| |
| install(FILES ${HEADERS} DESTINATION "${SERF_INSTALL_HEADERS}") |
| |
| # Generate the pkg-config module file. |
| if(NOT SERF_WINDOWS) |
| set(SERF_PC_FILE "serf-${SERF_MAJOR_VERSION}.pc") |
| |
| # Use a separate variable scope for the substitutions in serf.pc.in. |
| function(make_pkgconfig) |
| # Use a relative prefix to create a relocatable PC file. |
| file(RELATIVE_PATH relfragment "/${SERF_INSTALL_PKGCONFIG}" "/") |
| file(TO_CMAKE_PATH "\${pcfiledir}/${relfragment}" relprefix) |
| |
| set(PREFIX ${relprefix}) |
| set(INCLUDE_SUBDIR ${SERF_INCLUDE_SUBDIR}) |
| set(LIBDIR \${prefix}/${SERF_INSTALL_LIBRARIES}) |
| set(VERSION ${SERF_VERSION}) |
| set(MAJOR ${SERF_MAJOR_VERSION}) |
| set(LIBS |
| ${APR_LDFLAGS} |
| ${APR_LIBRARIES} |
| ${APR_EXTRALIBS} |
| ${APRUTIL_LDFLAGS} |
| ${APRUTIL_LIBRARIES} |
| ${APRUTIL_EXTRALIBS} |
| ${GSSAPI_LIBRARIES} |
| ${ZLIB_LIBRARIES} |
| ) |
| list(REMOVE_DUPLICATES LIBS) |
| list(JOIN LIBS " " LIBS) |
| configure_file("build/serf.pc.in" "${SERF_PC_FILE}" @ONLY) |
| endfunction() |
| |
| make_pkgconfig() |
| install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${SERF_PC_FILE}" |
| DESTINATION "${SERF_INSTALL_PKGCONFIG}") |
| endif() |
| |
| |
| if(NOT SKIP_TESTS) |
| if(SKIP_STATIC) |
| message(WARNING "The tests depend on the Serf static library") |
| message(STATUS "Skipping tests; to silence this message, either remove") |
| message(STATUS "the SKIP_STATIC option or add the SKIP_TESTS option.") |
| set(SKIP_TESTS TRUE) |
| else() |
| enable_testing() |
| add_subdirectory(test) |
| endif() |
| endif() |
| |
| |
| # Summary |
| set(_build_shared OFF) |
| set(_build_static OFF) |
| set(_build_tests OFF) |
| set(_gen_dot_clangd OFF) |
| set(_have_brotli OFF) |
| set(_have_gssapi OFF) |
| set(_have_sspi OFF) |
| |
| if(NOT SKIP_SHARED) |
| set(_build_shared ON) |
| endif() |
| if(NOT SKIP_STATIC) |
| set(_build_static ON) |
| endif() |
| if(NOT SKIP_TESTS) |
| set(_build_tests ON) |
| if(ENABLE_SLOW_TESTS) |
| set(_build_tests "ON, slow tests enabled") |
| endif() |
| endif() |
| if(DOT_CLANGD) |
| set(_gen_dot_clangd ON) |
| endif() |
| |
| if("SERF_HAVE_BROTLI" IN_LIST SERF_C_DEFINES) |
| set(_have_brotli ON) |
| endif() |
| if("SERF_HAVE_GSSAPI" IN_LIST SERF_C_DEFINES) |
| set(_have_gssapi ON) |
| endif() |
| if("SERF_HAVE_SSPI" IN_LIST SERF_C_DEFINES) |
| set(_have_sspi ON) |
| endif() |
| |
| message(STATUS "Summary:") |
| message(STATUS " Version ................... : ${SERF_VERSION}") |
| message(STATUS " Build:") |
| message(STATUS " platform: ............... : ${SERF_PLATFORM}") |
| message(STATUS " target: ................. : ${SERF_TARGET}") |
| message(STATUS " generator: .............. : ${CMAKE_GENERATOR}") |
| message(STATUS " build type .............. : ${CMAKE_BUILD_TYPE}") |
| message(STATUS " shared libraries ........ : ${_build_shared}") |
| message(STATUS " static libraries ........ : ${_build_static}") |
| message(STATUS " tests ................... : ${_build_tests}") |
| message(STATUS " generate .clangd ........ : ${_gen_dot_clangd}") |
| message(STATUS " Options:") |
| message(STATUS " Brotli .................. : ${_have_brotli}") |
| message(STATUS " GSSAPI .................. : ${_have_gssapi}") |
| message(STATUS " SSPI .................... : ${_have_sspi}") |
| message(STATUS " Install:") |
| message(STATUS " prefix: ................. : ${CMAKE_INSTALL_PREFIX}") |
| message(STATUS " headers: ................ : ${SERF_INSTALL_HEADERS}") |
| message(STATUS " libraries: .............. : ${SERF_INSTALL_LIBRARIES}") |
| if(SERF_WINDOWS) |
| message(STATUS " dynamic libraries: ...... : ${SERF_INSTALL_RUNTIME}") |
| else() |
| message(STATUS " pkg-config file: ........ : ${SERF_INSTALL_PKGCONFIG}") |
| endif() |