Makefile学习笔记<显示/隐藏命令 忽略命令错误>

来源:互联网 发布:吸入麻醉药七氟烷mac值 编辑:程序博客网 时间:2024/06/03 20:34

1.显示命令:
一般默认make会把命令原样显示出来后再去执行命令,如果我们不需要原样显示命令,则可以在命令前面加一个“@”, 如:

echo building target...

make执行时会输出:

echo building target...building target...

如果在命令前加了”@”,则不会把命令原样输出:

@echo building target...

make执行时实际在终端看到的输出显示是:

building target...

在调试自己写发Makefile时往往想知道自己写的对不对,但又不想执行Makefile中的命令,而是只想看看自己写的这些命令执行的顺序对不对,这是该怎么办呢?
幸运的是make为我们提供了参数“-n”或者“–just-print”,只要在执行make时在其后面加上该参数即可。如

#:make -n <targetName>

如果嫌执行make后会有大量命令显示刷屏,可以在执行make后面添加参数
“-s”或“–slient”,这样就不会显示任何命令了。 如:

#:make -s <targetName>

2.忽略出错的命令:
如果不希望某条命令因为出错了而导致整个make执行被终止,可以在命令前面加上“-”,表示不管该命令出不出错,后面的命令都将继续执行下去。如:

mkdir dir

如果不加“-”并且dir已经存在,则这条命令就会出错,并将导致整个make执行被终止。
要想不被终止,则要改成:

-mkdir dir

另外,make还有全局的办法:
a. 给make加上参数“-i”或“–ignore-errors”,那么Makefile中的所欲命令都会被忽略错误。如:

make -i <targetName>

b.如果一个规则是以“.IGNORE”作为目标的,那么这个规则中所有命令都将会忽略错误。如:

.PHONY:clean clean1 .IGNORE clean2clean:clean1 .IGNORE  clean2clean1:    -rm test $(objs).IGNORE:    rm xxxxclean2:    -rm test2 $(objs2)

假设目标 test (objs)test2(objs2)都存在,但是xxxx不存在,那么执行到rm xxxx时就会出错,由于rm xxxx是在.IGNORE规则下的,make会自动终止.IGNORE规则的执行,但会继续执行后面的clean2规则。如:

$ make cleanrm test test.orm xxxxrm: cannot remove ‘xxxx’: No such file or directorymake: [.IGNORE] Error 1 (ignored)rm test2 test2.o

如果这里的目标不是.IGNORE,那么执行make clean时就会因为rm xxxx出错而终止,后面的clean2规则的命令不会再被执行了。

$ make cleanrm test test.orm xxxxrm: cannot remove ‘xxxx’: No such file or directorymake: *** [clean3] Error 1

c.给make加上参数”-k”或者“–keep-going”,那么如果makefile中某规则中的命令出错了,make会终止改规则的执行,但继续执行接下来的其他规则。如:

make -k <targetName>
0 0