1.欢迎来到我的酒馆
从头讲一门工具总是显得很难,先借助一个小项目来学习Makefile。tinyhttpd,代码仅有502行,用来学习http server非常不错。通过它,你可以了解到http服务器的本质。https://sourceforge.net/projects/tinyhttpd/ 解压出来 (原版写于2018年5月,修改了想重新写过,还是觉得原版好。。。)
2.Makefile的书写规则
make+file,Makefile是一种配置文件,由make程序执行。它详细说明了编译当前项目的细节和管理非源代码文件(.o文件,可执行文件等)。Makefile可以看成是加强版的shell脚本。shell里面能用的命令,在Makefile里也可以用。Makefile书写规则:
1.target+dependencis … \n[Tab]gcc commands1 … 称为一个执行单元。
2.编译命令前,一定要摁下一个TAB键缩进(GNU Make下)。别敲空格,没用的。。。
3.生成一个target需要一个或多个"配方(dependencis)",配方可以是源文件,或者是别的target。
所有的配方都集齐了,就可以"开工(gcc commands)"生成target。
看tinyhttpd的Makefile是怎么写的,简单明了。把’-lsocket’删了,因为这个程序有点老,1999年写的,现在默认有了socket这个库。保存退出,make编译。
-W: 关闭编译警告。
-Wall: 打开编译警告。
-lsocket,-lpthread:l指link,链接socket,pthread库。
-o: o指output,输出目标,这里生成了一个可执行程序httpd。
clean: 因为没有指定"配方",所以clean这一个单元默认不执行,指定才会执行,如:make clean 。
3.Makefile的执行流程
如上面说的规则,tinyhttpd的Makefile中有3个执行单元:all、httpd和clean。先找到它的执行顺序。Makefile是解释执行的,从上往下。
make先找到第一个target:all。
①:all需要配方:httpd,转到②。
②:httpd,有这个源文件或它被别人用作target吗 ? 执行③ : 报错,No to make target ‘all’。
③:httpd需要配方:httpd.c,转到④。
④:httpd.c,有这个源文件或它被别人用作target吗 ? 执行⑤ : 报错,No to make target ‘httpd’。
⑤:gcc command,生成可执行文件httpd。①需要的配方httpd已做好,回到②,all没有写gcc命令,所以啥也不干,结束。
⑥:clean硬肝,不要配方,默认不执行。除非指定它执行,如: make clean。
不知道我讲清楚执行流程没有。有点印象的话,我们把客户端程序(simpleclient.c)也加进去编译。
如何验证执行顺序是正确的 ?可以用日志输出的形式去验证,如:
httpd: httpd.c
gcc -W -Wall -lpthread -o httpd httpd.c
@echo “httpd done !”
4.更进一步
①②③ 的效果是一样的。依次基于上一步跟进的,复杂度也随之增加。③中的书写风格常见于中大型项目中。