常见问题

此页面提供了一些关于如何处理各种常见错误和 QA 通知的方法建议。

处理 QA 通知

Portage 的 ebuild.sh 部分包含了许多针对常见问题的检查。这些检查可能导致显示“QA 通知”消息。您不能依赖 Portage 始终生成这些消息 - 它们不能替代开发人员进行的正确测试和 QA。

QA 通知:USE 标记 foo 不在 IUSE 中

除了“特殊”标记(架构标记和 USE_EXPAND 变量)之外,软件包使用的所有 USE 标记都必须包含在 IUSE 中。请参阅 IUSEUSE 标记

QA 通知:foo 位于全局作用域

当在全局作用域中不适当地使用各种工具时,会出现此消息。请记住,不应该在全局范围内运行任何外部代码。根据所使用的工具,有各种替代方案

sedawkgrepegrepcut
通常,在全局作用域中使用上述任何工具时,都是为了操作版本或程序名称字符串。应避免使用这些工具,而应使用纯 bash 结构。EAPI 7 的内置助手在此处很有用。请参阅 版本和名称格式问题Bash 变量操作
has_versionbest_version
在全局范围内调用这两个函数都表明存在严重问题。您不能根据依赖于系统的信息来更改元数据 - 请参阅 Portage 缓存。您应该重写您的 ebuild 以正确使用依赖项。
pythonperl
Ebuild 是 bash 脚本。将您不会用 bash 做的事情卸载到其他语言是不被接受的 - 至少是因为并非所有用户在 ebuild 被源代码化时都会始终拥有完整系统。

QA 通知:foo 是 setXid,动态链接并使用延迟绑定

出于安全原因,动态链接的 setXid 应用程序在链接时不应使用延迟绑定。如果显示此消息,则有以下几个选项

  • 修改软件包的 Makefile(或等效文件)以在链接时使用 -Wl,-z,now。此解决方案是首选。
  • 使用 append-ldflags(请参阅 添加其他标记)添加 -Wl,-z,now。这将影响所有安装的二进制文件,而不仅仅是 setXid 二进制文件。

QA 通知:ECLAS foo 非法继承

所有 eclass 继承必须是无条件的,或者仅基于静态的与机器无关的标准(PNPV 在此处最常见)。请参阅 Portage 缓存

在实际上没有发生任何非法继承的情况下,您可能会看到此警告。最常见的情况是

  • 取消合并使用旧版 Portage 版本(未记录继承)安装的软件包时。
  • 在使用具有陈旧缓存的覆盖层中的 eclass 时。请参阅 覆盖层和 eclass
  • 在使用陈旧的 Portage 缓存时。

如果您在本地看到此通知,则应根据 Portage 缓存 中描述的规则手动检查。如果您在使用纯 emerge sync 通过 rsync 设置进行操作时看到此通知,则它可能是一个真实的问题。

处理访问冲突

Portage 在构建过程的某些阶段使用沙箱。这可以防止软件包意外写入“安全”位置之外。请参阅 沙箱 以获取详细信息。

如果软件包违反了沙箱,则将给出如下错误(假设沙箱已启用并在测试系统上工作,对于开发人员机器而言,这始终应该如此)

    --------------------------- ACCESS VIOLATION SUMMARY ---------------------------
    LOG FILE = "/tmp/sandbox-app-misc_-_breakme-1-31742.log"

    open_wr:   /big-fat-red-error
    --------------------------------------------------------------------------------

open_wr 表示软件包尝试打开一个不在写入许可区域内的文件进行写入。在本例中,相关文件是 /big-fat-red-error

对于读取受限区域,存在其他错误消息 - 这些消息在 ebuild 中很少使用。

访问冲突最常发生在安装阶段。有时可以通过欺骗构建系统使用更安全的位置来解决沙箱冲突。请参阅 src_install安装目标 以进行讨论。