FLAVOR?= ${FLAVORS:[1]}
Flavors are a way to have multiple variations of a port. The port is built multiple times, with variations.
For example, a port can have a normal version with many features and quite a few dependencies, and a light "lite" version with only basic features and minimal dependencies.
Another example could be, a port can have a GTK flavor and a QT flavor, depending on which toolkit it uses.
To declare a port having multiple flavors, add
FLAVORS
to its
Makefile
.
The first flavor in
FLAVORS
is the default flavor.
|
It can help simplify the logic of the
Makefile
to also define
FLAVOR?= ${FLAVORS:[1]}
|
|
To distinguish flavors from options, which are always uppercase letters, flavor names can
only
contain lowercase letters, numbers, and the underscore
|
If a port has a "lite" slave port, the slave port can be removed, and the port can be converted to flavors with:
FLAVORS= default lite
lite_PKGNAMESUFFIX= -lite
[...]
.if ${FLAVOR:U} != lite
[enable non lite features]
.endif
If a port has a
-nox11
slave port, the slave port can be removed, and the port can be converted to flavors with:
FLAVORS= x11 nox11
FLAVOR?= ${FLAVORS:[1]}
nox11_PKGNAMESUFFIX= -nox11
[...]
.if ${FLAVOR} == x11
[enable x11 features]
.endif
Here is a slightly edited excerpt of what is present in
devel/libpeas
,
a port that uses the
Python flavors
.
With the default Python 2 and 3 versions being 2.7 and 3.6, it will automatically get
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
This port does not use
USE_PYTHON=distutils
but needs Python flavors anyway.
To guard against
FLAVOR
being empty, which would cause a
make(1)
error, use
${FLAVOR:U}
in string comparisons instead of
${FLAVOR}
.
The Gnome Python gobject3 bindings have two different names, one for Python 2, pygobject3 and one for Python 3, py3gobject3.
The
configure
script has to run in
${WRKSRC}
, but we are only interested in building and installing the Python 2 or Python 3 parts of the software, so set the build and install base directories appropriately.
Hint about the correct Python 3 config script path name.
The packing list is different when the built with Python 3. As there are three
possible Python 3 versions, set
PLIST
for all three using the
helper
.
To make the Makefile easier to write, a few flavors helpers exist.
This list of helpers will set their variable:
flavor
_PKGNAMEPREFIX
flavor
_PKGNAMESUFFIX
flavor
_PLIST
flavor
_DESCR
This list of helpers will append to their variable:
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
PKGNAME
As all packages must have a different package name, flavors must change theirs, using
flavor
_PKGNAMEPREFIX
and
flavor
_PKGNAMESUFFIX
makes this easy:
FLAVORS= normal lite lite_PKGNAMESUFFIX= -lite
USES=php
and Flavors
When using
php
with one of these arguments,
phpize
,
ext
,
zend
, or
pecl
,
the port will automatically have
FLAVORS
filled in with the PHP versions it supports.
USES=php
Extension
This will generate package for all the supported versions:
PORTNAME= some-ext
PORTVERSION= 0.0.1
PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX}
USES= php:ext
This will generate package for all the supported versions but 7.2:
PORTNAME= some-ext
PORTVERSION= 0.0.1
PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX}
USES= php:ext
IGNORE_WITH_PHP= 72
PHP applications can also be flavorized.
This allows generating packages for all PHP versions, so that users can use them with whatever version they need on their servers.
|
PHP applications that are flavorized
must
append
|
Adding Flavors support to a PHP application is straightforward:
PKGNAMESUFFIX= ${PHP_PKGNAMESUFFIX}
USES= php:flavors
|
When adding a dependency on a PHP flavored port, use
|
USES=python
and Flavors
When using
python
and
USE_PYTHON=distutils
,
the port will automatically have
FLAVORS
filled in with the Python versions it supports.
USES=python
Supposing the current Python supported versions are 2.7, 3.4, 3.5, and 3.6, and the default Python 2 and 3 versions are 2.7 and 3.6, a port with:
USES= python USE_PYTHON= distutils
Will get these flavors:
py27
, and
py36
.
USES= python USE_PYTHON= distutils allflavors
Will get these flavors:
py27
,
py34
,
py35
and
py36
.
USES=python
with Version Requirements
Supposing the current Python supported versions are 2.7, 3.4, 3.5, and 3.6, and the default Python 2 and 3 versions are 2.7 and 3.6, a port with:
USES= python:-3.5 USE_PYTHON= distutils
Will get this flavor:
py27
.
USES= python:-3.5 USE_PYTHON= distutils allflavors
Will get these flavors:
py27
,
py34
, and
py35
.
USES= python:3.4+ USE_PYTHON= distutils
Will get this flavor:
py36
.
USES= python:3.4+ USE_PYTHON= distutils allflavors
Will get these flavors:
py34
,
py35
, and
py36
.
PY_FLAVOR
is available to depend on the correct version of Python modules.
All dependencies on flavored Python ports should use
PY_FLAVOR
, and not
FLAVOR
directly..
distutils
If the default Python 3 version is 3.6, the following will set
PY_FLAVOR
to
py36
:
RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}
USES= python:3.5+
USES=lua
and Flavors
When using
lua:module
or
lua:flavors
,
the port will automatically have
FLAVORS
filled in with the Lua versions it supports.
However, it is not expected that ordinary applications (rather than Lua modules) should use this feature;
most applications that embed or otherwise use Lua should simply use
USES=lua
.
LUA_FLAVOR
is available (and must be used) to depend on the correct version of dependencies regardless of whether the port used the
flavors
or
module
parameters.
See Using Lua for further information.
USES=guile
and Flavors
When using
guile:flavors
,
the port will automatically have
FLAVORS
filled in with the Guile versions it supports.
However, it is not expected that ordinary applications should use this feature;
it is primarily intended for use by libraries and extensions,
such as
guile-lib
or
guile-cairo
.
GUILE_FLAVOR
is available (and must be used) to depend on the correct version of flavored dependencies regardless of whether the port used the
flavors
parameter or not.
See Using Guile for further information.
Last modified on : February 18, 2025 by Fernando ApesteguĂa