Portage 缓存

Portage 使用缓存来存储大多数顶级变量(DEPENDDESCRIPTIONSRC_URI 等)。此缓存可以在不同的机器上生成,因此这些变量必须是静态的,或者只能使用不变的“版本/名称”变量(PPNPVPRPVRPF)生成。

缓存在生成时必须相同,与使用的机器或环境无关。这个概念被称为元数据不变性

因此,以下操作将无法正常工作

# DO NOT DO THIS!
if ! has_version "x11-libs/gtk+" ; then
	DEPEND="${DEPEND}
		gtk?  ( >=x11-libs/gtk+-2 )
		!gtk? ( =x11-libs/gtk+-1.2* )"
fi

但是,以下操作是合法的,因为 ver_test 函数基于 PV,并且 PVPN 变量都是静态的

if ver_test -ge 7.0 ; then
	IUSE="${IUSE} tcltk mzscheme"
	DEPEND="${DEPEND}
		tcltk?    ( dev-lang/tcl )
		mzscheme? ( dev-lisp/mzscheme )"
	RDEPEND="${RDEPEND}
		tcltk?    ( dev-lang/tcl )
		mzscheme? ( dev-lisp/mzscheme )"

	if [[ "${MY_PN}" != "vim-core" ]] ; then
		RDEPEND="${RDEPEND} !<app-vim/align-30-r1"
	fi
fi

条件继承

因为 eclass 会修改各种缓存变量,所以不允许条件继承,除非在每个系统上都能始终获得相同的结果。例如,基于 USE 标志的继承是非法的,但仅基于上述不变变量(例如 PV)的继承是允许的。

作为合法且可能很有用的条件继承的示例,某些 eclass 或 ebuild 会执行以下操作

if [[ ${PV} == 9999 ]]; then
	inherit git-r3
	EGIT_REPO_URI="https://anongit.gentoo.org/git/proj/devmanual.git"
else
	SRC_URI="https://dev.gentoo.org/~ulm/distfiles/${P}.tar.xz"
	KEYWORDS="~amd64 ~arm ~hppa ~ppc ~ppc64 ~sparc ~x86"
fi

这允许对常规包和实时包使用相同的 eclass(或相同的 ebuild“模板”)。