【问题标题】:How to build/deploy RPM(s) for new Boost version on RHEL?如何在 RHEL 上为新的 Boost 版本构建/部署 RPM?
【发布时间】:2014-11-10 20:33:12
【问题描述】:

我在一个由 10 多名开发人员组成的团队中工作,我们将 RHEL 6.4 用于我们的开发机器和服务器(部署我们的软件的地方)。

RHEL 6.4 附带 Boost 1.41,但我需要至少 1.47 中的修复。我想升级到最新版本(目前是 1.56)。

这不像下载源代码和构建/安装那么容易,因为:

  • 我希望我们团队中的每个人(包括未来的团队成员)都能轻松访问新的 Boost 版本。要求每个人都构建/安装很麻烦,并且可能存在不一致。
  • 我们的软件部署为 RPM,安装在数百台服务器上(这些服务器归其他团队所有,不受我们的控制)。这些也运行 RHEL 6.4。我们的软件(可能)需要在所有这些机器上运行时链接到新的 Boost 共享库。

为了让事情变得更丑陋,RedHat 似乎有自己的专有方式将 Boost 软件/库捆绑/打包到 RPM 中。它们不只有一个 RPM,而是一系列较小的 RPM:

$ yum list installed|grep boost
boost.x86_64                          1.41.0-11.el6_1.2           @Workstation  
boost-date-time.x86_64                1.41.0-11.el6_1.2           @Workstation  
boost-devel.x86_64                    1.41.0-11.el6_1.2           @Workstation  
boost-filesystem.x86_64               1.41.0-11.el6_1.2           @Workstation  
boost-graph.x86_64                    1.41.0-11.el6_1.2           @Workstation  
boost-iostreams.x86_64                1.41.0-11.el6_1.2           @Workstation  
boost-program-options.x86_64          1.41.0-11.el6_1.2           @Workstation  
boost-python.x86_64                   1.41.0-11.el6_1.2           @Workstation  
boost-regex.x86_64                    1.41.0-11.el6_1.2           @Workstation  
boost-serialization.x86_64            1.41.0-11.el6_1.2           @Workstation  
boost-signals.x86_64                  1.41.0-11.el6_1.2           @Workstation  
boost-system.x86_64                   1.41.0-11.el6_1.2           @Workstation  
boost-test.x86_64                     1.41.0-11.el6_1.2           @Workstation  
boost-thread.x86_64                   1.41.0-11.el6_1.2           @Workstation  
boost-wave.x86_64                     1.41.0-11.el6_1.2           @Workstation  

我一直在谷歌上搜索,但找不到简单的解决方案。在 RPM 方面,我还是个新手。

在我们的情况下,如何将 Boost 1.56 构建/部署为 RPM?

