处理C ++依赖项(跨平台)

时间:2013-05-02 12:28:06

标签: c++ dependencies build-automation

我的印象是这个问题被问过一百次,但从未完全回答。

我正在开展一个小型项目,在某些时候应该发布三大PC平台(Windows,Mac和GNU / Linux),因此将自己锁定到早期的技术是一个坏主意。幸运的是,但不幸的是,目前,在早期开发过程中,我们只针对32位Windows。

在代码级别,如果选择正确的库,跨平台开发相对容易。在多个平台上构建软件也相对简单,我正在研究使用GYP或CMake。

问题是依赖性。要构建您需要的项目:SDL,SDL_image,SDL_ttf,iconv,libxml2,libxmlmm,sigc ++,wxWidgets,glew,bullet,openALsoft以及稍后可能添加的项目。

到目前为止,我找到了三个选项:

  1. 签入来源并将其构建为项目的一部分
  2. 签入二进制文件
  3. 管理源树之外的依赖关系
  4. 第一个看起来有点矫枉过正,因为你需要基本上维护你的库和自定义构建系统的分支。

    当您的目标只有一个或两个平台时,第二个选项听起来就像要做的事情。但是,如果你计算所有不同的目标,包括32/64位变体,这也开始成为一个几乎无法控制的东西。

    第三种选择取决于环境。如果你让你的开发人员手动处理依赖项,你将永远不会在附近睡觉。只需将每个依赖关系构建并准备好使用几乎是不可能的。更不用说您无法确保每个开发人员使用正确的版本。

    如果你看其他语言,他们会以不同的方式解决问题。对于像npm,marvin或phing这样的系统,你只需在项目中维护一些配置文件,然后工具就可以获取所需的任何依赖项。

    我正在考虑集中构建依赖项,将它们打包成zip / deb / rpm /任何包并将它们放入存储库。然后,每个开发人员都会在构建之前将其平台的依赖项复制到存储库中(但不会检查它们)。这将优选地作为预构建步骤自动完成。

    我特别不想要额外的构建系统。我环顾四周,唯一远程做我想要的东西可能是常春藤。但要么是遗漏了某些东西,要么常春藤完全是在设计这个问题。有什么简单的东西可以解决这个问题吗?

    我建立自己的英雄。

1 个答案:

答案 0 :(得分:3)

我建议不要建立自己的。

我们使用ant / ivy / Hudson来自动化我们的跨平台(Windows和Linux)版本。我们还使用Nexus(Maven)作为我们的工件库,其中包含我们第三方库的平台特定版本以及我们自己的应用程序。 Hudson与Perforce(我们的软件存储库)完全集成。

我们也在为所有内容创建单独的32位和64位工件,而ant / ivy将使这一过程变得更加容易。

它对我们来说很有用。