|
|
@@ -5,6 +5,7 @@
|
|
|
* HTTPLIB_USE_ZLIB_IF_AVAILABLE (default on)
|
|
|
* HTTPLIB_USE_BROTLI_IF_AVAILABLE (default on)
|
|
|
* HTTPLIB_USE_ZSTD_IF_AVAILABLE (default on)
|
|
|
+ * HTTPLIB_BUILD_MODULES (default off)
|
|
|
* HTTPLIB_REQUIRE_OPENSSL (default off)
|
|
|
* HTTPLIB_REQUIRE_ZLIB (default off)
|
|
|
* HTTPLIB_REQUIRE_BROTLI (default off)
|
|
|
@@ -110,6 +111,15 @@ option(HTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN "Enable feature to load system cer
|
|
|
option(HTTPLIB_USE_NON_BLOCKING_GETADDRINFO "Enables the non-blocking alternatives for getaddrinfo." ON)
|
|
|
option(HTTPLIB_REQUIRE_ZSTD "Requires ZSTD to be found & linked, or fails build." OFF)
|
|
|
option(HTTPLIB_USE_ZSTD_IF_AVAILABLE "Uses ZSTD (if available) to enable zstd support." ON)
|
|
|
+# C++20 modules support requires CMake 3.28 or later
|
|
|
+if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28")
|
|
|
+ option(HTTPLIB_BUILD_MODULES "Build httplib modules (requires HTTPLIB_COMPILE to be ON)." OFF)
|
|
|
+else()
|
|
|
+ set(HTTPLIB_BUILD_MODULES OFF CACHE INTERNAL "Build httplib modules disabled (requires CMake 3.28+)" FORCE)
|
|
|
+ if(DEFINED CACHE{HTTPLIB_BUILD_MODULES} AND HTTPLIB_BUILD_MODULES)
|
|
|
+ message(WARNING "HTTPLIB_BUILD_MODULES requires CMake 3.28 or later. Current version is ${CMAKE_VERSION}. Modules support has been disabled.")
|
|
|
+ endif()
|
|
|
+endif()
|
|
|
# Defaults to static library but respects standard BUILD_SHARED_LIBS if set
|
|
|
include(CMakeDependentOption)
|
|
|
cmake_dependent_option(HTTPLIB_SHARED "Build the library as a shared library instead of static. Has no effect if using header-only."
|
|
|
@@ -240,6 +250,22 @@ if(HTTPLIB_COMPILE)
|
|
|
message(FATAL_ERROR "Failed when trying to split cpp-httplib with the Python script.\n${_httplib_split_error}")
|
|
|
endif()
|
|
|
|
|
|
+ # If building modules, also generate the module file
|
|
|
+ if(HTTPLIB_BUILD_MODULES)
|
|
|
+ # Put the generate_module script into the build dir
|
|
|
+ configure_file(generate_module.py "${CMAKE_CURRENT_BINARY_DIR}/generate_module.py"
|
|
|
+ COPYONLY
|
|
|
+ )
|
|
|
+ # Generate the module file
|
|
|
+ execute_process(COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/generate_module.py"
|
|
|
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
|
+ ERROR_VARIABLE _httplib_module_error
|
|
|
+ )
|
|
|
+ if(_httplib_module_error)
|
|
|
+ message(FATAL_ERROR "Failed when trying to generate cpp-httplib module with the Python script.\n${_httplib_module_error}")
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+
|
|
|
# split.py puts output in "out"
|
|
|
set(_httplib_build_includedir "${CMAKE_CURRENT_BINARY_DIR}/out")
|
|
|
add_library(${PROJECT_NAME} ${HTTPLIB_LIB_TYPE} "${_httplib_build_includedir}/httplib.cc")
|
|
|
@@ -248,6 +274,13 @@ if(HTTPLIB_COMPILE)
|
|
|
$<BUILD_INTERFACE:${_httplib_build_includedir}/httplib.h>
|
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/httplib.h>
|
|
|
)
|
|
|
+
|
|
|
+ # Add C++20 module support if requested
|
|
|
+ # Include from separate file to prevent parse errors on older CMake versions
|
|
|
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28")
|
|
|
+ include(cmake/modules.cmake)
|
|
|
+ endif()
|
|
|
+
|
|
|
set_target_properties(${PROJECT_NAME}
|
|
|
PROPERTIES
|
|
|
VERSION ${${PROJECT_NAME}_VERSION}
|
|
|
@@ -264,8 +297,12 @@ endif()
|
|
|
# Only useful if building in-tree, versus using it from an installation.
|
|
|
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
|
|
|
|
|
|
-# Require C++11
|
|
|
-target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_11)
|
|
|
+# Require C++11, or C++20 if modules are enabled
|
|
|
+if(HTTPLIB_BUILD_MODULES)
|
|
|
+ target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_20)
|
|
|
+else()
|
|
|
+ target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_11)
|
|
|
+endif()
|
|
|
|
|
|
target_include_directories(${PROJECT_NAME} SYSTEM ${_INTERFACE_OR_PUBLIC}
|
|
|
$<BUILD_INTERFACE:${_httplib_build_includedir}>
|
|
|
@@ -337,7 +374,11 @@ 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)
|
|
|
+ if(HTTPLIB_BUILD_MODULES)
|
|
|
+ install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/httplib/modules CXX_MODULES_BMI DESTINATION ${CMAKE_INSTALL_LIBDIR}/httplib/modules)
|
|
|
+ else()
|
|
|
+ install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets)
|
|
|
+ endif()
|
|
|
|
|
|
install(FILES "${_httplib_build_includedir}/httplib.h" TYPE INCLUDE)
|
|
|
|
|
|
@@ -366,6 +407,10 @@ if(HTTPLIB_INSTALL)
|
|
|
include(CPack)
|
|
|
endif()
|
|
|
|
|
|
+if(HTTPLIB_BUILD_MODULES AND NOT HTTPLIB_COMPILE)
|
|
|
+ message(FATAL_ERROR "HTTPLIB_BUILD_MODULES requires HTTPLIB_COMPILE to be ON.")
|
|
|
+endif()
|
|
|
+
|
|
|
if(HTTPLIB_TEST)
|
|
|
include(CTest)
|
|
|
add_subdirectory(test)
|