一个Makefile的进化(二)

一个Makefile的进化(二)

代码分离与通用Makefile

这一篇接着对Makefile进行修改
目的:

  1. 将代码与生成文件进行分离
  2. 使得Makefile具有更广泛的通用性
  3. 使Makefile看起来更牛逼(哈哈哈)

涉及知识:

  1. makefile的include
  2. 修改makefile的隐含规则
  3. makefile中的函数使用

涉及的测试文件:

string@asus:~/Projects/makefile$ tree 
.
├── include
│   └── test.h
├── Makefile
└── src
    ├── Makefile
    ├── test.c
    └── test_fun1.c

主Makefile

CPPFLAGS:=-Iinclude
OUTDIR:=out
SRCDIR:=src
PROJECT:= $(notdir $(SRCDIR)) 
include $(SRCDIR)/Makefile
OBJS=$(addprefix $(OUTDIR)/,$(OBJ))

$(OUTDIR)/%.o:$(SRCDIR)/%.c
    $(CC) -c $(CPPFLAGS) $< -o $@

all:$(OUTDIR) .build.stamp

$(OUTDIR):
    mkdir $@

.build.stamp: $(OBJS)
    gcc $^ -o $(OUTDIR)/$(PROJECT)
    touch $@ 

clean:
    $(RM) .build.stamp
    rm -rf $(OUTDIR)

.PHONY : clean 

子目录的Makefile

PROJECT=test
OBJ+= test.o test_fun1.o

代码解释:
完成代码与代码的分离需要修改隐含的规则,因为默认的规则会到目标.o对应的目录去寻找.c,为了将其进行分离重新进行规则设计,对应代码中的下面两行

$(OUTDIR)/%.o:$(SRCDIR)/%.c
       $(CC) -c $(CPPFLAGS) $< -o $@

单独摘出来应该很容易理解了,这两行的目的就是当有需要OUTDIR目录下的.o的时候就去SRCDIR的目录寻找对应的.c

下面两行代码需要解释一下

OBJS=$(addprefix $(OUTDIR)/,$(OBJ))
PROJECT:= $(notdir $(SRCDIR)) 

第一行使用了Makefile的一个函数,addprefix,这个函数是增加前缀函数,作用是在$(OBJ)这个变量的每一个字符串前面加上$(OUTDIR),
示例中OUTDIR为:OBJ+= test.o test_fun1.o,
这个函数调用后:OBJS=out/test.o out/test_fun1.o
第二行使用了Makefile的取文件名函数,虽然在这里不是文件名,但是我们利用Makefile的特性获得一个项目名称该行执行后PROJECT=src,虽然在这里看起来没有作用,这样设计是有原因的,后面会讲到

以上Makefile最终会展开成下面的代码

out/%.o:src/%.c
    $(CC) -c -Iinclude $< -o $@
all:out .build.stamp
out:
    mkdir $@
.build.stamp: out/test.o out/test_fun1.o
    gcc $^ -o out/src
    touch $@ 
clean:
    $(RM) .build.stamp
    rm -rf out
.PHONY : clean 

展开以后的Makefile是不是很容易理解了,纯手工展开,实在是太麻烦了,这部分工作还是交给Makefile去做吧
但是展开后的代码只能完成我们本文的第一个目标:代码分离

为什么Makefile要写成那个没有展开的Makefile,写着也有点费力,理解也费力,但是这么写终归是有原因的,下面我们见证以下如何完成本文的第二个目标,第二个目标完成后你就会觉得很多Makefile的写法瞬间理解了

注意一下子目录的Makefile是不是写的很简单,但是该Makefile不能单独使用,需要使用主目录包含后才能起作用,如果我们拥有很多个类似的项目此时就不需要每一个项目写一个麻烦的Makefile,只需要仿照子目录下的那个Makefile写下简单的几行就可以了,下面我们做一下测试

  1. 首先复制一份src的代码用于测试,复制到serial
  2. 修改src的复制代码的Makefile,在此只修改PROJECT
  3. 执行make SRCDIR=serial查看测试结果

serial修改后的Makefile如下

PROJECT=serial
OBJ+= test.o test_fun1.o

执行结果如下

string@asus:~/Projects/makefile$ make SRCDIR=serial 
mkdir out
cc -c -Iinclude serial/test.c -o out/test.o
cc -c -Iinclude serial/test_fun1.c -o out/test_fun1.o
gcc out/test.o out/test_fun1.o -o out/serial
touch .build.stamp 

请注意一下编译的文件是serial/test.c serial/test_fun1.c这说明了我们编译的是serial目录下的文件生成的目标为serial,在此说明一下:serial下的Makefile中的PROJECT可以不赋值,会得到同样的结果,这时由于在主Makefile下有语句
PROJECT:= (notdir(SRCDIR))
这一句会使用目录SRCDIR目录名作为项目名称赋值给PROJECT

至此本文已经解决完两个目标,至于第三个目标(呵呵),解决完前两个问题第三个还是问题吗 哈哈哈

这个Makefile只作为简单理解Makefile中的一些机制,在linux,openwrt,buildroot,busybox等开源软件中都有大量使用这些规则,如果想更深入的理解Makefile还需要在实际工作中去学习

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

推荐阅读更多精彩内容

  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,605评论 0 17
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,618评论 0 10
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,018评论 2 34
  • 善用时间就是善待生命。第二次进入易效能。90天践行又开始了
    王子_c8e8阅读 168评论 0 0
  • 突然想起这句话。 第一次看见是在三毛的小说里。那时候是高三,紧张而又忙碌的生活从未让我感到压力。我想那时并不是...
    小律管海鑫阅读 306评论 2 2