假设我为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>
答案 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
显示同一目录的软件包。例如,initscripts和chkconfig使用%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