【问题标题】:Preferred way to build multiple projects with Jenkins, CMake and pkg-config?使用 Jenkins、CMake 和 pkg-config 构建多个项目的首选方式?
【发布时间】:2012-07-26 15:43:38
【问题描述】:

我正在开发两个库 A 和 B,其中 B 取决于 A,它们都在自己的 Git 存储库中进行管理。这些库使用 CMake 构建并安装在标准 UNIX 目录中。在安装过程中,还会安装一个.pc 文件供pkg-config 使用。库 B 使用 pkg-config 查找库 A,因此有必要使用 make install 在系统范围内安装库 A,或者将 PKG_CONFIG_PATH 设置为适当的目录。

现在,我使用 Jenkins 在远程机器上构建库 A。不幸的是,由于不满足依赖关系,无法构建库 B(pkg-config 找不到库 A)。在预构建步骤中设置路径不起作用,因为命令在其自己的 shell 中运行。

问题是

  • 我能以某种方式make install 图书馆A 吗?或者,
  • 我能否以某种方式将 CMake 指向 /var/lib/jenkins/jobs/libA/install_dir/lib
  • 有没有更好的方法来构建具有相互依赖库的项目?

【问题讨论】:

    标签: linux jenkins cmake pkg-config


    【解决方案1】:

    按顺序回答您的问题:

    要安装库 A - 您可以配置构建库 A 的 Jenkins 作业,以将库归档为构建工件。然后构建库 B 的工作可以在运行开始时从 Jenkins 下载人工制品——例如http:///job/libA/lastSuccessfulBuild/artifact/
    一旦库 B 作业收集了库 A,就可以安装和使用它。

    配置 Cmake – 我对 cmake 了解不够,所以恐怕无法回答。

    有没有更好的方法 - 可能使用 Rake,我们使用它来控制具有大量依赖项的构建链。虽然我不确定如果必须在远程机器上构建库 A,它会如何工作。如果两个库都构建在同一台机器上,事情可能会更容易管理。

    【讨论】:

    • 实际上它们是建立在同一台(远程)机器上的。我想说的是,Jenkins 或 CMake 可能因为权限问题而无法轻松安装。不幸的是,您的第一个答案确实对我没有帮助,因为库 B 仍然试图通过 pkg-config 查找库 A,如何在这里“下载”工件有帮助?
    • 哦,好吧,当您说您使用 jenkins 在远程机器上构建库 A 时,我认为这意味着这两个库是在不同的机器上构建的。如果您因为权限而无法安装构建库,您可以设置一个 chroot 来构建吗?然后你应该能够在没有权限问题的情况下安装库,或者覆盖构建机器上的其他软件。
    • 这个解决方案很糟糕,因为文档说工件不应大于 100MB。当你用调试符号编译多个库时,很容易被超越。
    【解决方案2】:

    按照 user1013341 的建议,使用工件是解决此问题所需的步骤之一。但要让它与pkg-config 一起工作,我们还需要做更多工作:

    1. 我设置库 A 的 CMakeLists.txt 以生成带有 make package_source 的 tarball。
    2. 成功构建库 A 后,Jenkins 会创建此 tarball 并将其存储为工件。
    3. 库 B 使用 Copy Artifact Plugin 获取 tarball 并解压缩它。在 tarball 里面仍然有构建项目和指向库 A 安装位置的.pc 文件。
    4. 在下一个构建步骤中,我使用EnvInject PluginPKG_CONFIG_PATHLD_LIBRARY_PATH 设置为未解压缩的库A。
    5. 最后但同样重要的是,可以启动正常的 CMake 构建过程,并根据环境变量选择正确的路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多