.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四个目标的依赖关系:
在文件中增加:
.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
生成情况:
生成顺序: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
生成情况:
生成顺序: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参数比较稳妥,它会尽量生成已经能生成的目标。