Makefile(二)-----Makefile中使用变量
接第一篇,我们可以在makefile中声明变量来替代重复的内容。比如:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了,于是我们的改良版makefile就变成下面这个样子:
1 objects = main.o kbd.o command.o display.o \
2 insert.o search.o files.o utils.o
3 edit : $(objects)
4 cc -o edit $(objects)
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。
1 objects = main.o kbd.o command.o display.o \
2 insert.o search.o files.o utils.o
3 edit : $(objects)
4 cc -o edit $(objects)
5 main.o : defs.h
6 kbd.o : defs.h command.h
7 command.o : defs.h command.h
8 display.o : defs.h buffer.h
9 insert.o : defs.h buffer.h
10 search.o : defs.h buffer.h
11 files.o : defs.h buffer.h command.h
12 utils.o : defs.h
13 .PHONY : clean
14 clean :
15 rm edit $(objects)
“.PHONY”表示,clean是个伪目标文件,伪目标文件在后续介绍。
[.o]和[.h]文件的依赖可以写的更简洁:
1 $(objects) : defs.h//所以的.o文件都依赖defs.h头文件
2 kbd.o command.o files.o : command.h//这三个.o文件都依赖command.h
3 display.o insert.o search.o files.o : buffer.h
4 .PHONY
补充:
在有些命令之前会有“$(Q)”出现,“$(Q)”的定义如下:
1 ifeq ($(KBUILD_VERBOSE),1)
2 quiet =
3 Q =
4 else
5 quiet=quiet_
6 Q = @
7 endif
其实就是为空或者"@",在指令前加上它,表示执行命令时,不打印这条命令,当然你可以
"make -s",就是不打印命令,但是这个会将所有的命令都屏蔽掉,想灵活一点就用“@”。