第 7 章 Flavors

7.1. Flavors 简介

Flavors 是一种拥有 Port 多个变体的途径。Port 会被多次构建,并带有不同的变体。

例如,一个 Port 可以拥有一个带有许多功能和相当多依赖项的普通版本,以及一个仅包含基本功能和最少依赖项的轻量级“lite”版本。

另一个例子可能是,一个 Port 可以拥有 GTK 版本和 QT 版本,具体取决于它使用的工具包。

7.2. 使用 FLAVORS

要声明一个 Port 拥有多个 Flavors,请在它的 Makefile 中添加 FLAVORSFLAVORS 中的第一个 Flavor 是默认 Flavor。

FLAVOR 定义为

FLAVOR?=	${FLAVORS:[1]}

为了将 Flavors 与始终为大写字母的选项区分开来,Flavor 名称只能包含小写字母、数字和下划线 _

示例 1. 基本 Flavors 用法

如果一个 Port 拥有一个“lite”从属 Port,则可以删除该从属 Port,并将 Port 转换为 Flavors:

FLAVORS=	default lite
lite_PKGNAMESUFFIX=	-lite
[...]
.if ${FLAVOR:U} != lite
[enable non lite features]
.endif
示例 2. 另一个基本 Flavors 用法

如果一个 Port 拥有一个 -nox11 从属 Port,则可以删除该从属 Port,并将 Port 转换为 Flavors:

FLAVORS=	x11 nox11
FLAVOR?=	${FLAVORS:[1]}
nox11_PKGNAMESUFFIX=	-nox11
[...]
.if ${FLAVOR} == x11
[enable x11 features]
.endif
示例 3. 更复杂的 Flavors 用法

这是一个来自 devel/libpeas(一个使用 Python Flavors 的 Port)的略微修改过的摘录。由于默认的 Python 2 和 3 版本分别为 2.7 和 3.6,它将自动获得 FLAVORS=py27 py36

USES=		gnome python
USE_PYTHON=	flavors

.if ${FLAVOR:Upy27:Mpy2*}
USE_GNOME=	pygobject3

CONFIGURE_ARGS+=	--enable-python2 --disable-python3

BUILD_WRKSRC=	${WRKSRC}/loaders/python
INSTALL_WRKSRC=	${WRKSRC}/loaders/python
.else # py3*
USE_GNOME+=	py3gobject3

CONFIGURE_ARGS+=	--disable-python2 --enable-python3 \
			ac_cv_path_PYTHON3_CONFIG=${LOCALBASE}/bin/python${PYTHON_VER}-config

BUILD_WRKSRC=	${WRKSRC}/loaders/python3
INSTALL_WRKSRC=	${WRKSRC}/loaders/python3
.endif

py34_PLIST=	${.CURDIR}/pkg-plist-py3
py35_PLIST=	${.CURDIR}/pkg-plist-py3
py36_PLIST=	${.CURDIR}/pkg-plist-py3

此端口未使用USE_PYTHON=distutils,但仍然需要 Python 版本。为了防止FLAVOR为空,这会导致make(1)错误,在字符串比较中使用${FLAVOR:U}而不是${FLAVOR}。Gnome Python gobject3 绑定有两个不同的名称,一个用于 Python 2,pygobject3,一个用于 Python 3,py3gobject3。configure脚本必须在${WRKSRC}中运行,但我们只对构建和安装软件的 Python 2 或 Python 3 部分感兴趣,因此请相应地设置构建和安装基础目录。关于正确的 Python 3 配置脚本路径名称的提示。使用 Python 3 构建时,打包列表会有所不同。由于存在三个可能的 Python 3 版本,因此使用助手为所有三个版本设置PLIST

7.2.1. 版本助手

为了使Makefile更易于编写,存在一些版本助手。

此助手列表将设置其变量

  • flavor_PKGNAMEPREFIX

  • flavor_PKGNAMESUFFIX

  • flavor_PLIST

  • flavor_DESCR

此助手列表将追加到其变量

  • flavor_CONFLICTS

  • flavor_CONFLICTS_BUILD

  • flavor_CONFLICTS_INSTALL

  • flavor_PKG_DEPENDS

  • flavor_EXTRACT_DEPENDS

  • flavor_PATCH_DEPENDS

  • flavor_FETCH_DEPENDS

  • flavor_BUILD_DEPENDS

  • flavor_LIB_DEPENDS

  • flavor_RUN_DEPENDS

  • flavor_TEST_DEPENDS

