模仿u-boot的makefile结构

u-boot(2014.04)是通过顶层makefile调用各子目录中的makefile来实现整个工程的编译的,实际上子目录的makefile是include进来的。这里仿照这种结构写个模板测试一下。

目录结构:

mytest:

  add:

    mul:

      Makefile

      mul.c

      mul.h

    add.c

    add.h

    Makefile

  main:

    main.c

    Makefile

  scripts:

    Makefile.build

    Makefile.clean

    Makefile.lib

  sub:

    div

      div.c

      div.h

      Makefile

    sub.c

    sub.h

    Makefile

顶层Makefile:

 1 CC := gcc
 2 LD := ld
 3 
 4 CFLAGS := -g
 5 
 6 PHONY := all
 7 
 8 target := mainApp
 9 
10 # default target
11 all: $(target)
12 
13 # dirs to be compiled
14 src-dirs += add/
15 src-dirs += sub/
16 src-dirs += main/
17 
18 # libs to be linked
19 libs-y := $(patsubst %/,%/built-in.o,$(src-dirs))
20 
21 src-dirs := $(patsubst %/,%,$(src-dirs))
22 
23 # include dirs
24 inc-dirs := $(addprefix -I,$(src-dirs))
25 
26 # the Makefile for building
27 build := -f scripts/Makefile.build obj
28 
29 CFLAGS += $(inc-dirs)
30 export CC LD CFLAGS
31 
32 
33 PHONY += $(src-dirs)
34 
35 # linking
36 $(target): $(src-dirs)
37     $(CC) -o $@ $(libs-y)
38 
39 # compiling source dirs
40 $(src-dirs):
41     make $(build)=$@
42 
43 # Clean
44 clean-dirs := $(foreach f,$(src-dirs),$(if $(wildcard $f/Makefile),$f))
45 clean-dirs := $(addprefix _clean_, $(clean-dirs))
46 PHONY += clean $(clean-dirs)
47 
48 # descending to subdirs for cleaning
49 $(clean-dirs):
50     make $(clean)=$(patsubst _clean_%,%,$@)
51 
52 # just simply remove .o and target 
53 clean: $(clean-dirs)
54     @find . \( -name '*.o' -o -name '$(target)' \) -type f | xargs rm -f 
55 
56 clean := -f scripts/Makefile.clean obj
57 .PHONY : $(PHONY)

顶层Makefile确定target,要编译的源码目录,include的路径。

第41行使用scripts/Makefile.build对各个源码目录进行编译,Makefile.build为实际编译代码的makefile,内容如下:

 1 src := $(obj)
 2 
 3 PHONY := __build
 4 
 5 obj-y := 
 6 
 7 # include the Makefile in the $(obj) dir
 8 build-dir := $(src)
 9 build-file := $(build-dir)/Makefile
10 include $(build-file)
11 
12 # include scripts/Makefile.lib
13 include scripts/Makefile.lib
14 
15 build := -f scripts/Makefile.build obj
16 
17 ifneq ($(strip $(obj-y)),)
18 builtin-target := $(obj)/built-in.o
19 endif
20 
21 # default target
22 __build: $(builtin-target) $(subdir)
23     @:
24 
25 # compiling .c files
26 $(obj)/%.o: $(src)/%.c
27     $(CC) -c $(CFLAGS) $< -o $@
28 
29 # subdir object
30 $(subdir-obj-y): $(subdir) ;
31 
32 # linking objs
33 $(builtin-target): $(obj-y)
34     $(LD) -r -o $@ $^
35 
36 PHONY += $(subdir)
37 
38 # descending to subdirs
39 $(subdir):
40     make $(build)=$@
41 
42 .PHONY : $(PHONY) 

obj变量为需要编译的源码目录,例如add,第10行将add/目录下的Makefile目录包含进来,add/Makefile内容如下:

1 obj-y += add.o
2 obj-y += mul/

