mirror of
https://github.com/CrowCpp/Crow.git
synced 2026-01-18 16:31:17 +01:00
361 lines
9.9 KiB
CMake
361 lines
9.9 KiB
CMake
#####################################
|
|
# Define Project-Wide Settings
|
|
#####################################
|
|
cmake_minimum_required(VERSION 3.15.0 FATAL_ERROR)
|
|
|
|
# Define the project name and language
|
|
project(Crow
|
|
LANGUAGES CXX
|
|
VERSION 1.1.1
|
|
)
|
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# Make sure Findasio.cmake module is found
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
|
|
|
# Check if Crow is the main project
|
|
set(CROW_IS_MAIN_PROJECT OFF)
|
|
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|
set(CROW_IS_MAIN_PROJECT ON)
|
|
endif()
|
|
|
|
# Set required C++ standard
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
|
|
|
# Default to build type "Release" unless tests are being built
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
if (NOT CROW_BUILD_TESTS)
|
|
message(STATUS "No build type selected, default to Release")
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
else()
|
|
message(STATUS "No build type selected but tests are being built, default to Debug")
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
endif()
|
|
endif()
|
|
if (MSVC)
|
|
add_compile_options(/bigobj)
|
|
endif ()
|
|
|
|
include(FindPython3)
|
|
find_package(Python3)
|
|
|
|
#####################################
|
|
# Define Options
|
|
#####################################
|
|
option(CROW_BUILD_EXAMPLES "Build the examples in the project" ${CROW_IS_MAIN_PROJECT})
|
|
option(CROW_BUILD_TESTS "Build the tests in the project" ${CROW_IS_MAIN_PROJECT})
|
|
option(CROW_BUILD_FUZZER "Instrument and build Crow fuzzer" OFF)
|
|
option(CROW_AMALGAMATE "Combine all headers into one" OFF)
|
|
option(CROW_INSTALL "Add install step for Crow" ON )
|
|
option(CROW_USE_BOOST "Use Boost.Asio for Crow" OFF)
|
|
option(CROW_GENERATE_SBOM "Generate SBOM file" OFF)
|
|
option(CROW_RETURNS_OK_ON_HTTP_OPTIONS_REQUEST
|
|
"Returns HTTP status code OK (200) instead of 204 for OPTIONS request"
|
|
OFF )
|
|
|
|
option(CROW_ENABLE_SSL "Enable Crow's SSL feature for supporting https" OFF)
|
|
option(CROW_ENABLE_COMPRESSION "Enable Crow's Compression feature for supporting compressed http content" OFF)
|
|
|
|
if(CROW_GENERATE_SBOM OR CROW_BUILD_TESTS)
|
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPM.cmake)
|
|
endif ()
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
CPMAddPackage(
|
|
NAME cmake-sbom
|
|
GITHUB_REPOSITORY DEMCON/cmake-sbom
|
|
GIT_TAG v1.4.0
|
|
DOWNLOAD_ONLY YES
|
|
)
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_BINARY_DIR}/_deps/cmake-sbom-src/cmake")
|
|
|
|
include(sbom)
|
|
include(version)
|
|
string(TIMESTAMP BUILD_DATE "%Y-%m-%d")
|
|
sbom_generate(
|
|
SUPPLIER CrowCpp
|
|
SUPPLIER_URL https://crowcpp.org/
|
|
LICENSE "BSD-3-Clause"
|
|
OUTPUT crow-${PROJECT_VERSION}-${BUILD_DATE}.spdx
|
|
)
|
|
endif()
|
|
|
|
#####################################
|
|
# Define Targets
|
|
#####################################
|
|
add_library(Crow INTERFACE)
|
|
add_library(Crow::Crow ALIAS Crow)
|
|
|
|
target_include_directories(Crow
|
|
INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<INSTALL_INTERFACE:include>
|
|
)
|
|
|
|
if(CROW_USE_BOOST)
|
|
if(POLICY CMP0167)
|
|
# Use Boost CMake module from Boost instead of the one from CMake
|
|
cmake_policy(SET CMP0167 NEW)
|
|
endif()
|
|
find_package(Boost 1.64 COMPONENTS date_time REQUIRED)
|
|
if(Boost_VERSION VERSION_LESS 1.89)
|
|
find_package(Boost 1.64 COMPONENTS system REQUIRED)
|
|
else()
|
|
add_library(Boost::system ALIAS Boost::headers)
|
|
endif()
|
|
target_link_libraries(Crow
|
|
INTERFACE
|
|
Boost::boost Boost::system Boost::date_time
|
|
)
|
|
target_compile_definitions(Crow INTERFACE CROW_USE_BOOST)
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
sbom_add(
|
|
PACKAGE boost
|
|
DOWNLOAD_LOCATION https://www.boost.org/
|
|
LICENSE "BSL-1.0"
|
|
SUPPLIER "Organization: Boost Community"
|
|
VERSION "${Boost_VERSION}"
|
|
)
|
|
endif()
|
|
else()
|
|
find_package(asio REQUIRED)
|
|
target_link_libraries(Crow
|
|
INTERFACE
|
|
asio::asio
|
|
)
|
|
target_compile_definitions(Crow INTERFACE ASIO_NO_DEPRECATED)
|
|
endif()
|
|
|
|
if(ASIO_FOUND)
|
|
find_file(ASIO_VERSION_HPP "asio/version.hpp" PATHS ${ASIO_INCLUDE_DIR})
|
|
if(ASIO_VERSION_HPP)
|
|
file(READ ${ASIO_VERSION_HPP} ASIO_VERSION_CONTENT)
|
|
string(REGEX MATCH "#define ASIO_VERSION ([0-9]+)" _ ${ASIO_VERSION_CONTENT})
|
|
if(CMAKE_MATCH_1)
|
|
math(EXPR ASIO_VERSION_MAJOR "${CMAKE_MATCH_1} / 100000")
|
|
math(EXPR ASIO_VERSION_MINOR "(${CMAKE_MATCH_1} / 1000) % 100")
|
|
math(EXPR ASIO_VERSION_PATCH "${CMAKE_MATCH_1} % 1000")
|
|
set(asio_VERSION "${ASIO_VERSION_MAJOR}.${ASIO_VERSION_MINOR}.${ASIO_VERSION_PATCH}")
|
|
endif()
|
|
endif()
|
|
|
|
# Fallback
|
|
if(NOT asio_VERSION)
|
|
set(asio_VERSION "unknown")
|
|
endif()
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
sbom_add(
|
|
PACKAGE asio
|
|
DOWNLOAD_LOCATION https://github.com/chriskohlhoff/asio
|
|
LICENSE "BSL-1.0"
|
|
SUPPLIER "Organization: Boost Community"
|
|
VERSION "${asio_VERSION}"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
target_compile_definitions(Crow INTERFACE "")
|
|
|
|
if(CROW_ENABLE_COMPRESSION)
|
|
find_package(ZLIB REQUIRED)
|
|
target_link_libraries(Crow INTERFACE ZLIB::ZLIB)
|
|
target_compile_definitions(Crow INTERFACE CROW_ENABLE_COMPRESSION)
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
sbom_add(
|
|
PACKAGE zlib
|
|
DOWNLOAD_LOCATION https://github.com/madler/zlib
|
|
LICENSE "Zlib"
|
|
SUPPLIER "Person: Jean-loup Gailly and Mark Adler"
|
|
VERSION "${ZLIB_VERSION}"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(CROW_ENABLE_SSL)
|
|
find_package(OpenSSL REQUIRED)
|
|
target_link_libraries(Crow INTERFACE OpenSSL::SSL)
|
|
target_compile_definitions(Crow INTERFACE CROW_ENABLE_SSL)
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
sbom_add(
|
|
PACKAGE openssl
|
|
DOWNLOAD_LOCATION https://github.com/openssl/openssl
|
|
LICENSE "Apache-2.0"
|
|
SUPPLIER "Organization: OpenSSL Software Foundation"
|
|
VERSION "${OPENSSL_VERSION}"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(CROW_AMALGAMATE)
|
|
set(CROW_AMALGAMATED_HEADERS
|
|
include/crow.h
|
|
include/crow/app.h
|
|
include/crow/ci_map.h
|
|
include/crow/common.h
|
|
include/crow/compression.h
|
|
include/crow/exceptions.h
|
|
include/crow/http_connection.h
|
|
include/crow/http_parser_merged.h
|
|
include/crow/http_request.h
|
|
include/crow/http_response.h
|
|
include/crow/http_server.h
|
|
include/crow/json.h
|
|
include/crow/logging.h
|
|
include/crow/middleware.h
|
|
include/crow/middleware_context.h
|
|
include/crow/mime_types.h
|
|
include/crow/multipart.h
|
|
include/crow/multipart_view.h
|
|
include/crow/mustache.h
|
|
include/crow/parser.h
|
|
include/crow/query_string.h
|
|
include/crow/returnable.h
|
|
include/crow/routing.h
|
|
include/crow/settings.h
|
|
include/crow/socket_adaptors.h
|
|
include/crow/task_timer.h
|
|
include/crow/utility.h
|
|
include/crow/version.h
|
|
include/crow/websocket.h
|
|
include/crow/middlewares/cookie_parser.h
|
|
include/crow/middlewares/cors.h
|
|
include/crow/middlewares/session.h
|
|
include/crow/middlewares/utf-8.h
|
|
)
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
sbom_add(
|
|
PACKAGE python3
|
|
DOWNLOAD_LOCATION https://www.python.org/
|
|
LICENSE "PSF-2.0"
|
|
SUPPLIER "Organization: Python Software Foundation"
|
|
VERSION "${Python3_VERSION}"
|
|
)
|
|
endif()
|
|
|
|
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/crow_all.h
|
|
COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/scripts/merge_all.py
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
${CMAKE_CURRENT_BINARY_DIR}/crow_all.h
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
DEPENDS ${CROW_AMALGAMATED_HEADERS}
|
|
)
|
|
|
|
add_custom_target(crow_amalgamated ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/crow_all.h)
|
|
endif()
|
|
|
|
# Examples
|
|
if(CROW_BUILD_EXAMPLES)
|
|
add_subdirectory(examples)
|
|
endif()
|
|
|
|
# Tests
|
|
if(CROW_BUILD_TESTS)
|
|
|
|
add_subdirectory(tests)
|
|
enable_testing()
|
|
add_test(
|
|
NAME crow_test
|
|
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/tests/unittest
|
|
)
|
|
|
|
if(NOT CROW_ENABLE_COMPRESSION)
|
|
message(STATUS "Compression tests are omitted. (Configure with CROW_ENABLE_COMPRESSION to enable them)")
|
|
endif()
|
|
if(NOT CROW_ENABLE_SSL)
|
|
message(STATUS "SSL tests are omitted. (Configure with CROW_ENABLE_SSL to enable them)")
|
|
else()
|
|
if(NOT MSVC)
|
|
add_test(
|
|
NAME ssl_test
|
|
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/tests/ssl/ssltest
|
|
)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# Fuzzers
|
|
if (CROW_BUILD_FUZZER)
|
|
add_subdirectory(tests/fuzz)
|
|
endif()
|
|
|
|
#####################################
|
|
# Install Files
|
|
#####################################
|
|
if(CROW_INSTALL)
|
|
include(GNUInstallDirs)
|
|
install(TARGETS Crow EXPORT CrowTargets)
|
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
)
|
|
|
|
install(EXPORT CrowTargets
|
|
FILE CrowTargets.cmake
|
|
NAMESPACE Crow::
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Crow"
|
|
)
|
|
|
|
if(CROW_USE_BOOST)
|
|
set(CROW_ASIO_PROVIDER "Boost 1.64 COMPONENTS system date_time REQUIRED")
|
|
else()
|
|
set(CROW_ASIO_PROVIDER "asio")
|
|
endif()
|
|
|
|
include(CMakePackageConfigHelpers)
|
|
configure_package_config_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/CrowConfig.cmake.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/CrowConfig.cmake"
|
|
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Crow"
|
|
)
|
|
install(FILES
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Findasio.cmake"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/CrowConfig.cmake"
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Crow"
|
|
)
|
|
endif()
|
|
|
|
if(WIN32 AND NOT CYGWIN)
|
|
set(CPACK_GENERATOR NSIS ZIP)
|
|
endif(WIN32 AND NOT CYGWIN)
|
|
if(APPLE)
|
|
set(CPACK_GENERATOR DragNDrop TGZ)
|
|
endif(APPLE)
|
|
if (UNIX AND NOT APPLE AND NOT WIN32)
|
|
set(CPACK_GENERATOR DEB TGZ)
|
|
endif (UNIX AND NOT APPLE AND NOT WIN32)
|
|
|
|
set(CPACK_PACKAGE_NAME "Crow")
|
|
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "CrowCpp")
|
|
set(CPACK_PACKAGE_VENDOR "CrowCpp")
|
|
set(CPACK_PACKAGE_DESCRIPTION "A Fast and Easy to use C++ microframework for the web.")
|
|
set(CPACK_PACKAGE_HOMEPAGE_URL "https://crowcpp.org")
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all")
|
|
set(CPACK_DEBIAN_PACKAGE_DEBUG OFF)
|
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libasio-dev")
|
|
set(CPACK_DEBIAN_PACKAGE_SECTION "libdevel")
|
|
|
|
include(CPack)
|
|
|
|
#####################################
|
|
# Uninstall Files
|
|
#####################################
|
|
if(NOT TARGET uninstall)
|
|
configure_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
|
|
IMMEDIATE @ONLY)
|
|
|
|
add_custom_target(uninstall
|
|
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
|
|
endif()
|
|
|
|
if(CROW_GENERATE_SBOM)
|
|
sbom_finalize()
|
|
endif()
|