Makefile第一个规则的第一个目标将作为"终极目标",
以下目标将不会作为"终极目标":
1:目标名以"."号开始,但不跟"/"。("./"表示当前目录,"../"表示上一级目录)。
2:模式规则的目标(%.o:%.c)。
'终极目标'是执行make的唯一目的,'终极目标'所在规则作为第一个被执行的规则。
其他规则都是被重建'终极目标'连带出来的,所以其他目标在Makefile中顺序无关。
Example:
foo.o:foo.c foo.h
cc -c -g $@
1:foo.o是目标,foo.c foo.h为目标的依赖, cc -c -g $@ 是目标生成的规则。
2:如何确定目标是否过期。
1:foo.o是否存在,不存在则重建
2:foo.o是否比foo.c foo.h任意一个旧,如果旧则重建。
3:规则命令中没有明确指明使用头文件foo.h,而foo.c中使用了foo.h,
这样如果foo.h改变了,则此目标会被重建。如果foo.h不在依赖中,若foo.h变化,则目标不会重建。
规则的语法格式:
TARGETS:PREREQUISITES
COMMAND
……
或者:
TARGETS:PREREQUISITES;COMMAND
COMMAND
……
COMMAND作为独立命令行(Shell命令)执行时,必须以[TAB]开始,从第一条规则之后,所有以[TAB]开始的行都会被作为命令处理。
常规依赖和Read-Only依赖:
1:常规依赖:如果目标比常规依赖旧,则重建目标
2:Read-Only依赖:只要依赖存在,不关注和目标的新旧关系,目标都不会被重建,即使Read-Only依赖更新了。
注意:如果依赖同时出来在常规和Read-Only中,则以常规依赖看待。
TARGETS:PREREQUISITES|Read-Only-PREREQUISITES #"|"之后作为Read-Only依赖
COMMAND
……
文件名通配符:
可以使用如下通配符:"*",".","[...]"
使用的地方:
1:规则的目标和依赖中
2:规则的命令中,按照shell的方式展开
注意:
1:其他地方不可直接使用通配符,需要通过$(wailcard *.c) #将当前目录下所有以.c结尾的文件列出来。
2:如文件命中有*,则需要通过'\'转义
3:"~"在shell中代表当前用户的家目录
example1:
.PHONY clean
clean:
rm -rf *.o #shell 执行,删除当前目录下所有以.o结尾的文件
example2:
print:*.c
ls $? #"$?"表示依赖中变化的文件
touch print
example3:
object = *.c #此表示的是一个叫*.c的文件,而不是所有以.c结尾的文件
object := $(wildcard *.c) #表示当前目录下所有以.c结尾的文件
object := $(patsubst %.c,%.o,$(wildcard *.c)) #1:wildcard 将当前目录下所有.c结尾的文件列出,以空格隔开 2:patsubst 将所有文件的.c换成.o
阅读(1424) | 评论(0) | 转发(0) |