我正在尝试从外部构建的库创建 RPM。
我的规格基本上是这样的:
Name: ace-tao
Version: 6.5.3
Release: 1
Summary: ACE and TAO libraries
License: other
Vendor: My Corp
Group: Applications/Engineering
Packager: My Corp <[email protected]>
Prefix: /usr/local/foo
%description
Contains the ACE and TAO libraries.
%install
mkdir -p %{buildroot}/%{prefix}/lib
cp -f %{_sourcedir}/deps/libACE*.so.%{version} %{buildroot}/%{prefix}/lib/
cp -f %{_sourcedir}/deps/libTAO*.so.2.5.3 %{buildroot}/%{prefix}/lib/
(
cd %{buildroot}/%{prefix}/lib/
for lib in libTAO*.so.2.5.3; do
ln -s $lib ${lib%.3}
ln -s $lib ${lib%.5.3}
ln -s $lib ${lib%.2.5.3}
done
)
%files
%defattr(-,root,root,-)
%{prefix}
TAO 库要求
libTAO*.so
、libTAO*.so.2
和 libTAO*.so.2.5
到 libTAO*.so.2.5.3
,因此需要 ln
调用。
用
rpmbuild -bb ace-tao.spec
构建此文件后,我得到一个文件 ace-tao-6.5.3-1.x86_64.rpm
。然而,安装这个会产生警告:
15:16:32,868 WARN packaging: ace-tao-6.5.3-1.x86_64 requires libTAO.so.2.5.3()(64bit)
15:16:32,868 WARN packaging: ace-tao-6.5.3-1.x86_64 requires libTAO_CodecFactory.so.2.5.3()(64bit)
15:16:32,868 WARN packaging: ace-tao-6.5.3-1.x86_64 requires libTAO_10RTable.so.2.5.3()(64bit)
... snip ...
检查包裹的要求,
rpm -qRp ace-tao-6.5.3-1.x86_64.rpm
确实列出了
libTAO.so.2.5.3()(64bit)
libTAO_AnyTypeCode.so.2.5.3()(64bit)
libTAO_CodecFactory.so.2.5.3()(64bit)
... snip ...
RPM 并没有提供它们:
$ rpm --provides -qp ace-tao-6.5.3-1.x86_64.rpm
ace-tao = 6.5.3-1
ace-tao(x86-64) = 6.5.3-1
即使它包含它们:
$ rpm -qlp ace-tao-6.5.3-1.x86_64.rpm | grep TAO
/usr/local/foo/lib/libTAO.so
/usr/local/foo/lib/libTAO.so.2
/usr/local/foo/lib/libTAO.so.2.5
/usr/local/foo/lib/libTAO.so.2.5.3
/usr/local/foo/lib/libTAO_AnyTypeCode.so
/usr/local/foo/lib/libTAO_AnyTypeCode.so.2
/usr/local/foo/lib/libTAO_AnyTypeCode.so.2.5
/usr/local/foo/lib/libTAO_AnyTypeCode.so.2.5.3
/usr/local/foo/lib/libTAO_CodecFactory.so
/usr/local/foo/lib/libTAO_CodecFactory.so.2
/usr/local/foo/lib/libTAO_CodecFactory.so.2.5
/usr/local/foo/lib/libTAO_CodecFactory.so.2.5.3
... snip ...
这是为什么呢?我需要对 RPM 进行哪些更改才能提供其包含的库?
我使用的是 CentOS 7.9。
为了让 RPM 的自动依赖系统获取共享对象,它们需要设置其可执行位。我怀疑你没有在这里这样做。
因此,在您的
%install
部分中,要么使用 install -Dm 755
而不是 cp
,要么使用 chmod 755
它们。请注意,您只需要对常规文件执行此操作;默认情况下,符号链接具有模式 777
。
虽然并不理想,但您始终可以手动声明
Provides:
条目作为最后的手段。
P.s.我不确定当您安装到非标准路径(即在
%{_libdir}
之外)时自动检测是否有效。如果设置可执行位不起作用,您可能希望尝试安装到 %{buildroot}%{_bindir}
。