如何在GNU Make中使用Shell命令回显字符串

时间:2019-06-21 06:03:26

标签: shell command-line makefile gnu-make gnu

我的makefile文件中包含以下几行:

.PHONY : clean
clean:
    @echo "Running Clean"
    $(shell if [ -e exe ]; then rm exe; else echo "no files"; fi)

当我跑步时:

make clean

我在shell上得到以下输出

Running Clean
no files
make: no: Command not found
Makefile:22: recipe for target 'clean' failed
make: *** [clean] Error 127

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

问题是使用$(shell ...)。您想要的是:

.PHONY : clean
clean:
    @echo "Running Clean"
    @if [ -e exe ]; then rm exe; else echo "no files"; fi

关于发生问题的解释-首次运行clean目标时,make将在开始运行配方之前先扩展配方中的所有make变量和函数-因为$(shell ...)只有一个{ {1}},这被认为是make函数。 Make运行命令,该命令输出$到stdout,并用该字符串替换调用,然后开始执行配方...因此,make现在可以看到以下内容:

no files

当由于缺少clean: @echo "Running Clean" no files 而试图运行no files时,它将在屏幕上回显该行,然后将命令传递给shell。由于外壳程序无法识别关键字@,因此它会输出您所看到的错误。然后使自身失败,因为外壳返回错误。

答案 1 :(得分:0)

嘿,我都是问这个问题的同一个人,但我在发布此问题后立即找到了答案,我想我会把这个问题保留下来(除非这违反了stackoverflow礼节),以防其他人遇到相同的问题。我的解决方案是将字符串回显到stdout。

$(shell if [ -e exe ]; then rm exe; else echo "no files" >&2; fi)