cmake_minimum_required(VERSION 3.20) project(hdk VERSION 0.0.1 LANGUAGES CXX DESCRIPTION "holo development kit" ) option(HDK_TESTS "Build HDK tests" OFF) option(HDK_EXAMPLES "Build HDK examples" OFF) option(HDK_INSTALL_EXAMPLES "Install HDK example binaries and assets" OFF) option(HDK_COVERAGE "Enable HDK coverage instrumentation and reporting" OFF) option(HDK_USE_SYSTEM_DEPS "Prefer system packages before FetchContent fallbacks" ON) set(HDK_COVERAGE_FAIL_UNDER 90 CACHE STRING "Minimum line coverage percentage required by strict coverage target") set(HDK_DOCTEST_MIN_VERSION "2.4.12" CACHE STRING "Minimum doctest version when resolving system packages") set(HDK_GRID_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-grid version when resolving system packages") set(HDK_SDL_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-sdl version when resolving system packages") set(HDK_IS3R_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-is3r version when resolving system packages") set(HDK_SDL3_MIN_VERSION "3.4.8" CACHE STRING "Minimum SDL3 version when resolving system packages") set(HDK_GRID_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-grid.git" CACHE STRING "Git repository used to fetch hdk-grid when package resolution fails") set(HDK_GRID_GIT_TAG "v${HDK_GRID_MIN_VERSION}" CACHE STRING "Git tag used to fetch hdk-grid fallback") set(HDK_SDL_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-sdl.git" CACHE STRING "Git repository used to fetch hdk-sdl when package resolution fails") set(HDK_SDL_GIT_TAG "v${HDK_SDL_MIN_VERSION}" CACHE STRING "Git tag used to fetch hdk-sdl fallback") set(HDK_IS3R_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-is3r.git" CACHE STRING "Git repository used to fetch hdk-is3r when package resolution fails") set(HDK_IS3R_GIT_TAG "v${HDK_IS3R_MIN_VERSION}" CACHE STRING "Git tag used to fetch hdk-is3r fallback") set(HDK_ASSETS_MIN_VERSION "0.0.1" CACHE STRING "Minimum hdk-assets version required by examples") set(HDK_ASSETS_GIT_REPOSITORY "https://git.ufp.institute/ufp/hdk-assets.git" CACHE STRING "Git repository used to fetch hdk-assets when package resolution fails") set(HDK_INSTALL_ASSETSDIR "assets" CACHE STRING "Install-time subdirectory for shared HDK assets under CMAKE_INSTALL_PREFIX") set(HDK_CMAKE_POLICY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake" CACHE PATH "Directory containing shared HDK CMake policy helpers") if(HDK_TESTS) include(CTest) enable_testing() option(HDK_USE_SYSTEM_DOCTEST "Try system doctest before FetchContent fallback" ${HDK_USE_SYSTEM_DEPS}) option(HDK_FETCH_DOCTEST_FALLBACK "Fetch doctest when a suitable system package is unavailable" ON) if(HDK_USE_SYSTEM_DOCTEST) find_package(doctest ${HDK_DOCTEST_MIN_VERSION} QUIET CONFIG) if(doctest_FOUND AND NOT TARGET doctest::doctest) if(TARGET doctest) add_library(doctest::doctest ALIAS doctest) else() set(doctest_FOUND FALSE) endif() endif() endif() if(NOT doctest_FOUND) if(NOT HDK_FETCH_DOCTEST_FALLBACK) message(FATAL_ERROR "doctest >= ${HDK_DOCTEST_MIN_VERSION} not found and HDK_FETCH_DOCTEST_FALLBACK=OFF") endif() include(FetchContent) FetchContent_Declare( doctest GIT_REPOSITORY https://github.com/doctest/doctest.git GIT_TAG v${HDK_DOCTEST_MIN_VERSION} ) FetchContent_MakeAvailable(doctest) endif() endif() if(HDK_COVERAGE) if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") message(WARNING "Coverage requested but compiler '${CMAKE_CXX_COMPILER_ID}' may not support --coverage.") endif() add_library(hdk-coverage-flags INTERFACE) target_compile_options( hdk-coverage-flags INTERFACE -O0 -g --coverage -fno-inline -fno-inline-functions -fno-default-inline -fkeep-inline-functions -fkeep-static-functions ) target_link_options(hdk-coverage-flags INTERFACE --coverage) endif() add_subdirectory(grid) add_subdirectory(sdl) add_subdirectory(is3r) add_subdirectory(assets) #add_subdirectory(hogl) if(HDK_TESTS AND HDK_COVERAGE) find_program(HDK_GCOVR_EXECUTABLE gcovr) if(HDK_GCOVR_EXECUTABLE) add_custom_target( coverage COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/coverage COMMAND ${HDK_GCOVR_EXECUTABLE} --root ${CMAKE_SOURCE_DIR} --filter ${CMAKE_SOURCE_DIR}/grid/include --filter ${CMAKE_SOURCE_DIR}/sdl/include --exclude ${CMAKE_BINARY_DIR}/_deps --print-summary --fail-under-function ${HDK_COVERAGE_FAIL_UNDER} --html-details ${CMAKE_BINARY_DIR}/coverage/index.html WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Run strict tests+coverage and generate report at ${CMAKE_BINARY_DIR}/coverage/index.html" VERBATIM ) else() message(WARNING "gcovr not found; coverage target will not be available.") endif() endif() # Option: DOCUMENTATION option(HDK_DOCS "Build documentation" OFF) if(HDK_DOCS) # Doxygen find_package(Doxygen) if(DOXYGEN_FOUND) set(DOXYGEN_GENERATE_HTML YES) set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs) set(DOXYGEN_STRIP_FROM_PATH ${CMAKE_CURRENT_SOURCE_DIR}) set(DOXYGEN_EXTRACT_ALL YES) set(DOXYGEN_DIRECTORY_GRAPH YES) set(DOXYGEN_JAVADOC_BANNER YES) set(DOXYGEN_JAVADOC_AUTOBRIEF YES) set(DOXYGEN_DOT_IMAGE_FORMAT svg) set(DOXYGEN_INTERACTIVE_SVG YES) set(DOXYGEN_INTERNAL_DOCS YES) set(DOXYGEN_TIMESTAMP YES) set(DOXYGEN_RECURSIVE YES) set(DOXYGEN_TAB_SIZE 2) set(DOXYGEN_BUILTIN_STL_SUPPORT YES) set(DOXYGEN_HTML_DYNAMIC_SECTIONS YES) set(DOXYGEN_USE_MDFILE_AS_MAINPAGE INDEX.md) set(DOXYGEN_GENERATE_TREEVIEW YES) set(DOXYGEN_FULL_SIDEBAR YES) set(DOXYGEN_QUIET YES) set(DOXYGEN_SOURCE_BROWSER YES) # https://www.doxygen.nl/manual/config.html#cfg_source_browser # https://www.doxygen.nl/manual/config.html#cfg_verbatim_headers set(DOXYGEN_VERBATIM_HEADERS YES) set(DOXYGEN_REFERENCED_BY_RELATION YES) set(DOXYGEN_REFERENCES_RELATION YES) doxygen_add_docs(docs ${CMAKE_CURRENT_SOURCE_DIR}/INDEX.md ${CMAKE_CURRENT_SOURCE_DIR}/grid/include/ ${CMAKE_CURRENT_SOURCE_DIR}/grid/src/ ${CMAKE_CURRENT_SOURCE_DIR}/grid/*.md ${CMAKE_CURRENT_SOURCE_DIR}/sdl/include/ ${CMAKE_CURRENT_SOURCE_DIR}/sdl/examples/ ${CMAKE_CURRENT_SOURCE_DIR}/sdl/src/ ${CMAKE_CURRENT_SOURCE_DIR}/sdl/*.md #USE_STAMP_FILE WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generate API") else() message(WARNING "Doxygen not found, API documentation will not be generated.") endif() endif() include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/HDKPackaging.cmake)