如果有成千上万个源代码,而且还有互相依赖,这时你修改了某个源代码,那么凡是依赖它的源代码都应该重新编译。一行行的输入
gcc first.c -o first.o
gcc second.c -o second.o
...
这是很繁琐的。人们发展了make这个好玩意。它通过makefile确定依赖关系和生成规则,并且根据时间戳,递归的把凡是修改时间比目标代码更新的文件及其依赖于它的文件都重新编译一下。一个典型的makefile长这样,
foo.o:foo.c
gcc foo.c -o foo.o
bar.o:bar.c
gcc bar.c -o bar.o
myprogram:foo.o bar.o
gcc foo.o bar.o -o myprogram
核心就是,依赖关系+生成规则。而为了适应不同的平台,适应批量的处理,还能定义变量,使用通配符。
经常碰到的事情是一个程序在不同的平台上编译,使用不同的makefile,因为在makefile中还得说明使用什么编译器,INCLUDE目录在哪里,库文件在哪里。人们总是想偷懒的,所以又发展了自动生成makefile的工具,有什么automake啊,configure啊之类的。
此外,还有qmake,wmake这些各种古怪稀奇的玩意。qmake是qt搞的,wmake是cfd软件openfoam重度使用的。基本道理都差不多。wmake貌似是会递归的查找当前目录及其子目录,然后在每个目录都去给编译一下。
实际上,visual studio系列也有这么个东西,不过不是makefile+make。它叫项目文件。在一个解决方案下可能有多个项目,每个项目就有个项目文件。如果我们用文本编辑工具打开这个项目文件的话,发现它说描述的是同样的事情,就是依赖关系和生成规则。当然visual studio系列也支持make,有个nmake工具。
https://seisman.github.io/how-to-write-makefile/ 这个说的很透彻。
人们连makefile都想自动生成。
能不能根据依赖关系和目标关系自动生成makefile,自动生成项目文件这些呢?你说对了,还真是有。cmake就是这么个工具。它根据CMakelists.txt和你选择的工具链去生成makefile这些,或者生成visual studio需要的项目文件。然后调用你的工具链去编译代码。
从我们前面的理解来看,cmake也是个函数,它的输入就是CMakelists.txt等,然后输出就是你所要的项目文件等。
Python也有个衍生品 SCons。
划重点=======================
make和makefile说的是依赖关系和生成规则。由此也有很多衍生品。
【 在 ziqin 的大作中提到: 】
: 为什么不拿python直接写个库?还要搞各种make
--
修改:leaning FROM 117.32.153.*
FROM 117.32.153.*