0
点赞
收藏
分享

微信扫一扫

makefile命令出错


当执行某个规则出现错误时,会马上停止该目标和该目标的依赖目标的生成。如何忽略错误,继续生成此目标之上的所有其它目标呢?
演示例子:

r1:r2 r3
echo 1
r2:r21
echo 2
cat tes.txt #tes.txt不存在,故意指定这条出错
r21:
echo 21
r3:r31
echo 3
r31:
echo

我们先看一下makefile的执行顺序:

~/Desktop/testdir$ make --just-print
echo 21
echo 2
cat tes.txt #tes.txt不存在,故意指定这条出错
echo 31
echo 3
echo

正常执行make命令:

~/Desktop/testdir$ make -s
21
2
cat: tes.txt: No such file or directory
makefile:4: recipe for target 'r2' failed
make: *** [r2]

参考:​​《makefile显示命令》​​ 可以看出执行到r2目标发生错误后,就停止了后续其他目标的生成了。如何忽略r2目标生成出现的错误,继续生成其他目标呢?有以下几种方法:

  • (1)在make命令后加上 -i 或者 --ignore-errors 参数,那么Makefile 中所有命令执行出现的错误都会被忽略。

// -s-i
~/Desktop/testdir$ make -s -i
21
2
cat: tes.txt: No such file or directory
31
3
1

从输出结果来看,忽略了r2执行出现的错误,继续生成后续的目标。

  • (2)在make命令后加上 -k 或是 --keep-going ,意思是如果某规则中的命令出错了,那么就终止该规则的执行,但继续执行其它规则:

~/Desktop/testdir$ make -s -k
21
2
cat: tes.txt: No such file or directory
makefile:4: recipe for target 'r2' failed
make: *** [r2]

  • (3)在Makefile 的命令行前加一个减号 - ,标记为忽略该命令执行出现的错误,如:

clean:
-rm -f *.o

将演示例子修改一下:

r1:r2 r3
echo 1
r2:r21
echo 2
-cat tes.txt #tes.txt不存在,故意指定这条出错
r21:
echo 21
r3:r31
echo 3
r31:
echo

执行编译:

~/Desktop/testdir$ make -s
21
2
cat: tes.txt: No such file or directory
31
3
1

可以看出makefile命令在执行出现的错误被忽略了,后面的规则被顺利执行了。

  • (4)用这个关键字.IGNORE声明目标,表示忽略其后命令执行出现的错,我们修改一下演示例子:

r1:r2 r3
echo 1
.IGNORE:r2
r2:r21
echo 2
cat tes.txt #tes.txt不存在,故意指定这条出错
r21:
echo 21
r3:r31
echo 3
r31:
echo

执行编译:

~/Desktop/testdir$ make -s
21
2
cat: tes.txt: No such file or directory
31
3
1

从执行结果来看,r2目标后面的命令执行出现的错误被忽略了。

注意:命令行前一定是Tab键。

谢谢阅读


举报

相关推荐

0 条评论