示例 4. 版本特定的PKGNAME

由于所有软件包都必须具有不同的软件包名称,因此版本必须更改其名称,使用flavor_PKGNAMEPREFIXflavor_PKGNAMESUFFIX可以简化此操作。

FLAVORS=	normal lite
lite_PKGNAMESUFFIX=	-lite

7.3. USES=php和版本

当使用php以及以下参数之一:phpizeextzendpecl时,端口将自动填充FLAVORS,其中包含其支持的 PHP 版本。

示例 5. 简单USES=php扩展

这将为所有受支持的版本生成软件包。

PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext

这将为所有受支持的版本(7.2 除外)生成软件包。

PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext
IGNORE_WITH_PHP=	72

7.3.1. PHP 应用程序中的 PHP 版本

PHP 应用程序也可以进行版本化。

这允许为所有 PHP 版本生成软件包,以便用户可以在其服务器上使用所需的任何版本。

进行版本化的 PHP 应用程序**必须**将其软件包名称追加到PHP_PKGNAMESUFFIX

示例 6. PHP 应用程序的版本化

向 PHP 应用程序添加版本支持非常简单。

PKGNAMESUFFIX=	${PHP_PKGNAMESUFFIX}

USES=	php:flavors

当添加对 PHP 版本端口的依赖项时,请使用@${PHP_FLAVOR}。**切勿**直接使用FLAVOR

7.4. USES=python和版本

当使用pythonUSE_PYTHON=distutils时,端口将自动填充FLAVORS,其中包含其支持的 Python 版本。

示例 7. 简单USES=python

假设当前支持的 Python 版本为 2.7、3.4、3.5 和 3.6,并且默认的 Python 2 和 3 版本分别为 2.7 和 3.6,则具有以下内容的端口:

USES=	python
USE_PYTHON=	distutils

将获得以下版本:py27py36

USES=	python
USE_PYTHON=	distutils allflavors

将获得以下版本:py27py34py35py36

示例 8. 带有版本要求的USES=python

假设当前支持的 Python 版本为 2.7、3.4、3.5 和 3.6,并且默认的 Python 2 和 3 版本分别为 2.7 和 3.6,则具有以下内容的端口:

USES=	python:-3.5
USE_PYTHON=	distutils

将获得以下版本:py27

USES=	python:-3.5
USE_PYTHON=	distutils allflavors

将获得以下版本:py27py34py35

USES=	python:3.4+
USE_PYTHON=	distutils

将获得以下版本:py36

USES=	python:3.4+
USE_PYTHON=	distutils allflavors

将获得以下版本:py34py35py36

PY_FLAVOR可用于依赖于正确版本的 Python 模块。所有对版本化 Python 端口的依赖项都应使用PY_FLAVOR,而不要直接使用FLAVOR

示例 9. 对于不使用distutils的端口

如果默认的 Python 3 版本为 3.6,则以下内容将把PY_FLAVOR设置为py36

RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}

USES=	python:3.5+

7.5. USES=lua和版本

当使用lua:modulelua:flavors时,端口将自动填充FLAVORS,其中包含其支持的 Lua 版本。但是,普通应用程序(而不是 Lua 模块)不应使用此功能;大多数嵌入或以其他方式使用 Lua 的应用程序应仅使用USES=lua

LUA_FLAVOR可用(并且必须使用)以依赖于正确版本的依赖项,无论端口是否使用flavorsmodule参数。

有关更多信息,请参阅使用 Lua

7.6. USES=guile和版本

当使用guile:flavors时,端口将自动填充FLAVORS,其中包含其支持的 Guile 版本。但是,普通应用程序不应使用此功能;它主要供库和扩展(例如guile-libguile-cairo)使用。

GUILE_FLAVOR可用(并且必须使用)以依赖于正确版本的版本化依赖项,无论端口是否使用flavors参数。

有关更多信息,请参阅使用 Guile


上次修改时间:2024 年 9 月 23 日,作者:Fernando Apesteguía