我的配置包含CMake 3.6,Visual Studio 2015和GitHub的最新Google测试。我通过我的一个cmake函数addGtest
添加我的单元测试并进行构建。在此之后,我可以从我的RUN_TESTS
目标运行测试,或者在VS中使用 ctrl + F5 并按预期工作。
最终目标是使用CMake依赖关系管理在构建时运行单元测试。现在,作为第一步,我已经增强了我的功能来创建custom_target
(包括整个函数,以防工作部分中出现无法预料的问题),但不构建它:
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)
正如我在执行构建时所期望的那样,新的目标,比如,utMyTest.tgt
被添加到VS,但它没有构建。现在,当我在VS中手动构建这个新目标时,我希望测试将会运行。但它没有并且给出以下错误:
1> The filename, directory name, or volume label syntax is incorrect.
我尝试提供COMMAND
选项的完整路径,删除--gtest_output
值附近的双引号,但无济于事。另一方面,当我在命令行窗口中cd到工作目录并调用exe时,它工作正常!!
第一个问题是我如何通过构建这个新目标来修复它来运行测试?之后,我计划add_custom_target (${myARGS_EXE}.run)
和add_dependencies (${myARGS_EXE}.run ${myARGS_EXE}.tgt)
。那么每当exe改变时,它会运行测试吗?或者我应该做些什么?谢谢你的帮助。
答案 0 :(得分:0)
无法在评论中添加如此多的细节,因此这个答案。
<强> 1。回答原始问题
由于我需要WORKING_DIRECTORY
命令的add_custom_target
选项中的配置相关路径,但无法将生成器表达式传递给它,因此想法是使用 CMAKE_CFG_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_DIRECTORY
中运行,这不是完全可取的,因为这是libs和exes的安装目录。 ......真是太好了......
<强> 2。从其构建目录
运行单元测试同时,从Visual Studio中获取DLL路径,并将Gtest生成的.xml
文件存储在构建目录中。这是解决方案:
在CMake版本3.10中增加了CMAKE_MSVCIDE_RUN_PATH
属性。在项目范围内CMakeLists.txt,set(CMAKE_MSVCIDE_RUN_PATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin)
- 感谢此solution#3,我们可以附加PATH
指向我们的安装目录。然后用以下代码替换上面的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_EXE
时,才会运行单元测试。显然,myARGS_EXE
对其他DLL的传递依赖性也包括在内。
如果您有其他优雅的解决方案,请发布。