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

18

我使用的是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})

当我使用message命令打印时,CMAKE_BUILD_TYPE是一个空字符串,我也尝试了

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

但是由于某些原因,file命令无法解释$<CONFIGURATION>,而像此类的命令

add_custom_target(run COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>/Test.exe)

如何在CMake中提取Visual Studio当前是以Release还是Debug模式构建的正确方法?


我还是不理解:我通过调用 cmake -G“Visual Studio 15 2017 Win64”.. 创建了一个VS解决方案,现在我有一个 *.sln 项目和 CMAKE_CONFIGURATION_TYPES = Debug; Release; MinSizeRel; RelWithDebInfo(我想这很标准)。 我能够使用配置管理器(或下拉菜单)更改配置。如何在 CMakeLists.txt 中检索当前选择的配置? - Netherwire
@Netherwire 在 CMake 配置时间之前,也就是在生成 sln 文件之前,你不知道选择了什么。add_custom_target 能够工作是因为自定义目标会在手动或程序化生成 sln 文件之后被调用。 - user3667089
1个回答

18

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

这也意味着无法使用生成器表达式(例如 $<CONFIG>),因为这些表达式在构建时进行求值。
提示:只要在 CMake 文档中没有明确指出某个命令支持使用生成器表达式,就意味着该命令不支持它们)。

之所以 ${CMAKE_BUILD_TYPE} 为空,是因为您可能未在调用 CMake 时指定它的原因:

cmake -DCMAKE_BUILD_TYPE=Debug ..

然而,这样做会导致生成的构建文件仅适用于Debug配置。显然这不是你想要的。

解决方案:使用生成器表达式是正确的方式,就像你已经通过使用add_custom_target(或者add_custom_command)发现的那样。

你可以将自定义命令用作其他“真实”目标的依赖项,并且可以通过add_custom_command为特定目标指定构建后/构建前和链接前命令。

如文档所述,对于add_custom_commandCOMMAND参数:

命令参数可以使用生成器表达式。在生成器表达式中引用目标名称意味着目标级别的依赖关系,但并不包括文件级别的依赖关系。使用DEPENDS选项列出目标名称以添加文件级别的依赖关系。

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

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>/"
)

如果add_custom_command是构建时间的正确方法,您是否也可以回答https://dev59.com/dJrga4cB1Zd3GeqPmGn1? - user3667089
似乎是很好的建议,只是无法让它正常工作。#$% - taranaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接