将来使用する予定の汎用 C++、CMake、およびCatchプロジェクト テンプレートを作成しており、コード カバレッジ レポートを有効にしたいと考えています。そのために、次の CMake モジュールをモジュールのリストに追加することにしました: CodeCoverage.cmake。これに対する私の使用法は、基本的に次のスニペットに要約されます。
if (ENABLE_COVERAGE AND NOT CMAKE_CONFIGURATION_TYPES)
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Coverage in a non-debug build may lead to misleading results! Setting build type to 'Debug'!")
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "" FORCE)
endif (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
include(CodeCoverage)
APPEND_COVERAGE_COMPILER_FLAGS()
if (NOT BUILD_TESTS)
message(STATUS "Tests must be enabled in a coverage build! Setting BUILD_TESTS to On!")
set(BUILD_TESTS On CACHE STRING "" FORCE)
endif (NOT BUILD_TESTS)
set(COVERAGE_EXCLUDES 'tests/*')
include(CodeCoverage)
APPEND_COVERAGE_COMPILER_FLAGS()
SETUP_TARGET_FOR_COVERAGE(NAME coverage EXECUTABLE tests DEPENDENCIES coverage)
else (ENABLE_COVERAGE AND NOT CMAKE_CONFIGURATION_TYPES)
# ...
endif (ENABLE_COVERAGE AND NOT CMAKE_CONFIGURATION_TYPES)
詳細。
ENABLE_COVERAGE
lcov/gcov を使用して生成されるコード カバレッジを有効/無効にするために使用するコマンド ライン フラグです。tests
すべての単体テストを実行する実行可能ファイルの名前です。まずadd_subdirectory
、そのフォルダーを追加するために使用し、使用するフォルダー内で:set(TEST_SOURCES test_hello_world.cpp test_factorial.cpp) add_executable(tests main.cpp ${TEST_SOURCES}) target_link_libraries(tests Project-Name-lib) include(ParseAndAddCatchTests) ParseAndAddCatchTests(tests)
私の問題:
通常、make
スクリプトを実行すると、ビルドに約 10 秒かかるテスト実行可能ファイルを含め、コードは簡単にコンパイルされます。ただし、コードのカバレッジを有効にすると、コードがビルドmain.cpp.o
(内部tests
) でスタックし、make
終了しません。を実行するmake VERBOSE=1
と、上記のオブジェクトに対して実行されている次のコマンドが表示されます。
cd project_dir/build/tests && /usr/bin/g++-5
-g -O0 --coverage -fprofile-arcs -ftest-coverage -g -O0
--coverage -fprofile-arcs -ftest-coverage -g
-I/project_dir/include -I/project_dir/build
-std=c++14 -o CMakeFiles/tests.dir/main.cpp.o -c /project_dir/main.cpp
(読みやすくするために一部のパスを短縮しており、インデントされた行は同じコマンドの一部です)
どうやら、 を使用しても、set(COVERAGE_EXCLUDES 'tests/*')
コンパイラはテスト実行可能ファイルにカバレッジ フラグを追加しているようです。これがビルド時間の遅さの原因だと思います。私の結論が正しければ、これらのフラグをテスト実行可能ファイルに追加しないようにコンパイラに指示するにはどうすればよいでしょうか? 私の結論が正しくない場合、この実行可能ファイルのビルド時間を短縮するにはどうすればよいですか? (フラグ名については直接言及したくありません。すべてのコンパイラで機能するとは限らないためです (つまり、GCC/Clang を意味します))。
ちなみに、私のmain.cpp
内容は次のとおりです。
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
サンプル テスト ファイルには次のものが含まれます。
#include <project-abbr/factorial.hpp>
#include "catch.hpp"
TEST_CASE("function factorial")
{
SECTION("normal arguments")
{
REQUIRE(factorial(2) == 2);
REQUIRE(factorial(3) == 6);
REQUIRE(factorial(4) == 24);
REQUIRE(factorial(5) == 120);
}
}