Portage 缓存
Portage 使用缓存来存储大多数顶级变量(DEPEND
、DESCRIPTION
、SRC_URI
等)。此缓存可以在不同的机器上生成,因此这些变量必须是静态的,或者只能使用不变的“版本/名称”变量(P
、PN
、PV
、PR
、PVR
和 PF
)生成。
缓存在生成时必须相同,与使用的机器或环境无关。这个概念被称为元数据不变性。
因此,以下操作将无法正常工作
# 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
,并且 PV
和 PN
变量都是静态的
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“模板”)。