Created
October 16, 2019 02:13
-
-
Save sleepdefic1t/1a3365e60dc8669596f034fc324effa0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# | |
# Downloads GTest and provides a helper macro to add tests. Add make check, as well, which | |
# gives output on failed tests without having to set an environment variable. | |
# | |
# | |
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) | |
if(CMAKE_VERSION VERSION_LESS 3.11) | |
set(UPDATE_DISCONNECTED_IF_AVAILABLE "UPDATE_DISCONNECTED 1") | |
include(DownloadProject) | |
download_project(PROJ googletest | |
GIT_REPOSITORY https://github.com/google/googletest.git | |
GIT_TAG release-1.8.0 | |
UPDATE_DISCONNECTED 1 | |
QUIET | |
) | |
# CMake warning suppression will not be needed in version 1.9 | |
set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "") | |
add_subdirectory(${googletest_SOURCE_DIR} ${googletest_SOURCE_DIR} EXCLUDE_FROM_ALL) | |
unset(CMAKE_SUPPRESS_DEVELOPER_WARNINGS) | |
else() | |
include(FetchContent) | |
FetchContent_Declare(googletest | |
GIT_REPOSITORY https://github.com/google/googletest.git | |
GIT_TAG release-1.8.0) | |
FetchContent_GetProperties(googletest) | |
if(NOT googletest_POPULATED) | |
FetchContent_Populate(googletest) | |
set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "") | |
add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) | |
unset(CMAKE_SUPPRESS_DEVELOPER_WARNINGS) | |
endif() | |
endif() | |
if(CMAKE_CONFIGURATION_TYPES) | |
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} | |
--force-new-ctest-process --output-on-failure | |
--build-config "$<CONFIGURATION>") | |
else() | |
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} | |
--force-new-ctest-process --output-on-failure) | |
endif() | |
set_target_properties(check PROPERTIES FOLDER "Scripts") | |
#include_directories(${gtest_SOURCE_DIR}/include) | |
# More modern way to do the last line, less messy but needs newish CMake: | |
# target_include_directories(gtest INTERFACE ${gtest_SOURCE_DIR}/include) | |
if(GOOGLE_TEST_INDIVIDUAL) | |
if(NOT CMAKE_VERSION VERSION_LESS 3.9) | |
include(GoogleTest) | |
else() | |
set(GOOGLE_TEST_INDIVIDUAL OFF) | |
endif() | |
endif() | |
# Target must already exist | |
macro(add_gtest TESTNAME) | |
target_link_libraries(${TESTNAME} PUBLIC gtest gmock gtest_main) | |
if(GOOGLE_TEST_INDIVIDUAL) | |
if(CMAKE_VERSION VERSION_LESS 3.10) | |
gtest_add_tests(TARGET ${TESTNAME} | |
TEST_PREFIX "${TESTNAME}." | |
TEST_LIST TmpTestList) | |
set_tests_properties(${TmpTestList} PROPERTIES FOLDER "Tests") | |
else() | |
gtest_discover_tests(${TESTNAME} | |
TEST_PREFIX "${TESTNAME}." | |
PROPERTIES FOLDER "Tests") | |
endif() | |
else() | |
add_test(${TESTNAME} ${TESTNAME}) | |
set_target_properties(${TESTNAME} PROPERTIES FOLDER "Tests") | |
endif() | |
endmacro() | |
mark_as_advanced( | |
gmock_build_tests | |
gtest_build_samples | |
gtest_build_tests | |
gtest_disable_pthreads | |
gtest_force_shared_crt | |
gtest_hide_internal_symbols | |
BUILD_GMOCK | |
BUILD_GTEST | |
) | |
set_target_properties(gtest gtest_main gmock gmock_main | |
PROPERTIES FOLDER "Extern") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) 2012 - 2015, Lars Bilke | |
# All rights reserved. | |
# | |
# Redistribution and use in source and binary forms, with or without modification, | |
# are permitted provided that the following conditions are met: | |
# | |
# 1. Redistributions of source code must retain the above copyright notice, this | |
# list of conditions and the following disclaimer. | |
# | |
# 2. Redistributions in binary form must reproduce the above copyright notice, | |
# this list of conditions and the following disclaimer in the documentation | |
# and/or other materials provided with the distribution. | |
# | |
# 3. Neither the name of the copyright holder nor the names of its contributors | |
# may be used to endorse or promote products derived from this software without | |
# specific prior written permission. | |
# | |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
# | |
# | |
# | |
# 2012-01-31, Lars Bilke | |
# - Enable Code Coverage | |
# | |
# 2013-09-17, Joakim Söderberg | |
# - Added support for Clang. | |
# - Some additional usage instructions. | |
# | |
# USAGE: | |
# 0. (Mac only) If you use Xcode 5.1 make sure to patch geninfo as described here: | |
# http://stackoverflow.com/a/22404544/80480 | |
# | |
# 1. Copy this file into your cmake modules path. | |
# | |
# 2. Add the following line to your CMakeLists.txt: | |
# INCLUDE(CodeCoverage) | |
# | |
# 3. Set compiler flags to turn off optimization and enable coverage: | |
# SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") | |
# SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") | |
# | |
# 3. Use the function SETUP_TARGET_FOR_COVERAGE to create a custom make target | |
# which runs your test executable and produces a lcov code coverage report: | |
# Example: | |
# SETUP_TARGET_FOR_COVERAGE( | |
# my_coverage_target # Name for custom target. | |
# test_driver # Name of the test driver executable that runs the tests. | |
# # NOTE! This should always have a ZERO as exit code | |
# # otherwise the coverage generation will not complete. | |
# coverage # Name of output directory. | |
# ) | |
# | |
# 4. Build a Debug build: | |
# cmake -DCMAKE_BUILD_TYPE=Debug .. | |
# make | |
# make my_coverage_target | |
# | |
# | |
# Check prereqs | |
FIND_PROGRAM( GCOV_PATH gcov) | |
FIND_PROGRAM( LCOV_PATH lcov ) | |
FIND_PROGRAM( GENHTML_PATH genhtml ) | |
FIND_PROGRAM( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/tests) | |
IF(NOT GCOV_PATH) | |
MESSAGE(FATAL_ERROR "gcov not found! Aborting...") | |
ENDIF() # NOT GCOV_PATH | |
IF("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") | |
IF("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3) | |
MESSAGE(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") | |
ENDIF() | |
ELSEIF(NOT CMAKE_COMPILER_IS_GNUCXX) | |
MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...") | |
ENDIF() # CHECK VALID COMPILER | |
SET(CMAKE_CXX_FLAGS_COVERAGE | |
"-g -O0 --coverage" | |
CACHE STRING "Flags used by the C++ compiler during coverage builds." | |
FORCE ) | |
SET(CMAKE_C_FLAGS_COVERAGE | |
"-g -O0 --coverage" | |
CACHE STRING "Flags used by the C compiler during coverage builds." | |
FORCE ) | |
SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE | |
"--coverage" | |
CACHE STRING "Flags used for linking binaries during coverage builds." | |
FORCE ) | |
SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE | |
"--coverage" | |
CACHE STRING "Flags used by the shared libraries linker during coverage builds." | |
FORCE ) | |
MARK_AS_ADVANCED( | |
CMAKE_CXX_FLAGS_COVERAGE | |
CMAKE_C_FLAGS_COVERAGE | |
CMAKE_EXE_LINKER_FLAGS_COVERAGE | |
CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) | |
IF ( NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Coverage")) | |
MESSAGE( WARNING "Code coverage results with an optimized (non-Debug) build may be misleading" ) | |
ENDIF() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" | |
# Param _targetname The name of new the custom make target | |
# Param _testrunner The name of the target which runs the tests. | |
# MUST return ZERO always, even on errors. | |
# If not, no coverage report will be created! | |
# Param _outputname lcov output is generated as _outputname.info | |
# HTML report is generated in _outputname/index.html | |
# Optional fourth parameter is passed as arguments to _testrunner | |
# Pass them in list form, e.g.: "-j;2" for -j 2 | |
FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname) | |
IF(NOT LCOV_PATH) | |
MESSAGE(FATAL_ERROR "lcov not found! Aborting...") | |
ENDIF() # NOT LCOV_PATH | |
IF(NOT GENHTML_PATH) | |
MESSAGE(FATAL_ERROR "genhtml not found! Aborting...") | |
ENDIF() # NOT GENHTML_PATH | |
SET(coverage_info "${CMAKE_BINARY_DIR}/${_outputname}.info") | |
SET(coverage_cleaned "${coverage_info}.cleaned") | |
SEPARATE_ARGUMENTS(test_command UNIX_COMMAND "${_testrunner}") | |
# Setup target | |
ADD_CUSTOM_TARGET(${_targetname} | |
# Cleanup lcov | |
${LCOV_PATH} --directory . --zerocounters | |
# Run tests | |
COMMAND ${test_command} ${ARGV3} | |
# Capturing lcov counters and generating report | |
COMMAND ${LCOV_PATH} --directory . --capture --output-file ${coverage_info} | |
COMMAND ${LCOV_PATH} --remove ${coverage_info} '*/tests/*' '*gtest*' '*gmock*' '/usr/*' --output-file ${coverage_cleaned} | |
COMMAND ${GENHTML_PATH} -o ${_outputname} ${coverage_cleaned} | |
COMMAND ${CMAKE_COMMAND} -E remove ${coverage_info} ${coverage_cleaned} | |
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} | |
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." | |
) | |
# Show info where to find the report | |
ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD | |
COMMAND ; | |
COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report." | |
) | |
ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE | |
# Param _targetname The name of new the custom make target | |
# Param _testrunner The name of the target which runs the tests | |
# Param _outputname cobertura output is generated as _outputname.xml | |
# Optional fourth parameter is passed as arguments to _testrunner | |
# Pass them in list form, e.g.: "-j;2" for -j 2 | |
FUNCTION(SETUP_TARGET_FOR_COVERAGE_COBERTURA _targetname _testrunner _outputname) | |
IF(NOT PYTHON_EXECUTABLE) | |
MESSAGE(FATAL_ERROR "Python not found! Aborting...") | |
ENDIF() # NOT PYTHON_EXECUTABLE | |
IF(NOT GCOVR_PATH) | |
MESSAGE(FATAL_ERROR "gcovr not found! Aborting...") | |
ENDIF() # NOT GCOVR_PATH | |
ADD_CUSTOM_TARGET(${_targetname} | |
# Run tests | |
${_testrunner} ${ARGV3} | |
# Running gcovr | |
COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} -e '${CMAKE_SOURCE_DIR}/tests/' -o ${_outputname}.xml | |
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} | |
COMMENT "Running gcovr to produce Cobertura code coverage report." | |
) | |
# Show info where to find the report | |
ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD | |
COMMAND ; | |
COMMENT "Cobertura code coverage report saved in ${_outputname}.xml." | |
) | |
ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE_COBERTURA |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) 2012 - 2017, Lars Bilke | |
# All rights reserved. | |
# | |
# Redistribution and use in source and binary forms, with or without modification, | |
# are permitted provided that the following conditions are met: | |
# | |
# 1. Redistributions of source code must retain the above copyright notice, this | |
# list of conditions and the following disclaimer. | |
# | |
# 2. Redistributions in binary form must reproduce the above copyright notice, | |
# this list of conditions and the following disclaimer in the documentation | |
# and/or other materials provided with the distribution. | |
# | |
# 3. Neither the name of the copyright holder nor the names of its contributors | |
# may be used to endorse or promote products derived from this software without | |
# specific prior written permission. | |
# | |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
# | |
# CHANGES: | |
# | |
# 2012-01-31, Lars Bilke | |
# - Enable Code Coverage | |
# | |
# 2013-09-17, Joakim Söderberg | |
# - Added support for Clang. | |
# - Some additional usage instructions. | |
# | |
# 2016-02-03, Lars Bilke | |
# - Refactored functions to use named parameters | |
# | |
# 2017-06-02, Lars Bilke | |
# - Merged with modified version from github.com/ufz/ogs | |
# | |
# | |
# USAGE: | |
# | |
# 1. Copy this file into your cmake modules path. | |
# | |
# 2. Add the following line to your CMakeLists.txt: | |
# include(CodeCoverage) | |
# | |
# 3. Append necessary compiler flags: | |
# APPEND_COVERAGE_COMPILER_FLAGS() | |
# | |
# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og | |
# | |
# 4. If you need to exclude additional directories from the report, specify them | |
# using the COVERAGE_LCOV_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE_LCOV. | |
# Example: | |
# set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*') | |
# | |
# 5. Use the functions described below to create a custom make target which | |
# runs your test executable and produces a code coverage report. | |
# | |
# 6. Build a Debug build: | |
# cmake -DCMAKE_BUILD_TYPE=Debug .. | |
# make | |
# make my_coverage_target | |
# | |
include(CMakeParseArguments) | |
# Check prereqs | |
find_program( GCOV_PATH gcov ) | |
find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl) | |
find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat ) | |
find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test) | |
find_package(Python COMPONENTS Interpreter) | |
if(NOT GCOV_PATH) | |
message(FATAL_ERROR "gcov not found! Aborting...") | |
endif() # NOT GCOV_PATH | |
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") | |
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3) | |
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") | |
endif() | |
elseif(NOT CMAKE_COMPILER_IS_GNUCXX) | |
message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...") | |
endif() | |
set(COVERAGE_COMPILER_FLAGS "-g --coverage -fprofile-arcs -ftest-coverage" | |
CACHE INTERNAL "") | |
set(CMAKE_CXX_FLAGS_COVERAGE | |
${COVERAGE_COMPILER_FLAGS} | |
CACHE STRING "Flags used by the C++ compiler during coverage builds." | |
FORCE ) | |
set(CMAKE_C_FLAGS_COVERAGE | |
${COVERAGE_COMPILER_FLAGS} | |
CACHE STRING "Flags used by the C compiler during coverage builds." | |
FORCE ) | |
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE | |
"" | |
CACHE STRING "Flags used for linking binaries during coverage builds." | |
FORCE ) | |
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE | |
"" | |
CACHE STRING "Flags used by the shared libraries linker during coverage builds." | |
FORCE ) | |
mark_as_advanced( | |
CMAKE_CXX_FLAGS_COVERAGE | |
CMAKE_C_FLAGS_COVERAGE | |
CMAKE_EXE_LINKER_FLAGS_COVERAGE | |
CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) | |
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") | |
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") | |
endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" | |
if(CMAKE_C_COMPILER_ID STREQUAL "GNU") | |
link_libraries(gcov) | |
else() | |
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") | |
endif() | |
# Defines a target for running and collection code coverage information | |
# Builds dependencies, runs the given executable and outputs reports. | |
# NOTE! The executable should always have a ZERO as exit code otherwise | |
# the coverage generation will not complete. | |
# | |
# SETUP_TARGET_FOR_COVERAGE_LCOV( | |
# NAME testrunner_coverage # New target name | |
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR | |
# DEPENDENCIES testrunner # Dependencies to build first | |
# ) | |
function(SETUP_TARGET_FOR_COVERAGE_LCOV) | |
set(options NONE) | |
set(oneValueArgs NAME) | |
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS) | |
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
if(NOT LCOV_PATH) | |
message(FATAL_ERROR "lcov not found! Aborting...") | |
endif() # NOT LCOV_PATH | |
if(NOT GENHTML_PATH) | |
message(FATAL_ERROR "genhtml not found! Aborting...") | |
endif() # NOT GENHTML_PATH | |
# Setup target | |
add_custom_target(${Coverage_NAME} | |
# Cleanup lcov | |
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -directory . --zerocounters | |
# Create baseline to make sure untouched files show up in the report | |
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base | |
# Run tests | |
COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} | |
# Capturing lcov counters and generating report | |
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info | |
# add baseline counters | |
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file ${Coverage_NAME}.total | |
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned | |
COMMAND ${GENHTML_PATH} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned | |
COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned | |
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} | |
DEPENDS ${Coverage_DEPENDENCIES} | |
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." | |
) | |
# Show where to find the lcov info report | |
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD | |
COMMAND ; | |
COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info." | |
) | |
# Show info where to find the report | |
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD | |
COMMAND ; | |
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." | |
) | |
endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV | |
# Defines a target for running and collection code coverage information | |
# Builds dependencies, runs the given executable and outputs reports. | |
# NOTE! The executable should always have a ZERO as exit code otherwise | |
# the coverage generation will not complete. | |
# | |
# SETUP_TARGET_FOR_COVERAGE_GCOVR_XML( | |
# NAME ctest_coverage # New target name | |
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR | |
# DEPENDENCIES executable_target # Dependencies to build first | |
# ) | |
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML) | |
set(options NONE) | |
set(oneValueArgs NAME) | |
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) | |
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
if(NOT Python_FOUND) | |
message(FATAL_ERROR "python not found! Aborting...") | |
endif() | |
if(NOT GCOVR_PATH) | |
message(FATAL_ERROR "gcovr not found! Aborting...") | |
endif() # NOT GCOVR_PATH | |
# Combine excludes to several -e arguments | |
set(GCOVR_EXCLUDES "") | |
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES}) | |
string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE}) | |
list(APPEND GCOVR_EXCLUDES "-e") | |
list(APPEND GCOVR_EXCLUDES "${EXCLUDE_REPLACED}") | |
endforeach() | |
add_custom_target(${Coverage_NAME} | |
# Run tests | |
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} | |
# Running gcovr | |
COMMAND ${GCOVR_PATH} --xml | |
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES} | |
--object-directory=${PROJECT_BINARY_DIR} | |
-o ${Coverage_NAME}.xml | |
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} | |
DEPENDS ${Coverage_DEPENDENCIES} | |
COMMENT "Running gcovr to produce Cobertura code coverage report." | |
) | |
# Show info where to find the report | |
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD | |
COMMAND ; | |
COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml." | |
) | |
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML | |
# Defines a target for running and collection code coverage information | |
# Builds dependencies, runs the given executable and outputs reports. | |
# NOTE! The executable should always have a ZERO as exit code otherwise | |
# the coverage generation will not complete. | |
# | |
# SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML( | |
# NAME ctest_coverage # New target name | |
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR | |
# DEPENDENCIES executable_target # Dependencies to build first | |
# ) | |
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML) | |
set(options NONE) | |
set(oneValueArgs NAME) | |
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) | |
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
if(NOT Python_FOUND) | |
message(FATAL_ERROR "python not found! Aborting...") | |
endif() | |
if(NOT GCOVR_PATH) | |
message(FATAL_ERROR "gcovr not found! Aborting...") | |
endif() # NOT GCOVR_PATH | |
# Combine excludes to several -e arguments | |
set(GCOVR_EXCLUDES "") | |
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES}) | |
string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE}) | |
list(APPEND GCOVR_EXCLUDES "-e") | |
list(APPEND GCOVR_EXCLUDES "${EXCLUDE_REPLACED}") | |
endforeach() | |
add_custom_target(${Coverage_NAME} | |
# Run tests | |
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} | |
# Create folder | |
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME} | |
# Running gcovr | |
COMMAND ${Python_EXECUTABLE} ${GCOVR_PATH} --html --html-details | |
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES} | |
--object-directory=${PROJECT_BINARY_DIR} | |
-o ${Coverage_NAME}/index.html | |
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} | |
DEPENDS ${Coverage_DEPENDENCIES} | |
COMMENT "Running gcovr to produce HTML code coverage report." | |
) | |
# Show info where to find the report | |
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD | |
COMMAND ; | |
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." | |
) | |
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML | |
function(APPEND_COVERAGE_COMPILER_FLAGS) | |
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) | |
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") | |
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# - Run cppcheck on c++ source files as a custom target and a test | |
# | |
# include(CppcheckTargets) | |
# add_cppcheck(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FAIL_ON_WARNINGS]) - | |
# Create a target to check a target's sources with cppcheck and the indicated options | |
# add_cppcheck_sources(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FAIL_ON_WARNINGS]) - | |
# Create a target to check standalone sources with cppcheck and the indicated options | |
# | |
# Requires these CMake modules: | |
# Findcppcheck | |
# | |
# Requires CMake 2.6 or newer (uses the 'function' command) | |
# | |
# Original Author: | |
# 2009-2010 Ryan Pavlik <[email protected]> <[email protected]> | |
# http://academic.cleardefinition.com | |
# Iowa State University HCI Graduate Program/VRAC | |
# | |
# Copyright Iowa State University 2009-2010. | |
# Distributed under the Boost Software License, Version 1.0. | |
# (See accompanying file LICENSE_1_0.txt or copy at | |
# http://www.boost.org/LICENSE_1_0.txt) | |
if(__add_cppcheck) | |
return() | |
endif() | |
set(__add_cppcheck YES) | |
if(NOT CPPCHECK_FOUND) | |
find_package(cppcheck QUIET) | |
endif() | |
if(CPPCHECK_FOUND) | |
if(NOT TARGET all_cppcheck) | |
add_custom_target(all_cppcheck) | |
set_target_properties(all_cppcheck PROPERTIES EXCLUDE_FROM_ALL TRUE) | |
endif() | |
endif() | |
function(add_cppcheck_sources _targetname) | |
if(CPPCHECK_FOUND) | |
set(_cppcheck_args) | |
set(_input ${ARGN}) | |
list(FIND _input UNUSED_FUNCTIONS _unused_func) | |
if("${_unused_func}" GREATER "-1") | |
list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG}) | |
list(REMOVE_AT _input ${_unused_func}) | |
endif() | |
list(FIND _input STYLE _style) | |
if("${_style}" GREATER "-1") | |
list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG}) | |
list(REMOVE_AT _input ${_style}) | |
endif() | |
list(FIND _input POSSIBLE_ERROR _poss_err) | |
if("${_poss_err}" GREATER "-1") | |
list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG}) | |
list(REMOVE_AT _input ${_poss_err}) | |
endif() | |
list(FIND _input FAIL_ON_WARNINGS _fail_on_warn) | |
if("${_fail_on_warn}" GREATER "-1") | |
list(APPEND | |
CPPCHECK_FAIL_REGULAR_EXPRESSION | |
${CPPCHECK_WARN_REGULAR_EXPRESSION}) | |
list(REMOVE_AT _input ${_fail_on_warn}) | |
endif() | |
set(_files) | |
foreach(_source ${_input}) | |
get_source_file_property(_cppcheck_loc "${_source}" LOCATION) | |
if(_cppcheck_loc) | |
# This file has a source file property, carry on. | |
get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE) | |
if("${_cppcheck_lang}" MATCHES "CXX") | |
list(APPEND _files "${_cppcheck_loc}") | |
endif() | |
else() | |
# This file doesn't have source file properties - figure it out. | |
get_filename_component(_cppcheck_loc "${_source}" ABSOLUTE) | |
if(EXISTS "${_cppcheck_loc}") | |
list(APPEND _files "${_cppcheck_loc}") | |
else() | |
message(FATAL_ERROR | |
"Adding CPPCHECK for file target ${_targetname}: " | |
"File ${_source} does not exist or needs a corrected path location " | |
"since we think its absolute path is ${_cppcheck_loc}") | |
endif() | |
endif() | |
endforeach() | |
if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0") | |
# Older than CMake 2.8.0 | |
add_test(${_targetname}_cppcheck_test | |
"${CPPCHECK_EXECUTABLE}" | |
${CPPCHECK_TEMPLATE_ARG} | |
${_cppcheck_args} | |
${_files}) | |
else() | |
# CMake 2.8.0 and newer | |
add_test(NAME | |
${_targetname}_cppcheck_test | |
COMMAND | |
"${CPPCHECK_EXECUTABLE}" | |
${CPPCHECK_TEMPLATE_ARG} | |
${_cppcheck_args} | |
${_files}) | |
endif() | |
set_tests_properties(${_targetname}_cppcheck_test | |
PROPERTIES | |
FAIL_REGULAR_EXPRESSION | |
"${CPPCHECK_FAIL_REGULAR_EXPRESSION}") | |
add_custom_command(TARGET | |
all_cppcheck | |
PRE_BUILD | |
COMMAND | |
${CPPCHECK_EXECUTABLE} | |
${CPPCHECK_QUIET_ARG} | |
${CPPCHECK_TEMPLATE_ARG} | |
${_cppcheck_args} | |
${_files} | |
WORKING_DIRECTORY | |
"${CMAKE_CURRENT_SOURCE_DIR}" | |
COMMENT | |
"${_targetname}_cppcheck: Running cppcheck on target ${_targetname}..." | |
VERBATIM) | |
endif() | |
endfunction() | |
function(add_cppcheck _name) | |
if(NOT TARGET ${_name}) | |
message(FATAL_ERROR | |
"add_cppcheck given a target name that does not exist: '${_name}' !") | |
endif() | |
if(CPPCHECK_FOUND) | |
set(_cppcheck_args) | |
list(FIND ARGN UNUSED_FUNCTIONS _unused_func) | |
if("${_unused_func}" GREATER "-1") | |
list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG}) | |
endif() | |
list(FIND ARGN STYLE _style) | |
if("${_style}" GREATER "-1") | |
list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG}) | |
endif() | |
list(FIND ARGN POSSIBLE_ERROR _poss_err) | |
if("${_poss_err}" GREATER "-1") | |
list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG}) | |
endif() | |
list(FIND _input FAIL_ON_WARNINGS _fail_on_warn) | |
if("${_fail_on_warn}" GREATER "-1") | |
list(APPEND | |
CPPCHECK_FAIL_REGULAR_EXPRESSION | |
${CPPCHECK_WARN_REGULAR_EXPRESSION}) | |
list(REMOVE_AT _input ${_unused_func}) | |
endif() | |
get_target_property(_cppcheck_sources "${_name}" SOURCES) | |
set(_files) | |
foreach(_source ${_cppcheck_sources}) | |
get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE) | |
get_source_file_property(_cppcheck_loc "${_source}" LOCATION) | |
if("${_cppcheck_lang}" MATCHES "CXX") | |
list(APPEND _files "${_cppcheck_loc}") | |
endif() | |
endforeach() | |
if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0") | |
# Older than CMake 2.8.0 | |
add_test(${_name}_cppcheck_test | |
"${CPPCHECK_EXECUTABLE}" | |
${CPPCHECK_TEMPLATE_ARG} | |
${_cppcheck_args} | |
${_files}) | |
else() | |
# CMake 2.8.0 and newer | |
add_test(NAME | |
${_name}_cppcheck_test | |
COMMAND | |
"${CPPCHECK_EXECUTABLE}" | |
${CPPCHECK_TEMPLATE_ARG} | |
${_cppcheck_args} | |
${_files}) | |
endif() | |
set_tests_properties(${_name}_cppcheck_test | |
PROPERTIES | |
FAIL_REGULAR_EXPRESSION | |
"${CPPCHECK_FAIL_REGULAR_EXPRESSION}") | |
add_custom_command(TARGET | |
all_cppcheck | |
PRE_BUILD | |
COMMAND | |
${CPPCHECK_EXECUTABLE} | |
${CPPCHECK_QUIET_ARG} | |
${CPPCHECK_TEMPLATE_ARG} | |
${_cppcheck_args} | |
${_files} | |
WORKING_DIRECTORY | |
"${CMAKE_CURRENT_SOURCE_DIR}" | |
COMMENT | |
"${_name}_cppcheck: Running cppcheck on target ${_name}..." | |
VERBATIM) | |
endif() | |
endfunction() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
# file Copyright.txt or https://cmake.org/licensing for details. | |
#[=======================================================================[.rst: | |
CTestCoverageCollectGCOV | |
------------------------ | |
This module provides the ``ctest_coverage_collect_gcov`` function. | |
This function runs gcov on all .gcda files found in the binary tree | |
and packages the resulting .gcov files into a tar file. | |
This tarball also contains the following: | |
* *data.json* defines the source and build directories for use by CDash. | |
* *Labels.json* indicates any :prop_sf:`LABELS` that have been set on the | |
source files. | |
* The *uncovered* directory holds any uncovered files found by | |
:variable:`CTEST_EXTRA_COVERAGE_GLOB`. | |
After generating this tar file, it can be sent to CDash for display with the | |
:command:`ctest_submit(CDASH_UPLOAD)` command. | |
.. command:: cdash_coverage_collect_gcov | |
:: | |
ctest_coverage_collect_gcov(TARBALL <tarfile> | |
[SOURCE <source_dir>][BUILD <build_dir>] | |
[GCOV_COMMAND <gcov_command>] | |
[GCOV_OPTIONS <options>...] | |
) | |
Run gcov and package a tar file for CDash. The options are: | |
``TARBALL <tarfile>`` | |
Specify the location of the ``.tar`` file to be created for later | |
upload to CDash. Relative paths will be interpreted with respect | |
to the top-level build directory. | |
``SOURCE <source_dir>`` | |
Specify the top-level source directory for the build. | |
Default is the value of :variable:`CTEST_SOURCE_DIRECTORY`. | |
``BUILD <build_dir>`` | |
Specify the top-level build directory for the build. | |
Default is the value of :variable:`CTEST_BINARY_DIRECTORY`. | |
``GCOV_COMMAND <gcov_command>`` | |
Specify the full path to the ``gcov`` command on the machine. | |
Default is the value of :variable:`CTEST_COVERAGE_COMMAND`. | |
``GCOV_OPTIONS <options>...`` | |
Specify options to be passed to gcov. The ``gcov`` command | |
is run as ``gcov <options>... -o <gcov-dir> <file>.gcda``. | |
If not specified, the default option is just ``-b -x``. | |
``GLOB`` | |
Recursively search for .gcda files in build_dir rather than | |
determining search locations by reading TargetDirectories.txt. | |
``DELETE`` | |
Delete coverage files after they've been packaged into the .tar. | |
``QUIET`` | |
Suppress non-error messages that otherwise would have been | |
printed out by this function. | |
#]=======================================================================] | |
function(ctest_coverage_collect_gcov) | |
set(options QUIET GLOB DELETE) | |
set(oneValueArgs TARBALL SOURCE BUILD GCOV_COMMAND) | |
set(multiValueArgs GCOV_OPTIONS) | |
cmake_parse_arguments(GCOV "${options}" "${oneValueArgs}" | |
"${multiValueArgs}" "" ${ARGN} ) | |
if(NOT DEFINED GCOV_TARBALL) | |
message(FATAL_ERROR | |
"TARBALL must be specified. for ctest_coverage_collect_gcov") | |
endif() | |
if(NOT DEFINED GCOV_SOURCE) | |
set(source_dir "${CTEST_SOURCE_DIRECTORY}") | |
else() | |
set(source_dir "${GCOV_SOURCE}") | |
endif() | |
if(NOT DEFINED GCOV_BUILD) | |
set(binary_dir "${CTEST_BINARY_DIRECTORY}") | |
else() | |
set(binary_dir "${GCOV_BUILD}") | |
endif() | |
if(NOT DEFINED GCOV_GCOV_COMMAND) | |
set(gcov_command "${CTEST_COVERAGE_COMMAND}") | |
else() | |
set(gcov_command "${GCOV_GCOV_COMMAND}") | |
endif() | |
# run gcov on each gcda file in the binary tree | |
set(gcda_files) | |
set(label_files) | |
if (GCOV_GLOB) | |
file(GLOB_RECURSE gfiles "${binary_dir}/*.gcda") | |
list(LENGTH gfiles len) | |
# if we have gcda files then also grab the labels file for that target | |
if(${len} GREATER 0) | |
file(GLOB_RECURSE lfiles RELATIVE ${binary_dir} "${binary_dir}/Labels.json") | |
list(APPEND gcda_files ${gfiles}) | |
list(APPEND label_files ${lfiles}) | |
endif() | |
else() | |
# look for gcda files in the target directories | |
# this will be faster and only look where the files will be | |
file(STRINGS "${binary_dir}/CMakeFiles/TargetDirectories.txt" target_dirs | |
ENCODING UTF-8) | |
foreach(target_dir ${target_dirs}) | |
file(GLOB_RECURSE gfiles "${target_dir}/*.gcda") | |
list(LENGTH gfiles len) | |
# if we have gcda files then also grab the labels file for that target | |
if(${len} GREATER 0) | |
file(GLOB_RECURSE lfiles RELATIVE ${binary_dir} | |
"${target_dir}/Labels.json") | |
list(APPEND gcda_files ${gfiles}) | |
list(APPEND label_files ${lfiles}) | |
endif() | |
endforeach() | |
endif() | |
# return early if no coverage files were found | |
list(LENGTH gcda_files len) | |
if(len EQUAL 0) | |
if (NOT GCOV_QUIET) | |
message("ctest_coverage_collect_gcov: No .gcda files found, " | |
"ignoring coverage request.") | |
endif() | |
return() | |
endif() | |
# setup the dir for the coverage files | |
set(coverage_dir "${binary_dir}/Testing/CoverageInfo") | |
file(MAKE_DIRECTORY "${coverage_dir}") | |
# run gcov, this will produce the .gcov files in the current | |
# working directory | |
if(NOT DEFINED GCOV_GCOV_OPTIONS) | |
set(GCOV_GCOV_OPTIONS -b -x) | |
endif() | |
execute_process(COMMAND | |
${gcov_command} ${GCOV_GCOV_OPTIONS} ${gcda_files} | |
OUTPUT_VARIABLE out | |
RESULT_VARIABLE res | |
WORKING_DIRECTORY ${coverage_dir}) | |
if (GCOV_DELETE) | |
file(REMOVE ${gcda_files}) | |
endif() | |
if(NOT "${res}" EQUAL 0) | |
if (NOT GCOV_QUIET) | |
message(STATUS "Error running gcov: ${res} ${out}") | |
endif() | |
endif() | |
# create json file with project information | |
file(WRITE ${coverage_dir}/data.json | |
"{ | |
\"Source\": \"${source_dir}\", | |
\"Binary\": \"${binary_dir}\" | |
}") | |
# collect the gcov files | |
set(unfiltered_gcov_files) | |
file(GLOB_RECURSE unfiltered_gcov_files RELATIVE ${binary_dir} "${coverage_dir}/*.gcov") | |
# if CTEST_EXTRA_COVERAGE_GLOB was specified we search for files | |
# that might be uncovered | |
if (DEFINED CTEST_EXTRA_COVERAGE_GLOB) | |
set(uncovered_files) | |
foreach(search_entry IN LISTS CTEST_EXTRA_COVERAGE_GLOB) | |
if(NOT GCOV_QUIET) | |
message("Add coverage glob: ${search_entry}") | |
endif() | |
file(GLOB_RECURSE matching_files "${source_dir}/${search_entry}") | |
if (matching_files) | |
list(APPEND uncovered_files "${matching_files}") | |
endif() | |
endforeach() | |
endif() | |
set(gcov_files) | |
foreach(gcov_file ${unfiltered_gcov_files}) | |
file(STRINGS ${binary_dir}/${gcov_file} first_line LIMIT_COUNT 1 ENCODING UTF-8) | |
set(is_excluded false) | |
if(first_line MATCHES "^ -: 0:Source:(.*)$") | |
set(source_file ${CMAKE_MATCH_1}) | |
elseif(NOT GCOV_QUIET) | |
message(STATUS "Could not determine source file corresponding to: ${gcov_file}") | |
endif() | |
foreach(exclude_entry IN LISTS CTEST_CUSTOM_COVERAGE_EXCLUDE) | |
if(source_file MATCHES "${exclude_entry}") | |
set(is_excluded true) | |
if(NOT GCOV_QUIET) | |
message("Excluding coverage for: ${source_file} which matches ${exclude_entry}") | |
endif() | |
break() | |
endif() | |
endforeach() | |
get_filename_component(resolved_source_file "${source_file}" ABSOLUTE) | |
foreach(uncovered_file IN LISTS uncovered_files) | |
get_filename_component(resolved_uncovered_file "${uncovered_file}" ABSOLUTE) | |
if (resolved_uncovered_file STREQUAL resolved_source_file) | |
list(REMOVE_ITEM uncovered_files "${uncovered_file}") | |
endif() | |
endforeach() | |
if(NOT is_excluded) | |
list(APPEND gcov_files ${gcov_file}) | |
endif() | |
endforeach() | |
foreach (uncovered_file ${uncovered_files}) | |
# Check if this uncovered file should be excluded. | |
set(is_excluded false) | |
foreach(exclude_entry IN LISTS CTEST_CUSTOM_COVERAGE_EXCLUDE) | |
if(uncovered_file MATCHES "${exclude_entry}") | |
set(is_excluded true) | |
if(NOT GCOV_QUIET) | |
message("Excluding coverage for: ${uncovered_file} which matches ${exclude_entry}") | |
endif() | |
break() | |
endif() | |
endforeach() | |
if(is_excluded) | |
continue() | |
endif() | |
# Copy from source to binary dir, preserving any intermediate subdirectories. | |
get_filename_component(filename "${uncovered_file}" NAME) | |
get_filename_component(relative_path "${uncovered_file}" DIRECTORY) | |
string(REPLACE "${source_dir}" "" relative_path "${relative_path}") | |
if (relative_path) | |
# Strip leading slash. | |
string(SUBSTRING "${relative_path}" 1 -1 relative_path) | |
endif() | |
file(COPY ${uncovered_file} DESTINATION ${binary_dir}/uncovered/${relative_path}) | |
if(relative_path) | |
list(APPEND uncovered_files_for_tar uncovered/${relative_path}/${filename}) | |
else() | |
list(APPEND uncovered_files_for_tar uncovered/${filename}) | |
endif() | |
endforeach() | |
# tar up the coverage info with the same date so that the md5 | |
# sum will be the same for the tar file independent of file time | |
# stamps | |
string(REPLACE ";" "\n" gcov_files "${gcov_files}") | |
string(REPLACE ";" "\n" label_files "${label_files}") | |
string(REPLACE ";" "\n" uncovered_files_for_tar "${uncovered_files_for_tar}") | |
file(WRITE "${coverage_dir}/coverage_file_list.txt" | |
"${gcov_files} | |
${coverage_dir}/data.json | |
${label_files} | |
${uncovered_files_for_tar} | |
") | |
if (GCOV_QUIET) | |
set(tar_opts "cfj") | |
else() | |
set(tar_opts "cvfj") | |
endif() | |
execute_process(COMMAND | |
${CMAKE_COMMAND} -E tar ${tar_opts} ${GCOV_TARBALL} | |
"--mtime=1970-01-01 0:0:0 UTC" | |
"--format=gnutar" | |
--files-from=${coverage_dir}/coverage_file_list.txt | |
WORKING_DIRECTORY ${binary_dir}) | |
if (GCOV_DELETE) | |
foreach(gcov_file ${unfiltered_gcov_files}) | |
file(REMOVE ${binary_dir}/${gcov_file}) | |
endforeach() | |
file(REMOVE ${coverage_dir}/coverage_file_list.txt) | |
file(REMOVE ${coverage_dir}/data.json) | |
if (EXISTS ${binary_dir}/uncovered) | |
file(REMOVE ${binary_dir}/uncovered) | |
endif() | |
endif() | |
endfunction() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Distributed under the OSI-approved MIT License. See accompanying | |
# file LICENSE or https://github.com/Crascit/DownloadProject for details. | |
# | |
# MODULE: DownloadProject | |
# | |
# PROVIDES: | |
# download_project( PROJ projectName | |
# [PREFIX prefixDir] | |
# [DOWNLOAD_DIR downloadDir] | |
# [SOURCE_DIR srcDir] | |
# [BINARY_DIR binDir] | |
# [QUIET] | |
# ... | |
# ) | |
# | |
# Provides the ability to download and unpack a tarball, zip file, git repository, | |
# etc. at configure time (i.e. when the cmake command is run). How the downloaded | |
# and unpacked contents are used is up to the caller, but the motivating case is | |
# to download source code which can then be included directly in the build with | |
# add_subdirectory() after the call to download_project(). Source and build | |
# directories are set up with this in mind. | |
# | |
# The PROJ argument is required. The projectName value will be used to construct | |
# the following variables upon exit (obviously replace projectName with its actual | |
# value): | |
# | |
# projectName_SOURCE_DIR | |
# projectName_BINARY_DIR | |
# | |
# The SOURCE_DIR and BINARY_DIR arguments are optional and would not typically | |
# need to be provided. They can be specified if you want the downloaded source | |
# and build directories to be located in a specific place. The contents of | |
# projectName_SOURCE_DIR and projectName_BINARY_DIR will be populated with the | |
# locations used whether you provide SOURCE_DIR/BINARY_DIR or not. | |
# | |
# The DOWNLOAD_DIR argument does not normally need to be set. It controls the | |
# location of the temporary CMake build used to perform the download. | |
# | |
# The PREFIX argument can be provided to change the base location of the default | |
# values of DOWNLOAD_DIR, SOURCE_DIR and BINARY_DIR. If all of those three arguments | |
# are provided, then PREFIX will have no effect. The default value for PREFIX is | |
# CMAKE_BINARY_DIR. | |
# | |
# The QUIET option can be given if you do not want to show the output associated | |
# with downloading the specified project. | |
# | |
# In addition to the above, any other options are passed through unmodified to | |
# ExternalProject_Add() to perform the actual download, patch and update steps. | |
# The following ExternalProject_Add() options are explicitly prohibited (they | |
# are reserved for use by the download_project() command): | |
# | |
# CONFIGURE_COMMAND | |
# BUILD_COMMAND | |
# INSTALL_COMMAND | |
# TEST_COMMAND | |
# | |
# Only those ExternalProject_Add() arguments which relate to downloading, patching | |
# and updating of the project sources are intended to be used. Also note that at | |
# least one set of download-related arguments are required. | |
# | |
# If using CMake 3.2 or later, the UPDATE_DISCONNECTED option can be used to | |
# prevent a check at the remote end for changes every time CMake is run | |
# after the first successful download. See the documentation of the ExternalProject | |
# module for more information. It is likely you will want to use this option if it | |
# is available to you. Note, however, that the ExternalProject implementation contains | |
# bugs which result in incorrect handling of the UPDATE_DISCONNECTED option when | |
# using the URL download method or when specifying a SOURCE_DIR with no download | |
# method. Fixes for these have been created, the last of which is scheduled for | |
# inclusion in CMake 3.8.0. Details can be found here: | |
# | |
# https://gitlab.kitware.com/cmake/cmake/commit/bdca68388bd57f8302d3c1d83d691034b7ffa70c | |
# https://gitlab.kitware.com/cmake/cmake/issues/16428 | |
# | |
# If you experience build errors related to the update step, consider avoiding | |
# the use of UPDATE_DISCONNECTED. | |
# | |
# EXAMPLE USAGE: | |
# | |
# include(DownloadProject) | |
# download_project(PROJ googletest | |
# GIT_REPOSITORY https://github.com/google/googletest.git | |
# GIT_TAG master | |
# UPDATE_DISCONNECTED 1 | |
# QUIET | |
# ) | |
# | |
# add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) | |
# | |
#======================================================================================== | |
set(_DownloadProjectDir "${CMAKE_CURRENT_LIST_DIR}") | |
include(CMakeParseArguments) | |
function(download_project) | |
set(options QUIET) | |
set(oneValueArgs | |
PROJ | |
PREFIX | |
DOWNLOAD_DIR | |
SOURCE_DIR | |
BINARY_DIR | |
# Prevent the following from being passed through | |
CONFIGURE_COMMAND | |
BUILD_COMMAND | |
INSTALL_COMMAND | |
TEST_COMMAND | |
) | |
set(multiValueArgs "") | |
cmake_parse_arguments(DL_ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
# Hide output if requested | |
if (DL_ARGS_QUIET) | |
set(OUTPUT_QUIET "OUTPUT_QUIET") | |
else() | |
unset(OUTPUT_QUIET) | |
message(STATUS "Downloading/updating ${DL_ARGS_PROJ}") | |
endif() | |
# Set up where we will put our temporary CMakeLists.txt file and also | |
# the base point below which the default source and binary dirs will be | |
if (NOT DL_ARGS_PREFIX) | |
set(DL_ARGS_PREFIX "${CMAKE_BINARY_DIR}") | |
endif() | |
if (NOT DL_ARGS_DOWNLOAD_DIR) | |
set(DL_ARGS_DOWNLOAD_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-download") | |
endif() | |
# Ensure the caller can know where to find the source and build directories | |
if (NOT DL_ARGS_SOURCE_DIR) | |
set(DL_ARGS_SOURCE_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-src") | |
endif() | |
if (NOT DL_ARGS_BINARY_DIR) | |
set(DL_ARGS_BINARY_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-build") | |
endif() | |
set(${DL_ARGS_PROJ}_SOURCE_DIR "${DL_ARGS_SOURCE_DIR}" PARENT_SCOPE) | |
set(${DL_ARGS_PROJ}_BINARY_DIR "${DL_ARGS_BINARY_DIR}" PARENT_SCOPE) | |
# Create and build a separate CMake project to carry out the download. | |
# If we've already previously done these steps, they will not cause | |
# anything to be updated, so extra rebuilds of the project won't occur. | |
configure_file("${_DownloadProjectDir}/DownloadProject.CMakeLists.cmake.in" | |
"${DL_ARGS_DOWNLOAD_DIR}/CMakeLists.txt") | |
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . | |
RESULT_VARIABLE result | |
${OUTPUT_QUIET} | |
WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}" | |
) | |
if(result) | |
message(FATAL_ERROR "CMake step for ${DL_ARGS_PROJ} failed: ${result}") | |
endif() | |
execute_process(COMMAND ${CMAKE_COMMAND} --build . | |
RESULT_VARIABLE result | |
${OUTPUT_QUIET} | |
WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}" | |
) | |
if(result) | |
message(FATAL_ERROR "Build step for ${DL_ARGS_PROJ} failed: ${result}") | |
endif() | |
endfunction() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cmake_minimum_required(VERSION 2.8.2) | |
project(${DL_ARGS_PROJ}-download NONE) | |
include(ExternalProject) | |
ExternalProject_Add(${DL_ARGS_PROJ}-download | |
${DL_ARGS_UNPARSED_ARGUMENTS} | |
SOURCE_DIR "${DL_ARGS_SOURCE_DIR}" | |
BINARY_DIR "${DL_ARGS_BINARY_DIR}" | |
CONFIGURE_COMMAND "" | |
BUILD_COMMAND "" | |
INSTALL_COMMAND "" | |
TEST_COMMAND "" | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#.rst | |
# FindLibUSB | |
# ------------ | |
# | |
# Created by Walter Gray. | |
# Locate and configure LibUSB | |
# | |
# Interface Targets | |
# ^^^^^^^^^^^^^^^^^ | |
# LibUSB::LibUSB | |
# | |
# Variables | |
# ^^^^^^^^^ | |
# LibUSB_ROOT_DIR | |
# LibUSB_FOUND | |
# LibUSB_INCLUDE_DIR | |
# LibUSB_LIBRARY | |
find_path(LibUSB_ROOT_DIR | |
NAMES include/libusb/libusb.h | |
PATH_SUFFIXES libusb | |
) | |
set(LibUSB_INCLUDE_DIR ${LibUSB_ROOT_DIR}/include) | |
find_library(LibUSB_LIBRARY | |
NAMES usb usb-${LibUSB_FIND_VERSION} HINTS ${LibUSB_ROOT_DIR}/lib) | |
#This is a little bit of a hack - if this becomes a common use-case we may need | |
#to add the ability to specify destination file names to add_local_files | |
if(BUILD_LINUX AND NOT BUILD_ANDROID AND NOT LibUSB_LIBRARY_ORIGINAL) | |
set(LibUSB_LIBRARY_ORIGINAL ${LibUSB_LIBRARY} CACHE FILEPATH "") | |
mark_as_advanced(LibUSB_LIBRARY_ORIGINAL) | |
get_filename_component(_basename "${LibUSB_LIBRARY}" NAME_WE) | |
set(LibUSB_LIBRARY ${CMAKE_BINARY_DIR}/libusb-temp/${_basename}.0${CMAKE_SHARED_LIBRARY_SUFFIX}.0 CACHE FILEPATH "" FORCE) | |
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/libusb-temp) | |
configure_file(${LibUSB_LIBRARY_ORIGINAL} ${LibUSB_LIBRARY} COPYONLY) | |
endif() | |
include(FindPackageHandleStandardArgs) | |
find_package_handle_standard_args(LibUSB DEFAULT_MSG LibUSB_INCLUDE_DIR LibUSB_LIBRARY) | |
include(CreateImportTargetHelpers) | |
generate_import_target(LibUSB SHARED) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This useful script was taken from http://www.kitware.com/blog/home/post/390 and slightly modified. | |
function(echo_target_property tgt prop) | |
# message("echo_target_property -- tgt = ${tgt}, prop = ${prop}") | |
# v for value, d for defined, s for set | |
get_property(v TARGET ${tgt} PROPERTY ${prop}) | |
get_property(d TARGET ${tgt} PROPERTY ${prop} DEFINED) | |
get_property(s TARGET ${tgt} PROPERTY ${prop} SET) | |
# only produce output for values that are set | |
if(s) | |
message("tgt='${tgt}' prop='${prop}'") | |
message(" value='${v}'") | |
message(" defined='${d}'") | |
message(" set='${s}'") | |
message("") | |
endif() | |
endfunction() | |
function(echo_target tgt) | |
if(NOT TARGET ${tgt}) | |
message("There is no target named '${tgt}'") | |
return() | |
endif() | |
set(props | |
DEBUG_OUTPUT_NAME | |
DEBUG_POSTFIX | |
RELEASE_OUTPUT_NAME | |
RELEASE_POSTFIX | |
ARCHIVE_OUTPUT_DIRECTORY | |
ARCHIVE_OUTPUT_DIRECTORY_DEBUG | |
ARCHIVE_OUTPUT_DIRECTORY_RELEASE | |
ARCHIVE_OUTPUT_NAME | |
ARCHIVE_OUTPUT_NAME_DEBUG | |
ARCHIVE_OUTPUT_NAME_RELEASE | |
AUTOMOC | |
AUTOMOC_MOC_OPTIONS | |
BUILD_WITH_INSTALL_RPATH | |
BUNDLE | |
BUNDLE_EXTENSION | |
COMPILE_DEFINITIONS | |
COMPILE_DEFINITIONS_DEBUG | |
COMPILE_DEFINITIONS_RELEASE | |
COMPILE_FLAGS | |
COMPILE_OPTIONS | |
DEBUG_POSTFIX | |
RELEASE_POSTFIX | |
DEFINE_SYMBOL | |
ENABLE_EXPORTS | |
EXCLUDE_FROM_ALL | |
EchoString | |
FOLDER | |
FRAMEWORK | |
Fortran_FORMAT | |
Fortran_MODULE_DIRECTORY | |
GENERATOR_FILE_NAME | |
GNUtoMS | |
HAS_CXX | |
IMPLICIT_DEPENDS_INCLUDE_TRANSFORM | |
IMPORTED | |
IMPORTED_CONFIGURATIONS | |
IMPORTED_IMPLIB | |
IMPORTED_IMPLIB_DEBUG | |
IMPORTED_IMPLIB_RELEASE | |
IMPORTED_LINK_DEPENDENT_LIBRARIES | |
IMPORTED_LINK_DEPENDENT_LIBRARIES_DEBUG | |
IMPORTED_LINK_DEPENDENT_LIBRARIES_RELEASE | |
IMPORTED_LINK_INTERFACE_LANGUAGES | |
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG | |
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE | |
IMPORTED_LINK_INTERFACE_LIBRARIES | |
IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG | |
IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE | |
IMPORTED_LINK_INTERFACE_MULTIPLICITY | |
IMPORTED_LINK_INTERFACE_MULTIPLICITY_DEBUG | |
IMPORTED_LINK_INTERFACE_MULTIPLICITY_RELEASE | |
IMPORTED_LOCATION | |
IMPORTED_LOCATION_DEBUG | |
IMPORTED_LOCATION_RELEASE | |
IMPORTED_NO_SONAME | |
IMPORTED_NO_SONAME_DEBUG | |
IMPORTED_NO_SONAME_RELEASE | |
IMPORTED_SONAME | |
IMPORTED_SONAME_DEBUG | |
IMPORTED_SONAME_RELEASE | |
IMPORT_PREFIX | |
IMPORT_SUFFIX | |
INCLUDE_DIRECTORIES | |
INSTALL_NAME_DIR | |
INSTALL_RPATH | |
INSTALL_RPATH_USE_LINK_PATH | |
INTERFACE_COMPILE_DEFINITIONS | |
INTERFACE_COMPILE_OPTIONS | |
INTERFACE_INCLUDE_DIRECTORIES | |
INTERFACE_LINK_LIBRARIES | |
INTERPROCEDURAL_OPTIMIZATION | |
INTERPROCEDURAL_OPTIMIZATION_DEBUG | |
INTERPROCEDURAL_OPTIMIZATION_RELEASE | |
LABELS | |
LIBRARY_OUTPUT_DIRECTORY | |
LIBRARY_OUTPUT_DIRECTORY_DEBUG | |
LIBRARY_OUTPUT_DIRECTORY_RELEASE | |
LIBRARY_OUTPUT_NAME | |
LIBRARY_OUTPUT_NAME_DEBUG | |
LIBRARY_OUTPUT_NAME_RELEASE | |
LINKER_LANGUAGE | |
LINK_DEPENDS | |
LINK_FLAGS | |
LINK_FLAGS_DEBUG | |
LINK_FLAGS_RELEASE | |
LINK_INTERFACE_LIBRARIES | |
LINK_INTERFACE_LIBRARIES_DEBUG | |
LINK_INTERFACE_LIBRARIES_RELEASE | |
LINK_INTERFACE_MULTIPLICITY | |
LINK_INTERFACE_MULTIPLICITY_DEBUG | |
LINK_INTERFACE_MULTIPLICITY_RELEASE | |
LINK_LIBRARIES | |
LINK_SEARCH_END_STATIC | |
LINK_SEARCH_START_STATIC | |
# LOCATION | |
# LOCATION_DEBUG | |
# LOCATION_RELEASE | |
MACOSX_BUNDLE | |
MACOSX_BUNDLE_INFO_PLIST | |
MACOSX_FRAMEWORK_INFO_PLIST | |
MAP_IMPORTED_CONFIG_DEBUG | |
MAP_IMPORTED_CONFIG_RELEASE | |
OSX_ARCHITECTURES | |
OSX_ARCHITECTURES_DEBUG | |
OSX_ARCHITECTURES_RELEASE | |
OUTPUT_NAME | |
OUTPUT_NAME_DEBUG | |
OUTPUT_NAME_RELEASE | |
POST_INSTALL_SCRIPT | |
PREFIX | |
PRE_INSTALL_SCRIPT | |
PRIVATE_HEADER | |
PROJECT_LABEL | |
PUBLIC_HEADER | |
RESOURCE | |
RULE_LAUNCH_COMPILE | |
RULE_LAUNCH_CUSTOM | |
RULE_LAUNCH_LINK | |
RUNTIME_OUTPUT_DIRECTORY | |
RUNTIME_OUTPUT_DIRECTORY_DEBUG | |
RUNTIME_OUTPUT_DIRECTORY_RELEASE | |
RUNTIME_OUTPUT_NAME | |
RUNTIME_OUTPUT_NAME_DEBUG | |
RUNTIME_OUTPUT_NAME_RELEASE | |
SKIP_BUILD_RPATH | |
SOURCES | |
SOVERSION | |
STATIC_LIBRARY_FLAGS | |
STATIC_LIBRARY_FLAGS_DEBUG | |
STATIC_LIBRARY_FLAGS_RELEASE | |
SUFFIX | |
TYPE | |
VERSION | |
VS_DOTNET_REFERENCES | |
VS_GLOBAL_WHATEVER | |
VS_GLOBAL_KEYWORD | |
VS_GLOBAL_PROJECT_TYPES | |
VS_KEYWORD | |
VS_SCC_AUXPATH | |
VS_SCC_LOCALPATH | |
VS_SCC_PROJECTNAME | |
VS_SCC_PROVIDER | |
VS_WINRT_EXTENSIONS | |
VS_WINRT_REFERENCES | |
WIN32_EXECUTABLE | |
XCODE_ATTRIBUTE_WHATEVER | |
) | |
message("======================== ${tgt} ========================") | |
foreach(p ${props}) | |
echo_target_property("${tgt}" "${p}") | |
endforeach() | |
message("") | |
endfunction() | |
function(echo_targets) | |
set(tgts ${ARGV}) | |
foreach(t ${tgts}) | |
echo_target("${t}") | |
endforeach() | |
endfunction() | |
# set(targets | |
# CMakeLib | |
# cmake-gui | |
# MathFunctions | |
# Tutorial | |
# vtkCommonCore | |
# ) | |
# echo_targets(${targets}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#TODO | |
# find_program lcov, genhtml, (gcov) | |
#TODO | |
# add add_coverage_dependency(target) function | |
#TODO | |
# add target to clean generated files by coverage target | |
#TODO | |
# https://cmake.org/cmake/help/latest/manual/ctest.1.html#ctest-coverage-step | |
#string(JOIN " " COVERAGE_EXCLUDE "\"/usr/*\"" "\"*test*.cpp\"") #since CMake version 3.12 | |
#set(COVERAGE_EXCLUDE "\"/usr/*\" \"*test*.cpp\"") #the space is escaped (when is sh), I don't know why | |
# must be specified as a single string to not cause inserting of ';' between list elements | |
# quotes must be escaped to survive into lcov call by sh | |
option(COV_VERBOSE "Make coverage target output verbose" OFF) | |
if(COV_VERBOSE) | |
set(COV_QUIET_OPT "") | |
else() | |
set(COV_QUIET_OPT "--quiet") | |
endif() | |
# https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake | |
add_custom_target(coverage | |
# clean after previous coverage | |
COMMAND lcov --zerocounters --directory . ${COV_QUIET_OPT} | |
# Run tests | |
#COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS} | |
COMMAND ctest --output-on-failure | |
# Capturing lcov counters and generating report | |
#COMMAND ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --directory . --capture --output-file coverage.info | |
COMMAND lcov --capture --directory . --base-directory . --rc lcov_branch_coverage=1 --output-file coverage.info.total ${COV_QUIET_OPT} | |
#TODO add --quiet | |
#TODO add explicit --gcov-tool ${GCOV} | |
#TODO lcovrc config file instead of --rc | |
#--directory ${CMAKE_BINARY_DIR} / CURRENT | |
COMMAND lcov --remove coverage.info.total "\"/usr/*\"" "\"*test*.cpp\"" --rc lcov_branch_coverage=1 --output-file coverage.info ${COV_QUIET_OPT} #TODO ${COVERAGE_EXCLUDE} | |
#TODO COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned | |
#COMMAND ${GENHTML_PATH} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned | |
COMMAND genhtml --legend --branch-coverage --rc lcov_branch_coverage=1 coverage.info --output-directory coverage-html ${COV_QUIET_OPT} | |
#TODO --demangle-cpp <-- TODO find_program(c++filt) (required for this option) | |
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} | |
#DEPENDS ${Coverage_DEPENDENCIES} #TODO tests targets (for ctest) | |
COMMENT "Processing test coverage and generating report" | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment