我的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
有什么建议吗?
答案 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)