【问题标题】:CMake run custom command with mixed shell scriptsCMake 使用混合 shell 脚本运行自定义命令
【发布时间】:2020-01-14 03:24:05
【问题描述】:

假设我们要在 CMake add_custom_command 中运行以下命令:

echo "#define FOO \"$(sh tools/foo.sh)\"" > foo.h

foo.sh 是别人维护的脚本,所以在这里我们无法轻易更改。

问题是,CMake 不会评估 \"$(sh tools/foo.sh)\"' inadd_costom_command`,而是直接将它们复制到 foo.h 中,这显然不是我们想要的。

在生成的 build.make 中我发现了类似的内容:

echo "#define FOO \"\$$(sh tools/foo.sh)\"" > .../foo.h

CMake add_custom_command COMMAND 的转义规则是什么?

add_custom_commandCOMMAND中的命令应该怎么写?

【问题讨论】:

  • COMMAND echo "#define FOO \"$(sh tools/foo.sh)\"" > foo.h ?你试过什么?它奏效了吗?我会把它一分为二 COMMAND printf "#define FOO" > foo.h COMMAND sh tools/foo.sh >> foo.h 似乎更易读。
  • @KamilCuk 已编辑
  • What'are the escape rules 了解VERBATIM。您是否将VERBATIM 传递给add_custom_command?无论如何,正确的方法是自己生成一个 shell。像COMMAND sh -c '"{ echo \"#define FOO\"; sh tools/foo.sh; } > foo.h" 一样,或者如果你必须COMMAND sh -c "echo \"#define FOO \\\"$(sh tools/foo.sh)\\\"\" > foo.h" 但那会转义。
  • @KamilCuk 谢谢。是的,我用VERBATIM 打电话给add_custom_command

标签: linux bash shell cmake


【解决方案1】:

CMake 语法太疯狂了,要进行这种转义(涉及)并不容易。为了解决这个问题,我建议您将 shell 命令放在项目目录中的单独文件(例如helper.sh)中,然后像这样调用它 --

add_custom_command(
  ...
  COMMAND bash ${PROJECT_SOURCE_DIR}/helper.sh > foo.h
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多