7

我正在重新组织一个大型跨平台 C++ 项目的物理(磁盘上)布局,该项目具有许多第三方依赖项,使用 CMake 构建。

由于我们需要支持 Windows,一个没有完善的包管理器的平台,我们很久以前就决定在源代码树中包含我们依赖的第三方库。但是,在我们支持的其他平台(例如 Linux 和 Mac OS X)上,这些第三方库中的许多都以包的形式提供,或者已经存在于系统中,并且很容易被 CMake 找到。

目前项目布局如下:

root/
    src/
        3rd-party-lib1/       (build system modified to output to build/)
        3rd-party-lib2/       (build system modified to output to build/)
        project-module1/      (our own code)
        project-module2/      (our own code)
    build/                    (CMake is invoked from here)
        3rd-party-lib1-bin/
        3rd-party-lib2-bin/

第三方库已经过调整,以便在构建时将其二进制文件输出到root/build/<lib>/.

这种布局的问题是多方面的:

  • 第三方库不再是 100% 原创的。这使得更新它们比需要的稍微困难一些。
  • src/目录包含我们自己的代码和第三方代码的混合,这令人困惑。
  • src/目录很大由于src/包含第三方库,与原始源代码的实际数量相比,它非常大,使得备份我们自己的代码比需要的稍微复杂一些(我们不能再归档整个src/目录了)。
  • 由于包含第三方库(可能包含大量非源文件,如文档、测试数据等),项目存储库 (Git) 非常大,并且每次更新时它都会变大。不幸的是,没有办法回到这里,除非我们决定用一个新的存储库重新启动(不幸的是丢失了整个提交历史)。
  • 在 Linux 或 Mac OS X 上构建项目的用户根本不需要其中包含的许多第三方库(例如 zlib、libpng),尽管它们极大地简化了 Windows 用户的操作。

另一种布局如下:

root/
    3rdparty/
        3rd-party-lib1/       (100% original, contains built artifacts)
        3rd-party-lib2/       (100% original, contains built artifacts)
    src/
        project-module1/      (our own code)
        project-module2/      (our own code)
    build/                    (CMake is invoked from here)

我们的 CMake 文件需要修改以在每个库的正确位置查找第三方头文件和库。

在原生跨平台项目中处理第三方库的最佳实践是什么?哪种布局会为我们的开发人员在各自的平台上带来最出人意料的构建体验?也欢迎现有项目中成功布局的具体示例。

4

1 回答 1

7

我的经验建议以下最佳做法:

  • 当完全按原样使用第三方开源库时,在主 git 存储库中提交下载的压缩 tarball 的本地副本,以避免网络连接问题阻止软件构建。

  • 当第三方开源库几乎按原样使用,但需要调整时(这在交叉编译时很常见:许多包需要对其配置步骤进行轻微调整),存储压缩的 tarball 和“统一 diff " 主 git repo 中的补丁文件,并在 ExternalProject_Add 的 PATCH_COMMAND 步骤中应用补丁。

  • 当您的组织(将)对第三方开源库进行大量修改或扩展时,请使用单独的 git 存储库来保存指向上游存储库的指针(当它也使用 git 时最简单,但上游 svn 也可以管理) . 将组织的更改提交到与用于镜像上游的分支不同的分支。如果你愿意,你可以在主 git repo 和这个之间引入一个子模块关系,虽然因为 DOWNLOAD_COMMAND 可以直接从任意 git repo 获取,所以在技术上没有必要这样做。

  • 通过将它们归档在主 git 存储库中来处理单个目标平台的小型、不常见的第三方专有二进制文件是合理的。但是,可用于各种平台、较大或经常演变的第三方二进制文件应存储在他们自己的 git 存储库中,并通过 DOWNLOAD_COMMAND 获取,如上所述。

于 2013-11-02T01:39:39.223 回答