参考了网上的博客,自己整理了一份并且可以编译通过,也能够正常执行,所以就做了记录。
防止过段时间就又忘记了。
首先先上个还没执行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,看执行后的源码树: