使用CMake生成的系统

时间:2016-10-17 00:57:28

标签: c++ visual-studio unit-testing cmake googletest

我的配置包含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改变时,它会运行测试吗?或者我应该做些什么?谢谢你的帮助。

1 个答案:

答案 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的传递依赖性也包括在内。

如果您有其他优雅的解决方案,请发布。