CMake add_custom_command() POST_BUILD 生成器表达式扩展不起作用
CMake add_custom_command() POST_BUILD generator expression expansion not working
我想在构建后 运行 执行一个 POST_BUILD 操作(但仅在调试配置中)。
阅读 add_custom_command docs and a possible solution 后,我了解到我可以将我的命令“包装”到 $<CONFIG:Debug>
生成器表达式中(以确保它在发布模式下是“空的”)。
我尝试了以下方法:
cmake_minimum_required(VERSION 3.18)
project(post-build CXX)
file(WRITE main.cxx "int main() {}")
add_executable(foo main.cxx)
add_custom_command(
TARGET foo POST_BUILD
COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo "hi there from debug build">
)
但这给了我 CMake 配置时警告和构建时硬故障(使用 Ninja 生成器):
(...) && "$<1:C:\Program Files\CMake\bin\cmake.exe" -E echo "hi there from debug build" >""
[build] The system cannot find the path specified.
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1
我尝试了很多可能的引号组合(包括转义引号):
COMMAND $<$<CONFIG:Debug>:"${CMAKE_COMMAND} -E echo \"hi there from debug build\"">
和
COMMAND "$<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo \"hi there from debug build\">"
等等
但是即使它删除了配置时警告,它仍然会在构建时产生硬错误。
问题:实现我想要的东西的正确方法是什么?是这样的可能还是这里有CMake的限制?
(注意:如果可能的话,我希望将整个命令放在一个地方执行。我也知道其他可能的解决方法)
遵循 Ben Boeckel here 的回答:
Spaces generally aren’t well-formed inside of genexes. You’ll need to replace the spaces with ;
to make it parse properly (which is why you’re seeing half-expanded remnants in the build command).
以及 CMake 邮件列表中的一些讨论 (here),最终对我有用的是:
add_custom_command(
TARGET foo POST_BUILD
COMMAND "$<$<CONFIG:Debug>:${CMAKE_COMMAND};-E;echo;\"hi there from debug build\">"
COMMAND_EXPAND_LISTS
)
(注意整个 genex 的引号,用分号分隔,对字符串进行反引号,以及 COMMAND_EXPAND_LISTS 以去除输出中的分号——总而言之绝对不是最令人愉快的事情阅读)
编辑:
这也有效:
set(HELLO_FROM_DEBUG ${CMAKE_COMMAND} -E echo "hi there")
add_custom_command(
TARGET foo POST_BUILD
COMMAND "$<$<CONFIG:Debug>:${HELLO_FROM_DEBUG}>"
COMMAND_EXPAND_LISTS
)
我想在构建后 运行 执行一个 POST_BUILD 操作(但仅在调试配置中)。
阅读 add_custom_command docs and a possible solution 后,我了解到我可以将我的命令“包装”到 $<CONFIG:Debug>
生成器表达式中(以确保它在发布模式下是“空的”)。
我尝试了以下方法:
cmake_minimum_required(VERSION 3.18)
project(post-build CXX)
file(WRITE main.cxx "int main() {}")
add_executable(foo main.cxx)
add_custom_command(
TARGET foo POST_BUILD
COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo "hi there from debug build">
)
但这给了我 CMake 配置时警告和构建时硬故障(使用 Ninja 生成器):
(...) && "$<1:C:\Program Files\CMake\bin\cmake.exe" -E echo "hi there from debug build" >""
[build] The system cannot find the path specified.
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1
我尝试了很多可能的引号组合(包括转义引号):
COMMAND $<$<CONFIG:Debug>:"${CMAKE_COMMAND} -E echo \"hi there from debug build\"">
和
COMMAND "$<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo \"hi there from debug build\">"
等等
但是即使它删除了配置时警告,它仍然会在构建时产生硬错误。
问题:实现我想要的东西的正确方法是什么?是这样的可能还是这里有CMake的限制?
(注意:如果可能的话,我希望将整个命令放在一个地方执行。我也知道其他可能的解决方法)
遵循 Ben Boeckel here 的回答:
Spaces generally aren’t well-formed inside of genexes. You’ll need to replace the spaces with
;
to make it parse properly (which is why you’re seeing half-expanded remnants in the build command).
以及 CMake 邮件列表中的一些讨论 (here),最终对我有用的是:
add_custom_command(
TARGET foo POST_BUILD
COMMAND "$<$<CONFIG:Debug>:${CMAKE_COMMAND};-E;echo;\"hi there from debug build\">"
COMMAND_EXPAND_LISTS
)
(注意整个 genex 的引号,用分号分隔,对字符串进行反引号,以及 COMMAND_EXPAND_LISTS 以去除输出中的分号——总而言之绝对不是最令人愉快的事情阅读)
编辑: 这也有效:
set(HELLO_FROM_DEBUG ${CMAKE_COMMAND} -E echo "hi there")
add_custom_command(
TARGET foo POST_BUILD
COMMAND "$<$<CONFIG:Debug>:${HELLO_FROM_DEBUG}>"
COMMAND_EXPAND_LISTS
)