现在,每次 lighttpd 主要版本发布都会改变其构建系统,这已成为一项传统。
目前,我们使用 autotools 作为用户可见的构建系统,并使用 scons 作为开发者的系统。
目前,我们正在测试 cmake 以替代 scons 的部分。
构建系统
在构建 C 程序之前,您首先需要找出您编译所用的系统支持哪些函数。不仅 UNIX 有各种版本,还有 Windows。
在 UNIX 上,自然的方式是使用 autotools (autoconf, automake, …),它会创建一个 shell 脚本 (configure),该脚本生成 Makefiles,然后由 make 处理这些 Makefiles 来构建应用程序。
automake 发布时减轻了 autoconf 的痛苦,但它仍然足够令人头疼,以至于需要寻找其他替代方案。别忘了 win32 和 shell 脚本并不是真正的朋友。
scons
SCons 另辟蹊径。它用一个基于 Python 的构建系统取代了 make 和 autotools。只需几行 Python 代码就可以完成所有事情。非常简洁。
缺点是:它的开发或多或少处于停滞状态。修复了各种严重 bug 的不稳定分支 0.96.9x 自 2004 年 8 月 22 日(即 0.96.1 版本发布之日)以来一直不稳定。
cmake
cmake 更为宽松,它不寻求解决所有问题。它执行配置检查,并将构建工作留给原生构建系统。在 Unix 上是 make 或 kdevelop3,在 MacOSX 上是 XCode,在 Windows 上是 nmake。
此外,cmake 支持基本的打包功能,并且与 Dart 等测试工具集成得非常好。
交叉编译
作为概念验证,我已将 cmake 支持添加到主干分支,并使用 openwrt SDK 来构建 lighttpd 与 openwrt。
$ cmake . $ rm CMakeCache.txt $ OPENWRT=.../OpenWrt-SDK-Linux-x86_64-1/staging_dir_mipsel/ \ CC=$OPENWRT/bin/mipsel-linux-gcc \ LD=$OPENWRT/bin/mipsel-linux-uclibc-ld make
命令行选项
$ cmake -L . ... CMAKE_INSTALL_PREFIX:PATH= ... WITH_BZIP:BOOL=OFF WITH_MYSQL:BOOL=OFF WITH_OPENSSL:BOOL=OFF WITH_PCRE:BOOL=ON WITH_SQLITE3:BOOL=OFF WITH_WEBPAV_PROPS:BOOL=OFF WITH_XATTR:BOOL=OFF WITH_ZLIB:BOOL=ON $ cmake -DWITH_BZIP:BOOL=ON \ -DCMAKE_INSTALL_PREFIX:PATH=/home/jan/l-1.5.0-cmake/
静态链接
为了方便不支持 dlopen() 的嵌入式系统,我添加了以下选项
$ cmake -DBUILD_STATIC:BOOL=ON .
它会将所有模块构建为静态库,并在构建时链接到服务器中。server.modules 仍然用于像以前一样初始化模块。