5.16.解决冲突
有三种不同的变量来注册软件包和 Port 之间的冲突: CONFLICTS
, CONFLICTS_INSTALL
和 CONFLICTS_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
将允许执行:
但下面的命令会报告冲突,因为安装的软件包基础名称是 git-lite
,而 git 会被构建,但不能在 git-lite
之外安装:
如果没有这个特性,Makefile 将需要为每一种口味编写一个 _flavor__CONFLICTS_INSTALL
,列出其他每一种口味。
这些变量中最常见的内容是另一个 port 的软件包基础。软件包基础是指没有附加版本的软件包名称, 它可以通过运行 make -V PKGBASE
得到。
例50.
CONFLICTS*
的基本用法如果 dns/bind910 存在,dns/bind99 就不能被安装,因为它们安装的是相同的文件。首先收集要使用的软件包基础:
然后添加到 dns/bind99 的 Makefile 中:
并添加到 dns/bind910 的 Makefile 中:
有时, 只有另一个 port 的某些版本是不兼容的。在这种情况下, 应使用完整的软件包名称, 包括版本。如果有必要, 可以使用 shell globs, 如 *
和 ?
以便所有必要的版本都能匹配。
例51. 使用
CONFLICTS*
与 Globs。从 2.0 版本到 2.4.1_2 版本,deskutils/gnotime 用来安装捆绑的 databases/qof 版本。
第一个条目匹配
2.0
至2.3
版本,第二个条目匹配2.4.0
的所有修订版,第三个条目匹配确切的2.4.1
版本,最后一个条目匹配2.4.1
版本的第一和第二修订版。deskutils/gnotime 没有任何冲突行,因为它的当前版本与其他东西没有冲突。
在制作不受冲突影响的目标时, 可以临时设置变量 DISABLE_CONFLICTS
。这个变量不应设置在 port 的 Makefile 中。
最后更新于