分类: 嵌入式
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 | 即使某个目标编译失败,仍继续执行 |