C++ 使用CMake生成的系统在构建时运行Google测试
我的配置有CMake 3.6、Visual Studio 2015和GitHub的最新Google测试。我通过一个cmake函数添加单元测试,然后进行构建。在此之后,我可以从我的C++ 使用CMake生成的系统在构建时运行Google测试,c++,visual-studio,unit-testing,cmake,googletest,C++,Visual Studio,Unit Testing,Cmake,Googletest,我的配置有CMake 3.6、Visual Studio 2015和GitHub的最新Google测试。我通过一个cmake函数添加单元测试,然后进行构建。在此之后,我可以从我的run\u TESTStarget运行测试,或者在VS中使用ctrl+F5并按预期工作 最终目标是使用CMake依赖关系管理在构建时运行单元测试。现在,作为第一步,我已经增强了我的功能,创建了一个自定义\u目标(包括整个功能,以防工作部分中出现不可预见的问题),但没有构建它: function (addGtest)
run\u TESTS
target运行测试,或者在VS中使用ctrl+F5并按预期工作
最终目标是使用CMake依赖关系管理在构建时运行单元测试。现在,作为第一步,我已经增强了我的功能,创建了一个自定义\u目标
(包括整个功能,以防工作部分中出现不可预见的问题),但没有构建它:
function (addGtest)
# vvvv this part works as explained vvvv #
set (optBOOLS)
set (optSINGLES EXE)
set (optLISTS DLL_LIST)
cmake_parse_arguments (myARGS
"${optBOOLS}" "${optSINGLES}" "${optLISTS}" ${ARGN})
# addExecutable is a function that adds target executables
set(myARGS_DLL_LIST gtest_main gtest "${myARGS_DLL_LIST}")
addExecutable (EXE ${myARGS_EXE} DLL_LIST ${myARGS_DLL_LIST} ${myARGS_UNPARSED_ARGUMENTS})
add_test (NAME ${myARGS_EXE} COMMAND ${myARGS_EXE} WORKING_DIRECTORY
${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
) # so it can be run using ctest
# ^^^^ this part works as explained ^^^^ #
add_custom_target (${myARGS_EXE}.tgt DEPENDS ${myARGS_EXE}
COMMAND ${myARGS_EXE} --gtest_output="xml:${myARGS_EXE}.xml"
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
)
endfunction (addGtest)
我尝试提供命令
选项的完整路径,删除--gtest_输出
值周围的双引号,但没有效果。另一方面,当我cd到命令行窗口中的工作目录并调用exe时,它工作正常
第一个问题是如何通过构建这个新目标来修复它以运行测试?之后,我计划
添加自定义目标(${myARGS\u EXE}.run)
和添加依赖项(${myARGS\u EXE}.run${myARGS\u EXE}.tgt)
。当exe更改时,这会运行测试吗?还是我应该做点别的?谢谢您的帮助。无法在评论中添加这么多细节,因此给出了此答案
1。原始问题的答案
由于我需要add\u custom\u target
命令的WORKING\u目录
选项中与配置相关的路径,但无法将生成器表达式传递给它,因此我的想法是使用CMAKE\u CFG\u INTDIR
变量:
add_custom_target (${myARGS_EXE}.tgt
DEPENDS ${myARGS_EXE}
COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin
)
现在,当您构建上述目标时,单元测试在WORKING\u目录中运行,这不是完全需要的,因为这是libs和exe的安装目录。如果能
2。从构建目录运行单元测试
同时,从Visual Studio中提取DLL路径,并将生成的Gtest.xml
文件存储在生成目录中。这就是解决方案:
在CMake版本3.10中添加了属性。在项目范围的CMakeLists.txt中,集(CMAKE\u MSVCIDE\u RUN\u PATH${CMAKE\u INSTALL\u PREFIX}/${CMAKE\u CFG\u INTDIR}/bin)
-由于这个#3,我们可以附加路径
,指向我们的安装目录。然后用以下命令替换上述add_custom_target
命令:
add_custom_command (
TARGET ${myARGS_EXE} POST_BUILD
COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
)
此解决方案避免了创建其他目标的麻烦。显然,只有在构建了myARGS\u EXE
时,才会运行单元测试。显然,myARGS\u EXE
对其他DLL的可传递依赖性也包括在内
如果您有其他优雅的解决方案,请发布。您是否尝试从add\u custom\u target
调用中删除所有变量的解引用和生成器表达式,并为此调用硬编码所有参数?这种方法在调试问题时很常见,可能与变量的解引用有关。add_custom_target
命令的选项的CMake文档中说它可以使用生成器表达式,但在工作目录
选项中没有提到。如果我硬编码工作目录路径,那么构建目标将执行gtest。将进行更多的研究/调试,并发布任何有用的信息。谢谢,好的。实际上,CMake文档明确地说,哪个选项可以使用生成器表达式。由于命令add\u custom\u target
没有关于WORKING\u DIRECTORY
选项的概念,因此不能使用生成器表达式。有趣的是,add\u test
的相同选项可能会使用生成器表达式(在文档中有明确描述)。@Tsyvarev
,我发现可以使用CMAKE\u CFG\u INTDIR
代替生成器表达式。但答案中有更多细节。感谢您硬编码变量的想法。请随时改进我下面的答案。
add_custom_command (
TARGET ${myARGS_EXE} POST_BUILD
COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
)