Makefile学习笔记之@ - 参数

作者:LGibsion 
原文:https://blog.csdn.net/LGibsion/article/details/70854565 

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 clean2
clean:clean1 .IGNORE  clean2
clean1:
    -rm test $(objs)
.IGNORE:
    rm xxxx
clean2:
    -rm test2 $(objs2)

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

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

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

$ make clean
rm test test.o
rm xxxx
rm: cannot remove ‘xxxx’: No such file or directory
make: *** [clean3] Error 1


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

make -k <targetName>

猜你喜欢

转载自blog.csdn.net/OpenStack_/article/details/90748434