首页 > 代码库 > 工程化管理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