手册:片段/使用Gentoo/USE
Readers should not try to follow instructions directly from the Handbook:Parts namespace (which is THIS page!). The sections displayed below are used as a skeleton for transcluding information into the computer architecture specific handbooks and are therefore lacking critical information.
Please visit the Handbook list to read instructions for a relevant computer architecture.
什么是 USE 标记
USE 标记的指导思想
安装 Gentoo 时,用户需要依据你工作的环境做出选择。服务器跟工作站的组织结构不同,游戏机跟3D工作站也会不一样。
不单只是选择你想要安装的包时如此,选择某一个包需要的特性时同样如此。如果你不需要OpenGL,为什么还要花费时间安装OpenGL并在其他包中加入对OpenGL的支持?如果你不用KDE,而且软件包没有KDE也能完美运行,为什么还要在编译这些包的时候加入KDE支持?
为了帮用户判断什么需要安装或激活,什么不需要;我们希望用户能用简单的方式设定他们自己的环境。这能促使用户判断他真正需要的东西,并让Portage做出有用的决定的过程变得简单。
USE 标记的定义
我们来具体看看 USE 标记。每一个标记都是代表对某特定概念的支持和依赖关系信息的关键字。如果你设定了某个 USE 标记,Portage会明白他们需要支持所选关键字。当然这同时也改变了这个包的依赖关系信息。
让我们看一个特殊示例:关键字 kde
。如果你的 USE 变量里面没有这个关键字,所有具有可选KDE支持的包在编译时都 不会 编译KDE支持。所有具有可选KDE依赖关系的包在安装时都 不会 (做为一个依赖关系而)安装KDE库。如果你设定了kde关键字,这些包在安装时都 会 编译KDE支持,而且KDE库也 会 (作为一个依赖关系而)被安装。
When the kde
flag is set to enabled, then those packages will be compiled with KDE support, and the KDE libraries will be installed as dependency.
通过正确定义 USE 标记,系统会根据系统管理员的需求进行专门定制。
使用 USE 标记
声明永久 USE 标记
所有 USE 标记都声明在 USE 变量里面。为了让用户能方便地查找和选择 USE 标记,我们提供了一份默认的 USE 设定。这些设定是我们觉得 Gentoo 用户通常都要用到的 USE 标记的集合。这个默认设置在make.defaults 文件中声明,这是已选择的 profile 的一部分。
你的系统使用的profile是符号链接 /etc/portage/make.profile 所指向的目录。每个profile叠加于某个更大的profile之上,最终的结果是这些profile的并集。初始profile是base profile( /var/db/repos/gentoo/profiles/base)。
要查看当前正在使用的USE标记(完整的),请使用 emerge --info:
root #
emerge --info | grep ^USE
USE="a52 aac acpi alsa branding cairo cdr dbus dts ..."
这个变量已经包括了非常多的关键字。不要通过修改make.defaults 文件里的 USE 变量来满足你的需要:在升级Portage的时候,这个文件将会被覆盖。
要改变这个默认设置,你需要在 USE 变量里添加或移去关键字。这是通过在/etc/portage/make.conf里定义USE全局变量来实现的。在这个变量里,添加你需要的额外的USE标记,或者移去你不需要的USE标记。后者可通过在标记前面加个负号 (-
).前缀来实现。
例如,要移除对 KDE 和 QT 的支持,并添加对 LDAP 的支持,可以在/etc/portage/make.conf里声明USE如下:
USE="-kde -qt5 ldap"
使用 USE 标记为单个包声明 USE 标记
如果你不是想为整个系统声明 USE 标记,而是想要为一个(或者几个)程序声明USE标记,你需要编辑/etc/portage/package.use文件。package.use 通常是一个文件,不过它也可以是一个充满子文件的目录;请看下面的提示和 man 5 portage 以获得更多如何使用这个约定的信息。下面的例子假设 package.use 是一个文件。
比如说,如果你不想全局的启用 Blu-ray 支持,你只想把它应用到 VLC 包,你可以这样做:
media-video/vlc bluray
如果 package.use 是一个已经存在的“目录”(而不是一个单文件),只需简单地在 package.use/ 目录下创建文件,就可以修改软件包的本地USE标记。虽然任何文件命名规范都行,但是更明智的做法是统一命名方案。
有一种规范是简单地使用包名作为子文件的标题。比如说,可以用如下方式为 media-video/vlc 软件包设置 bluray
USE 标记。
root #
echo "media-video/vlc bluray" >> /etc/portage/package.use/vlc
你当然也可以直接为某一个程序禁用 USE 标记。比如说,禁用PHP的bzip2支持(但通过make.conf中的 USE 标记为其他包提供支持):
dev-lang/php -bzip2
声明临时 USE 标记
有时,你只想暂时改变一个USE设置。你可以仅仅把USE 变量声明成一个环境变量,而不必两次修改/etc/portage/make.conf 。但是要记住,当重新 emerge 或者更新这个程序时(不管是单独更新还是随系统更新),你的修改会被重置。
下面的例子我们将在安装 SeaMonkey 的时候临时从 USE 变量中移去pulseaudio
值。
root #
USE="-pulseaudio" emerge www-client/seamonkey
优先级
当然,在什么设置优先于USE设置有一定的优先级。 USE设置的优先级,按优先级排序(第一优先级最低):
- make.defaults 里面的USE默认设定
- 用户在/etc/portage/make.conf里面的USE默认设定
- 用户在 /etc/portage/package.use里面的USE默认设定
- 用户作为环境变量的USE设定
运行 emerge --info可以看到Portage识别的最终的USE设定。它会列出Portage使用的所有相关变量(包括 USE 变量)。
root #
emerge --info
在整个系统上应用新的 USE 标记
如果你已经修改了你的 USE 标记,而且你想用新的 USE 标记更新你的系统,可以使用emerge的 --newuse
选项:
root #
emerge --update --deep --newuse @world
然后运行Portage的depclean来移除已经安装到你的"旧"系统里但是在新 USE 标记中被废除的条件依赖关系。
请反复检查“已废止(obsoleted)”软件包列表,确保不会移除所需要的软件包。下面这个例子里,
--pretend
(-p
) 选项可以使 depclean 只列出这些软件包而不移除他们:root #
emerge -p --depclean
depclean 完成之后,emerge 会针对可能是已经删除的软件包提供的共享对象动态链接的应用程序提示重新构建。此操作完成前,为了防止破坏应用程序,Portage 将会保存必要的库。它存储着需要在 preserved-rebuild
设置的重建内容。若要重建必要的包,请运行:
root #
emerge @preserved-rebuild
这些都完成之后,你的系统就已经应用上了新的 USE 标记的设定。
软件包特有的 USE 标记
查看可用 USE 标记
让我们以 seamonkey 来作例子,看看它接收什么 USE 标记。我们可以以--pretend
和 --verbose
为选项执行 emerge来查看:
root #
emerge --pretend --verbose www-client/seamonkey
These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] www-client/seamonkey-2.48_beta1::gentoo USE="calendar chatzilla crypt dbus gmp-autoupdate ipc jemalloc pulseaudio roaming skia startup-notification -custom-cflags -custom-optimization -debug -gtk3 -jack -minimal (-neon) (-selinux) (-system-cairo) -system-harfbuzz -system-icu -system-jpeg -system-libevent -system-libvpx -system-sqlite {-test} -wifi" L10N="-ca -cs -de -en-GB -es-AR -es-ES -fi -fr -gl -hu -it -ja -lt -nb -nl -pl -pt-PT -ru -sk -sv -tr -uk -zh-CN -zh-TW" 216,860 KiB Total: 1 package (1 new), Size of downloads: 216,860 KiB
emerge 并不是做这件事的唯一工具。事实上,我们有一个专门的包信息工具叫equery,它属于app-portage/gentoolkit。
root #
emerge --ask app-portage/gentoolkit
现在带 uses
参数执行 equery 来查看指定包的 USE 标记。例如 app-portage/portage-utils 软件包:
user $
equery --nocolor uses =app-portage/portage-utils-0.93.3
[ Legend : U - final flag setting for installation] [ : I - package is installed with flag ] [ Colors : set, unset ] * Found these USE flags for app-portage/portage-utils-0.93.3: U I + + nls : Add Native Language Support (using gettext - GNU locale utilities) + + openmp : Build support for the OpenMP (support parallel computing), requires >=sys-devel/gcc-4.2 built with USE="openmp" + + qmanifest : Build qmanifest applet, this adds additional dependencies for GPG, OpenSSL and BLAKE2B hashing + + qtegrity : Build qtegrity applet, this adds additional dependencies for OpenSSL - - static : !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
满足 REQUIRED_USE
一些 ebuild 需要或禁止 USE 标记的某些组合才能正常工作。这通过放置在 REQUIRED_USE ,用一组条件来表示。此条件确保所有功能和依赖性都已完成,并且构建将成功并按预期执行。 如果任何一个不符合,emerge 会提醒你,并要求你解决这个问题。
示例 | 描述 |
---|---|
REQUIRED_USE="foo? ( bar )"
|
如果设定 foo ,则必须设定 bar 。
|
REQUIRED_USE="foo? ( !bar )"
|
如果设定 foo ,则不得设定 bar 。
|
REQUIRED_USE="foo? ( || ( bar baz ) )"
|
如果设定 foo ,则必须在 bar 或baz 中设定一个。
|
REQUIRED_USE="^^ ( foo bar baz )"
|
必须在 foo 、bar 或 baz 中设定一个。
|
REQUIRED_USE="|| ( foo bar baz )"
|
至少在 foo 、bar 或 baz 中设定一个。
|
REQUIRED_USE="?? ( foo bar baz )"
|
可以在 foo 、bar 或 baz 中设定一个或者都不设定。
|