常见问题
此页面提供了一些关于如何处理各种常见错误和 QA 通知的方法建议。
处理 QA 通知
Portage 的 ebuild.sh
部分包含了许多针对常见问题的检查。这些检查可能导致显示“QA 通知”消息。您不能依赖 Portage 始终生成这些消息 - 它们不能替代开发人员进行的正确测试和 QA。
QA 通知:USE 标记 foo 不在 IUSE 中
除了“特殊”标记(架构标记和 USE_EXPAND
变量)之外,软件包使用的所有 USE
标记都必须包含在 IUSE
中。请参阅 IUSE 和 USE 标记。
QA 通知:foo 位于全局作用域
当在全局作用域中不适当地使用各种工具时,会出现此消息。请记住,不应该在全局范围内运行任何外部代码。根据所使用的工具,有各种替代方案
-
sed
、awk
、grep
、egrep
、cut
等 - 通常,在全局作用域中使用上述任何工具时,都是为了操作版本或程序名称字符串。应避免使用这些工具,而应使用纯
bash
结构。EAPI 7 的内置助手在此处很有用。请参阅 版本和名称格式问题 和 Bash 变量操作。 -
has_version
、best_version
- 在全局范围内调用这两个函数都表明存在严重问题。您不能根据依赖于系统的信息来更改元数据 - 请参阅 Portage 缓存。您应该重写您的 ebuild 以正确使用依赖项。
-
python
、perl
等 - Ebuild 是
bash
脚本。将您不会用bash
做的事情卸载到其他语言是不被接受的 - 至少是因为并非所有用户在 ebuild 被源代码化时都会始终拥有完整系统。
QA 通知:foo 是 setXid,动态链接并使用延迟绑定
出于安全原因,动态链接的 setXid 应用程序在链接时不应使用延迟绑定。如果显示此消息,则有以下几个选项
- 修改软件包的 Makefile(或等效文件)以在链接时使用
-Wl,-z,now
。此解决方案是首选。 - 使用
append-ldflags
(请参阅 添加其他标记)添加-Wl,-z,now
。这将影响所有安装的二进制文件,而不仅仅是 setXid 二进制文件。
QA 通知:ECLAS foo 非法继承
所有 eclass 继承必须是无条件的,或者仅基于静态的与机器无关的标准(PN
和 PV
在此处最常见)。请参阅 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
和 安装目标 以进行讨论。