Makefile的规则
1.make如何确定目标文件过期?
对比目标文件和目标文件的依赖,如果目标文件的修改时间戳要比依赖文件的时间戳老,则过期,需要重新生成,否则不需要执行命令重新生成。
2.在编译.c或者.cpp/.cc文件的时候,我们不需要把头文件加入命令中,因为一般.c文件里面就包含了头文件。而在编写目标的依赖的时候,我们还是要把头文件加入到依赖里面的。
可以看看下面这个例子(这个例子摘自《GNU make中文版》 徐海兵译著):
foo.o : foo.c defs.h # module for twiddling the frobs cc -c -g foo.c
可以看到头文件被加入目标的依赖中去了。其中#是注释符。
2.目标的依赖其实还分为两种
1.常规依赖,特性为每次更新这种依赖,目标文件在make的时候就要重建。
2.order-only依赖,特性为,目标文件不存在的时候才会参与规则命令的执行。如果目标文件存在,即使修改了这种依赖,也不会执行规则的命令来重建目标文件。
这两种依赖一般由管道符来分割“|”,前面是常规依赖,后面的order-only依赖。
可以看看下面这个例子(这个例子摘自《GNU make中文版》 徐海兵译著):
LIBS = libtest.a foo : foo.c | $(LIBS) $(CC) $(CFLAGS) $< -o $@ $(LIBS)
3.文件名使用通配符
Maekfile 中表示文件名时可使用通配符。可使用的通配符有:“*”、“?”和“[…]”。
在 Makefile 中通配符的用法和含义和 Linux(unix)的 Bourne shell 完全相同。
Makefile 中统配符可以出现在以下两种场合:
- 可以用在规则的目标、依赖中,make 在读取 Makefile 时会自动对其进行匹配
处理(通配符展开); - 可出现在规则的命令中,通配符的通配处理是在 shell 在执行此命令时完成的。
除这两种情况之外的其它上下文中,不能直接使用通配符。而是需要通过函数
“wildcard”(这个以后有时间介绍函数的时候再进一步介绍)来实现。
如果文件名中就包含了通配符,那么在Makefile书写的时候要加上\来进行转义,否则make命令将会把它解释为通配符。
5.目录搜索
a.一般搜索
GNU make 可以识别一个特殊变量“VPATH”。通过变量“VPATH”可以指定依赖文件的搜索路径,当规则的依赖文件在当前目录不存在时,make 会在此变量所指定的目录下去寻找这些依赖文件。通常我们都是用此变量来指定规则的依赖文件的搜索路径。其实“VPATH”变量所指定的是 Makefile 中所有文件的搜索路径,包括了规则的依赖文件和目标文件。定义变量“VPATH”时,使用空格或者冒号(:)将多个需要搜索的目录分开。make搜索目录的顺序是按照变量“VPATH”定义中的目录顺序进行的(当前目录永远是第一搜索目录)。
b.选择性搜索
“vpath”关键字(全小写的)
它的使用方法有三种:
1) vpath PATTERN DIRECTORIES
为所有符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目
录使用空格或者冒号(:)分开。
2) vpath PATTERN
清除之前为符合模式“PATTERN”的文件设置的搜索路径。
3) vpath
清除所有已被设置的文件搜索路径。
vapth 使用方法中的“PATTERN”需要包含模式字符“%”。“%”意思是匹配一个
或者多个字符,例如,“%.h”表示所有以“.h”结尾的文件。如果在“PATTERN”中
没有包含模式字符“%”,那么它就是一个明确的文件名,这样就是给定了此文件的所在目录。