Make
维基百科,自由的百科全书
make是一个自动转化文件形式的工具,同时它也会检查文件的从属关系,如果需要的话,它会调用一些外部的软件来完成任务。它的依靠关系检查系统非常简单,主要是使用输入文件的修改时间。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做"makefile"的文件来确定一个输出文件的从属关系,然后把编译脚本程序传给shell去编译这个文件。"makefile"这个词是来自于它通常的文件名"makefile"和后来的"Makefile"
目录 |
[编辑] 起源
现在有不少的从属关系检查工具,但是make是被使用最广泛的一个之一,主要是归功于它被包含在Unix系统中。Stuart Feldman 在1977年在贝尔实验室里制作了这个软件。2003年Feldman因发明了这样一个重要的工具而接受了美国计算机协会(ACM)颁发的软件系统奖。
在make诞生之前,Unix系统的编译系统主要由"make"和"install"shell脚本程序和程序的源代码组成。它可以把不同目标的命令组成一个文件,而且可以抽象化从属关系的检查和存档。这是向现代编译环境发展的重要一步。
[编辑] 现在版本
make程序已经被多次重写,其中包括几次用相同的文件格式和算法原理从新编写,并且添加了一些不常见的改进。三个不同的make程序是:
- BSD make, 是从Adam de Boor的制作的版本上发展成的。它编译目标的时候有并行计算的能力。它在FreeBSD,NetBSD 和 OpenBSD 中不同程度的修改下存活了下来。
- GNU make, 是大多数GUN Linux 安装的一部分,常常被和GNU编译系统一起使用。
- NMAKE, Visual C++使用的编译系统。
[编辑] 优点和缺点
就像其他和make有着悠久历史的软件一样,它有着很多的拥护者和反对者。它的很多问题因现代大型的软件项目的出现而暴露出来。但是很多人争论说它在常见的情况下可以很好的工作,而且使用非常的简单,功能强大,表达清楚。无论如何,make仍然被用来编译很多完整的操作系统,而且现在替代品们在基本的操作上与它没有太大差别。
随着现代的集成开发环境(IDE)的诞生,特别是非Unix的平台上,很多程序员不再手动管理依靠关系检查,甚至不用去管哪些文件是这个项目的一部分,而是把这些任务交给了他们的开发环境去做。类似的,很多现代的编程语言有自己特别的高效的从属关系的设置方法。
[编辑] Makefile的结构
一个makefile是由定义一个文件或者一些规定依靠关系的文本组成。比如说,输出文件被标记着要依靠它的源文件,而源文件被标记着要依靠它内部include的文件。在每个依靠关系都被列出来之后,一系列的文本就会来定义如何把输入文件转化成输出文件。这些定义会被称为编译脚本程序,并且被转到shell去生成目标文件。它的基本结构是:
# Comments use the pound sign (aka hash) target: dependencies command 1 command 2 . . . command n
makefile文件也可以包含变量的定义和其他的makefile。makefile里面的变量可以被命令窗口调用make工具时的参数而改变。这样就允许用户去设定编译脚本的不同功能。比如说,CC变量在makefile里面通常被用来指一个C的编译器,用户可以通过设定参数去使用不同的编译器。
[编辑] makefile 例子
下面是一个非常简单的例子。这段命令让makefile用C编译器来编译一个叫helloworld.c源文件。
helloworld: helloworld.o cc -o $@ $< helloworld.o: helloworld.c cc -c -o $@ $< .PHONY: clean clean: -rm -f helloworld helloworld.o