我有一个像这样的Makefile:
k:
status=$(shell ./x.sh;echo $?)
ifeq ( $(status),0)
echo success
else
echo failure
exit 1
endif
x.sh
是打印数字1到10的简单脚本。
所以当我执行make:
时ramana@Ramana:$make k
status=1 2 3 4 5 6 7 8 9 10
/bin/sh: 1: 2: not found
Makefile:2: recipe for target 'k' failed
make: *** [k] Error 127
这里我得到脚本的输出而不是$?
。当我在ifeq
status
中进行比较时,值为空。
我如何开展这项工作?另外我如何使用.ONESHELL指令?如果出现问题,我是否可以真正退出make,而不是使用exit 1
执行以下说明?
答案 0 :(得分:0)
GNU make的配方通常由/bin/sh
执行,这意味着ifeq
构造(即make语法)不起作用。
现在是坏消息:你试图做的通常是一个坏主意。在GNU make中使用shell变量很可能会破坏你的程序。使用shell条件会使其颈部突然出现。
在你的情况下我会做什么
k:
./x.sh
@echo Success!
如果./x.sh失败(即退出状态为非零),make将自行停止。如果您迫切需要退出状态,我发现这有效:
k:
-./x.sh
@echo $$@
一些解释:
通常make
将打印它执行的每一行。在该行停止之前@
。
通常make
如果以非零退出状态执行则会停止。行前的-
会阻止该行。
编辑:代码中的错误是由该行引起的 - >
status=1 2 3 4 5 6 7 8 9 10
尝试在shell中运行它。你可以将它用单引号或双引号括起来,但就像我说的那样,你试图做的事情非常“不make
”。