2011-2-11

最近因为工作的原因,继续研究MySQL。从网上下载了最新的源代码后,发现竟然不会编译了,因为5.5已经去除了与autotools相关的部分,在所有平台下均采用cmake编译。哦,我傻了。我也就是前几天给openfetion打包的时候才刚刚开始用cmake

Mastering CMake》这本书,我目前还没找到电子版下载,而CMake的官方文档(Documentation for CMake 2.8)仅可做参考手册用,不是像《MySQL Reference》那样是一本书,有逻辑,有层次的。

对于如何在windows下用cmake编译mysql,国外有人写了一篇图文并茂的博文,http://sleto.wordpress.com/2010/11/26/step-by-step-guide-on-how-to-compile-mysql-5-5-on-microsoft-windows/。但是我编译到sql_locale.cc就编译不过去了。原因在我很明白,之前的博文中解释过这个问题http://www.sunchangming.com/blog/post/3382.form

如果把系统的区域与语言设置里面“非Unicode程序的语言”改成英文然后重启,那么必然是可以编译过去的,这是最稳妥的办法。但是我比较懒。我就挑编译不过去的这个文件,用notepad++打开,加上BOM,然后就OK了。这种做法是有缺陷的,因为已经编译过去的文件未必就真的是正确的(见前面的3382文)。

我目前对cmake的了解还不深,仅限于写一些简单的程序。但是毫无疑问,为了写一个hello world,cmake要比autotools简单太多太多了。我甚至建议以后大学生的C/C++ 教材中不要再用tc/vc了,里面的例子直接就是cmake/nmake加命令行版的cl,再配合以notepad++这样的编辑器。工具链越简单,学生越容易明白编译、链接的过程,并且这些都是开源的工具,省的让学生从学校就养成了必用盗版软件的习惯。

MySQL社区在废弃autotools的时候,其内部也不是没有反对的声音。其中Alex Esterkin提到,

“configure.ac and configure.in are NOT the same thing. If you do not
know the difference, I am not surprised your team had difficulties
maintaining the automake based build system. ”

说白了,反对继续使用autotools的人群中绝大多数人怎么都学不明白gnu的这套东西。其实我也属于一直分不清configure.ac和configure.in的区别的人之一。虽然autotools太复杂,但是迄今为止,没有任何一套东西能实现它的全部功能,换句话说,它不是那么容易被替代的。目前大型项目中我接触到的也只有KDE4、MySQL、Boost在用Cmake。如果有朝一日 cmake 想做的像autotools那么强大,那么它的手册至少是现在的2倍厚。

autotools版本混乱,不同版本间兼容性差,早在10年前就有人指责它这个问题,但我觉得这是开源项目的常见弊端。10年之后再看cmake,可能已经不在了,再或者,可能依然有这个问题。连用户手册都懒得写好的项目,更别说把规范写出来了。没有落在纸上的规范,版本间的兼容性那就是扯淡。

很多人抱怨为什么autotools要使用m4这么古老的语言,但是你想,那是10多年前啊,它不用m4它还能用什么?从10几年前一直用到现在,必然是很古老的语言。其次,你看cmake,它根本说不清楚它那是一套什么语法。

很多人抱怨libtool慢,甚至以cmake不支持(不使用)libtool来夸赞cmake,作为选择cmake的理由。可libtool恰恰是我很喜欢的工具之一。它不仅简单,而且灵活,而且功能很完善。compile/link/clean/install/run,我所需要的它都有了。但是还是那个问题,很多人根本不知道用libtool和gdb配合起来调试程序,更不知道为何要多一个.libs目录,甚至不明白为啥要有libtool,直接gcc –shared不是很好吗?

但是,cmake有一点让我很喜欢:它支持vc。相比而下,autotools是gnu的核心武器,它从来都没有考虑过*nix以外的平台。MySQL也正是因为不愿意维护两套编译系统所以才舍弃autotools。autotools完全是为C/C++设计的,虽然它也支持JAVA,但是我没看见哪个JAVA项目会傻乎乎的舍弃ant而改用automake,更没有看见谁放着免费的SUN JDK不用而去用gcj。

我准备把我写的一些小东西改成cmake。但是如果公司上马新的项目,我绝对还是用autotools。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