【问题讨论】:

    标签: c++ linux boost rpm rhel


    【解决方案1】:

    Sam 发布了总体策略(可行):从 Fedora 20 下载 Boost 1.54 源 RPM 并根据我的目的对其进行修改。

    这里是我如何编辑 boost.spec 文件以将 RPM 重命名为 jason-boost* 并安装在 /opt/install/thirdparty 下的额外细节。

    1. 将 boost.spec 重命名为 jason-boost.spec。接下来,编辑 jason-boost.spec,如下所示。
    2. 将宏从 /usr(默认)重新定义为 /opt/install/thirdparty。添加到文件顶部:

      # Override installation dirs. We don't want things to go into
      # /usr (default) because they would overwrite the system Boost
      # library.
      %define _prefix /opt/install/thirdparty
      %define _defaultdocdir /opt/install/thirdparty/share/doc
      %define _mandir /opt/install/thirdparty/share/man
      
    3. Name 从“boost”更改为“jason-boost”

    4. Summary 更改为“TBS LTE 升级版 Boost 库(无更改)”
    5. 更改toplev_dirname

      • 发件人:

        %define toplev_dirname %{name}_%{version_enc}
        
      • 收件人:

        %define toplev_dirname boost_%{version_enc}
        
    6. 更改Source0

      • 发件人:

        Source0: http://downloads.sourceforge.net/%{name}/%{toplev_dirname}.tar.bz2
        
      • 收件人:

        Source0: http://downloads.sourceforge.net/boost/boost_1_54_0.tar.bz2
        
    7. 将“boost”子包重命名为“jason-boost”

      • 例如

        • 发件人:

          Requires: boost-atomic = %{version}-%{release} 
          
        • 收件人:

          Requires: jason-boost-atomic = %{version}-%{release} 
          
      • 例如

        • 发件人:

          Requires: boost = %{version}-%{release} 
          
        • 收件人:

          Requires: jason-boost = %{version}-%{release} 
          
    8. --prefix=/opt/install/thirdparty 添加到bootstrap.sh 选项

      • 发件人:

        ./bootstrap.sh --with-toolset=gcc --with-icu
        
      • 收件人:

        ./bootstrap.sh --with-toolset=gcc --with-icu --prefix=/opt/install/thirdparty
        
    9. 改变

      • 发件人:

        %{_includedir}/%{name} 
        
      • 收件人:

        %{_includedir}/boost
        
    10. 在没有 python3、mpich 或 openmpi 的情况下构建 RPM。 Python3 在 RHEL 6.4 中不容易获得,mpich 和 openmpi 还有各种其他编译问题。

      rpmbuild -ba jason-boost.spec --without python3 --without mpich --without openmpi
      

    【讨论】:

      【解决方案2】:

      构建 RPMS 本身就是一项技能。跑到最近的商店,不要走路,买一本“Maximum RPM”书,第 2 版,它将教你如何构建 RPMS。

      构建 RPMS 并不完全是火箭科学,但这不是几段可以解释的东西,这里。我对 boost 不是很熟悉,但可以快速检查一下上面列出的包:在 Fedora 上,它们都是从相同的源 RPM 构建的。它是一个单一的源代码包,作为构建 RPM 的一部分,RPM 构建脚本会自动将其分割成多个包,就像您看到的那样。所以,它实际上是一个单独的包,以及 RPM 构建脚本。

      您可能值得尝试从源 RPM 重建 Fedora 的 boost 包,看看它是否适合您。 Fedora 的最新增强包似乎是 1.54,所以甚至还没有构建 1.56。至少在 Fedora 20 上还没有。21 beta 可能会有更新的提升;我不知道。

      尝试从源 RPMS 重建值得一试。它不会花很长时间,它要么工作,要么不工作。从 Fedora 的下载库获取 boost-1.54.0-9.fc20.src.rpm 的副本;将它下载到您的 RHEL 盒子上,然后尝试看看会发生什么:

      [user@localhost]$ rpmbuild --rebuild boost-1.54.0-9.fc20.src.rpm
      

      你会很快知道它是否有效。

      但即使这行得通,你还不是在树林里。 Boost 在版本之间不兼容二进制 ABI。这意味着,一旦你更新了你的 boost 包,你几乎肯定会破坏你拥有的任何现有应用程序,包括链接到 boost 的 RHEL 包;并且 rpm 可能会也可能无法捕捉到这一点。因此,如果您走到了这一步,请为可能不得不重新构建一堆其他非增强型 RPM 做好准备。

      【讨论】:

      • 那本书很旧,里面有很多不是最新的。虽然这是一个好的开始。 Fedora 在其网站上有相当不错的介绍性包装材料。 RedHat 也有相当多的好信息。关于打破宇宙中所有其他使用提升包的信息是好的,应该更加强调。
      • Maximum RPM 的第 1 版已过时。第 2 版有点尘土飞扬,但大部分都是最新的。
      • 这几乎不是我所说的“有点尘土飞扬”。第一版是1997。该版本来自2000。从那时起,在最佳实践/等方面发生了许多变化。
      • “Boost 不兼容二进制 ABI”——这确实改变了游戏规则。我想知道我是否可以获取 Fedora 的 Boost 源 RPM 并将其更改为安装到不同的目录,以免覆盖已经存在的内容?然后我可以将我的应用的 RPM 更改为依赖于备用 Boost RPM。
      • @jfritz42 不幸的是没有链接(虽然我可以通过一些搜索来挖掘一些),但我确实给出了我或多或少会搜索的术语。 Fedora 和 RedHat 都有包装介绍、指南等。此外,现有的规范文件可能是一个很好的起点,是的,使用备用名称/前缀重新使用它可能是一个好主意(类似于官方 SCL 存储库的方式)我相信工作)。
      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 2022-11-11
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多