jjgod / blog Random notes by Jjgod Jiang.

cmake

我以前总说 autotools sucks,以为只用 make 就能解决一切问题。

最近终于开始做一套比较实用的 (或者说 Insdustrial-strength) 的程序,涉及好几个平台和库,于是 make 的局限性就显现出来了,为了在几个不同的平台下都编译使用,不得不在 Makefile 里写大量判断。

于是开始找跨平台的编译工具,其中最有名的两个是 cmakescons,cmake 之所以出名估计是因为 KDE 4 从 autotools 转向用 cmake 来编译。而 scons 则是 lighttpd 原来用的编译工具,它现在也转向 Python 了。cmake 和 python 大概代表了新一代跨平台编译工具的两种方向。第一种 (cmake) 是延续并改良传统 automake, autoconf 工具链,将之合为一体,但最终仍然生成 Makefile, Visual Studio 的 .sln,Xcode 的 .xcodebuild 文件,依赖现有编译工具 (make, nmake, vcbuild, xcodebuild) 来编译;第二种则是完全消除现有编译工具的调用,直接调用编译器,scons 就属于这一类 (scons 还有一个特点是完全不用专门的语言,控制编译的脚本就是 Python)。

人气上来说,反倒是走改良路线的 cmake 比 scons 好一些,有几个原因:scons 基于 Python,可能有些代码不是很照顾速度,于是类似 KDE 这样的大项目编译起来会很慢;scons 开发比较慢,最近一直只是 bugfix。不过相对 cmake,scons 的优点是文档非常细致可读,而 cmake 的文档则非常少,可以在网上找到的只有几篇介绍性的文章和参考手册,不像 scons 有一本 User Guide。

与之相关的工具还有 Jam (包括它的变体 FTJam, Boost.Build), Waf, Bakefile 等。其中比较新的 Waf 是一个 scons 的改进,在它的提供的 benchmark 中,显示通过缓存方式可以大大改进编译的速度。不过因为这个项目还很新,目前没有什么软件用它作为编译系统。

Bakefile 走的则是 cmake 的路子,从名称上也可以看出,它最终也是通过生成 Makefile 一类的文件来完成编译的。不过不同的地方在于 cmake 用的语法很像 autotools 用的 m4 的传统语法,而 bakefile 则完全用 XML 来定义编译规则了,这一点倒很像 ant。Bakefile 倒是有不少著名的项目使用,比如 wxWidgets, WebKit, VCF, libxml。

我自己挑来选去,最终决定用 cmake,不过选择的过程写下来,希望能对遇上同样问题的朋友有用。


7 Comments

哈哈,我好像是最早的cmake中文文档编写者之一(2002),为了玩最初使用cmake的VTK项目写的 ;-)

Posted by dahuang on 22 February 2007 @ 7pm

嗯,大多数人都是通过玩ITK/VTK认识的cmake

Posted by CY on 24 February 2007 @ 9pm

jjgod,我是一位Blog开发者,能否做个链接?(http://www.auiou.com)

Posted by 自由勇 on 5 March 2007 @ 7pm

有点深奥。

Posted by citsgo on 6 March 2007 @ 10pm

其实tconf挺短小精悍的,不过based on bash,所以windows下没法用。

Posted by fishy on 22 March 2007 @ 6pm

很有深度啊

Posted by 888 on 30 April 2007 @ 9pm

正好刚才看了一下KDE on Mac OS X就顺便看了一下cmake,有个问题问一下。 他的simple example (http://www.cmake.org/HTML/Examples.html)里面,我用cmake .可以生成一堆文件和Makefile,这一堆文件里面包含了CMakeCache之类的东西。 Makefile里面只有clean规则没有distclean规则,因此只能清除make出来的东西,不能清除cmake出来的东西。cmake –help里面貌似也没有clean之类的参数,那么cmake的结果如何清除?还是说他的设计就是不打算让你清除的? 我主要是先生成了个Makefile然后想再生成个Xcodeproj看看遇到的这个问题。

Posted by fishy on 13 May 2007 @ 4am

Leave a Comment