摘要:该文章次要介绍makefile,一种常用语GNU gcc编译的工具语言,同时LiteOS也是利用该文件对工程项目进行make构建生成执行文件的。

LiteOS源码中应用makefile进行文件的批处理编译和连贯到生成文件,如果在应用LiteOS来设计工程时应用GNU编译器进行编译,个别会都会应用到makefile进行编译和链接程序,如果应用的Keil或IAR的编译器进行编译则在Keil IDE或IAR IDE中设置编译器信息和文件包换门路就能够了进行编译链接和输入文件。

1、makefile介绍

简略的说makefile就是make执行的文件,将代码变成可行性文件的的过程叫做编译,组成一系列文件的编译叫做构建(build),Make是GNU提供的构建工具,次要用C、C++我的项目的构建编译过程,要学会应用Make,咱们就须要学会应用makefile编写,makefile,该文件形容了如何编译和链接由几个C源文件和几个头文件组成的文本编辑器。当明确要求时,makefile还能够通知make如何运行其余命令(例如,删除某些文件作为清理操作)

1.1 makefile 规定

一个简略的makefile由具备以下形态的“规定”组成:

target … : prerequisites …        recipe        …        …

target(指标)通常是由程序生成的文件的名称。指标的示例是可执行文件或指标文件。指标也能够是要执行的操作的名称,例如“clean”;

prerequisites(前置条件)是一个文件,该文件用作创立指标的输出。一个指标通常取决于几个文件;

recipe(命令)是一种要执行的动作。配方可能在同一行上或在本人的行上具备多个命令。请留神:您须要在每个配方行的结尾增加一个制表符!这是一个含糊的中央,引起了人们的留神。如果您心愿在食谱中应用制表符以外的其余字符作为前缀,则能够将.RECIPEPREFIX变量设置为其余字符

"指标"是必须的,不可省略;"前置条件"和"命令"都是可选的,然而两者之中必须至多存在一个。

一条规定阐明了如何以及何时从新制作作为特定规定指标的某些文件。 make依据创立或更新指标的先决条件执行办法。规定还能够解释如何以及何时执行某项操作。一个makefile可能蕴含除规定之外的其余文本,然而一个简略的makefile只需蕴含规定。规定看起来可能比此样例中显示的要简单一些,但所有规定或多或少都适宜该模式。

1.2Makefile 语法

① # 示意正文

② 通配符用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 统一,次要有星号()、问号(?)和 [...] 。比方, .o 示意所有后缀名为o的文件。

③ %模式匹配

如须要编译当前目录下a.c和b.c两个文件,原来的写法是:

a.o: a.cb.c: b.c

利用%能够简写为:

%.o : %.c

在解决大量同类型文件时既能够利用%简写文件

④ “=” 自定义变量

txt = Hello Worldtest:    @echo $(txt)

下面的 txt代替的了“Hello World”

同时基于“=” Makefile提供了(=、:=、?=、+=)四个赋值运算操作。

⑤ 内置变量

Make有本人的操作变量,特指一些本人的性能命令;如:$(CC) 指向以后应用的编译器,$(MAKE) 指向以后应用的Make工具

具体变量规定可参考:https://www.gnu.org/software/...

⑥ 主动变量(Automatic Variables)

makefile提供一些与规定相干的变量,罕用的有:

(1)$@ -----指代以后指标

(2)$< -----指代第一个前置条件

a.txt: b.txt c.txt    cp $< $@ 

下面的代码和上面的代码统一

a.txt: b.txt c.txt    cp b.txt a.txt 

$< 指代第一个前置条件,即“b.txt”;$@ 指代目标值即“a.txt”

(3)$? ------ 指代比指标更新的所有前置条件,之间以空格分隔。比方,规定为 t: p1 p2,其中 p2 的工夫戳比 t 新,$?就指代p2。

(4)$^ ------ 指代所有前置条件,之间以空格分隔。比方,规定为 t: p1 p2,那么 $^ 就指代 p1 p2 。

(5)$* ------ 指代匹配符 % 匹配的局部, 比方% 匹配 f1.txt 中的f1 ,$* 就示意 f1。

(6)$(@D) 和 $(@F)------ 别离指向 $@ 的目录名和文件名。比方,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。

(7)$(<D) 和 $(<F) ------ 别离指向 $< 的目录名和文件名。

1.3 makefile 循环

Makefile应用 Bash 语法,实现判断和循环。

如ifeq -- else -- endif 应用

ifeq ($(CC),gcc)  libs=$(libs_for_gcc)else  libs=$(normal_libs)endif

以上代码通过判断编译器是否为gcc决定编译不同的门路。

1.4 makefile 函数

Makefile 提供一些内置函数,应用格局如下:

$(function arguments)# 或者${function arguments}

内建函数如下表:具体函数参考门路(https://www.gnu.org/software/...

2.mikefile文件编写

如下文件编译一个C语言工程,蕴含main.c kdb.c display.c 三个源文件及defs.h、command.h、两个头文件

编译代如下:

edit : main.o kbd.o command.o display.o     cc -o edit main.o kbd.o command.o display.omain.o : main.c defs.h    cc -c main.ckbd.o : kbd.c defs.h command.h    cc -c kbd.ccommand.o : command.c defs.h command.h    cc -c command.cdisplay.o : display.c defs.h    cc -c display.cclean :     rm edit main.o kbd.o command.o display.o.PHONY: edit clean

该代码中,清空了输入文件,而后利用gcc编译器编译了三个头文件和两个文件。

本文分享自华为云社区《一文读懂LiteOS中的“makefile”文件(1)----makfile简介》,原文作者:o0龙龙0o 。

点击关注,第一工夫理解华为云陈腐技术~