第三章:Makefile 的规则

本章我们开始讨论 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”参数

你可能感兴趣的:(第三章:Makefile 的规则)