Linux下规范性Makefile规则
文件目录
- bsp
- clk (时钟驱动)
- bsp_clk.c
- bsp_clk.h
- delay (延时驱动)
- bsp_delay.c
- bsp_delay.h
- led (LED驱动)
- bsp_led.c
- bsp_led.h
- clk (时钟驱动)
- imx6ul
- cc.h (变量类型声明)
- fsl_common.h (NXP官方SDK通用宏定义文档)
- fsl_iomuxc.h (NXP官方SDK寄存器地址定义文档)
- imx6ul.h (常用头文件)
- MCIMX6Y2.h (NXP官方SDK寄存器结构体和相关位定义文档)
- obj
.o文件目标地址 - project
- main.c (主函数)
- start.S (启动文件)
Makefile
1 |
|
细节
工具配置
1 |
|
目录与文件管理
1 |
|
patsubst
:
-
函数用法:
$(patsubst <pattern>,<replacement>,<text>
-
名称:模式字符串替换函数——patsubst。
-
功能:查找
<text>
中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>
,如果匹配的话,则以<replacement>
替换。这里,<pattern>
可以包括通配符“%”,表示任意长度的字串。如果<replacement>
中也包含“%”,那么<replacement>
中的这个“%”将是<pattern>
中的那个“%”所代表的字串。(可以用“\”来转义,以“%”来表示真实含义的“%”字符) -
返回:函数返回被替换过后的字符串。
-
示例:
$(patsubst %.c,%.o, a.c b.c)
,把字串“a.c b.c”符合模式[%.c]的单词替换成[%.o],返回结果是“a.o b.o”
源码文件收集
1 |
|
foreach
:
-
用法:
$(foreach <var>, <list>, <expr>)
-
功能:遍历
<list>
中的每个元素,将元素赋值给<var>
,然后展开<expr>
,最终将所有展开结果合并成一个空格分隔的字符串。 -
示例中的用法:遍历
SRCDIRS
中的每个目录,收集所有.S
和.c
文件的完整路径。dir
依次取SRCDIRS
中的值(如project
,bsp/clk
等)$(wildcard $(dir)/*.S)
展开为dir
目录下所有.S
文件的路径(如project/start.S, bsp/clk/clk.S
)。- 最终
SFILES
是所有.S
文件的路径列表,CFILES
是所有.c
文件的路径列表。
wildcard
:
- 用法:
$(wildcard <pattern>)
- 功能:匹配符合
<pattern>
的文件路径,支持通配符 * 和 ?。 - 示例中的用法:在
foreach
循环中,为每个dir
目录生成文件列表。
生成二进制文件
1 |
|
编译规则
1 |
|
-nostdlib
:不链接标准库,适用于裸机程序-O2
:优化等级为2$(INCLUDE)
:包含头文件目录的-I
选项
1 |
|
清理规则
1 |
|
完整流程:
- 收集源码路径:
SFILES = project/start.S bsp/clk/clk.S
CFILES = project/main.c bsp/clk/clk.c
- 提取文件名:
SFILENDIR = start.S clk.S
CFILENDIR = main.c clk.c
- 生成目标文件列表
SOBJS = obj/start.o obj/clk.o
COBJS = obj/main.o obj/clk.o
OBJS = obj/start.o obj/clk.o obj/main.o obj/clk.o
- 编译时
- Make 根据
VPATH
在project
和bsp/clk
目录中查找start.S
和clk.c
等文件。
- Make 根据
Linux下规范性Makefile规则
http://akichen891.github.io/2025/03/02/Linux下规范性Makefile规则/