这里仅仅确定需编译的文件以及子目录,回到makefile.build,第13行,包含scripts/Makefile.lib文件,内容如下:

1 subdir := $(patsubst %/,%,$(filter %/, $(obj-y)))
2 obj-y := $(patsubst %/,%/built-in.o, $(obj-y))
3 subdir-obj-y := $(filter %/built-in.o, $(obj-y))
4 
5 subdir := $(addprefix $(obj)/,$(subdir))
6 obj-y := $(addprefix $(obj)/,$(obj-y))
7 subdir-obj-y := $(addprefix $(obj)/, $(subdir-obj-y))

obj-y表示要编译的目标文件,如果是目录,如mul/,则表示mul/built-in.o;subdir表示要继续编译的子目录;subdir-obj-y表示子目录下的built-in.o

回到makefile.build,第18行,每个要编译的源码目录编译之后都将会产生一个built-in.o的文件,第27行,对.c文件进行编译,即由obj-y变量所确定的文件。第40行,对子目录执行同样的过程。第33行,对每个目录链接出一个built-in.o文件,这个built-in.o由当前目录下.o文件和子目录下的.built-in.o文件链接而成。

在所有的源码目录都经过编译之后,回到顶层makefile执行最后的链接,得到target。

再看看clean目标,第49行,首先在需要进行clean的目录下使用scripts/Makefile.clean执行clean,需要clean的目录为含有makefile的源码目录。Makefile.clean内容如下:

 1 src := $(obj)
 2 
 3 PHONY := __clean
 4 
 5 # default target
 6 __clean:
 7 
 8 clean := -f scripts/Makefile.clean obj
 9 
10 # include the Makefile in the $(obj) dir
11 build-dir := $(src)
12 build-file := $(build-dir)/Makefile
13 include $(build-file)
14 
15 # subdir to be cleaned
16 subdir := $(patsubst %/,%,$(filter %/,$(obj-y)))
17 subdir := $(addprefix $(obj)/,$(subdir))
18 
19 __clean-files :=
20 __clean-files := $(addprefix $(obj),$(__clean-files))
21 
22 __clean-dirs :=
23 __clean-dirs := $(addprefix $(obj),$(__clean-dirs))
24 
25 __clean: $(subdir)
26 ifneq ($(strip $(__clean-files)),)
27     rm -f $(__clean-files)
28 endif
29 
30 ifneq ($(strip $(__clean-dirs)),)
31     rm -rf $(__clean-dirs)
32 endif
33 
34 PHONY += $(subdir)
35 $(subdir):
36     make $(clean)=$@
37 
38 .PHONY: $(PHONY)

这里也是一个逐步往下clean的过程,要clean的文件由__clean-files变量指定。

回到顶层makefile,简单的一个find操作,删除目录下所有.o文件和目标。

关于include路径,u-boot讲所有头文件都集中放在了某几个目录下,于是源码中要包含其他头文件的时候是这样子做的xxx/xxx/xxx.h,我这里的main.c如下,其中对与mul和div的包含也是类似。

 1 #include <stdio.h>
 2 #include "add.h"
 3 #include "sub.h"
 4 #include "mul/mul.h"
 5 #include "div/div.h"
 6 
 7 void main(void)
 8 {
 9     int a = 1;
10     int b = 2;
11     printf("a = %d, b = %d\n", a, b);
12     printf("a + b = %d\n", add(a, b));
13     printf("a - b = %d\n", sub(a, b));
14     printf("a * b = %d\n", mul(a, b));
15     printf("a / b = %d\n", div(a, b));
16 }

u-boot的makefile对我来说还是太复杂了,这里仅仅是它的冰山一角,可是我已经吃不消了。。。

转载于:https://www.cnblogs.com/heyxiaotang/p/6438162.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我国机器视觉企业体量偏小,上游零部件占利润大头

