Makefile 配置和使用
相信作为ARM嵌入式开发人员,对Makefile一定不陌生,但总是容易忘记一些常用语法,所以在这做一些总结,以便快速查找。
1.基础
1.1基础语法
注意,Makefile是严格要求
intent使用的是tabs。
即command前为4位tab而不是4个spaces。
1.1.0 Makefile中一些GNU约定俗成的伪目标
| 伪目标 | 含义 |
|---|---|
| all | 所有目标的目标,其功能一般是编译所有的目标 |
| clean | 删除所有被make创建的文件 |
| install | 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去 |
| 列出改变过的源文件 | |
| tar | 把源程序打包备份. 也就是一个tar文件 |
| dist | 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件 |
| TAGS | 更新所有的目标, 以备完整地重编译使用 |
| check 或 test | 一般用来测试makefile的流程 |
伪目标并不是一个"目标(target)", 不像真正的目标那样会生成一个目标文件。
典型的伪目标是 Makefile 中用来清理编译过程中中间文件的 clean 伪目标, 一般格式如下:
.PHONY: clean
clean:
rm -f *.o
1.1.1依赖原则
依赖关系 和 生成目标的方法
#格式如下:
target ... : prerequisites ...
command
#示例:
all : test.o lib.o font.o
ld -o $@.elf $^
objcopy -O binary -S $@.elf $@.bin
command太长, 可以用 “\” 作为换行符.
1.1.2 规则中的通配符
| 符号 | 含义 |
|---|---|
| * | 表示任意一个或多个字符 |
| ? | 表示任意一个字符 |
| […] | ex. [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符, [0-9]表示 0~9中任意一个数字 |
| ~ | 表示用户的home目录 |
1.2变量
1.2.1变量定义(=、 :=、 ?=、 +=)
= 延时变量,只有被使用时才展开定义
:= 立即变量,定义时的赋值立即有效
?= 条件变量,当变量为空时才赋值
+= 追加赋值
1.2.2自动变量
Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下:
| 自动变量 | 含义 |
|---|---|
| $@ | 目标集合 |
| $% | 当目标是函数库文件时, 表示其中的目标文件名 |
| $< | 第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标 |
| $? | 比目标新的依赖目标的集合 |
| $^ | 所有依赖目标的集合, 会去除重复的依赖目标 |
| $+ | 所有依赖目标的集合, 不会去除重复的依赖目标 |
| $* | 这个是GNU make特有的, 其它的make不一定支持 |
1.2.3查看C文件的依赖关系
写 Makefile 的时候, 需要确定每个目标的依赖关系.
GNU提供一个机制可以查看C代码文件依赖那些文件, 这样我们在写 Makefile 目标的时候就不用打开C源码来看其依赖那些文件了.
#列出test.c所需的所有依赖
gcc -MM test.c
#将依赖信息写入文件test.d
gcc -M -MF test.d test.c
#编译test.c->test.o并把所需依赖写入test.d
gcc -c -o test.o test.c -MD -MF test.d
1.2.4命令参数变量
| 变量名 | 含义 |
|---|---|
| ARFLAGS | AR命令的参 |

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



