首页 > 代码库 > 工程化管理Makefile的学习(一)
工程化管理Makefile的学习(一)
引言:
Makefile是嵌入式软件开发环境中的智能管家,尤其面对文件数量达到数十个以上的项目时,利用它可为我们构造高效的项目编译系统,从而显著的提高项目的开发效率和后期更新维护,同时也可以增强代码的重复利用率。
学习Makefile首先明确3个重要概念
1、目标(Target):指运行make后生成的目标文件。
2、依赖关系(Dependency):指明目标文件与其他文件、中间目标文件的依赖关系;其中被依赖的目标又称为依赖目标的先决条件(Prerequisite)。
3、命令(Command):告诉Makefile如何生成目标。
编写Makefile文件之前,首先要熟悉文件之间的依赖关系,可用UML构建一个"依赖树", 然后再利用Makefile中变量、函数按照规则表达依赖树即可。
今天就学习下里面经常用到的变量:
.PHONY:xxx 其中xxx为伪目标,一般命名为clean, 其主要作用就是避免文件列表中的文件名与clean重名,造成无法重新make.
自动变量:
$@: 用于表示一个规则中的目标。 当一个规则中有多个目标时, $@所指的是其中任何造成规则命令被运行的目标。
$^ :表示的是规则中的所有先决条件。
$< :标识规则中的第一个先决条件。
特殊变量:
MAKE——表示当前处理Makefile的命令名是什么。
MAKECMDGOALS——表示当前构建的目标名。
注意运行make时可以同时指定多个目标,当make获得了多个目标以后, 将以从左到右的顺序逐个地构建目标。
变量的类别和赋值:
变量的类别分为两大类:
1、递归扩展变量——只用一个“=”定义的变量称为递归扩展变量(Recursively expanded varible), 对该类变量的引用是递归的。
2、简单扩展变量——用“:=”定义的变量是称为简单扩展变量(Simple expanded varible), 对该类变量make只做一次展开。
同时Makefile中也可以实现条件赋值和追加赋值
条件赋值“?=” :变量没有定义时就将等号右边的值赋给变量;如果已经定义则不改变变量原值;
追加赋值“+=”: example
.PHONY:clean objects = main.o fun1.o objects += fun2.o<pre name="code" class="cpp">clean: rm objects