来源&#xff1a;仪商网根据中国机器视觉产业联盟(CMVU)调查统计&#xff0c;目前进入中国市场的国际机器视觉企业和中国本土的机器视觉企业(不包括代理商)都已经超过200家&#xff0c;产品代理商超过300家&#xff0c;专业的机器视觉系统集成商超过70家&#xff0c;覆盖全产业…

php 后端 轻量 框架,GitHub - 22cloud/mixphp: 轻量 PHP 框架,基于 Swoole 的常驻内存型 PHP 高性能框架 (开发文档完善)...

高性能 • 轻量级 • 命令行MixPHP 是什么MixPHP 秉承 "普及 PHP 常驻内存型解决方案&#xff0c;促进 PHP 往更后端发展" 的理念而创造&#xff0c;采用 Swoole 扩展作为底层引擎&#xff0c;围绕常驻内存的方式而设计&#xff0c;提供了 Web / Console 开发所需的众…

技术面试问项目难题如何解决的_技术创新 | 降本增效,青海农信社项目小伙刻苦钻研解决联合支架设计难题!...

革新READ随着建筑技术的进步&#xff0c;建筑内部功能和机电系统越来越多样&#xff0c;带来机电管线的数量成倍增加。为节约建筑空间&#xff0c;提高建筑净高&#xff0c;保证系统功能&#xff0c;提升履约品质&#xff0c;越来越多的项目选择采用联合支架的形式将各类管线集…

AI研究过于集中狭隘,我们是不是该反思了?

来源&#xff1a;AI科技大本营译者 | 陆离编辑 | 夕颜【导读】2019年是AI领域更加冷静的一年&#xff0c;少了些喧嚣和泡沫&#xff0c;大浪淘沙留下的是经过检验的真正的AI研究者、实践者。但是你也许没有发现&#xff0c;本来被寄予厚望要解决一切“疑难杂症”的AI&#xff0…

svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢

一、内存占用过高1、造成服务器内存占用过高只有两种情况&#xff1a;内存溢出或内存泄漏(1)内存溢出&#xff1a;程序分配的内存超出物理内存的大小&#xff0c;导致无法继续分配物理内存&#xff0c;出现OOM报错。(2)内存泄漏&#xff1a;不再调用的对象一直占用着内存不释放…

Even Three is Odd

题意&#xff1a; 问题是对于所有的长度为n&#xff0c;且$1<ai<n$的整数序列求 $\prod_{i1}^{n-2}{max \{w_i,w_{i1},w_{i2}}\}$ 之和。 解法&#xff1a; 首先设dp状态为 $f(i,j,k)$ &#xff0c;长度为$i3$的&#xff0c;最大值为k&#xff0c;且最大值出现的位置集合…

中国图书评论协会2019年度“中国好书”

来源&#xff1a;腾讯网2019.12.16第1127次推送为读者发现好书&#xff0c;为好书寻找读者。“中国好书”月榜由我国权威的图书评测机构中国图书评论学会发布&#xff0c;志达书店经整理编辑&#xff0c;为您呈现“中国好书”2019年度榜单&#xff08;1-10月&#xff09;。寒假…

a标签居中 img vue,让html img图片垂直居中的三种方法

三种让img元素图片在盒子内垂直居中的方式教程&#xff0c;依据代码与文章教程熟习掌握并加以应用。一、使用flex完成垂直居中操纵css flex实现垂直居中。flex或许不是完成垂直居中最好的选择&#xff0c;由于IE8,9其实不赞成它。那时&#xff0c;为了用flex实现垂直居中&#…

python——面向对象相关

其他相关 一、isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 123456class Foo(object):passobj Foo()isinstance(obj, Foo)二、issubclass(sub, super) 检查sub类是否是 super 类的派生类 1234567class Foo(object):passclass Bar(Foo):passissubclass(Bar, Foo)三、异…

德国工业4.0眼里“工业互联网”与“智能制造”

来源&#xff1a;智造智库工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#xff0c;降…

