makefile语法基础

1、什么是makefile?
  • makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作。
  • makefile 就是“自动化编译”,告诉make命令如何编译和链接。
2、makefile里有什么?

makefile包含以下五个:

  • 显示规则
  • 隐晦规则
  • 变量定义
  • 文件指示
  • 注释
3、makefile的规则
target ...  :  prerequisites ...
command
或者:
target ... : prerequisites... ;command

  • target:目标文件。可以是Object File,也可以是执行文件,还可以标签(Label)
  • prerequisites:依赖文件,既要生成那个target所需要的文件或其他target
  • command:make需要执行的命令

makefile 示例

#当前目录存在main.c tool.c tool.h三个文件
#下面是makefile文件内容
main: main.o too.o
    gcc main.o tool.o -o main
.PHONY: clean
clean:
   -rm main *.o
----------------------------------------------
//执行make后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
//生成一个可执行文件main
gcc main.o tool.o -o main
  • -o:指定可执行文件的名称。
  • clean:标签,不会生成“clean”文件,这样的target称之为伪目标,伪目标的名字不能和文件的名字重复。clean一般放在文件最后。
  • .PHONY:显示的表明clean是一个伪目标。
4、makefile是如何工作的?

默认方式下,输入make命令后:

  • make会在当前目录下找名字叫“Makefile”或者“makefile”的文件。
  • 如果找到,他会找文件中第一个目标文件(target),并把这个target作为最终的目标文件,如前面实例中的main。
  • 如果main文件不存在,或main所依赖的.o文件的修改时间要比main文件要新,那么它会执行后面所定义的命令来生成main文件。
  • 如果main所依赖的.o文件也存在,那么make会在当前文件中到目标为.o文件的依赖性,若找到则根据规则生成.o文件。
  • make再用.o文件声明make的最终任务,也就是执行文件“main”。
5、makefile中使用变量?
  • 为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成c语言中的宏可能更好。
  • 比如,我们生成一个变量,叫objects,于是,我们就可以很方便的在我们的makefile中以$(objects)的方式来使用这个变量了。
objects = main.o tool.o
main: $(objects)
    gcc $(objects) -o main

.PHONY:clean
clean:
    -rm main $(objects)
-------------------------------------------
//执行make后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
//生成一个可执行文件main
gcc main.o tool.o -o main
6、makefile中如何引用其他的makefile?
  • 使用include关键字可以把其它Makefile包含进来,include语法格式:
    include <filename>
#语法格式
include <filename>
#举个例子,你有这样几个 Makefile: a.mk、b.mk、c.mk,还有一个文件叫 foo.make,以及一个变量$(bar),其包含了e.mk 和 f.mk 
include foo.make *.mk $(bar)
#等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
#如果文件找不到,而你希望make时不理会那些无法读取的文件而继续执行,可以在include前加一个减号“-”,如:
-include <filename>
7、环境变量 MAKEFILES
  • 如果当前环境变量中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于 include 的动作。这个变量中的值是其它 Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的 makefile 的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。但是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的makefile都会受到它的影响,也许有时候makefile出现了奇怪的事,那么可以查看当前环境中有没有定义这个变量。
8、makefile预定义变量
9、makefile自动变量
9、makefile函数
#不带参数
define FUNC
$(info echo "hello")
endif
$(call FUNC)
-----------------------------
输出:hello

#带参数
define FUNC1
$(info echo $(1) $(2))
endif
$(call FUNC1,hello,world)
-----------------------------
输出:hello world
10、make的工作流程

GNU的make工作时的执行步骤如下:

  • 1 读入所有的Makefile。
  • 2 读入被include的其他Makefile。
  • 3 初始化文件中的变量。
  • 4 推到隐晦规则,并分析所有规划。
  • 5 为所有的目标文件创建依赖关系链。
  • 6 根据依赖关系,决定哪些目标要重新生成。
  • 7 执行生成命令
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,696评论 0 17
  • makefile关系到整个工程的编译规则,一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干的目录当中,...
    Joe_HUST阅读 1,879评论 0 3
  • makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程...
    Stan_Z阅读 1,622评论 2 15
  • 那这一次的分享,我会围绕社群这个主题去做复盘,为了让大家对社群玩法有更深度的了解,今天的内容我会分成两块。 第一块...
    花花有话说阅读 1,122评论 0 0
  • 彭臻华 文 1 县城一中,课外活动时间,身着藏青色保安服的刘立田挺直腰板在校园巡逻,把双手背在后面,一脸的严肃。...
    彭臻华阅读 215评论 0 1