11

为了在我的一个项目中运行单元测试,我有一个自定义命令,它将可执行文件、库和其他相关文件复制到其他地方,以便可以使用特定设置运行它们,而不是在它们所在的地方运行它们建成。在 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${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 上使自定义命令特定于配置?

4

2 回答 2

12

它可以在下一个“生成器表达式”(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

于 2013-10-06T00:14:51.243 回答
7

这是为与 一起使用而提供的生成器表达式的情况add_custom_command

在您的情况下,您希望编译的 exe 的完整路径,以及附加到目标目录的文件名。这些分别是$<TARGET_FILE:unitTests>$<TARGET_FILE_NAME:unitTests>

您的完整命令将是:

add_custom_command(TARGET unitTests POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E
                       copy $<TARGET_FILE:unitTests>
                            ${RUN_UNITTESTS_DIR}/$<TARGET_FILE_NAME:unitTests>)
于 2012-12-21T23:32:53.167 回答