Linux CMake使用混合shell脚本运行自定义命令

Linux CMake使用混合shell脚本运行自定义命令,linux,bash,shell,cmake,makefile,Linux,Bash,Shell,Cmake,Makefile,假设我们想在CMakeadd\u custom\u命令中运行以下命令: echo "#define FOO \"$(sh tools/foo.sh)\"" > foo.h sh是一个由其他人维护的脚本,因此我们无法在这里轻松更改它 问题是,CMake不会在add\u costom\u命令”中计算“$(sh tools/foo.sh)\”,而是直接将它们复制到foo.h中,这显然不是我们想要的 在生成的build.make中,我发现如下内容: echo "#define FOO \"\$$

假设我们想在CMake
add\u custom\u命令中运行以下命令:

echo "#define FOO \"$(sh tools/foo.sh)\"" > foo.h
sh是一个由其他人维护的脚本,因此我们无法在这里轻松更改它

问题是,CMake不会在
add\u costom\u命令”中计算“$(sh tools/foo.sh)\”,而是直接将它们复制到foo.h中,这显然不是我们想要的

在生成的build.make中,我发现如下内容:

echo "#define FOO \"\$$(sh tools/foo.sh)\"" > .../foo.h
CMake
add\u custom\u命令的转义规则是什么


我应该如何在
add_custom_command
command
中编写命令?

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


COMMAND echo“#define FOO\”$(sh tools/FOO.sh)\”>FOO.h
?你试过什么?它起作用了吗?我会把它分成两个
COMMAND printf“#define FOO”>FOO.h COMMAND sh tools/FOO.sh>>FOO.h
看起来更可读。@KamilCuk编辑了
什么是转义规则
逐字阅读
。您是否将
逐字
传递到
添加自定义\u命令
?无论如何,正确的方法是自己产卵。比如
命令sh-c'{echo\\\\\\\\\\\\\\\>定义FOO\\“sh tools/FOO.sh;}>FOO.h”
,或者如果您必须
命令sh-c“echo\\\\\\\\\\\\\\\\\\\”$(sh tools/FOO.sh)\\\\\“>FOO.h”
,但这是转义。@KamilCuk谢谢。是的,我用
逐字
调用了
添加自定义\u命令
add_custom_command(
  ...
  COMMAND bash ${PROJECT_SOURCE_DIR}/helper.sh > foo.h
)