if(ESP_PLATFORM) include("${CMAKE_CURRENT_LIST_DIR}/ports/esp_idf/CMakeLists.txt") return() endif() cmake_minimum_required(VERSION 3.14) cmake_policy(VERSION 3.14...3.31) project(Vanetza VERSION 26.02) set(VANETZA_SOVERSION 0) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # Look up threading library (usually pthread) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads MODULE) # Build configuration options option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(BUILD_TESTS "Build unit tests" OFF) if(BUILD_TESTS) enable_testing() add_subdirectory(gtest) endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib/static) include(GNUInstallDirs) include(UseVanetza) # Enable usage of targets' folder property (good for Visual Studio) set_property(GLOBAL PROPERTY USE_FOLDERS ON) # Find project dependencies find_package(Boost 1.70 REQUIRED COMPONENTS date_time OPTIONAL_COMPONENTS program_options CONFIG) vanetza_optional_dependency(GeographicLib 1.37 VANETZA_WITH_GEOGRAPHICLIB "Use GeographicLib for precise geodesy") vanetza_optional_dependency(CapnProto 0.8 VANETZA_WITH_RPC "Enable RPC support") vanetza_optional_dependency(CryptoPP 5.6.1 VANETZA_WITH_CRYPTOPP "Enable Crypto++ support") vanetza_optional_dependency(OpenSSL 1.1.1 VANETZA_WITH_OPENSSL "Enable OpenSSL extensions") option(VANETZA_WITH_PQC "Enable the experimental hybrid-PQC certificate profile" OFF) if(VANETZA_WITH_PQC) find_package(liboqs 0.14 CONFIG REQUIRED) endif() option(VANETZA_EMBED_COUNTRY_DATA "Embed country boundary data into geodesy library" OFF) add_subdirectory(vanetza/access) add_subdirectory(vanetza/asn1) add_subdirectory(vanetza/btp) add_subdirectory(vanetza/common) add_subdirectory(vanetza/dcc) add_subdirectory(vanetza/facilities) add_subdirectory(vanetza/geodesy) add_subdirectory(vanetza/geonet) add_subdirectory(vanetza/gnss) add_subdirectory(vanetza/net) add_subdirectory(vanetza/rpc) add_subdirectory(vanetza/security) add_subdirectory(vanetza/units) option(BUILD_SOCKTAP "Build socktap application" OFF) if(BUILD_SOCKTAP) add_subdirectory(tools/socktap) endif() option(BUILD_CERTIFY "Build certify application" OFF) if(BUILD_CERTIFY) add_subdirectory(tools/certify) if(VANETZA_WITH_PQC) add_subdirectory(tools/certify-pqc) endif() endif() option(BUILD_BENCHMARK "Build benchmark application" OFF) if(BUILD_BENCHMARK) add_subdirectory(tools/benchmark) endif() option(BUILD_FUZZ "Build fuzz harness" OFF) if(BUILD_FUZZ) add_subdirectory(tools/fuzz-harness) endif() option(BUILD_PKI "Build PKI tools" OFF) if(BUILD_PKI AND VANETZA_WITH_PQC) message(FATAL_ERROR "BUILD_PKI cannot be combined with VANETZA_WITH_PQC: the unchanged PKI " "client uses Vanetza's standard Security ASN.1 profile. Build the PKI " "client separately with VANETZA_WITH_PQC=OFF.") endif() if(BUILD_PKI) add_subdirectory(tools/pki) endif() # interface library for convenience get_property(_components GLOBAL PROPERTY VANETZA_COMPONENTS) add_library(vanetza INTERFACE) add_library(Vanetza::vanetza ALIAS vanetza) foreach(_component IN LISTS _components) target_link_libraries(vanetza INTERFACE ${_component}) endforeach() # installation rules include(CMakePackageConfigHelpers) set(CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/Vanetza") set(CMAKECONFIG_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/cmake-config") write_basic_package_version_file(${CMAKECONFIG_BUILD_DIR}/VanetzaConfigVersion.cmake COMPATIBILITY ExactVersion) configure_package_config_file(cmake/VanetzaConfig.cmake.in ${CMAKECONFIG_BUILD_DIR}/VanetzaConfig.cmake INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} PATH_VARS CMAKE_INSTALL_INCLUDEDIR) install(TARGETS vanetza EXPORT ${PROJECT_NAME}) install(FILES ${CMAKECONFIG_BUILD_DIR}/VanetzaConfig.cmake ${CMAKECONFIG_BUILD_DIR}/VanetzaConfigVersion.cmake DESTINATION ${CMAKECONFIG_INSTALL_DIR}) install(DIRECTORY ${PROJECT_SOURCE_DIR}/cmake/ DESTINATION ${CMAKECONFIG_INSTALL_DIR} FILES_MATCHING PATTERN "Find*.cmake") install(EXPORT ${PROJECT_NAME} NAMESPACE Vanetza:: FILE VanetzaTargets.cmake DESTINATION ${CMAKECONFIG_INSTALL_DIR}) # install all C++ headers except those found for tests file(GLOB_RECURSE _vanetza_headers RELATIVE ${PROJECT_SOURCE_DIR} CONFIGURE_DEPENDS vanetza/*.hpp) list(FILTER _vanetza_headers EXCLUDE REGEX "/tests/") if(NOT VANETZA_WITH_PQC) list(FILTER _vanetza_headers EXCLUDE REGEX "vanetza/security/pqc/") endif() foreach(_header IN LISTS _vanetza_headers) get_filename_component(_dir ${_header} DIRECTORY) install(FILES ${_header} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${_dir}) endforeach() # export build tree (allows import by outside projects) option(VANETZA_EXPORT_PACKAGE "Export Vanetza build directory to CMake package registry" OFF) if(VANETZA_EXPORT_PACKAGE) export(EXPORT ${PROJECT_NAME} NAMESPACE Vanetza:: FILE VanetzaExports.cmake) file(COPY ${CMAKECONFIG_BUILD_DIR}/VanetzaConfigVersion.cmake DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) configure_file(cmake/VanetzaExportsConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/VanetzaConfig.cmake @ONLY) export(PACKAGE ${PROJECT_NAME}) endif() # mark build directory as cache dir, see https://bford.info/cachedir file(WRITE ${PROJECT_BINARY_DIR}/CACHEDIR.TAG "Signature: 8a477f597d28d172789f06886806bc55")