如何在RHEL上构建/部署新的Boost版本的RPM(s)?

6
我在一个由10多个开发人员组成的团队中工作,我们使用RHEL 6.4作为我们的开发机和服务器(其中部署了我们的软件)。
RHEL 6.4自带Boost 1.41,但我需要至少1.47版本的修补程序。我想升级到最新版(目前是1.56)。
但这并不像下载源代码然后构建/安装那么简单,因为:
- 我希望我们团队的每个人(包括未来的团队成员)都可以轻松访问新的Boost版本。要求每个人都进行构建/安装太麻烦了,而且可能存在不一致性。 - 我们的软件以RPM方式部署在数百台服务器上(这些服务器归其他团队所有,超出我们的控制范围)。这些服务器也正在运行RHEL 6.4。我们的软件(据推测)需要在所有这些机器上运行时链接到新的Boost共享库。
更加棘手的是,RedHat似乎有他们自己专有的方式将Boost软件/库打包成RPMs。他们不只有一个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(s)呢?

2个回答

5

Sam发布了一般策略(适用):从Fedora 20下载Boost 1.54源RPM并根据我的需求进行修改。

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

  1. Rename boost.spec to jason-boost.spec. Next, edit jason-boost.spec as follows.
  2. Redefine macros from /usr (default) to /opt/install/thirdparty. Add to top of file:

    # 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. Change Name from "boost" to "jason-boost"

  4. Change Summary to "TBS LTE upgraded version of Boost library (no changes)"
  5. Change toplev_dirname

    • From:

      %define toplev_dirname %{name}_%{version_enc}
      
    • To:

      %define toplev_dirname boost_%{version_enc}
      
  6. Change Source0

    • From:

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

      Source0: http://downloads.sourceforge.net/boost/boost_1_54_0.tar.bz2
      
  7. Rename "boost" sub-packages to "jason-boost"

    • E.g.

      • From:

        Requires: boost-atomic = %{version}-%{release} 
        
      • To:

        Requires: jason-boost-atomic = %{version}-%{release} 
        
    • E.g.

      • From:

        Requires: boost = %{version}-%{release} 
        
      • To:

        Requires: jason-boost = %{version}-%{release} 
        
  8. Add --prefix=/opt/install/thirdparty to bootstrap.sh options

    • From:

      ./bootstrap.sh --with-toolset=gcc --with-icu
      
    • To:

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

    • From:

      %{_includedir}/%{name} 
      
    • To:

      %{_includedir}/boost
      
  10. Build RPMs without python3, mpich, or openmpi. Python3 isn't easily available unden RHEL 6.4 and mpich and openmpi have all kinds of other compile trouble.

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

2
构建RPMS本身就是一种技能。跑步而不是走路,去最近的商店买一本《Maximum RPM》第二版的书,它将教你如何构建RPMS。
构建RPMS并不是什么高深的科学,但这不是可以在这里用几段话来解释的。我对boost不是很熟悉,但快速检查上面列出的软件包:在Fedora上,它们都是从同一个源RPM构建的。这是一个单一的源包,在构建RPMS的过程中,RPM构建脚本会自动将其分割成多个软件包,就像你看到的那样。因此,它实际上是一个单一的软件包和RPM构建脚本。
尝试从源RPM重新构建Fedora的boost软件包可能值得一试。Fedora的最新boost软件包似乎是1.54,所以1.56甚至还没有构建。至少在Fedora 20上还没有。21 beta可能有更新的boost,我不知道。
尝试从源RPM重新构建是值得一试的。这不会花费很长时间,要么成功,要么失败。从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可能能够捕捉到这一点,也可能不能。因此,如果你走到这一步,请准备好重新构建一堆其他非boost RPMS的可能性。

那本书已经过时了,其中很多内容都不是最新的。虽然它是一个不错的起点。Fedora在他们的网站上有相当不错的入门包装材料。RedHat也有相当数量的好信息。关于破坏宇宙中每个其他使用boost的软件包的信息是很好的,应该更加强调。 - Etan Reisner
第一版的Maximum RPM已经过时了。第二版有点旧,但大部分内容都是最新的。 - Sam Varshavchik
那几乎不算是“有点陈旧”。第一版出版于1997年。那个版本是从2000年的。自那时以来,许多事情在最佳实践/等方面发生了变化。 - Etan Reisner
“Boost不是二进制ABI兼容的” - 这真的改变了游戏规则。我想知道是否可以获取Fedora的Boost源RPM并更改其安装目录,以便不覆盖已有内容?然后我可以更改我的应用程序的RPM依赖项为备用的Boost RPM。 - jfritz42
1
@jfritz42 很遗憾没有链接(虽然我可以通过搜索找到一些),但我已经给出了我会搜索的术语。Fedora和RedHat都有包装介绍、指南等。此外,现有的规范文件很可能是一个很好的起点,是的,重新使用它并使用另一个名称/前缀很可能是一个好主意(类似于官方SCL存储库的工作方式)。 - Etan Reisner
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接