Gentoo 如何选择合适的 USE 选项

对于初次使用 Gentoo 的用户来说,除了内核编译外,最大的疑惑莫过于 USE 变量的作用了,虽然说看见官方的文档说 USE 是用来控制编译选项的,但是却依然不容易理解 USE 到底是怎样工作的。

首先来了解一下 USE 变量的值是如何在 Ebuild 和用户之间交互的。

Ebuild 与用户的交互

Ebuild 提供 USE 选项

一个 ebuild 文件通过设置 IUSE 变量的值来决定这个包提供哪些 USE 可供自定义。比如 dev-vcs/git

1 # 还有很多,这里只节选部分
2 IUSE="+curl cgi emacs +gpg gtk highlight +pcre +perl +python +threads"

表示 dev-vcs/git 提供了如上面这些 USE,前面有 + 表示默认是选中的,没有 + 表示默认不选中。

用户设置 USE

USE 来源分为 4 种:

  • 预定义: 由 ebuild 文件指定默认 USE

  • 全局 USE: 定义在 /etc/portage/make.conf 中的 USE 变量中

  • 局部 USE: 定义在 /etc/portage/package.use 文件或该目录下的所有文件

  • 临时 USE: 命令行中临时指定,比如 sudo USE='systemd' emerge -uDN world

USE 写错并不会产生致命错误,比如对于上面的 Git,想开启 emacs USE,但是却写成 emcas,这并不会出错,只是没有成功设置这个 USE

Ebuild 获取用户 USE 设置

当安装这个包时, Portage 会读取用户对此包的 USE 设置然后传递给 ebuid 脚本,在 ebuild 脚本里通过 use() 函数来获取用户的 USE 设置,这个函数定义在 /usr/lib/portage/bin/phase-helpers.sh 171 ~ 216 行。

use() 函数返回 bool 值,如果用户启用了某个 USE,则此函数返回 true,否则返回 false

比如上面的 dev-vcs/git,如果用户默认没有修改 USE,那么 use curl 将返回 trueuse emacs 将返回 false

然后在 ebuild 里就可以设置不同的行为了,比如 Git 对 emacs 的使用(节选)。

1 if use emacs ; then
2     elisp-compile contrib/emacs/git{,-blame}.el
3 fi

如果用户开启了 emacs,就编译 emacs 支持文件。

USE 在 Ebuild 中常见的用途

提供依赖选项

这个用在 RDEPENDDEPEND 变量中,根据 USE 情况来决定包的依赖。用在这两个变量里时可以直接在 use 后加问号来获取 USE 是否启用。

比如 net-irc/weechat (节选)

 1 RDEPEND="
 2     nls? ( virtual/libintl )
 3     perl? ( dev-lang/perl )
 4     ruby? ( >=dev-lang/ruby-1.9 )
 5     ssl? ( net-libs/gnutls )
 6 "
 7 DEPEND="${RDEPEND}
 8     doc? (
 9         app-text/asciidoc
10         dev-util/source-highlight
11     )
12     nls? ( >=sys-devel/gettext-0.15 )
13 "

如果启用了 nls USE,就添加依赖 virtual/libintl

提供编译选项

根据不同的 USE,选择不同的编译选项。

还是上面那个 Git 包。

 1 use tk \\
 2     || myopts="${myopts} NO_TCLTK=YesPlease"
 3 use pcre \\
 4     && myopts="${myopts} USE_LIBPCRE=yes" \\
 5     && extlibs="${extlibs} -lpcre"
 6 use perl \\
 7     && myopts="${myopts} INSTALLDIRS=vendor" \\
 8     || myopts="${myopts} NO_PERL=YesPlease"
 9 
10 # blabla
11 
12 # 最后构造成了编译选项
13 export MY_MAKEOPTS="${myopts}"
14 export EXTLIBS="${extlibs}"

提供源码配置选项

有时候光提供编译选项还不够的,比如包上游本身不提供编译选项时,就需要根据 USE 修改相应源码了。

比如 dev-lang/erlangUSE, Erlang 本身是没有这个编译选项的,因此机智的 Gentoo 开发者就直接修改源码了。

1 if ! use wxwidgets; then
2     sed -i 's: wx : :' lib/Makefile
3     rm -rf lib/wx
4 fi

提供安装选项

就像上面的 emacs USE 一样,如果用户使用了 emacs USE,那么就安装 emacs 包。

再比如 dev-lang/ruby,如果开启了 doc,就会安装文档。

1 if use doc; then
2     make DESTDIR="${D}" install-doc || die "make install-doc failed"
3 fi

Ebuild 中的 USE 相关函数

use

启用了某项 USE 返回 true,否则返回 false

use_enable

根据 USE 情况返回对应的编译选项,比如 $(use_enable systemd),如果启用了 systemd USE,则返回 --enable-systemd,否则返回 --disable-systemd

注意,这个函数只是简单的加前缀 --enable-, --disable-,如果想进行更复杂的选择,那还是得用

$(use systemd && echo "--enable-systemd-support-and-so-on")

use_with

use_enable 相似,但是返回的是 --with-systemd` --without-system` 格式。跟上面一样只是加前缀。

选择 use_enable 或者 use_with 或者 use <USE> && echo "--OPTIONS" 还是得根据包的实际编译选项决定。

常见的 USE 管理工具

用的最多的还是 equery 吧。

equery u <pkg> 用来查看一个包有哪些 USE。

输出有 UI 两列 USE, I 那一列表示当前安装版本的 USE 情况,U 那一列表示当前 Portage 计算得出的 USE 情况,再次 emerge -uDN <pkg> 将采用的 USE。

equery h <use> 用来查看哪些包提供了这个 USE 选项

还有一个专用的 euse,一看就知道是专门用来管理 USE 的,但是我没用过,因此这里就不说了。

总结

USE 提供了 Ebuild 和用户之间交互的桥梁,某个 USE 在某个软件包中到底是何作用完全取决于 ebuild 该怎么写,因此你当然也可以只提供 USE,但是并不使用这个 USE

所以想知道某个 USE 对某个包有什么作用,最好的办法就是看 ebuild 文件中到底是怎么使用这个 USE 的。

因此下次遇到安装一个软件包不知道该启用哪个 USE 时,不妨 grep 'use <use>' <path-to-ebuild> 一下,然后就知道该不该启用这个 USE 了。

本文作者: zhustec

本文标题: Gentoo 如何选择合适的 USE 选项

本文链接: https://blog.zhustec.me/posts/how-to-choose-the-proper-use-options-in-gentoo

发布时间: 2014-11-26T18:45:28+00:00

版权声明: 本文由 zhustec 原创 采用 CC BY-NC-ND 4.0 许可协议 转载请保留以上声明信息!