GNU make简介
引言
接触开源项目有一段时间了,对自动化编译工具一直很好奇。近期有时间正好整理下GNU make。后续可以深入了解下。
本文主要整理GNU make的学习的基本资料,同时简要介绍make的功能、语法。
GNU Make
GNU Make主要用于自动化构建可执行程序(库文件),比较经典的用法如下:
make
make install
make clean
make distclean
Make使用makefile中规则构建程序。
makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。
说白了,GNU make搭建了构建和编译的桥梁,通过makefile实现了自动构建脚本的生成和执行,同时支持自定义扩展(比如make clean、make install)。
Make的功能
- 自动化构建和安装
- 增量编译及自动更新
- 适用于多语言,比如c/c++、java、php等
- 支持自定义功能扩展(只要有意义,都是可以放到makefile中)
makefile的规则和目标
Make是一个规则解释语言,也是一种宏语言。
其核心是通过规则(Rule)描述了工作目标与依赖项之间的关系,通过这种关系实现自动构建,增量更新。其基本语法如下:
target: dependencies ...
commands
一个规则包括target,及其构建的依赖项(dependencies);comands前面必须是'\t'(Tab键),给出由依赖项构建target需要调用的shell脚本命令。在make调用时可以指定特定的target,
规则通常分为具体规则、模式规则、隐含规则等。
默认的c语言编译时,*.o依赖于*.c文件,这就是隐含规则,通常是约定俗成的。
写成下面形式:
*.o : *.c
$(CC) -c $(CFLAGS) $< -o $@
这种就是模式规则,是由用户自定义的规则。
如果是形式比如下面:
test: test.c
gcc $< -o $@
这就是具体规则。
由于makefile也是脚本的一种,通常支持通配符、变量、函数调用、宏等。有兴趣的可以参考下后续的资料。
注意上面的\(@、\)<是自动变量的一种,分别表示“工作目标的文件名”、“第一个必要条件的文件名”。
GNU make的学习
在很多开源项目中都会用到makefile,建议还是先了解下具体的使用,再学习Make的基本语法。其官网是:https://www.gnu.org/software/make/。
中文版的参考资料可以阅读:陈皓的"跟我一起写 Makefile"(麻烦自己搜索,网上很多版本)
也可以参考"Managing Projects with GNU Make"(中译名《GNU Make项目管理》)。
这本书上有比较全面详细的GNU Make介绍。
当然,最全面的还是GNU Make的用户手册,网上也有很多中译版。
小结
接触很久makefile,终于下定决心了解并深入下,虽然做不到专业,但是最起码能看懂,出现问题或疑问知道怎么解决,也算一种进步。后续有机会可以深入了解下Linux/开源项目的Makefile用法。另外,Android的NDK其实也是很多Makefile的集合。
这里说明一点,这不是一篇对GNU Make介绍很全面的文章,这仅仅是我在近期对GNU Make一个大概的认识,不全面的地方一定会有。
----------------------------------------------------------------------------------------------------------------------------
本文作者:Tocy e-mail: zyvj@qq.com
版权所有@2015-2020,请勿用于商业用途,转载请注明原文地址。本人保留所有权利。