make程序已被用户多次重/改写,其中包括几次用相同的文件格式和算法原理重新编写,并且依照不同需要添加了一些不常见的改良。
GNU make仿照make的标准功能(透过clean-room工程)重新改写,并加入作者觉得值得加入的新功能,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。
BSD make是从Adam de Boor的制作的版本上发展成。它编译目标的时候有并发计算的能力。它在FreeBSD,NetBSD和OpenBSD中不同程度的修改下存活了下来。
广泛应用于微软的Windows,微软的nmake是 Visual Studio 随附的命令行工具,不要与来自AT&T和贝尔实验室的Unix系统nmake混淆。
就像其他和make有着悠久历史的软件一样,make有着很多的拥护者和反对者。它的很多问题因现代大型的软件项目的出现而暴露出来。但是很多人争论说它在常见的情况下可以很好的工作,而且使用非常的简单,功能强大,表达清楚。无论如何,make仍然被用来编译很多完整的操作系统,而且现在替代品们在基本的操作上与它没有太大差别。
随着现代的集成开发环境(IDE)的诞生,特别是非Unix的平台上,很多程序员不再手动管理依靠关系检查,甚至不用去管哪些文件是这个项目的一部分,而是把这些任务交给了他们的开发环境去做。类似的,很多现代的编程语言有自己特别的高效的依赖关系的设置方法。
makefile的格式是:
# 用“#”号表明注释。
target(要生成的文件):dependencies(被依赖的文件)
# 命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误!
Tab ↹命令1
Tab ↹命令2
Tab ↹命令3
Tab ↹命令n
# 可以使用“\”表示续行。注意,“\”之后不能有空格!
举例来说明makefile的结构和make如何运作。
editor: main.o text.o
gcc -o editor main.o text.o
main.o: main.c def.h
gcc -c main.c
text.o: text.c com.h
gcc -c text.c
install:editor
mv editor /usr/local
当我们输入:
make
或者
make editor
当editor这个target文件不存在,或者 main.o、text.o这两个依赖文件被修改,都会导致make调用其下的命令“gcc -o editor main.o text.o”;接下来,由于引用到main.o和text.o,make会检查main.o的依赖main.c、def.h有无更新,如果有,则执行其下的命令“gcc -c main.c”;同样的道理,也适用于text.o。 于是,可有几种不同的输出:
gcc -c main.c
gcc -c text.c
gcc -o editor main.o text.o
gcc -c main.c
gcc -o editor main.o text.o
gcc -c text.c
gcc -o editor main.o text.o
gcc -c main.c
gcc -c text.c
gcc -o editor main.o text.o
当我们输入:
make install
make会检查install的依赖editor是否是最新,如果是,则执行其下的命令“mv editor /usr/local”。由于这个过程并没有产生名为“install”的文件,所以,install是一个假目标。
“宏”指的是用一个字符串代替另一个字符串的功能。在makefile中可以使用“=”号来定义宏,使用“$(宏名)”来使用宏;还可以用“+=”追加宏的内容。习惯上,宏名使用大写。承接上面的例子:
OBJECTS = main.o text.o
INSTALL_PATH = /usr/local
editor: $(OBJECTS)
gcc -o editor $(OBJECTS)
main.o: main.c
gcc -c main.c
text.o: text.c
gcc -c text.c
install:editor
mv editor $(INSTALL_PATH)
搬运自维基百科