USE 标志
USE
标志用于控制可选依赖项和设置,这些依赖项和设置是用户可能合理地希望选择的。例如,app-editors/vim
可选择构建对 ruby
解释器的支持,它需要安装 dev-lang/ruby
来实现这一点 - 我们使用 ruby USE
标志来提供此选项。另一方面,app-text/glark
无论如何都需要 ruby
,因此在那里没有使用 USE
标志。
任何 USE
标志组合都不应导致软件包无法构建,因为用户可以设置任何标志组合。
软件包不应根据编译时可用的内容进行配置和链接 - 任何自动检测都必须被覆盖。这通常被称为依赖项是“自动化的”。这很糟糕,因为依赖项没有被包管理器工具检测到,并且很容易破坏,以及其他问题。
自动化的依赖项最好通过准备一个构建系统补丁来修复,该补丁添加适当的选项来控制相关依赖项,并将该补丁提交到上游,以造福所有用户。为了避免在下游携带额外的补丁,自动化的依赖项通常可以使用特殊的构建系统选项(例如,autotools 中的缓存变量)或通过无条件地依赖相关软件包来解决(即,强制检查始终成功)。
pkg_prerm
和 pkg_postrm
中的值取自那里。这意味着在合并和取消合并之间设置或取消设置 USE 标志无效。何时不使用 USE 标志?
虽然 USE
标志通常被认为对用户有利,但也有有效的使用案例可以避免它们。在编写 ebuild 时,请考虑是否为特定条件功能添加标志,或者探索下面描述的替代解决方案之一。
使用 USE
标志不应控制运行时依赖项,而软件包没有链接到它。这样做会为软件包创建额外的配置,并在磁盘上没有底层文件更改的情况下重新编译。应避免这种情况,而应通过安装后的消息(如果需要)将其传达给用户。
USE
标志不得用于控制安装小文件、非侵入性文件、不引入额外的构建时依赖项或导致构建时间显着增加的文件。此类文件的示例包括 bash 完成文件、init.d 脚本、logrotate 配置文件、systemd 服务文件。其原理与上面相同。相反,这些文件必须无条件安装。
对于具有多个条件程序或模块的软件包,也可以进行类似的论证。每当这导致大量 USE
标志,迫使用户花费大量时间选择兼容标志,并在选择不完整后可能需要重新构建时,请考虑将标志的使用减少到那些具有外部依赖项和/或构建时间长的程序或模块。其余的应该无条件构建,或者由 minimal
等标志控制。
你不应该引入操纵编译器标志或类似变量的 USE 标志,这些标志和变量是用户直接配置的(例如,-O3
、-flto
)。相反,软件包应该完全避免操纵它们,并让用户直接设置它们。常见的错误包括
- 使用
debug
USE 标志强制-O0 -g
并禁用剥离。debug
标志的正确用途是控制额外的调试代码路径。使用正确的标志和功能来保留调试信息是用户的责任。 - 引入
lto
标志来强制-flto
。这是用户应该在标志变量中直接设置的内容。 - 使用
CPU_FLAGS_*
来控制-m*
选项。这些标志旨在控制明确需要特定 CPU 扩展的代码路径,例如单独的汇编。编译器生成的汇编应该尊重用户的-march
选择。
可能存在这些规则不适用的极端情况。例如,一些上游要求用户使用特定的 CFLAGS
并拒绝针对使用其他值的构建的错误报告。在这种情况下,习惯上是默认情况下剥离标志,并提供 custom-cflags
标志来允许用户强制使用他们首选的标志。另一个例外是 CFLAGS
,它在编译时启用/禁用功能(通过预处理器宏)。
noblah
USE 标志
避免使用 noblah
样式的 USE
标志。它们会破坏 use.mask
并导致架构开发人员遇到各种复杂情况。以下是原因
考虑一个名为 'vplayer' 的假设软件包,它可以播放视频。该软件包通过 USE
标志提供对各种声音和视频输出方法、各种视频编解码器等的可选支持。
vplayer 的一项可选功能是对 'fakemedia' 编解码器的支持,不幸的是,它只能作为不可靠的 x86 二进制文件提供。我们可以通过以下方式处理这个问题:
RDEPEND="x86? ( fakemedia? ( >=media-libs/fakemedia-1.1 ) )"
但这样做很糟糕 - 当也制作 AMD64 二进制文件时会发生什么?此外,其他架构上的用户将在 emerge -pv
输出中看到 fakemedia,即使它实际上不可用。
类似地,假设 vplayer 支持通过 ALSA 编解码器输出作为一种选择。但是,ALSA 在 SPARC 或 Alpha 上不可用(或在编写本示例时不可用)。因此,我们可以这样做
DEPEND="!sparc? ( !alpha? ( alsa? ( media-libs/alsa-lib ) ) )"
同样,它很混乱,ALSA 仍然显示在 emerge -p
输出中。此外,一旦 ALSA 开始在 SPARC 上工作,每个执行此操作的 ebuild 都必须手动编辑。
解决方案是 use.mask
,它在 Profiles use.mask file 中有记录。每个配置文件都可以有一个 use.mask
文件,该文件可以用来强制在给定架构(或子架构或子配置文件)上禁用某些 USE 标志。因此,如果 fakemedia
USE 标志在每个非 x86 配置文件中都被 use.masked,那么以下操作将是完全合法的,不会破坏任何东西
RDEPEND="fakemedia? ( >=media-libs/fakemedia-1-1 )"
非 x86 的用户在执行 emerge -pv vplayer
时会看到以下内容
[ebuild R ] media-video/vplayer-1.2 alsa -blah (-fakemedia) xyz
要将标志添加到 use.mask
中,请咨询相关的架构团队。
IUSE 默认值
在 IUSE
中的 use 标志名称之前添加 +
或 -
以默认情况下将其打开或关闭。
应谨慎使用 IUSE 默认值。排除/默认禁用功能的原因可能包括例如依赖项的构建时间很长,或者 Gentoo 维护人员无法在运行时测试的配置。
软件包的 IUSE 默认值不应使软件包处于非功能状态或缺少重要的常见功能。咨询上游文档可能有助于评估这一点。
IUSE
中的标志之前添加 -
几乎毫无用处,因为它既不会覆盖用户配置 (make.conf
),也不会覆盖配置文件默认值 (make.defaults
和 package.use
)。有关 Portage 中 USE 顺序的详细信息,请参阅 make.conf(5)。# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
IUSE="+bar foo"
本地和全局 USE 标志
USE 标志分为本地和全局两种。全局 USE 标志必须满足以下几个条件:
- 它被许多不同的软件包使用,至少 5 个似乎是公认的。
- 它具有通用的非特定用途。
第二点很重要。如果 USE 标志对 pkg-one
的影响与对 pkg-two
的影响有很大不同,那么该标志不适合作为全局标志。特别是,请注意,如果引入了 client
和 server
USE 标志,它们不能成为全局 USE 标志,原因就在于此。
在引入新的全局 USE 标志之前,必须在 gentoo-dev 邮件列表中进行讨论。
USE 标志描述
所有 USE 标志必须在 profiles/
目录中的 use.desc
或软件包目录中的 metadata.xml
中进行描述。有关格式说明,请参见 man portage
或这些文件中的注释。请记住,要保持这些文件排序。文件 use.local.desc
是从软件包的 metadata.xml
中的条目自动生成的,可以被解析树的工具使用。由于 use.local.desc
是自动生成的,因此永远不要在树中手动编辑它。有关更多信息,请参见 GLEP 56。
对此的例外是 USE_EXPAND
标志,它们必须在 profiles/desc/
目录中进行文档化。每个 USE_EXPAND
变量需要一个文件,该文件必须包含对该变量可以接受的可能值的描述。有关格式说明,请参见这些文件中的注释,并请记住要保持它们排序。
冲突的 USE 标志
有时,ebuild 会因功能而出现冲突的 USE 标志。检查它们并返回错误并非可行的解决方案。相反,您必须选择一个有冲突的 USE 标志作为首选,并提醒用户正在使用哪个特定标志。
一个例子来自 mail-mta/msmtp
ebuild。该软件包可以使用带有 GnuTLS 的 SSL,带有 OpenSSL 的 SSL 或根本不使用 SSL。由于 GnuTLS 的功能比 OpenSSL 更强大,因此它被优先考虑。
src_configure() {
local myconf
if use ssl; then
myconf+=" --enable-ssl --with-ssl=$(usex gnutls gnutls openssl)"
else
myconf+=" --disable-ssl"
fi
econf \
# Other stuff
${myconf}
}
在一些特殊情况下,以上策略会破坏反向 USE 依赖关系。为了避免这种情况,ebuild 可以使用 REQUIRED_USE
指定允许的 USE 标志组合。有关其语法说明,请参见部分 REQUIRED_USE。
例如,如果软件包 dev-libs/foo
可以使用 USE="a"
或 USE="b"
构建,但不能同时使用两者,那么优先使用其中一个标志会破坏依赖于 dev-libs/foo[a]
或 dev-libs/foo[b]
的软件包。因此,在这种情况下,ebuild 应该指定 REQUIRED_USE="a? ( !b )"
。
REQUIRED_USE
。只要有可能进行可能满足用户需求的构建,就应遵循正常策略。USE_EXPAND 和 ARCH USE 标志
变量 VIDEO_CARDS
、INPUT_DEVICES
和 L10N
会自动扩展为 USE 标志。这些被称为 USE_EXPAND
变量。例如,如果用户在 make.conf
中有 L10N="en fr"
,那么 Portage 会自动设置 USE="l10n_en l10n_fr"
。
从 Portage 2.0.51.20 开始,USE_EXPAND
列表在 profiles/base/make.defaults
中设置。在没有在 gentoo-dev 列表中进行讨论的情况下,不得修改它,也不得在任何子配置文件中修改它。
当前架构(例如 x86
、sparc
、ppc-macos
)也会自动设置为 USE 标志。有关所有有效架构关键字的完整列表,请参见 profiles/arch.list
,有关格式说明,请参见 GLEP 22。
ACCEPT_KEYWORDS
存在某种关系是一个常见的误解。事实并非如此。例如,在 sparc
上接受 x86
关键字不会设置 USE="x86"
。同样,没有 ~arch
USE 标志,所以不要尝试 if use ~x86
。