cmake_minimum_required(VERSION 3.16) project(wavefront_parser LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -O3") set(CMAKE_CXX_FLAGS "-fno-threadsafe-statics") option(ENABLE_COVERAGE "Enable coverage instrumentation for tests" OFF) file(GLOB SRC_FILES CONFIGURE_DEPENDS src/*.cpp) set(APP_SOURCES ${SRC_FILES}) list(REMOVE_ITEM APP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp) add_executable(wavefront_parser ${SRC_FILES}) target_include_directories(wavefront_parser PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) find_package(GTest REQUIRED) enable_testing() add_executable(wavefront_tests tests/unit/trim_test.cpp tests/unit/settings_test.cpp tests/unit/scan_test.cpp tests/unit/parse_test.cpp ${APP_SOURCES} ) target_link_libraries(wavefront_tests PRIVATE GTest::gtest GTest::gmock GTest::gtest_main ) target_include_directories(wavefront_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) if(ENABLE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(wavefront_tests PRIVATE --coverage -O0 -g) target_link_options(wavefront_tests PRIVATE --coverage) endif() include(GoogleTest) gtest_discover_tests(wavefront_tests) find_program(LCOV_EXECUTABLE lcov) find_program(GENHTML_EXECUTABLE genhtml) if(LCOV_EXECUTABLE AND GENHTML_EXECUTABLE) add_custom_target(coverage COMMAND ${LCOV_EXECUTABLE} --directory "${CMAKE_BINARY_DIR}" --capture --rc geninfo_unexecuted_blocks=1 --demangle-cpp --ignore-errors inconsistent --keep-going --output-file coverage.info COMMAND ${LCOV_EXECUTABLE} --extract coverage.info "${CMAKE_SOURCE_DIR}/src/*" --output-file coverage.info COMMAND ${GENHTML_EXECUTABLE} coverage.info --output-directory coverage WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMENT "Generating lcov report at \"${CMAKE_BINARY_DIR}/coverage/index.html\"" VERBATIM ) endif()