テストを通常どおりまたはvalgrindで実行できるように、CMakeLists.txtを作成したいと思います。 ctestとvalgrindの統合については多くのことを見てきましたが、すべて、テスト結果をDartダッシュボードに送信するようにサーバーをセットアップすることを前提としています。自分のマシンでテストを実行し、コマンドラインで結果を確認したいだけです。
Cmake -D VALGRIND = ONを実行する必要がある場合は問題ありませんが、可能であれば「foo」および「valgrind_foo」という名前のテストを生成したいと思います。
メモリチェックにvalgrindを使用しています。 valgrindを構成するために、ビルドシステムで次の変数を定義します。
find_program( MEMORYCHECK_COMMAND valgrind )
set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full" )
また、私のvalgrind抑制ファイルがあります:
set( MEMORYCHECK_SUPPRESSIONS_FILE "${PROJECT_SOURCE_DIR}/valgrind_suppress.txt" )
CMakeLists.txtファイルを作成し、それらにvalgrindを正しく構成した後、次のコマンドを実行できます。
cmake -G ... (to configure your build)
ctest -D ExperimentalBuild (this will build your code)
ctest -R testName -D ExperimentalTest (just runs the test)
ctest -R testName -D ExperimentalMemCheck (to run the test under valgrind)
これにより、ビルドシステムがだまされて、テスト自動化がローカルで実行されます。それはあなたが実行することを期待しています:
ctest -R testName -D ExperimentalSubmit
次に、(デフォルトまたは自分の)ダッシュボードに送信しますが、必要なものを実行するためにこの手順を実行する必要はありません。結果はTesting/Temporary /ディレクトリに保存されます。
以下で十分のようです。以前はseparate_argumentsを使用していませんでしたが、それは私の愚かさでした。
function(add_memcheck_test name binary)
set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}")
separate_arguments(memcheck_command)
add_test(${name} ${binary} ${ARGN})
add_test(memcheck_${name} ${memcheck_command} ./${binary} ${ARGN})
endfunction(add_memcheck_test)
function(set_memcheck_test_properties name)
set_tests_properties(${name} ${ARGN})
set_tests_properties(memcheck_${name} ${ARGN})
endfunction(set_memcheck_test_properties)
私のケースは非常に単純だったので、カスタムターゲットを使用しました。
project(bftest)
add_executable(bftest main.c)
target_link_libraries(bftest LINK_PUBLIC bf)
find_program(VALGRIND "valgrind")
if(VALGRIND)
add_custom_target(valgrind
COMMAND "${VALGRIND}" --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes $<TARGET_FILE:bftest>)
endif()
add_custom_target()
を使用して、最小限の「DartConfiguration.tcl」構成ファイルを生成できます。次に、適切な引数を使用してvalgrind
を呼び出すctest
カスタムターゲットを追加できます。これは私が通常それをする方法です:
find_program(VALGRIND "valgrind")
if (VALGRIND)
set(Dart_CONFIG DartConfiguration.tcl)
add_custom_target(${Dart_CONFIG}
COMMAND echo "MemoryCheckCommand: ${VALGRIND}" >> ${Dart_CONFIG}
COMMENT "Generating ${Dart_CONFIG}"
)
set(VALGRIND_ARGS
--leak-check=full
--error-exitcode=255
)
set(LOGFILE memcheck.log)
add_custom_target(valgrind
COMMAND ctest -O ${LOGFILE} -D ExperimentalMemCheck --overwrite MemoryCheckCommandOptions="${VALGRIND_ARGS}"
COMMAND tail -n1 ${LOGFILE} | grep 'Memory checking results:' > /dev/null
COMMAND rm -f ${LOGFILE}
DEPENDS ${Dart_CONFIG}
)
endif()
お役に立てれば! :-)
クレジット: https://github.com/ARMmbed/mbedtls/blob/development/CMakeLists.txt#L237