如何在 Visual Studio 的 CMake 中获取当前配置 (Release/Debug)

How to get current configuration (Release/Debug) in CMake for Visual Studio

我在 Visual Studio 2013,CMake 3.5.1,Windows 10。我正在尝试通过 CMake 复制一些文件,如下所示:

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/Release)

是否可以用表示配置的变量替换 "Release",例如:

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/${Variable})

我试过了

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})

但是CMAKE_BUILD_TYPE用message打印出来是空串,我也试过

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>)

但由于某些原因文件命令无法破译 $<CONFIGURATION> 而像

这样的命令
add_custom_target(run COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>/Test.exe)

可以。提取 visual studio 当前是在 Release 中构建还是在 CMake 中调试的正确方法是什么?

file 命令在 CMake 运行时执行,而不是在构建时(即 VS 运行时)执行。

这也意味着不能使用生成器表达式(例如 $<CONFIG>),因为它们是在构建时计算的。
提示:只要在 CMake 文档中没有明确提及对特定命令使用生成器表达式,该命令就不会支持它们)。

${CMAKE_BUILD_TYPE} 为空的原因是您可能没有在调用 CMake 时指定它:

cmake -DCMAKE_BUILD_TYPE=Debug ..

但是,使用它意味着构建文件仅为 Debug 配置生成。这显然不是你想要的。

解决您的问题:使用生成器表达式是正确的方法,因为您已经通过使用 add_custom_target(或 add_custom_command)找到了答案。

您可以使用自定义命令作为其他“real”目标的依赖项,您可以为特定目标指定 post-/pre-build 和 pre-link 命令通过 add_custom_command.

正如 add_custom_commandCOMMAND 参数的文档所述:

Arguments to COMMAND may use generator expressions. References to target names in generator expressions imply target-level dependencies, but NOT file-level dependencies. List target names with the DEPENDS option to add file-level dependencies.

在成功构建目标后复制文件:

add_custom_command(TARGET myTarget POST_BUILD
                   COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${IMAGE1}" "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
                   COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${IMAGE2}" "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
)