加载中…
个人资料
电子世界的小蜗牛
电子世界的小蜗牛
  • 博客等级:
  • 博客积分:0
  • 博客访问:6,902
  • 关注人气:7
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

简单的实例,多层嵌套Makefile(一)

(2018-04-12 19:08:40)
分类: linux
https://blog.csdn.net/sinat_29830917/article/details/55506309

首先先上个还没执行make前的源码树:

https://img-blog.csdn.net/20170217150245829?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjk4MzA5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


源文件都是一个printf 没什么好讲的,主要是makefile。


首先是顶层Makefile的内容;

https://img-blog.csdn.net/20170217140152413?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjk4MzA5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

第1行:设置编译器

第2行:设置所有会生成的目标文件,为了最后一步连接成可执行文件。
第3行:设置顶层Makefile坐在的目录

第4行:设置目标文件存放的目录,待会第二行的那些目标文件,都会保存在这个目录下面

第5行:设置可执行文件存放的目录

第6行:设置可执行文件的名字

第7行:保存所有子目录下的Makefile的路径。只要子目录有makefile存在就在这个地方添加上这个makefile相对顶层Makefile的路径。

第11行:讲1~6行的变量设置成全局变量,在子目录的makefile里面可以直接使用这些变量。

第13行:神奇的all标号。

有网友比较官方的解释:一种简写,可以让多个目标操作顺次执行

有网友比较接地气的解释(根据本篇makefile做了修改):

直接 make 或 make all 的话会执行CHECKDIR 和 $(SUB_DIR) 的编译命令
后面不加参数的话,会把第一个目标作为默认的
make CHECKDIR 的话只执行第16行内容
make $(SUB_DIR)的话只编译17~21行内容

 现在我们只是直接make,所以会先执行CHECKDIR然后再执行$(SUB_DIR)部分:


CHECKDIR:创建一大堆目录,目录存在就不创建了。


关键点在$(SUB_DIR):遍历make所有目录下面的makefile。

首先查找依赖部分“ECHO”,就是一些打印信息,echo前面的‘@’符号不加也是可以的。

接着就是执行:make -C  $(SUB_DIR) (-C是大写的C,小写的c编译出目标文件

-C 参数的含义: -C DIRECTORY, --directory=DIRECTORY  Change to DIRECTORY before doing anything.

翻译过来就是:在离开这个目录前做点什么。

真特么的奇葩。 直接讲执行该目录下的makefile不就好了。

所以加上-C 选项意思就是:在$(SUB_DIR) 目录下面执行make

make -C  $(SUB_DIR) 展开就是:make -C main/  src/ src/eat/ obj/ :按顺序对各个目录下面的makefile,make一下。


第23行:执行make clean 就会执行clean部分。


src目录下面的makefile:

https://img-blog.csdn.net/20170217144651942?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjk4MzA5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

稍微解释下:

OBJ_DIR : 在顶层makefile中定义了,变量值为保存目标文件的目录。

     CC       :编译器,在顶层makefile中定义。

生成的目标文件的路径/目标文件xxx.o:生成目标文件的依赖文件(xxx.c)

(编译器) -c (依赖文件xxx.c) -o (生成的目标文件路径/目标文件xxx.o)


src/eat/目录下面的makefile:

不解释了。

https://img-blog.csdn.net/20170217145643550?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjk4MzA5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

obj目录下面的makefile:

链接成可执行文件文件名为$(BIN),最终可执行文件保存在$(BIN_DIR)目录下.

https://img-blog.csdn.net/20170217145821296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjk4MzA5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

在顶层makefile那里执行make,看执行后的源码树:

https://img-blog.csdn.net/20170217150147500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjk4MzA5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

0

阅读 收藏 喜欢 打印举报/Report
前一篇:MP3和PCM
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有