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

  • Post author:
  • Post category:其他


参考了网上的博客,自己整理了一份并且可以编译通过,也能够正常执行,所以就做了记录。

防止过段时间就又忘记了。



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


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

首先是


顶层


Makefile的内容;


第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:


稍微解释下:

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

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


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




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




src/eat/目录下面的makefile:




不解释了。





obj目录下面的makefile:




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





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






版权声明:本文为sinat_29830917原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。