rpmbuild:目录的共同所有权

时间:2015-05-06 04:38:52

标签: linux rpm rpmbuild rpm-spec

假设我为myprog1和myprog2构建的软件包将安装在/ usr / lib / mysystem / myprog1 /和/ usr / lib / mysystem / myprog2 /

根据一些发行版'文档,例如在OpenSUSE的情况下,两个包都必须拥有共享目录。但是如何在.spec文件中完成?以下是否正确?

%files
/usr/lib/mysystem

或者我需要做什么

%files
%dir /usr/lib/mysystem
/usr/lib/mysystem/myprog<1|2>

2 个答案:

答案 0 :(得分:1)

通常只有一个包拥有给定目录。在典型的系统中,会有一个诸如“filesystem”之类的包,它可能拥有诸如/bin之类的东西。对于Red Hat和OpenSUSE上的filesystem包,该包拥有/usr/bin但该目录中没有任何文件。

你可以这样做,通过创建一个包装器包,它拥有在你的应用程序中共享的东西,并使它成为安装到这些目录中的应用程序的依赖项(Requires)。

要查看rpm实际拥有的内容,您可以使用-qf选项,例如,

rpm -qf /usr/lib/mysystem/myprog

该命令适用于目录和文件。

%dir%files的文档是决定如何使包拥有目录时的起点。在Maximum RPM: Taking the Red Hat Package Manager to the Limit第13章 Directives For the %files list 中,它说:

  

正如我们在the section called The %files List中提到的,如果在%files 列表中指定了目录,则该目录的内容以及其下每个目录的内容将自动包含在内在包中

     

解决这个问题的方法是使用%dir 指令。通过将此指令添加到包含该目录的行,RPM将仅打包目录本身,而不管创建包时目录中的文件是什么。以下是%dir 的示例。

%dir /usr/blather

所以建议案例的后一个案例遵循文档。但是,作为检查语法是否正确(即使rpm恰好构建)的检查,最好检查路径名列表。

调查Fedora 21以查找rpm -qf显示同一目录的软件包。例如,initscriptschkconfig使用%dir指令执行此操作:

%dir /etc/rc.d
%dir /etc/rc.d/rc[0-9].d
%dir /etc/rc.d/init.d

initscripts规范文件中,

/etc/rc.d
/etc/rc.d/init.d
/etc/rc[0-6].d
/etc/rc.d/rc[0-6].d
<{1>}规范文件中的

。但是,chkconfig包需要initscripts,由/sbin/chkconfig包提供。由于该依赖关系,chkconfig是目录的实际所有者。

答案 1 :(得分:1)

这取决于,特别是如果program1和program2的包是从一个源构建或形成完全不同的源。

如果它们来自一个来源,则必须以更复杂的方式区分:

%files program1
%dir /usr/lib/mysystem
/usr/lib/mysystem/program1

%files program2
%dir /usr/lib/mysystem
/usr/lib/mysystem/program2

如果你单独构建它们,你可以做到

%files programX
/usr/lib/mysystem

如果你使用干净的buildroot,但它只包含你的包创建的文件。

但这并没有伤害

%files programX
%dir /usr/lib/mysystem
/usr/lib/mysystem/programX

如果您有几个这样的软件包,您甚至可以创建一个拥有该目录的公共软件包,如果您有这样的软件包,还可以提供其他要求。那么就需要这个“父包”,“公司包”或者你想如何命名它。

然后就足够了

Requires: mysystemcompanypackage
...
%files
/usr/lib/mysystem/program1