jfr*_*z42 5 c++ linux boost rpm rhel
我在一个由 10 多名开发人员组成的团队中工作,我们将 RHEL 6.4 用于我们的开发机器和服务器(部署我们的软件)。
RHEL 6.4 带有 Boost 1.41,但我需要至少 1.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
Run Code Online (Sandbox Code Playgroud)
我一直在谷歌搜索,找不到简单的解决方案。在 RPM 方面,我也是一个新手。
在我们的情况下,如何将 Boost 1.56 构建/部署为 RPM?
Sam 发布了一般策略(有效):从 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
Run Code Online (Sandbox Code Playgroud)从“boost”更改Name为“jason-boost”
Summary为“TBS LTE升级版Boost库(无变化)”改变toplev_dirname
从:
%define toplev_dirname %{name}_%{version_enc}
Run Code Online (Sandbox Code Playgroud)到:
%define toplev_dirname boost_%{version_enc}
Run Code Online (Sandbox Code Playgroud)改变Source0
从:
Source0: http://downloads.sourceforge.net/%{name}/%{toplev_dirname}.tar.bz2
Run Code Online (Sandbox Code Playgroud)到:
Source0: http://downloads.sourceforge.net/boost/boost_1_54_0.tar.bz2
Run Code Online (Sandbox Code Playgroud)将“boost”子包重命名为“jason-boost”
例如
从:
Requires: boost-atomic = %{version}-%{release}
Run Code Online (Sandbox Code Playgroud)到:
Requires: jason-boost-atomic = %{version}-%{release}
Run Code Online (Sandbox Code Playgroud)例如
从:
Requires: boost = %{version}-%{release}
Run Code Online (Sandbox Code Playgroud)到:
Requires: jason-boost = %{version}-%{release}
Run Code Online (Sandbox Code Playgroud)添加--prefix=/opt/install/thirdparty到bootstrap.sh选项
从:
./bootstrap.sh --with-toolset=gcc --with-icu
Run Code Online (Sandbox Code Playgroud)到:
./bootstrap.sh --with-toolset=gcc --with-icu --prefix=/opt/install/thirdparty
Run Code Online (Sandbox Code Playgroud)改变
从:
%{_includedir}/%{name}
Run Code Online (Sandbox Code Playgroud)到:
%{_includedir}/boost
Run Code Online (Sandbox Code Playgroud)无需 python3、mpich 或 openmpi 即可构建 RPM。Python3 在 RHEL 6.4 下不容易使用,并且 mpich 和 openmpi 存在各种其他编译问题。
rpmbuild -ba jason-boost.spec --without python3 --without mpich --without openmpi
Run Code Online (Sandbox Code Playgroud)构建 RPMS 本身就是一项技能。跑,不要走路,到最近的商店,买一本“最大 RPM”书,第二版,这本书将教您如何构建 RPMS。
构建 RPMS 并不完全是火箭科学,但也不是几段文字就能解释清楚的事情。我对 boost 不太熟悉,但快速检查一下上面列出的软件包:在 Fedora 上,所有这些软件包都是从相同源 RPM 构建的。它是一个单一的源包,并且作为构建 RPM 的一部分,RPM 构建脚本会自动将其分成多个包,就像您所看到的那样。所以,它实际上是一个包和 RPM 构建脚本。
您可能值得一试,尝试从源 RPM 重建 Fedora 的 boost 软件包,看看它是否适合您。Fedora 的最新 boost 包似乎是 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
Run Code Online (Sandbox Code Playgroud)
您很快就会知道它是否有效。
但即使这有效,你还没有脱离困境。Boost 在版本之间不兼容二进制 ABI。这意味着,一旦您更新了 boost 软件包,您几乎肯定会破坏您拥有的任何现有应用程序,包括链接到 boost 的 RHEL 软件包;rpm 可能能够也可能无法捕捉到这一点。因此,如果您做到了这一点,请准备好重新构建一堆其他非升压 RPMS 的可能性。