我在一个由10多个开发人员组成的团队中工作,我们使用RHEL 6.4作为我们的开发机器和服务器(我们的软件部署在这里)。
RHEL 6.4自带了Boost 1.41,但我需要修复至less1.47。 我想升级到最新(目前1.56)。
它不像下载源代码和编译/安装那么简单,因为:
更糟糕的是,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下的额外详细信息。
将/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
将Name
从“boost”更改为“jason-boost”
Summary
更改为“TBS LTE升级版Boost库(不更改)” 更改toplev_dirname
从:
%define toplev_dirname %{name}_%{version_enc}
至:
%define toplev_dirname boost_%{version_enc}
更改Source0
从:
Source0: http://downloads.sourceforge.net/%{name}/%{toplev_dirname}.tar.bz2
至:
Source0: http://downloads.sourceforge.net/boost/boost_1_54_0.tar.bz2
将“boost”子包重命名为“jason-boost”
例如
从:
Requires: boost-atomic = %{version}-%{release}
至:
Requires: jason-boost-atomic = %{version}-%{release}
例如
从:
Requires: boost = %{version}-%{release}
至:
Requires: jason-boost = %{version}-%{release}
将--prefix=/opt/install/thirdparty
到bootstrap.sh
选项
从:
./bootstrap.sh --with-toolset=gcc --with-icu
至:
./bootstrap.sh --with-toolset=gcc --with-icu --prefix=/opt/install/thirdparty
更改
从:
%{_includedir}/%{name}
至:
%{_includedir}/boost
不使用python3,mpich或openmpi构建RPM。 Python3并不容易取消RHEL 6.4,mpich和openmpi有其他各种编译的麻烦。
rpmbuild -ba jason-boost.spec --without python3 --without mpich --without openmpi