一个 Gentoo Linux 系统是 "在线即时编译" 的。安装 Gentoo Linux 包括建立一个够用的编译器和编译环境,Portage能在这个环境中从 Internet 上下载源码并编译余下的核心系统及任何你想要的程序。尽管 Portage 的确支持安装编译好的二进制软件包,但这对整个系统是一个危害,除非是在很慢的计算机上,或是开发者系统快速恢复某个软件包,又或者你是在一个速度快的检索上编译,拿到速度慢的计算机上使用时,才应该使用。
由于这一点,再加上 Portage 编译安装软件包的方法是高度可配置的,所以只有很少的 Gentoo Linux 安装是完全一样的。从本质上说,当用户安装 Gentoo Linux 时,Portage 系统根据配置文件和 ebuilds 中指定的参数,编译出的实际上是自定义的系统。
USE 设置系统是在编译时改变全部或单个软件包特性的灵活方式。它允许管理员控制如何根据可选的特性来编译软件包,把哪些特性编译到包里面去。比如某个包有可以选择的 GNOME 支持,如果在编译时,禁止 gnome USE 设置,就能禁止这个特性。反之,打开 gnome USE 设置,就打开了这个包的 GNOME 支持特性。
USE 设置对包的影响取决于是否软件包本身和它的 ebuild 支持 USE 选择。如果上面的那个软件包没有 GNOME 支持,相应的 USE 设置很明显就没有作用。同样,很多包的依赖性不被视为可选特性,所以 USE 变量对依赖关系也没有作用。某个包 USE 的关键字列表可以在它 ebuild 文件中的 DEPEND 和 RDEPEND 行找到。
Gentoo Linux 使用的 USE 设置列表可以在 /usr/portage/profiles/use.desc 文件中找到。每行列出一个关键字,后面跟着它作用的简单描述。
Portage 决定某个 USE 设置是打开还是禁止的,要搜索四个不同位置。这些位置以"栈"(译注:后进先出的一个数据结构) 的方式来改变 USE 设置。Portage 搜索过每个位置,并记住是否前一个位置打开或禁止了一个 USE 设置。在这个过程中,USE 设置是可以累加的。
Porage 查看 USE 设置的位置以及查看这几个位置的顺序是由 /etc/make.global 中的 USE_ORDER 来决定。要去掉一个位置,你只要从 USE_ORDER 中把它去掉就行了。
这是在 Portage profile 的 use.defaults 文件中定义的(/etc/make.profile/use.defaults)。每个条目含有一个 USE 设置和相应的软件包。如果目前系统里有这个软件包,就会使用它的 USE 设置。例如,你安装过 x11-base/xfree,并且没有指明要禁止 X USE 设置,这个 X 关键字就会在以后都管用,只要软件包还没删掉。建议你别改这个文件,因为以后 profile 的变化可能会覆盖你的改动。
Conf(配置)
如果在 /etc/make.conf 文件中定义了一个 USE 设置,就会加上它。如果在 make.conf 里没有定义 USE 变量,就会在 /etc/make.globals 文件里查找。这个条目类似于下面这样:
These are the packages that I would merge, in order.
Calculating dependencies ...done!
[ebuild N ] kde-base/kdelibs-2.2.2-r4 to /
[ebuild N ] dev-util/kdbg-1.2.2 to /
[ebuild U ] app-text/psutils-1.17 to /
[ebuild U ] app-text/a2ps-4.13b-r3 to /
[ebuild U ] app-text/jadetex-2.20 to /
[ebuild N ] app-text/sgmltools-lite-3.0.3-r2 to /
[ebuild N ] kde-base/kdoc-2.2.2-r1 to /
[ebuild N ] net-www/htdig-3.1.5-r2 to /
[ebuild N ] app-text/enscript-1.6.3-r1 to /
[ebuild N ] kde-base/kdebase-2.2.2-r2 to /
[ebuild N ] app-doc/qt-docs-2.3.1 to /
[ebuild N ] dev-util/kdevelop-2.0.2 to /
上面的列表中,标记了 N 的软件包是还没有装过的,将在这次 emerge 时安装,而标记了 U 的软件包是已经装过老版本的软件包,这次将升级。
Portage 的 world 升级特性会检查系统的 profile ,禁止安装的软件包 (package.mask), world profile 和 world profile 中列出的软件包的依赖关系(包括版本范围),并在这个基础上,决定哪个包需要升级。如果一个软件包存在新的版本,并且这个软件包列在 world profile 中或是 world profile 中某个包的依赖关系,这个软件包才会升级。另外,这个包或者说要安装的这个版本必须不在 system(系统) profile 或 package.mask 中被禁止。
当考虑要升级哪个包时,Portage 试图尽可能多的升级在 world profile 中提到的包。Portage 还会考虑它们的依赖关系包,只要存在新的版本,符合指定的版本范围,并且没有在 system profile 或 package.mask 中禁止,就会升级这个依赖关系包。它还会考虑 SLOTS(插槽),上一节已经说过了。
Portage 的 world 升级,最重要的就是 world profile. system profile 通常是由开发者来定义的,用户不应该改动它,而 world profile 就不同了,它是由用户的日常操作来间接产生的。world profile 有点像"收藏夹(有最爱的意思)"。用户通过 emerge 命令来手动安装的单个软件包,会被记录在 world 文件中,它位于 /var/cache/edb/world. Portage 假设你费力告诉它要安装这个包,你就有兴趣让这个包与时俱进。
world 升级前要先看一下升级和安装的软件包列表,可以用本节前面提到的 --pretend 参数。
注意:一个 world 升级同时会自动执行一个 system 升级。核心包不能用 world 文件来固定版本号(就是前面说过的 mozilla 那种方法),因为当前的 Portage profile 会覆盖它。
world 升级有一个有趣的副作用,可以在一个安装好的系统上重新编译所有软件包。由于 world 升级会试图升级所有 world 文件里提到的包和它们的依赖关系,使用参数 --emptytree 可以强制编译所有这些包和依赖关系,除了 glibc. 如果用户想改变优化参数,或 USE 关键字的值,并且希望系统中所有软件都能用到这些改变,又懒得重新 merge 每一个包,就可以用这种用法。在 world 文件中填上所有你常用的程序,然后用下面的命令: