这不能称为优雅的解决方案,但在我看来,它是更好,然后cmake回忆。 我试图创建的宏,其通过源文件的列表确定覆盖文物(*.gcno和*.gcda文件)的名称:
macro (determine_coverage_data Sources TestName Artifacts Suffix)
set (CoverageDirectory "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${TestName}.dir")
foreach (File ${Sources})
string (REGEX MATCH "^${CMAKE_CURRENT_SOURCE_DIR}*" Directory "${File}")
if (Directory STREQUAL CMAKE_CURRENT_SOURCE_DIR)
string (REGEX REPLACE "^${CMAKE_CURRENT_SOURCE_DIR}*" "${CoverageDirectory}" File "${File}")
else (Directory STREQUAL CMAKE_CURRENT_SOURCE_DIR)
string (REGEX REPLACE "/" ";" A "${CMAKE_CURRENT_SOURCE_DIR}")
string (REGEX REPLACE "/" ";" B "${File}")
list (LENGTH A DeepDirectory)
list (LENGTH B DeepFile)
set (File "${CoverageDirectory}")
set (I 1)
while (I LESS DeepDirectory)
list (GET A ${I} AI)
list (GET B ${I} BI)
if (AI STREQUAL BI)
math (EXPR I "${I} + 1")
else (AI STREQUAL BI)
math (EXPR DeepDiff "${DeepFile} - ${I} - 1")
while (DeepDiff GREATER 0)
set (File "${File}/__")
math (EXPR DeepDiff "${DeepDiff} - 1")
endwhile (DeepDiff GREATER 0)
while (I LESS DeepFile)
list (GET B ${I} BI)
set (File "${File}/${BI}")
math (EXPR I "${I} + 1")
endwhile (I LESS DeepFile)
endif (AI STREQUAL BI)
endwhile (I LESS DeepDirectory)
endif (Directory STREQUAL CMAKE_CURRENT_SOURCE_DIR)
set (${Artifacts} ${${Artifacts}} "${File}${Suffix}")
endforeach (File)
endmacro (determine_coverage_data)
所以,完整的解决方案是看起来像:
├── cmake
│ └── UseGCov.cmake
├── CMakeLists.txt
├── src
│ ├── logic.cpp
│ └── logic.h
└── test
├── CMakeLists.txt
└── logic_test.cpp
主要CMakeLists.txt文件是:
cmake_minimum_required (VERSION 2.8)
project (Logic)
set (Logic_SOURCES ${PROJECT_SOURCE_DIR}/src/logic.cpp)
# Include macro.
include ("${PROJECT_SOURCE_DIR}/cmake/UseGCov.cmake")
include_directories (${PROJECT_SOURCE_DIR}/src)
add_library (logic SHARED ${Logic_SOURCES})
add_subdirectory (test)
而且CMakeLists.txt的测试是:
find_package (GTest)
set (Test_SOURCES ${Logic_SOURCES} ${PROJECT_SOURCE_DIR}/test/logic_test.cpp)
set (TestName logic_test)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -march=native -mtune=native -fprofile-arcs -ftest-coverage")
set (CMAKE_EXE_LINKER_FLAGS "-fprofile-arcs -ftest-coverage")
# Call macro.
determine_coverage_data ("${Test_SOURCES}" "${TestName}" Test_GCNOS ".gcno")
determine_coverage_data ("${Test_SOURCES}" "${TestName}" Test_GCDAS ".gcda")
set (Coverage_REPORT ${PROJECT_BINARY_DIR}/coverage.info)
set (Coverage_DIR ${PROJECT_BINARY_DIR}/coverage)
add_custom_command (
OUTPUT ${Coverage_REPORT}
COMMAND lcov -q -c -f -b . -d ${PROJECT_BINARY_DIR}/test -o ${Coverage_REPORT}
COMMAND lcov -e ${Coverage_REPORT} '${PROJECT_SOURCE_DIR}/src/*' -o ${Coverage_REPORT}
COMMAND genhtml ${Coverage_REPORT} --legend --demangle-cpp -f -q -o ${Coverage_DIR}
DEPENDS logic_test
)
add_custom_target (coverage DEPENDS ${Coverage_REPORT})
set (Test_COVERAGE_DATA ${Coverage_REPORT} ${Coverage_DIR} ${Test_GCNOS} ${Test_GCDAS})
set_directory_properties (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${Test_COVERAGE_DATA}")
add_executable (${TestName} ${Test_SOURCES})
target_link_libraries (${TestName} gtest gtest_main gcov pthread)