为什么在Yocto中尝试安装时会出现/etc/cups冲突?

8

我有一份编译打印机驱动程序的配方,并且在do_install中运行几行简单的代码。

do_install() {
  install -d ${D}${libdir}/cups/filter
  install -m 755 ${B}/src/rastertoprinter ${D}${libdir}/cups/filter/
  install -d ${D}${sysconfdir}/cups/ppd
  install -m 755 ${B}/../rastertoprinter/printer_name.ppd ${D}${sysconfdir}/cups/ppd/
}

为了编译源代码,我需要在DEPENDS中添加cups,并且在RDEPENDS中也需要添加cups,因为操作系统需要安装cups才能打印。
由于打印机驱动程序不是公开的,因此我将其重命名为rastertoprinter并更改了路径名称。
基本上,我只需要创建或确保目录/usr/lib/cups/filter存在,并将rastertoprinter程序复制到该目录中。我还需要创建或确保目录/etc/cups/ppd存在,并将.ppd文件复制到该目录中。
前两行运行良好,但第三行会抛出以下错误:
file /etc/cups conflicts between attempted installs of printername-r0.corei7_64 and cups-2.2.2-r0.corei7_64
file /etc/cups/ppd conflicts between attempted installs of printername-r0.corei7_64 and cups-2.2.2-r0.corei7_64

我不明白为什么这两个命令都不能创建这个目录并往里面放东西?奇怪的是,我可以正常地使用第一个命令创建 /usr/lib/cups/filter 目录。

2个回答

9
原来问题在于Yocto中每个要打包的文件都会为其父级目录生成一个%dir。我们不想拥有由另一个软件包所拥有的目录,因此如果您将以下内容添加到您的配方中,则可以解决该问题:
DIRFILES = "1"

这将导致您的软件包不拥有软件包中文件所在的父目录。
这将生成一个没有%dir条目的rpm规范文件。

真幸运,有人问了这么一个晦涩的问题,并且得到了答案。 - Paulo Neves
1
值得注意的是,如果您错误地安装文件以替换目录,则可能会收到非常相似的错误 - 如果您忽略创建目录,然后继续安装文件并将该目录指定为目标而不是完整路径,则可能会发生这种情况。 - bluelightning

2
这是一个非常古老的问题,但答案实际上是错误的。原因在于两个软件包都试图安装不同的目录:cups 提供带有组所有权为 lp 的 /etc/cups,而 gutenprint 提供带有组所有权为 root 的 /etc/cups。
使权限相同,就不必去处理 DIRFILES 了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接