makefile中的命令

1. 命令

当依赖被修改后,会调用更新方法。在生成方法/更新方法所执行的就是命令,就是你在终端中执行的命令。使用伪目标,因为我们并不生成什么,只是想打印一些东西。

.PHONY:print
print:
pwd
ls
cat demo.c

这三条命令会依次执行,需要注意的是,每条命令占一行,不用任何东西结尾,开头是一个缩进。make执行这些命令其实就是调用你系统的shell来执行,默认为/bin/sh。
每一行命令都会调用一个shell,也就是说,这三条命令是在三个不同的shell里执行的。这样你在shell里定义的变量就无法被其他shell使用。
如果我们想让3个命令在同一个shell里执行,需要把他们写到一行,并以分号分割。

.PHONY:print
print:
pwd;ls;cat demo.c

make会先在shell打印我们的命令,然后才会执行,我们如果不想让它打印我们的命令,需要在前面加上@

ubuntu@R7000:~/make_study/chapter1$ make
pwd;ls;cat demo.c
/home/ubuntu/make_study/chapter1
Makefile bin demo.c obj src
#include <stdio.h>

int main(int argc,char **argv){
printf("hello world\n");
return 0;
}ubuntu@R7000:~/make_study/chapter1$
.PHONY:print
print:
@pwd;ls;cat demo.c

2.命令出错

每一条命令运行完,make会检查返回码,如果成功执行,会执行下一条命令,所有命令都正确执行,这个规则就算是执行成功。如果其中有一条命令执行失败,make就会终止当前规则,导致终止所有规则的执行。
个别时候,命令出错不一定是错的,比如mkdir,如果目录存在,那就不需要我们创建了,我们并不会觉得这是一个错误,我们希望程序继续执行。我们需要忽略这个错误。

因此,在命令前加一个减号就可以了,这样make就不会在意这条命令的返回值了。

clean:
-rm -f *.o