【Makefile 学习笔记】基础篇
学习自《专业嵌入式软件开发:全面走向高质高效编程》 第三章
Target: Hello Word
all:echo "HelloWorld"
test:echo "This is Test"
“假目标”
“假目标”无需考虑当前文件夹下的目标是否存在或者时间戳是否为最新,每次都会执行假目标的生成,如定义一个假目标clean:
.PHONY: clean
简单的编译项目
.PHONY:cleanCC = gcc
RM = rmTARGET = HelloWorld
OBJS = foo.o main.o${TARGET} : ${OBJS}@echo "build $@"@${CC} $^ -o HelloWorld
foo.o:@echo "build foo.o"@${CC} foo.c -o foo.o -c
main.o:@echo "build main.o"@${CC} main.c -o main.o -c
clean:@echo "clear output"@${RM} ${OBJS}@echo "ok"
- 使用@可以静默当前指令的显示
- 变量的用法:${变量} 或 $(变量)
- 自动变量说明:
- $@: 表示当前的Target, 例如在foo.o里调用 $@ ,就代表了foo.o
- $^: 当前Target的依赖列表
- $<: 当前Target的依赖列表的第一项。
特殊变量
- MAKE: 当前处理makefile的指令, 一般是make
- MAKECMDGLOALS: 当前的构建目标名,例如make clean ,那么该变量的值为clean
变量赋值
- = :直接赋值,如果右值是变量,则右值递归展开
- := :直接赋值,如果右值是变量,则只展开一次
- ?= :直接赋值,如果左值已经存在,则不赋值
- += :追加赋值,赋值类型为:=
变量引用:后缀替换
.PHONY=allfoo = a.c b.c c.c
bar := ${foo:.c=.o}all:@echo "bar = ${bar}"
变量引用:指定变量值
.PHONY=allfoo = helloall:@echo "foo = ${foo}"
bash:
make foo=hi
- 如果不想foo被指定,需要声明 override
override foo = hello
模式
.PHONY:cleanCC = gcc
RM = rmTARGET = HelloWorld
OBJS = foo.o main.o${TARGET} : ${OBJS}@echo "build $@"@${CC} $^ -o HelloWorld
foo.o:@echo "build foo.o"@${CC} foo.c -o foo.o -c
main.o:@echo "build main.o"@${CC} main.c -o main.o -c
clean:@echo "clear output"@${RM} ${OBJS}@echo "ok"
使用“模式”可以精简为:
.PHONY:cleanCC = gcc
RM = rmTARGET = HelloWorld
SOURCE = foo.c main.c func.c
OBJECTS = ${SOURCE:.c=.o}${TARGET}: ${OBJECTS}${CC} -o $@ $^
%.o: %.c${CC} -o $@ -c $^clean:@echo "clear output"@${RM} ${OBJECTS}@echo "ok"