diff --git a/CMakeLists.txt b/CMakeLists.txt index 20b85c2..73de511 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,11 +3,11 @@ * BUILD_SHARED_LIBS (default off) builds as a shared library (if HTTPLIB_COMPILE is ON) * HTTPLIB_USE_OPENSSL_IF_AVAILABLE (default on) * HTTPLIB_USE_ZLIB_IF_AVAILABLE (default on) + * HTTPLIB_USE_BROTLI_IF_AVAILABLE (default on) * HTTPLIB_REQUIRE_OPENSSL (default off) * HTTPLIB_REQUIRE_ZLIB (default off) - * HTTPLIB_USE_BROTLI_IF_AVAILABLE (default on) - * HTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN (default on) * HTTPLIB_REQUIRE_BROTLI (default off) + * HTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN (default on) * HTTPLIB_COMPILE (default off) * HTTPLIB_INSTALL (default on) * HTTPLIB_TEST (default off) @@ -59,7 +59,6 @@ ------------------------------------------------------------------------------- - FindPython3 requires Cmake v3.12 ARCH_INDEPENDENT option of write_basic_package_version_file() requires Cmake v3.14 ]] cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR) @@ -69,20 +68,19 @@ cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR) # This is so the maintainer doesn't actually need to update this manually. file(STRINGS httplib.h _raw_version_string REGEX "CPPHTTPLIB_VERSION \"([0-9]+\\.[0-9]+\\.[0-9]+)\"") -# Needed since git tags have "v" prefixing them. -# Also used if the fallback to user agent string is being used. +# Extracts just the version string itself from the whole string contained in _raw_version_string +# since _raw_version_string would contain the entire line of code where it found the version string string(REGEX MATCH "([0-9]+\\.?)+" _httplib_version "${_raw_version_string}") project(httplib VERSION ${_httplib_version} LANGUAGES CXX) -# Lets you disable C++ exception during CMake configure time. -# The value is used in the install CMake config file. -option(HTTPLIB_NO_EXCEPTIONS "Disable the use of C++ exceptions" OFF) - # Change as needed to set an OpenSSL minimum version. # This is used in the installed Cmake config file. set(_HTTPLIB_OPENSSL_MIN_VER "3.0.0") +# Lets you disable C++ exception during CMake configure time. +# The value is used in the install CMake config file. +option(HTTPLIB_NO_EXCEPTIONS "Disable the use of C++ exceptions" OFF) # Allow for a build to require OpenSSL to pass, instead of just being optional option(HTTPLIB_REQUIRE_OPENSSL "Requires OpenSSL to be found & linked, or fails build." OFF) option(HTTPLIB_REQUIRE_ZLIB "Requires ZLIB to be found & linked, or fails build." OFF) @@ -94,10 +92,6 @@ option(HTTPLIB_USE_ZLIB_IF_AVAILABLE "Uses ZLIB (if available) to enable Zlib co option(HTTPLIB_COMPILE "If ON, uses a Python script to split the header into a compilable header & source file (requires Python v3)." OFF) # Lets you disable the installation (useful when fetched from another CMake project) option(HTTPLIB_INSTALL "Enables the installation target" ON) -# Just setting this variable here for people building in-tree -if(HTTPLIB_COMPILE) - set(HTTPLIB_IS_COMPILED TRUE) -endif() option(HTTPLIB_TEST "Enables testing and builds tests" OFF) option(HTTPLIB_REQUIRE_BROTLI "Requires Brotli to be found & linked, or fails build." OFF) option(HTTPLIB_USE_BROTLI_IF_AVAILABLE "Uses Brotli (if available) to enable Brotli decompression support." ON) @@ -110,45 +104,48 @@ if (BUILD_SHARED_LIBS AND WIN32 AND HTTPLIB_COMPILE) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) endif() +# Set some variables that are used in-tree and while building based on our options +set(HTTPLIB_IS_COMPILED ${HTTPLIB_COMPILE}) +set(HTTPLIB_IS_USING_CERTS_FROM_MACOSX_KEYCHAIN ${HTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN}) + # Threads needed for on some systems, and for on Linux -set(THREADS_PREFER_PTHREAD_FLAG true) +set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) # Since Cmake v3.11, Crypto & SSL became optional when not specified as COMPONENTS. if(HTTPLIB_REQUIRE_OPENSSL) find_package(OpenSSL ${_HTTPLIB_OPENSSL_MIN_VER} COMPONENTS Crypto SSL REQUIRED) + set(HTTPLIB_IS_USING_OPENSSL TRUE) elseif(HTTPLIB_USE_OPENSSL_IF_AVAILABLE) find_package(OpenSSL ${_HTTPLIB_OPENSSL_MIN_VER} COMPONENTS Crypto SSL QUIET) -endif() -# Just setting this variable here for people building in-tree -if(OPENSSL_FOUND AND NOT DEFINED HTTPLIB_IS_USING_OPENSSL) - set(HTTPLIB_IS_USING_OPENSSL TRUE) + # Avoid a rare circumstance of not finding all components but the end-user did their + # own call for OpenSSL, which might trick us into thinking we'd otherwise have what we wanted + if (TARGET OpenSSL::SSL AND TARGET OpenSSL::Crypto) + set(HTTPLIB_IS_USING_OPENSSL ${OPENSSL_FOUND}) + else() + set(HTTPLIB_IS_USING_OPENSSL FALSE) + endif() endif() if(HTTPLIB_REQUIRE_ZLIB) find_package(ZLIB REQUIRED) + set(HTTPLIB_IS_USING_ZLIB TRUE) elseif(HTTPLIB_USE_ZLIB_IF_AVAILABLE) find_package(ZLIB QUIET) -endif() -# Just setting this variable here for people building in-tree -# FindZLIB doesn't have a ZLIB_FOUND variable, so check the target. -if(TARGET ZLIB::ZLIB) - set(HTTPLIB_IS_USING_ZLIB TRUE) + # FindZLIB doesn't have a ZLIB_FOUND variable, so check the target. + if(TARGET ZLIB::ZLIB) + set(HTTPLIB_IS_USING_ZLIB TRUE) + endif() endif() # Adds our cmake folder to the search path for find_package +# This is so we can use our custom FindBrotli.cmake list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") if(HTTPLIB_REQUIRE_BROTLI) find_package(Brotli COMPONENTS encoder decoder common REQUIRED) + set(HTTPLIB_IS_USING_BROTLI TRUE) elseif(HTTPLIB_USE_BROTLI_IF_AVAILABLE) find_package(Brotli COMPONENTS encoder decoder common QUIET) -endif() -# Just setting this variable here for people building in-tree -if(Brotli_FOUND) - set(HTTPLIB_IS_USING_BROTLI TRUE) -endif() - -if(HTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) - set(HTTPLIB_IS_USING_CERTS_FROM_MACOSX_KEYCHAIN TRUE) + set(HTTPLIB_IS_USING_BROTLI ${Brotli_FOUND}) endif() # Used for default, common dirs that the end-user can change (if needed) @@ -204,9 +201,7 @@ endif() add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) # Require C++11 -target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} - cxx_std_11 -) +target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_11) target_include_directories(${PROJECT_NAME} SYSTEM ${_INTERFACE_OR_PUBLIC} $ @@ -273,9 +268,7 @@ if(HTTPLIB_INSTALL) # Creates the export httplibTargets.cmake # This is strictly what holds compilation requirements # and linkage information (doesn't find deps though). - install(TARGETS ${PROJECT_NAME} - EXPORT httplibTargets - ) + install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets) install(FILES "${_httplib_build_includedir}/httplib.h" TYPE INCLUDE)