本章我们开始讨论 Makefile的一个重要内容,Makefile的规则:
常规则的语法格式如下:
TARGETS : PREREQUISITES
COMMAND
......
或
TARGETS : PREREQUISITES ; COMMAND
COMMAND
......
依赖的类型:
1. 在以前章节所提到的规则中使用的是常规依赖,这是我们书写的 Makefile 规则中最常用的一种。
2. 另外一种在我们书写 Makefile 时不会经常使用,它比较特殊、称之为“order-only”依赖.
在书写规则时,“order-only”依赖使用管道符号“|”开始,作为目标的一个依赖文件。格式如下:
TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES
Makefile中统配符可以出现在以下两种场合:
1. 可以用在规则的目标、依赖中,此时 make会自动将其展开;
2. 可出现在规则的命令中,其展开是在 shell 在执行此命令时完成。
除这两种情况之外的其它上下文中,不能直接使用通配符。需要通过函数“wildcard”(objects = $(wildcard *.o))
变量定义中使用的通配符不会被展开
函数wildcard:
用法:变量 = $(wildcard PATTERN...)
变量 = $(patsubst %.c,%.o,$(wildcard *.c)) 得到的是当前目录下以.c为结尾的对应的.o文件的名称集合
一般搜索(变量VPATH):变量“VPATH”的定义中,使用空格或者冒号(:)将多个目录分开
选择性搜索(关键字vpath):
它的使用方法有三种:
1、vpath PATTERN DIRECTORIES
2、vpath PATTERN
清除之前为符合模式“PATTERN”的文件设置的搜索路径。
3、vpath
清除所有已被设置的文件搜索路径。
自动化变量:
“$^”代表所有的是的通过目录搜索得到的依赖文件的完整路径名目录+一般文件名)列表
“$@”代表规则的目标
伪目标:
.PHONY: clean
clean:
rm *.o temp
对多个目录进行 make 的实现方式可以在一个规则中可以使
用 shell 的循环来完成。如下:
SUBDIRS = foo bar baz
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
foo: baz
MAKEFILE特殊目标
PHONY:
目标“.PHONY”的所有的依赖被作为伪目标。伪目标时这样一个目标:当使用make命令行指定此目标时,这个目标所在规则定义的命令、无论目标文件是否存在都会被无条件执行
.SUFFIXES:
特殊目标“SUFFIXES”的所有依赖指出了一系列在后缀规则中需要检查的后缀名(就是当前make需要处理的后缀)
.DEFAULT
Makefile中,目标“.DEFAULT”所在规则定义的命令,被用在重建那些没有具体规则的目标(明确规则和隐含规则)。就是说一个文件作为某个规则的依赖,但却不是另外一个规则的目标时。Make程序无法找到重建此文件的规则,此种情况时就执行“.DEFAULT”所指定的命令。
自动产生依赖
现代的 c 编译器提供了通过查找源文件中的“#include”来自动产生依赖的功能。“GCC”支持一个“-M”的选项来实现此功能
例如,如果“main.c”只包含了头文件“defs.h”
当需要依赖关系中不考虑标准库头文件时,需要使用“-MM”参数