RPM打包冲突的库

什么是RPM打包的东西,提供一个名义上阴影系统的最佳做法是什么?

背景:对于一个支持RPM的Linux系统,我打包了一个“自包含”的应用程序foo ,它希望生活在/ opt下,尽可能多地提供自己的依赖关系,以便不依赖于安装的版本主要系统。 ( foo使用LD_LIBRARY_PATH来避免系统库。)

不幸的是,其中一个foo依赖是一个库grunk ,其版本与主系统所需的libgrunk.so完全相同。 RPM的自动提供:生成然后确定提供这个库的两个RPM。 (这不是真的 – 只有系统软件包可以让程序库对任何程序都可用,而foo软件包只能用于foo 。)

这有时会混淆自动依赖parsing。 例如, yum可能会安装错误的软件包,或者只有两个软件包需要安装。

例:

 grunk-libs-1.2-3.$arch.rpm # System Library Files: %{_libdir}/libgrunk.so.1 %{_libdir}/libgrunk.so.1.2 Provides: libgrunk.so.1()(%{_arch}) foo-xyz-r.$arch.rpm # App Files: /opt/foo /opt/foo/bin/... Requires: libgrunk.so.1()(%{_arch}) # foo needs grunk, but wants its own instance foo-grunklibs-1.2-1.$arch.rpm # App Dependency Files: /opt/foo/libs/libgrunk.so.1 /opt/foo/libs/libgrunk.so.1.2 Provides: libgrunk.so.1()(%{_arch}) # <-- same as from system "grunk-libs" 

我现在已经禁用了AutoReqProv,但我希望能够利用RPM的自动function和依赖关系生成function。 我想让RPM知道foo-grunklibs.rpm通过后者的foo.rpm确实需要foo-grunklibs.rpm ,但是也知道主系统rpm中的相同库是不够的。

我想我是在常规使用的限制。 有没有我可以用来解决这个问题的包装技术?

经过一段时间的考虑,我认为更正确的方法是使用RPM虚拟资源“名称空间”。 例如:

 Provides: resource # 'resource' is available to the whole system Provides: namespace(resource) # 'resource' is specifically available only to "namespace" 

RPM最终看起来像这样:

 grunk-libs.rpm Provides: libgrunk.so.1()(%{_arch}) # System library. unchanged foo.rpm Requires: /bin/sh Requires: libc.so.6()(%{_arch}) Requires: foo(libgrunk.so.1()(%{_arch})) # Note special foo(...) namespace foo-grunklibs.rpm Provides: foo(libgrunk.so.1()(%{_arch})) # Note special foo(...) namespace 

通过这种方式, foolibgrunk的特殊构build的libgrunk不能被普通的grunk-libs RPM满足,但必须通过该库的特定于foo的构build来满足。

我的概念certificate是这样的:

 Name: foo ... Source99: find-namespaced-requires # Here's the magic %define _use_internal_dependency_generator 0 %define __find_requires %{SOURCE99} foo /bin/sh glibc 

脚本find-namespaced-要求包装标准RPM %{_rpmconfigdir} / find-requires并过滤其输出。 它的第一个参数是要使用的命名空间( "foo(...)" ),随后的参数是依赖关系或提供应该命名空间的依赖关系的RPM。 在这个例子中,我想让fooglibc获取主系统的/ bin / sh以及普通的libc,libdl,libm等,但是其他所有的依赖都应该被假定为foo特有的。

通过将上面的大部分内容包含在构build时RPM中,可以使它更简洁一些,也更通用:

 Name: foo BuildRequires: special-deps-macros %define _namespace foo # defaults to %{name} ? %define _generic_dependencies ... # defaults to /bin/sh glibc libselinux ?