使用CMake生成的系统在构建时运行Google测试

Running Google test at build time with CMake generated system

本文关键字:构建 运行 Google 测试 系统 CMake 使用      更新时间:2023-10-16

我的配置有CMake 3.6, Visual Studio 2015和最新的谷歌测试从GitHub。我通过一个cmake函数addGtest添加单元测试,然后进行构建。在此之后,我可以从我的RUN_TESTS目标或使用ctrl + F5在VS中运行测试并按预期工作。

最终目标是在构建时使用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。原问题解答

由于我需要add_custom_target命令的WORKING_DIRECTORY选项中的配置依赖路径,但不能将生成器表达式传递给它,因此想法是使用 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中运行,这并不是完全理想的,因为这是lib和exe的安装目录。如果……就好了。

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) -由于这个解决方案#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的传递依赖也包括在内。

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