5.16.解决冲突

有三种不同的变量来注册软件包和 Port 之间的冲突: CONFLICTSCONFLICTS_INSTALLCONFLICTS_BUILD

注意

冲突变量会自动设置 IGNORE 变量,这在《用 BROKEN 标记不可安装的 Port 》中有更全面的记载。

当删除几个冲突的 Port 中的一个时, 建议在其他 Port 中保留几个月的 CONFLICTS, 以满足那些偶尔才更新一次的用户。

CONFLICTS_INSTALL

如果该软件包不能与其他软件包共存(因为文件冲突,运行时不兼容,等等)。CONFLICTS_INSTALL 检查是在构建阶段之后、安装阶段之前进行的。

CONFLICTS_BUILD

如果在已经安装了其他特定的 port 时, 无法构建这个 port。构建冲突不会被记录在生成的包中。

CONFLICTS

如果已经安装了某个 port, 而生成的软件包又不能与其他软件包共存, 则无法构建这个 port。CONFLICTS 检查会在联编阶段和安装阶段之前进行。

CONFLICTS* 变量中以空格分隔的每一项, 都会使用 shell 的 globbing 规则与正在联编的包相匹配。这样就可以在冲突列表中列出某个 port 的所有版本, 而不必费力地将正在联编的版本排除在列表之外。例如, 如果安装了 git-lite, CONFLICTS_INSTALL=git git-lite 将允许执行:

% make -C devel/git FLAVOR=lite all deinstall install

但下面的命令会报告冲突,因为安装的软件包基础名称是 git-lite,而 git 会被构建,但不能在 git-lite 之外安装:

% make -C devel/git FLAVOR=default all deinstall install

如果没有这个特性,Makefile 将需要为每一种口味编写一个 _flavor__CONFLICTS_INSTALL,列出其他每一种口味。

这些变量中最常见的内容是另一个 port 的软件包基础。软件包基础是指没有附加版本的软件包名称, 它可以通过运行 make -V PKGBASE 得到。

例50. CONFLICTS* 的基本用法

如果 dns/bind910 存在,dns/bind99 就不能被安装,因为它们安装的是相同的文件。首先收集要使用的软件包基础:

% make -C dns/bind99 -V PKGBASE
bind99
% make -C dns/bind910 -V PKGBASE
bind910

然后添加到 dns/bind99Makefile 中:

CONFLICTS_INSTALL=	bind910

并添加到 dns/bind910Makefile 中:

CONFLICTS_INSTALL=	bind99

有时, 只有另一个 port 的某些版本是不兼容的。在这种情况下, 应使用完整的软件包名称, 包括版本。如果有必要, 可以使用 shell globs, 如 *? 以便所有必要的版本都能匹配。

例51. 使用 CONFLICTS* 与 Globs。

从 2.0 版本到 2.4.1_2 版本,deskutils/gnotime 用来安装捆绑的 databases/qof 版本。

CONFLICTS_INSTALL=	gnotime-2.[0-3]* \
			gnotime-2.4.0* gnotime-2.4.1 \
			gnotime-2.4.1_[12]

第一个条目匹配 2.02.3 版本,第二个条目匹配 2.4.0 的所有修订版,第三个条目匹配确切的 2.4.1 版本,最后一个条目匹配 2.4.1 版本的第一和第二修订版。

deskutils/gnotime 没有任何冲突行,因为它的当前版本与其他东西没有冲突。

在制作不受冲突影响的目标时, 可以临时设置变量 DISABLE_CONFLICTS。这个变量不应设置在 port 的 Makefile 中。

% make -DDISABLE_CONFLICTS patch

最后更新于

FreeBSD 中文社区