前言
Makefile 问世并流行多年,互联网上早已拥有海量的相关学习文章、视频及书籍资料。因此这篇文章主要以个人的理解角度,来阐述 Makefile 的学习之路。
基础知识/概念
符号
- 符号
$
表示引用定义变量的值 - 符号
$@
目标的集合 - 符号
$<
依赖文件集合中的第一个文件;通常依赖文件是以(“%”)定义的,所以其表示为符合模式的一系列文件
Makefile格式
- 直接输入命令make,系统会默认以第一条规则的目标为最终目标; 也可以指定生成目标,比如make main、make clean
1 | 目标....: 依赖文件集合... |
规则模式与语法
模式规则
常用函数
进阶应用
Makefile父子文件配置
多目录管理
文件间变量如何共享?
如何组织工程
make menuconfig 原理
Automake 原理
Automake是GNU构建系统的一部分,它旨在简化软件项目的构建过程。Automake通过简化Makefile的编写,提供了一种更加高级和可移植的方式来描述软件项目的构建规则。
Automake使用一种称为”Makefile.am”的文件来描述构建规则,然后通过”aclocal”、”autoconf”和”automake”等工具生成最终的Makefile。
使用Automake可以使得构建规则更加清晰、简洁,并且具有更好的可移植性。
Automake还提供了一些高级功能,如支持多目录构建、自动化依赖关系管理、自动生成文件等。
这些功能使得Automake成为一个强大的构建工具,特别适用于大型和复杂的软件项目。
实际工程之应用开发
在单片机中的应用点
make 构建编译工程的时候,调用其它可执行程序将 bootloader、app两个bin文件合并为一个镜像文件
make 相应指令,调用 J-Flash 将编译生成镜像下载到单片机中
在Linux中的应用点
注意项及疑惑解答
Makefile 文件与 .mk 文件的区别与联系?
在实际使用中,通常将makefile文件的扩展名命名为.mk或者Makefile。在GNU Make工具中,.mk文件通常用于包含一组相关的规则,而Makefile文件通常用于包含整个项目的构建规则。
实际上,.mk文件和Makefile文件之间没有本质区别,它们都是Make工具所使用的构建规则文件。
通常情况下,.mk文件用于包含一组相关的规则,而Makefile文件用于包含整个项目的构建规则,但这只是一种惯例,实际上可以根据项目的需要来命名文件。
无论是.mk文件还是Makefile文件,它们都是Make工具所使用的构建规则文件,可以包含变量定义、目标规则、依赖关系等内容。
因此,在实际使用中,可以根据项目的需要来选择使用.mk文件或者Makefile文件,并没有严格的规定。
在Makefile中,是如何将每个需要编译生成.o目标文件与.c源文件关联起来的
1 | # addprefix用于在每个元素前面添加一个前缀:(OUTPUT_DIR)/ |
./configure命令
configure脚本由autoconf工具生成,在make命令之前先执行配置;执行此命令,配置编译器、库、工具等参数,并根据此参数生成一个Makefile
编译、包含依赖文件,避免重复编译、提高效率
在编译命令中加入-MMD
选项,告诉编译器生成依赖关系文件
在Makefile里的目标文件编译规则命令之后,加入-include $(wildcard $(OUTPUT_DIR)/*/*.d)