makefile 中忽略错误参数.IGNORE、-k、-i的区别详解

.IGNORE

用这个关键字指示的目标,在生成过程中出现错误时,会马上停止该目标和该目标的依赖目标的生成,但是会继续生成此目标之上的所有其它目标。

 

示例:

有如下makefile文件:

r1 : r2 r3
 echo 1
r2 : r21
 echo 2
 cat ew         #ew文件不存在,故意让这条指定出错
r21 :
 echo 21
r3 : r31
 echo 3
r31 :
 echo 31

 

图解:

r1、r2、r3、r21、r31四个目标的依赖关系:

makefile 中忽略错误参数.IGNORE、-k、-i的区别详解_第1张图片

在文件中增加:

.IGNORE : r2

执行make命令后输出为:

root@lifengwei-desktop:~/Documents/mksub# make
echo 21
21
echo 2
2
cat ew
cat: ew: No such file or directory
make: [r2] Error 1 (ignored)
echo 31
31
echo 3
3
echo 1
1

生成情况:

makefile 中忽略错误参数.IGNORE、-k、-i的区别详解_第2张图片
生成顺序:r21->r2(出错) ->r31->r3->r1

 

如果是:

.IGNORE : r1

执行make命令后输出为:

root@lifengwei-desktop:~/Documents/mksub# make
echo 21
21
echo 2
2
cat ew
cat: ew: No such file or directory
make: *** [r2] Error 1
生成情况:

makefile 中忽略错误参数.IGNORE、-k、-i的区别详解_第3张图片

生成顺序:r21->r2(出错停止)

 

.IGNORE还有个特性

.IGNORE直接指定的目标,如果执行时有命令出错,仍然继续执行出错命令后面的命令。其它目标下如果执行时有命令出错,则立即停止生成此目标。

例:

.IGNORE : all
all :
 echo aaa
 cat ew
 echo bbb


make后输出为:

root@lifengwei-desktop:~/Documents/mksub# make
echo aaa
aaa
cat ew
cat: ew: No such file or directory
make: [all] Error 1 (ignored)
echo bbb
bbb

例:

.IGNORE : all
all : res
 echo aaa
 cat ew
 echo bbb

res :
 echo resaaa
 cat ew
 echo resbbb

 

make后输出为:

root@lifengwei-desktop:~/Documents/mksub# make
echo resaaa
resaaa
cat ew
cat: ew: No such file or directory
make: *** [res] Error 1

 

-k参数

如果某个目标出错,依赖这个目标的规则都不执行,其它规则执行。

例:

还是这个makefile文件:

r1 : r2 r3
 echo 1
r2 : r21
 echo 2
 cat ew         #ew文件不存在,故意让这条指定出错
r21 :
 echo 21
r3 : r31
 echo 3
r31 :
 echo 31

执行命令make -k,有如下输出:

root@lifengwei-desktop:~/Documents/mksub# make -k
echo 21
21
echo 2
2
cat ew
cat: ew: No such file or directory
make: *** [r2] Error 1
echo 31
31
echo 3
3
make: Target `r1' not remade because of errors.

生成顺序:r21->r2(出错) ->r31->r3

 

-i 参数

忽略一切命令的出错,执行所有生成规则。

makefile文件:

r1 : r2 r3
 echo 1
r2 : r21
 echo 2
 cat ew
r21 :
 echo 21
r3 : r31
 echo 3
r31 :
 echo 31

执行make -i命令,输出如下:

root@lifengwei-desktop:~/Documents/mksub# make -i
echo 21
21
echo 2
2
cat ew
cat: ew: No such file or directory
make: [r2] Error 1 (ignored)
echo 31
31
echo 3
3
echo 1
1

生成顺序:r21->r2(出错) ->r31->r3->r1

注意:即使r2规则中有命令出错,在出错命令之后的命令仍然会执行。

例:

makefile文件:


all :
 echo aaa
 cat ew
 echo bbb

 

执行命令make -i

root@lifengwei-desktop:~/Documents/mksub# make -i
echo aaa
aaa
cat ew
cat: ew: No such file or directory
make: [all] Error 1 (ignored)
echo bbb
bbb
执行命令make -k

root@lifengwei-desktop:~/Documents/mksub# make -k
echo aaa
aaa
cat ew
cat: ew: No such file or directory
make: *** [all] Error 1
执行命令make

root@lifengwei-desktop:~/Documents/mksub# make
echo aaa
aaa
cat ew
cat: ew: No such file or directory
make: *** [all] Error 1


文件中增加.IGNORE : all后。

执行make

root@lifengwei-desktop:~/Documents/mksub# make
echo aaa
aaa
cat ew
cat: ew: No such file or directory
make: [all] Error 1 (ignored)
echo bbb
bbb

 

感觉使用-k参数比较稳妥,它会尽量生成已经能生成的目标。

你可能感兴趣的:(File,makefile)