【问题标题】:CMake add_custom_command() POST_BUILD generator expression expansion not workingCMake add_custom_command() POST_BUILD 生成器表达式扩展不起作用
【发布时间】:2021-11-26 10:20:10
【问题描述】:

我想在构建后运行 POST_BUILD 操作(但仅在调试配置中)。

阅读add_custom_command docspossible 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 $&lt;$&lt;CONFIG:Debug&gt;:"${CMAKE_COMMAND} -E echo \"hi there from debug build\""&gt;

COMMAND "$&lt;$&lt;CONFIG:Debug&gt;:${CMAKE_COMMAND} -E echo \"hi there from debug build\"&gt;" 等等

但即使它删除了配置时警告,它仍然会在构建时产生硬错误。

问题:实现我想要的正确方法是什么?有可能是这样还是这里有 CMake 限制?

(注意:如果可能的话,我希望将整个命令保留在一个地方执行。我也知道其他可能的解决方法)

【问题讨论】:

    标签: cmake cmake-language


    【解决方案1】:

    按照 Ben Boeckel here 的回答:

    空间在基因内通常不是格式良好的。您需要将空格替换为 ; 以使其正确解析(这就是为什么您会在构建命令中看到一半扩展的残余)。

    在 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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多