php 正则匹配静态资源,Struts2 配置静态资源文件不经过Strut处理(正则匹配)

Struts2框架有两个核心配置文件&#xff1a;struts.xml和Struts2默认属性文件default.properties(在struts2-core-2.3.20.jar中)default.properties可以通过自己在classpath下写一个struts.properties文件进行定制改写为什么是struts.properties&#xff0c;这可以看org.apache…

全球数字孪生市场大预测:2025 年的 358 亿美元,年复合增长率(CAGR)高达 37.8%...

来源&#xff1a;云头条 数字孪生市场估计将从2019年的38亿美元猛增到2025年的358亿美元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;高达37.8%。推动数字孪生需求增长的几个因素包括&#xff1a;越来越广泛地采用物联网和云计算之类的技术用于实施数字孪生&#xff…

yii3正式版什么时候发布_事业单位联考结束,成绩什么时候发布?合格分数线怎么算?...

今天上午&#xff0c;2020下半年全国事业单位联考笔试结束了。笔试刚刚结束&#xff0c;很多考生问图图有没有此次联考的答案&#xff0c;那肯定得有啊。为了帮助各位考生更好估分&#xff0c;华图教育推出估分系统&#xff0c;各位考生只需点击文末“了解更多”即可参与估分。…

德勤全球智慧城市2.0报告!中国占了世界一半

来源&#xff1a;德勤全球智慧城市新发展全球城市化的进程依然以不可阻挡的趋势向前推进&#xff0c; 到2050年&#xff0c; 接近70%的世界人口将生活在城市。人口大国中国和印度所在的亚洲将成为全球城市化最快的地区。在城市急速扩张的过程中&#xff0c; 先进的技术将帮助城…

大公司里怎样开发和部署前端代码

作者&#xff1a;张云龙链接&#xff1a;https://www.zhihu.com/question/20790576/answer/32602154来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。没人邀请&#xff0c;看到这个问题不错&#xff0c;路过怒答。&#x…

5G产业发展最新进展深度解析(144页PPT)

来源&#xff1a;吴东升本报告对不同区域&#xff08;全球、美国、中国、日本、欧洲等&#xff09;的5G产业发展做了深入、全面的分析&#xff1b;对5G产业链和生态链以及主要产业应用状况做了系统盘点分析&#xff1b;对5G技术进展、投资环境和投资机会等也做了详细梳理。是5G…

php layui table,Layui table组件相关介绍

出现的问题&#xff1a;1、使用 Layui 官方提供的 【转换静态表格】 方式初始化加载时报 id 找不到的错误(自己的锅)2、传递参数问题使用的 table 加载刷新方案有一个页面&#xff0c;左侧是一个 tree&#xff0c;右侧是一个 table&#xff0c;默认 table 加载全数据&#xff0…

存内计算能否成为下一代AI芯片的关键

来源&#xff1a;半导体行业观察随着人工智能的落地和大规模应用&#xff0c;AI芯片也成为了常见的芯片品类。AI芯片相比传统芯片来说&#xff0c;主要的竞争优势就在于高算力和高能效比。高算力是指能够比传统芯片更快地完成AI计算&#xff0c;而高能效比则是指能比传统芯片用…

[转载]sql server 分布式查询

--用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset--查询示例select * from openrowset(SQLOLEDB,sql服务器名;用户名;密码,数据库名.dbo.表名)在跨库查询时需要启用Ad Hoc Distributed Queries启用Ad Hoc Distributed Queries&#xff1a;exec sp…

matlab画半透明矩形,使用matlab画半透明椭圆

先上最终效果图&#xff1a;本来是想直接用scatter和alpha来画的&#xff0c;结果在尝试以下代码后&#xff0c;发现无法显示透明效果scatter(rand(1000,1),rand(1000,1), ‘filled‘);alpha(0.5)具体原因可以参考stackoverflow(http://stackoverflow.com/questions/6366404/se…