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

时间:2014-09-16 23:15:21

标签: c++ linux boost rpm rhel

我在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?

2 个答案:

答案 0 :(得分:3)

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从“提升”改为“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”

    • E.g。

      • 自:

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

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

      • 自:

        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不容易使用unden RHEL 6.4和mpich和openmpi有各种其他编译麻烦。

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

答案 1 :(得分:1)

构建RPMS本身就是一项技能。跑步,不要走路,到最近的商店,买一本“最高转速”书,第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可能会或可能不会捕获。所以,如果你做到这一点,也要为重建一堆其他非增强RPMS的可能性做好准备。