1. makefile的格式:
target ... : prerequisites ...
command
......
......
target 也就是一个目标文件,可以是 Object File,也可以是执行文件。还可以是一个
标签(Label)
,对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites 就是,要生成那个 target 所需要的文件或是目标。
command 也就是 make 需要执行的命令。
(任意的 Shell 命令)
这是一个文 件的依赖关 系,也就是 说,target 这一个或多 个的目标文 件依赖于
prerequisites 中的文件,
其生成规则定义在 command 中。
说白一点就是说,
prerequisites
中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。这
就是 Makefile 的规则。也就是 Makefile 中最核心的内容。
其中comand一定要以一个 Tab 键作为开头,
ps:之前我把声明和实现都写在同一个.hpp文件里面, 如果不在.cpp文件里包含这个头文件,那么这个头文件是不会被编译的。
因为yl 也说了,make编译的时候是只会编译.cpp 文件的
2.make的自动推导(隐晦规则)
GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必
要去在每一个[.o]文件后都写上类似的命令,因为,我们的 make 会自动识别,并自己推导
命令。
只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make
找到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。并且 cc -c
whatever.c 也会被推导出来,于是,我们的 makefile 再也不用写得这么复杂。新的makefile:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
3. 清空目标文件的规则
每个 Makefile 中都应该写一个清空目标文件(.o 和执行文件)的规则,这不仅便于重
编译,也很利于保持文件的清洁。这是一个“修养”
一般的风格都是:
clean:
rm edit $(objects)
更为稳健的做法是:
.PHONY : clean
clean :
-rm edit $(objects)
为了避免和文件重名的这种情况,
我们使用一个特殊的标记“.PHONY”来显示地指明clean目标是“伪目标
4. 注释
Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符
5.make的工作方式
GNU 的 make 工作时的执行步骤入下:
(想来其它的 make 也是类似)
1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
6.在规则中使用通配符
如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make 支持
三个通配符:
“*”, “?”和“[...]”。
这是和 Unix 的 B-Shell 是相同的。
7.文件搜寻
在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存
放在不同的目录中。所以,当 make 需要去找寻文件的依赖关系时,你可以在文件前加上路
径,但最好的方法是把一个路径告诉 make,让 make 在自动去找。
Makefile 文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,
make 只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make
就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。
VPATH = src:../headers
上面的的定义指定两个目录,“src”和“../headers”,make 会按照这个顺序进行搜
索。目录由“冒号”分隔。
(当然,当前目录永远是最高优先搜索的地方)
另一个设置文件搜索路径的方法是使用 make 的“vpath”关键字(注意,它是全小写
的),这不是变量,这是一个 make 的关键字
8.伪目标