为了在我的一个项目中运行单元测试,我有一个自定义命令,它将可执行文件、库和其他相关文件复制到其他位置,以便它们可以使用特定的设置运行,而不是在它们所在的位置运行它们建造的。在 Linux 上,这非常简单。但在 Windows 上,我遇到了一些障碍,因为 cmake 将配置名称附加到输出目录(我通常喜欢这样,但它搞砸了我在这种情况下所做的事情)。这使得确定生成的库或可执行文件的路径变得困难。例如,如果我有一个自定义命令,只需将可执行文件复制到另一个目录
set(EXE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/exeName${CMAKE_EXECUTABLE_SUFFIX}")
set(NEW_EXE_PATH "${RUN_UNITTESTS_DIR}/exeName${CMAKE_EXECUTABLE_SUFFIX}")
add_custom_command(TARGET unitTests POST_BUILD
COMMAND ${CMAKE_COMMAND} ARGS -E copy "${EXE_PATH}" "${NEW_EXE_PATH}")
它会在 Windows 上卡住,因为可执行文件实际上并不在CMAKE_RUNTIME_OUTPUT_DIRECTORY
。根据配置类型,它可以是${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release
or ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug
。在 Linux 上,可以通过使用轻松修复CMAKE_BUILD_TYPE
并将其添加到路径中,但这不适用于 Windows,因为在 Windows 上,cmake 生成多个配置,而不仅仅是一个。所以,我想做的是
add_custom_command(TARGET unitTests POST_BUILD
debug
COMMAND ${CMAKE_COMMAND} ARGS -E copy "${DEBUG_EXE_PATH}" "${DEBUG_NEW_EXE}")
add_custom_command(TARGET unitTests POST_BUILD
release
COMMAND ${CMAKE_COMMAND} ARGS -E copy "${RELEASE_EXE_PATH}" "${RELEASE_NEW_EXE}")
一些 cmake 命令认为能够做到这一点(例如target_link_libraries
),但据我所知,add_custom_target
不提供这种能力。那么,问题是我该怎么做?如何在 Windows 上使自定义命令特定于配置?
它可以借助下一个“生成器表达式”(CMake 2.8.10)来解决:
-
$<0:...>
= 空字符串(忽略“...”)
-
$<1:...>
=“...”的内容
-
$<CONFIG:cfg>
= '1' 如果配置是“cfg”,否则为 '0'
您可以将它们组合起来以达到您需要的行为(伪代码):
if debug then ${DEBUG_EXE_PATH} elseif release then ${RELEASE_EXE_PATH}
翻译过来就是:
$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>
所以你的字符串看起来像:
add_custom_command(TARGET unitTests POST_BUILD
COMMAND ${CMAKE_COMMAND} ARGS -E copy "$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>" "$<$<CONFIG:debug>:${DEBUG_NEW_EXE}>$<$<CONFIG:release>:${RELEASE_NEW_EXE}>")
细节:CMake:add_custom_command https://cmake.org/cmake/help/latest/command/add_custom_command.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)