掌握Makefile编写的实用技巧与注意事项
本文将深入探讨Makefile的编写心得,包括Makefile的基本结构、获取方式、关键语法以及注意事项。Makefile是Unix/Linux系统中常用的构建工具,用于自动化管理和编译源代码。以下是主要内容概要: 1. **Makefile的基本概念与获取**: - Makefile项目的地址为:http://savannah.gnu.org/projects/make/ - 获取Makefile的方法分为两步:首先检查$MAKEFILES路径,通常它会在当前目录下或上级目录中查找。如果没有,则可以从指定目录(如`/usr/gnu/include`, `/usr/local/include`, `/usr/include`)搜索。此外,Makefile的全局变量定义也很重要,如`ifeq`, `ifndef`, `include`等。 2. **关键语法部分**: - **变量定义和条件语句**: - 变量的两种常用定义方法:`=`用于简单赋值,`+=`用于追加。 - 条件语句如`ifeq`和`ifndef`用于根据特定条件决定是否执行某些命令。 - 检查变量是否已定义是编写Makefile的关键环节,如`ifeq VARIABLES, defined`。 - **shell命令和函数**: - 使用`$(shell)`执行shell命令,例如获取环境变量或动态计算路径。 - 包括其他Makefile文件时要注意路径问题,避免全局搜索,可以使用`-I`选项指定包含目录。 3. **规则与目标管理**: - 使用`.PHONY`关键字声明伪目标,它们不会依赖于文件的存在而自动执行。 - 文件依赖管理很重要,比如`$(wildcard)`用于匹配文件模式,`%.o: %.c`表示目标对象文件由源代码生成。 4. **Makefile结构与规则编写**: - 通过`.SUFFIXES`定义扩展名到后缀处理程序的映射,如`.c.o`。 - 通过`%.target: %dependencies`定义规则,如编译规则。 - 当前目录和子目录的处理需要遵循一定的规则,如目录结构不应影响编译过程。 5. **注意事项**: - 确保Makefile中的规则具有明确的目标和依赖关系,避免混淆。 - 使用`default`或`.DEFAULT_GO`设置默认目标,方便用户执行。 - 避免在Makefile中直接写入可执行的shell命令,以防安全风险。 Makefile编写需要对语法、规则和依赖有深入理解,并且注意结构清晰、逻辑合理。通过本文的学习,读者能够更好地掌握Makefile的使用技巧,提升项目构建效率。
Make 执行过程:
! 1、2...单独的数字编号表示顺序
! 2.1、2.2....表示并列,顺序交替进行
一.读取Make脚本:
1.读取环境变量MAKEFILES指定的文件:
!读取过程和Makefile相同
! MAKEFILES指定的文件中的规则目标不能做为最终目标。
! MAKEFILES指定的文件不存在时Make不会产生错误。
2.读取Makefile内容:
2.1 读取变量定义
2.1.1 递归展开式变量:变量中存在的其他变量(或函数)不被展开。
2.1.2 直接展开式变量:变量中存在的其它变量(或函数)被递归展开:
1.执行变量中的函数
2.展开变量中其他变量
! .VARIABLES 中包含所有已经读取的全局变量列表
2.2 读取指示符(ifdef ifndef ifeq ifneq)
2.2.1 执行指示符参数中的函数
2.2.2 展开指示符参数中的变量
2.2.3 决定是否读入包含在指示符中的Makefile语句。
2.3 读取直接调用函数(如:$(shell ...))
1.展开函数参数中的变量
2.执行函数
2.4 读取包含的其他Make文件:递归读取
1.执行include 参数中的函数
!没有指定所在的路径时,Make会搜索以下目录:
-I 或--include-dir 指定的目录
/usr/gnu/include
/usr/local/include
/usr/include
!只有当Makefile全部被读入后,include包含有找不到的文件才会报出,因为被包含的文件很可能在后面的规则中生成。
!-include 等价于 sinclude(兼容性更好)
!MAKEFILE_LIST 环境变量包含已经读入的所有Makefile文件名,可以使用此变量判断最后被include的文件名。
2.5 读取规则:
!读取时不会展开规则中的变量,执行规则中的函数
二.更新读取的内容:
1. 寻找所有创建include参数的规则
1.寻找显示规则
2.寻找隐含规则
2. 执行规则(包括建立依赖链和规则执行)
3. 如果规则指令被执行,重新读取Make脚本。
! Make 的-t、-q、-n选项对更新Makefile文件的规则不起作用,同样会真正执行此规则。
三.建立目标依赖链:
1.执行目标或依赖中的函数
2.展开目标或依赖中的变量
3.建立依赖关系链,自动推倒缺省链
!模式规则的匹配和替换,模式匹配算法:
1.分离目标T为目录D和文件N。
2.匹配T或者N,有'/'符号用T匹配,没有则用N匹配。
3.只要存在一条模式规则,则排除非最终万用规则;排除没有命令的模式规则,因为这类模式规则没有意义。
4.匹配目标,计算茎S,计算依赖文件,如果有目录D同时将D加到每个依赖文件的前面。
剩余10页未读,继续阅读
- 粉丝: 84
- 资源: 23
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