USE 标志

USE 标志用于控制可选依赖项和设置,这些依赖项和设置是用户可能合理地希望选择的。例如,app-editors/vim 可选择构建对 ruby 解释器的支持,它需要安装 dev-lang/ruby 来实现这一点 - 我们使用 ruby USE 标志来提供此选项。另一方面,app-text/glark 无论如何都需要 ruby,因此在那里没有使用 USE 标志。

任何 USE 标志组合都不应导致软件包无法构建,因为用户可以设置任何标志组合。

软件包不应根据编译时可用的内容进行配置和链接 - 任何自动检测都必须被覆盖。这通常被称为依赖项是“自动化的”。这很糟糕,因为依赖项没有被包管理器工具检测到,并且很容易破坏,以及其他问题。

自动化的依赖项最好通过准备一个构建系统补丁来修复,该补丁添加适当的选项来控制相关依赖项,并将该补丁提交到上游,以造福所有用户。为了避免在下游携带额外的补丁,自动化的依赖项通常可以使用特殊的构建系统选项(例如,autotools 中的缓存变量)或通过无条件地依赖相关软件包来解决(即,强制检查始终成功)。

何时不使用 USE 标志?

虽然 USE 标志通常被认为对用户有利,但也有有效的使用案例可以避免它们。在编写 ebuild 时,请考虑是否为特定条件功能添加标志,或者探索下面描述的替代解决方案之一。

使用 USE 标志不应控制运行时依赖项,而软件包没有链接到它。这样做会为软件包创建额外的配置,并在磁盘上没有底层文件更改的情况下重新编译。应避免这种情况,而应通过安装后的消息(如果需要)将其传达给用户。

USE 标志不得用于控制安装小文件、非侵入性文件、不引入额外的构建时依赖项或导致构建时间显着增加的文件。此类文件的示例包括 bash 完成文件、init.d 脚本、logrotate 配置文件、systemd 服务文件。其原理与上面相同。相反,这些文件必须无条件安装。

对于具有多个条件程序或模块的软件包,也可以进行类似的论证。每当这导致大量 USE 标志,迫使用户花费大量时间选择兼容标志,并在选择不完整后可能需要重新构建时,请考虑将标志的使用减少到那些具有外部依赖项和/或构建时间长的程序或模块。其余的应该无条件构建,或者由 minimal 等标志控制。

你不应该引入操纵编译器标志或类似变量的 USE 标志,这些标志和变量是用户直接配置的(例如,-O3-flto)。相反,软件包应该完全避免操纵它们,并让用户直接设置它们。常见的错误包括

  1. 使用 debug USE 标志强制 -O0 -g 并禁用剥离。debug 标志的正确用途是控制额外的调试代码路径。使用正确的标志和功能来保留调试信息是用户的责任。
  2. 引入 lto 标志来强制 -flto。这是用户应该在标志变量中直接设置的内容。
  3. 使用 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 默认值不应使软件包处于非功能状态或缺少重要的常见功能。咨询上游文档可能有助于评估这一点。

# 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 的影响有很大不同,那么该标志不适合作为全局标志。特别是,请注意,如果引入了 clientserver 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 )"

USE_EXPAND 和 ARCH USE 标志

变量 VIDEO_CARDSINPUT_DEVICESL10N 会自动扩展为 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 列表中进行讨论的情况下,不得修改它,也不得在任何子配置文件中修改它。

当前架构(例如 x86sparcppc-macos)也会自动设置为 USE 标志。有关所有有效架构关键字的完整列表,请参见 profiles/arch.list,有关格式说明,请参见 GLEP 22