手册:片段/使用Gentoo/功能特性

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Handbook:Parts/Working/Features and the translation is 63% complete.
Outdated translations are marked like this.

Portage有几个附加的特性,它们能够令您的Gentoo之旅更加愉快。这些特性中的大多数依赖于某些能够提高性能、可靠性、安全性等的软件工具。

为了打开或者关闭某一Portage特性您需要编辑 /etc/portage/make.conf中的 FEATURES变量,这个变量包含不同的特性关键字,用空格分开。在一些情况下您可能还需要额外的安装被这个特性所依赖的工具。

并不是所有Portage所支持的特性都在这里列出。完整的概述,请查阅make.conf手册页:make.conf

user $man make.conf

查看 FEATURES 的默认设置,运行emerge --info并且查找FEATURES变量或者用grep 显示它:

user $emerge --info | grep ^FEATURES=

分布式编译

使用distcc

distcc 是一个分布式编译程序,可以把编译任务分配给同一网络中的不同机器,这些机器的配置不必完全相同。distcc客户端发送所有必须的信息给所有可利用的distcc服务器(运行distccd的机器)。这样它们每一个都能为客户端编译一部分源码。所获得的效果就是更短的编译时间。

您可以在Gentoo Distcc文档里找到更多的关于Distcc的信息(包括如何让它在Gentoo上工作)。

安装 distcc

Distcc使用一个图形化监视器来监视您的机器发送出去的编译工作。请把 USE=gnomeUSE=gtk放进您的USE设置中。

root #emerge --ask sys-devel/distcc

激活Portage的distcc支持

distcc 添加到/etc/portage/make.conf.中的 FEATURES </ var>变量中。 接下来,编辑MAKEOPTS变量,并增加系统允许的并行构建的数量。 一个已知的方法是填写 -jN 其中N 是运行distccd(包括当前主机)的CPU数量+1(或者核心数+1),但这只是一个建议。

现在运行 distcc-config并输入已有的DistCC服务器。作为一个简单例子,我们假设已有的DistCC服务器是192.168.1.102(当前主机)、192.168.1.103和192.168.1.104(两个远端服务器):

root #distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104"

当然,也不要忘了运行distccd系统服务:

root #rc-update add distccd default
root #/etc/init.d/distccd start

缓冲编译结果

关于ccache

ccache是一个快速编译器缓存。 无论何时编译应用程序,它都将缓存中间结果,以便每当重新编译相同的程序时,编译时间大大减少。 第一次运行ccache时,它会比正常编译慢得多。 但是后续的重新编译应该更快。 ccache只有在相同的应用程序将被重新编译多次(或相同应用程序的升级频繁发生)时才有用; 因此它通常只对软件开发人员有用。

如果您对ccache的工作机制有兴趣,请访问homepage主页.

警告
已知ccache会导致大量的编译失败。 有时ccache会保留旧代码对象或损坏的文件,这可能导致无法破损的源码。 如果发生这种情况(例如"File not recognized: File truncated"出现在构建日志中),请尝试重新编译ccache导致错误的应用程序 (FEATURES="-ccache"/etc/portage/make.conf)

安装 ccache

要安装ccache,只需要:

root #emerge --ask dev-util/ccache

激活Portage ccache 支持

打开 /etc/portage/make.conf并添加ccache到FEATURES变量。然后添加一个新的变量ccache并设置它为ccache:

文件 /etc/portage/make.conf开启 Portage ccache 支持
FEATURES="ccache"
CCACHE_SIZE="2G"

要检查ccache是否运行,只需让它提供给您它的统计数据。因为Portage使用一个不同的ccache主目录,您需要设定CCACHE_DIR变量:

root #CCACHE_DIR="/var/tmp/ccache" ccache -s

/var/tmp/ccache/是Portage的默认ccache主目录;为了修改这个设置,您可以设定/etc/portage/make.conf中的CCACHE_DIR参数。

不过,如果您运行 ccache ,它使用的默认目录是${HOME}/.ccache/。这就是为什么当您查询(Portage)ccache统计数据的时候您需要设定 CCACHE_DIR参数的原因。

非Portage编译中使用ccache

如果您需要在非Portage编译中使用ccache,添加 /usr/lib/ccache/bin/到您 PATH参数里靠前的位置(在/usr/bin之前)。这一点可以通过编辑在您用户主目录中的~/.bash_profile文件来实现。使用~/.bash_profile是定义 PATH参数的一个方式

文件 ~/.bash_profile设置 ccache 路径 PATH
PATH="/usr/lib/ccache/bin:${PATH}"

二进制包支持

创建预编译包

Portage 也支持安装预编译软件包。尽管 Gentoo 本身并不提供预编译包,但 Portage 依然能够处理预编译包。

如果某个包已经被安装在您的系统上,您可以用 quickpkg 来创建预编译包。也可以用带有 --buildpkg--buildpkgonly 选项的 emerge 命令。

如果您希望 Portage 为您所安装的每一个软件包创建预编译软件包,那么请在 FEATURES 中添加 buildpkg 变量。

预编译包的更多扩展支持可以用 catalyst 得到。关于catalyst的更多信息请参阅 Catalyst FAQ

安装预编译包

尽管Gentoo并不提供,但是您可以自己建立一个“中心仓库”来存放预编译包。如果您希望使用这个仓库,您需要设定PORTAGE_BINHOST参数使Portage能够知道它。例如,如果预编译包在 ftp://buildhost/gentoo 上:

文件 /etc/portage/make.conf添加 PORTAGE_BINHOST
PORTAGE_BINHOST="ftp://buildhost/gentoo"

当您需要安装预编译包的时候,在emerge命令后的 --getbinpkg选项旁加入 --usepkg 选项。前者让emerge命令从预定的服务器上下载预编译包,后者让emerge首先试图安装预编译包,如果预编译包不存在,那么才下载并编译源码。

例如:用预编译包安装gnumeric

root #emerge --usepkg --getbinpkg gnumeric

关于emerge的预编译包的更多信息请参阅emerge手册页:

user $man emerge

将预构建的软件包分发给他人

如果预构建的软件要分发给其他人,请确保这样做是被允许的。 检查上游软件包的分发要求。 例如,对于在GNU GPL协议下发布的软件,源代码必须与二进制文件一起提供。

如果构建的二进制程序不可分发,则Ebuild可以在其RESTRICT 变量中定义 bindist限制。 有时,此限制取决于一个或多个USE标志。

默认情况下,Portage将不会屏蔽任何包,因为有限制。 这可以通过在/etc/portage/make.conf中设置ACCEPT_RESTRICT变量来全局更改。 例如,要掩盖具有bindist 限制的软件包,请将以下行添加到make.conf

文件 /etc/portage/make.conf只接受预编译包
ACCEPT_RESTRICT="* -bindist"

还可以通过将ACCEPT_RESTRICT选项用于emerge命令,来覆盖--accept-restrict 变量。 例如, --accept-restrict=-bindist将临时屏蔽带有bindist 限制的包。

还可以考虑在分发包时设置ACCEPT_LICENSE变量。 请参阅 授权许可

重要
每个 用户完全有责任遵守软件许可条款和每个用户国家的法律。 ebuilds(RESTRICTLICENSE)定义的元数据变量可以为禁止预编译文件分发提供指导。但是Portage的输出或Gentoo开发人员的回答 不是 法律声明,不应该依赖他们。 谨慎遵守您的当地的法律。

下载文件

验证源文件

要重新验证完整性并(可能)重新下载当前所有安装的软件包以前删除或损坏的 distfiles,请运行:

root #emerge --ask --fetchonly --emptytree @world