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

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

RHEL 6.4自带了Boost 1.41,但我需要修复至less1.47。 我想升级到最新(目前1.56)。

它不像下载源代码和编译/安装那么简单,因为:

  • 我希望我们团队中的每个人(包括未来的团队成员)能够轻松访问新的Boost版本。 要求每个人build立/安装都是很麻烦的,可能会有不一致的地方。
  • 我们的软件被部署为安装在数百台服务器上的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 

我一直在谷歌search,找不到一个简单的解决scheme。 谈到RPM,我也是一个新手。

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

建立RPMS本身就是一项技能。 跑,不要走路,到最近的商店,买一本“最大RPM”的书,第二版,这将教你如何建立RPMS的副本。

建立RPMS并不完全是火箭科学,但这里不能解释几段。 我对boost并不是很熟悉,但是对上面列出的软件包进行了快速检查:在Fedora上,所有这些软件包都是由相同的源RPM构建的。 这是一个单一的源代码包,作为构建RPM的一部分,RPM构建脚本会自动将其封装成多个包,就像你看到的一样。 所以,这实际上是一个单一的包,而RPM的构建脚本。

可能值得一试,尝试从源代码RPM中重建Fedora的boost包,看看它是否适合你。 最新的Fedora升级包似乎是1.54,所以1.56还没有建成。 至少在Fedora 20还没有.21测试版可能有一个更新的提升; 我不知道。

试图从源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兼容的。 这意味着,只要你升级你的升级包,你几乎可以保证打破你现有的任何应用程序,包括链接反对升压的RHEL包; 和转速可能会或可能无法捕捉。 所以,如果你得到这么多的话,也要准备好重建一堆其他非升压RPMS的可能性。

山姆发布了一般策略(工作):从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/thirdpartybootstrap.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