Makefile 配置和使用

Makefile 配置和使用

相信作为ARM嵌入式开发人员,对Makefile一定不陌生,但总是容易忘记一些常用语法,所以在这做一些总结,以便快速查找。

1.基础

1.1基础语法

注意,Makefile是严格要求intent使用的是tabs
command前为4位tab而不是4个spaces

1.1.0 Makefile中一些GNU约定俗成的伪目标

伪目标 含义
all 所有目标的目标,其功能一般是编译所有的目标
clean 删除所有被make创建的文件
install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
print 列出改变过的源文件
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命令的参
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值