每条命令的开头必须以 Tab 键开头,除非命令是跟在依赖规则后的分号后面。在命令行之间中的空格或者空行会被忽略,但是如果该空格或空行是以 Tab 键开头的,那么 make 会认为其是一个空命令。

如果我们在编译过程中,可以显示正在编译哪一步,就会很方便我们对程序编译的监控。我们可以使用makefile的一些显示命令,添加上一些类似注释的信息,伴随编译的过程打印到控制台上。

在makefile中,当我们在命令行前加上@ ,那么这个命令将不会被 make 显示出来。我们常用@echo命令显示一些有用的信息,如我们以下这个makefile文件:

all:main1 main2
.PHONY : all

MAIN_1_OBJ = main.o hello.o car.o
main1: $(MAIN_1_OBJ)
@echo main1...
gcc -o main1 $(MAIN_1_OBJ)
main.o hello.o:hello.h
main.o car.o:car.h

main2:main2.o
@echo main2...
@gcc -o main2 main2.o

.PHONY:cleanall cleanobj cleanapp
cleanall:cleanobj cleanapp
cleanobj:
@echo ...
-rm *.o
cleanapp:
@echo main1 main2
-rm

在命令行前加上@ ,那么这个命令将不会被 make 显示出来:

~/Desktop/mydir$ make
cc -c -o main.o main.c
cc -c -o hello.o hello.c
cc -c -o car.o car.c
main1...
gcc -o main1 main.o hello.o car.o
cc -c -o main2.o main2.c
main2...

可以看到echo命令没有被显示出来,gcc -o main2 main2.o这行命令前,因为有@,所以在make时,也没有被显示出来,但是他们都被执行了。

如果执行make命令时,带上参数 -n 或 --just-print,那么其只是显示命令,但不会执行命令:

~/Desktop/mydir$ make -n
cc -c -o main.o main.c
cc -c -o hello.o hello.c
cc -c -o car.o car.c
echo main1...
gcc -o main1 main.o hello.o car.o
cc -c -o main2.o main2.c
echo main2...
gcc -o main2 main2.o

这个功能很方便我们调试Makefile,可以查看书写的makefile命令最后要执行的内容和执行的顺序

如果执行make命令时,带上参数 -s 或 --silent 或 --quiet 则会禁止命令在控制台的打印,但命令会被执行:

~/Desktop/mydir$ make -s
main1...
main2...
~/Desktop/mydir$ ls
car.c car.o hello.c hello.o main2 main2.o main.o module
car.h hello hello.h main1 main2.c main.c makefile

谢谢阅读