C ++ Buildsystem,具有预先编译依赖项的能力

时间:2009-12-01 17:31:44

标签: c++ build-process dependencies cmake

我正在为c ++游戏项目设置构建环境。我们的主要要求是不仅可以构建我们的游戏代码,还可以构建其依赖项(Ogre3D,Cegui,boost等)。此外,我们希望能够在Linux和Windows上构建,因为我们的开发团队由使用不同操作系统的成员组成。

Ogre3D使用CMake作为构建工具。这就是我们迄今为止将我们的项目建立在CMake上的原因。一旦在每个团队成员系统上手动设置所有依赖关系,我们就可以完全编译,因为CMake能够找到库。

问题是,是否有可行的方法来自动设置依赖项。作为一名Java开发人员,我知道Maven,但在c ++世界中确实存在哪些工具?


更新:感谢您的答案和链接。在接下来的几天里,我将尝试使用一些工具来查看符合我们要求的工具,从CMake开始。到目前为止,我确实已经与autotools分享了一些内容,并且我喜欢文档(这是一本非常好的读者),我担心autotools本身并不适合在Windows上使用。

有些人建议让某些IDE处理依赖关系管理。我们由使用所有可能技术的个人组成,从纯Vim到完全吹制Eclipse CDT或Visual Studio。这是CMake允许使用其生成本机项目文件的能力的地方。

7 个答案:

答案 0 :(得分:7)

在最新的CMake 2.8版本中,有新的ExternalProject模块。 这允许下载/签出代码,配置和构建它作为主构建树的一部分。 它还应该允许设置依赖项。

在我的工作(医学图像处理小组)中,我们使用CMake构建我们自己的库和应用程序。我们有一个内部工具来跟踪项目之间的所有依赖关系(在XML数据库中定义)。大多数第三方库(如Boost,Qt,VTK,ITK等)都为我们支持的每个系统(MSWin32,MSWin64,Linux32等)构建一次,并在版本控制系统中作为zip文件提交。然后,CMake将根据开发人员正在使用的系统提取和配置正确的zip文件。

答案 1 :(得分:5)

过去几个月我一直在使用GNU Autotools(Autoconf,Automake,Libtool)参与我参与的几个项目,我认为它的工作非常精彩。说实话,它确实需要一点点习惯语法,但我已成功地在需要分发python脚本,C库和C ++应用程序的项目上使用它。当我第一次在这里问一个类似的问题时,我会给你一些帮助我的链接。

更多链接:

  1. http://www.lrde.epita.fr/~adl/autotools.html
  2. http://www.developingprogrammers.com/index.php/2006/01/05/autotools-tutorial/
  3. http://sources.redhat.com/autobook/
  4. 我不确定的一件事是GNU Autotools的任何类型的Windows包装器。我知道您可以在Cygwin中使用它,但至于在Windows平台上实际分发文件和依赖项,您可能最好使用Windows MSI安装程序(或者可以在Visual Studio中打包项目的东西)。

    如果要分发依赖项,可以在不同的子目录下设置它们,例如 libzip ,并使用特定的Makefile.am条目构建该库。执行 make install 时,库将安装到配置脚本确定应使用的 lib 文件夹中。

    祝你好运!

答案 2 :(得分:2)

有几个有趣的make替换可以自动跟踪隐式依赖项(来自头文件),是跨平台的,可以处理生成的文件(例如着色器定义)。我过去使用的两个示例是SConsJam / BJam

我不知道让* make自动跟踪依赖关系的跨平台方式。 您可以做的最好的事情是使用一些扫描源文件的脚本(或者让C ++编译器这样做)并找到#includes(条件编译使得这很棘手)并生成makefile的一部分。 但是,只要有可能发生变化,你就需要调用这个脚本。

答案 3 :(得分:2)

  

问题是,是否有可行的方法来自动设置依赖项。

你的意思是什么?

正如你所说,一旦依赖关系在机器上,CMake将编译所有内容。您是否只是在寻找一种打包依赖源的方法?一旦所有源都存在,就可以使用CMake和构建工具(gcc,nmake,MSVS等)。

编辑:旁注,CMake有文件命令,可以在需要时下载文件:file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

编辑2:CPack是CMake家伙的另一个工具,可用于打包文件等,以便在各种平台上进行分发。它可以为Windows创建NSIS,为* nix创建.deb或.tgz文件。

答案 4 :(得分:2)

在我的工作地点(我们构建用于电源保护的嵌入式系统),我们使用CMake来解决问题。我们的设置允许cmake从不同的位置运行。

/
CMakeLists.txt "install precompiled dependencies and build project"
   project/
      CMakeLists.txt "build the project managing dependencies of subsystems"
      subsystem1/
         CMakeLists.txt "build subsystem 1 assume dependecies are already met"
      subsystem2/
         CMakeLists.txt "build subsystem 2 assume dependecies are already met"

诀窍是确保可以单独调用每个CMakeLists.txt文件,但顶级文件仍然可以正确构建所有内容。从技术上讲,我们不需要子CMakeLists.txt文件,但它让开发人员感到高兴。如果我们都必须在项目的根目录下编辑一个单片构建文件,那将是一种绝对的痛苦。

我没有设置系统(我帮助但不是我的宝贝)。作者说,boost cmake构建系统中有一些非常好的东西,这有助于他让整个过程顺利构建。

答案 5 :(得分:1)

在许多* nix系统上,使用某种包管理器或构建系统。最常见的源代码是GNU Autotools,我听说这是极度悲痛的根源。但是,通过几个脚本和一个在线存储库,您可以设置类似的东西:

  • 在项目Makefile中,创建一个覆盖依赖项的目标(可选择包含子目标)。
  • 在每个依赖项的目标中,首先检查dep源是否在项目中(在* nix上,您可以使用touch进行此操作,但您可以更加彻底)
  • 如果不存在dep,您可以使用curl等来下载dep
  • 在所有情况下,让dep目标对依赖项的Makefile(或其他配置脚本/构建文件)进行递归调用(make; make install; make clean;等)。如果dep已经构建并安装,make将会很快返回。

根据每个dep的安装程序(可能是安装程序是交互式的?),会有很多极端情况会导致这种情况破坏,但这种方法应该涵盖一般的想法。

答案 6 :(得分:0)

现在我正在开发一种工具,能够自动安装具有确切版本要求的C / C ++应用程序的所有依赖项:

  • 编译
  • 工具(cmake,autotools)

现在它适用于我的应用程序。 (按正确顺序安装UnitTest ++,Boost,Wt,sqlite,cmake)

这个名为“C ++版本管理器”的工具(灵感来自优秀的ruby版本管理器),用bash编码并托管在github上:https://github.com/Offirmo/cvm

欢迎任何意见和建议。