分类: 嵌入式
2011-07-25 21:59:42
target: dependency [denpency […]]
command
command
每一个命令的第一个字符必须是制表符,否则会出现“Missing Separator”错误并停止。
make如何知道更新?当目标的一个依赖或多个依赖体比目标体还新,make就会重新生成目标体。
make也可以指定伪目标,如下,
clean:
rm app *.o
当遇到目标体clean,由于没有依赖体,所以make认为目标体是最新的,而不去执行。
但是如果碰到有个clean的文件存在呢,那就没办法执行make clean了。怎么办?
make定义了个.PHONY特殊目标体。(make将不会查找是否已有目标体,而会直接执行命令)
.PHONY: clean
clean:
rm app *.o
递归展开变量
TOPDIR = /home/ubuntu/project
SRCDIR = $(TOPDIR)/src
简单展开变量
CC := gcc –o
CC += –O2
环境变量
make也可以读取环境变量,但是如果已有同名的变量,则外部环境变量无效。
自动变量
$@ | 规则中目标所对应的文件名(目标体) |
$<<> | 规则中第一个相关文件名(依赖体) |
$^ | 规则中所有文件列表,以空格为分隔符 |
$? | 规则中日期新于目标的所有文件列表,以空格为分隔符 |
$(@D) | 目标文件的目录部分 |
$(@F) | 目标文件的文件名部分 |
预定义变量
AR | ar |
AS | as |
CC | cc (C编译程序) |
CPP | cpp(C预处理程序) |
RM | rm -f |
ARFLAGS | 默认值为rv |
ASFLAGS | 没有默认值 |
CFLAGS | 没有默认值 |
CPPFLAGS | 没有默认值 |
LDFLAGS | 没有默认值 |
模式规则提供了扩展隐式规则的一个办法,如下例,
%.o: %.c
$(CC) –c $(CFLAGS) $(CPPFLAGS) $< –o $@
-f | 指定makefile的文件名 |
-Idirname | 指定被包含的makefile所在的目录 |
-n | 不执行只打印命令 |
-s | 执行时不打印命令 |
-d | 打印调试信息 |
-w | 如果make在执行时改变目录,则打印当前目录名 |
-i | 即使某个命令返回非零的退出状态值,仍继续执行 |
-k | 即使某个目标编译失败,仍继续执行 |