如何在 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_command
的 COMMAND
参数的文档所述:
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>/"
)
我在 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_command
的 COMMAND
参数的文档所述:
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 theDEPENDS
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>/"
)