当前位置: 代码迷 >> 综合 >> 【Makefile 学习笔记】1. 基础篇
  详细解决方案

【Makefile 学习笔记】1. 基础篇

热度:108   发布时间:2023-11-14 20:54:28.0

【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"
  相关解决方案