CMake以及OpenSceneGraph工程简介

OpenSceneGraph和OpenThreads工程(1.9.x以上及SVN版本)已经开始使用CMake来构建统一的编译和生成系统。Cmake读取源代码目录中简单的CMakeLists.txt脚本文件,并创建多种平台相关的编译和生成系统,例如Visual Studio工程,Unix Makefile工程,Xcode工程等。CMake可以自动定位外部依赖库,允许用户自行选取和取消各模块的编译,并自由地配置生成选项。


统一的生成系统可以有效避免不同的生成环境(Visual Studio,Unix,XCode)下的诸多编译和生成问题,通常情况下这类错误屡见不鲜。这无疑可以降低核心开发者和社区成员的开发强度。这种模式还为最终用户提供了更加稳定和持久的平台相关生成环境,并使得新版本的开发和发行更为高效。我们预计未来OpenSceneGraph的多平台生成系统将会更加稳定,其开发过程更加简单,对于高质量代码的测试和重构也会有所助益。

获取CMake的方法

对于Windows平台的用户,建议使用CMake 2.4.6的版本。对于OS X Xcode的支持还在开发和测试当中,因此建议尝试使用SVN的版本。

Unix下的生成过程(MingwCygwin用户请参阅Windows下的生成过程)

Unix的生成系统在控制台下实现,可以使用cmake直接创建生成系统,或者使用ccmake打开一个文本模式的用户界面,调整相关的选项。系统生成后,用户还可以使用make edit_cache命令重新构建生成系统。用户可以选择在本地源代码目录生成库文件和可执行文件,并分别放置在本地lib和bin目录下,也可以脱离源代码目录进行生成,即,所有生成的中间文件和最终库均放置在独立的目录下。后一种生成方法在生成多个目标(如32-bit和64-bit,或者源代码目录来自网络,且生成平台不同)时是非常有用的。CMake还可以执行源代码的完全清理工作。总之,我们建议使用CMake生成库文件,并保存在用户自定义的目录下。


注意:如果之前你已经将生成文件保存在源代码目录下,,之后又准备再次生成文件并保存在别的目录下,则需要手动清理源代码目录下CMake的缓存文件,否则可能造成混乱。


生成并保存在源代码目录下:

cd OpenThreads
ccmake .
make
sudo make install
cd ..

cd OpenSceneGraph
ccmake .
make
sudo make install
cd ..

生成并保存在用户目录下(推荐):

mkdir build_OpenThreads
cd build_OpenThreads
ccmake ../OpenThreads
make
sudo make install
cd ..

mkdir build_OpenSceneGraph
cd build_OpenSceneGraph
ccmake ../OpenSceneGraph
make
sudo make install
cd ..

注意:如果你准备为CMake支持的IDE环境(例如KDevelop)生成工程文件,则需要在CMake命令后添加-G<generator-name>,即,输入“ccmake -GKDevelop3”而非“ccmake”。

Windows下的生成过程(包括Microsoft Visual StudioMinGWCygwin等)

  • 从开始菜单启动CMake。
  • 拖动CMakeLists.txt到CMake界面上。
  • 生成并保存到用户目录(推荐)时,改变“Where to build the binaries”编辑框的内容(例如在末尾添加“\build”)。
  • 点击“Configure”,并选择编译器及IDE环境。
  • 补充和修改可选项,指定参与编译的依赖库路径(如果配置过程中出现错误,CMake会弹出错误对话框)。
  • 点击“Generate”。
  • 现在我们已经生成了所需的工程文件。我们可以使用之前指定的IDE环境打开工程文件(工程文件可能保存在之前设定的用户目录中)。如果生成的是Makefile文件,我们可以使用make来运行生成。

注意:用户可以采用和Unix生成系统类似的方法,在命令行下运行CmakeSetup.exe。它相当于ccmake的作用。(用户可能需要使用全路径名来运行CmakeSetup.exe)


注意:用户也可以使用右键“打开方式”菜单来使用CMake工具。在CMakeLists.txt文件上使用右键点击,选择“打开方式”->“选择程序…”,浏览并选择CMake安装目录下的CmakeSetup.exe。这之后,每次重新生成工程文件时,都可以右键点击CMakeLists.txt文件,并选择“打开方式”->“CMakeSetup”。用户也可以直接把.txt文件关联到CmakeSetup上,但是上面所述的方法更为适用。

Mac OS X下的生成

目前CMake还不支持许多Mac的特性,例如Universal Binaries,install_name以及frameworks。不过,我们还是可以采用Unix形式来执行工程文件的生成。参看Unix下的生成过程。用户还可以使用CMake的“-GXcode”参数来生成Xcode工程。

后继计划

下面列出的是未来工作中将要解决的问题:

  1. 修正CMake的生成依赖库:
    • src/osgPlugins/dae (COLLADA插件)
    • src/osgPlugins/jp2 (JPEG200插件)
    • src/osgPlugins/pfb (Performer插件)
    • src/osgPlugins/vrml (libvrml插件)
    • src/osgPlugins/xine (xine-lib插件)
  2. 库文件的版本问题。
  3. OSG的Doxygen文档生成(包括OpenThreads)。
  4. 修正Windows下的第三方依赖库,保证Find*.cmake文件可以找到正确的依赖库名称:
    • 去除库文件的前缀名。
    • 去除库文件的后缀版本名(例如freetype219.dll)。
  5. 测试静态库的生成(目前的库生成顺序可能有问题)。
  6. 修正OSG 2.0中包含的Findosg*.cmake文件(可能有冗余的部分)。
  7. Ctest的使用(不必用于OSG的生成)。
  8. Cpack的使用?
  9. 使用OpenSceneGraph和CMake生成用户程序的示范工程(可选)。
  10. Mac OS X的frameworks支持(需要修改CMake)。
  11. Mac OS X的install_name支持。
  12. Mac OS X的Universal Binaries支持:
    • 可能需要修改CMake,实现OS版本的合理检测。
    • 测试64-bit环境的生成,基于Leopard。
    • CMake(使用-F/System/Library/Frameworks)的现有问题导致Universal的编译失败,CVS版本可能修正了这一问题。
  13. Mac OS X的CMake INSTALL特性:
    • Unix样式的安装,应该已经实现。
    • Mac样式的安装,尚未实现。
  14. Mac OS X生成.app捆绑。
  15. Mac OS X生成选项,使用X11。