Implement basic flavors.

**Do not start migrating any ports, a hook will prevent it**

This has been a long awaiting feature, most of the work has been done by
bapt, bdrewery and antoine, I am just the one actually doing the commit.

All this informations, and more to come are in the first link to our wiki
in the bottom block. A roadmap is in the second link.

To define a different flavors in a port, before any include, set:

FLAVORS=  flavor1 flavor2 [...]

The first flavor in the list will be the default.

You can then check for flavors after includ'ing bsd.port.options.mk with:

.if ${FLAVOR} == flavor2
[some stuff]
.endif

To build flavor2, simply run:

make FLAVOR=flavor2

To depend on a specific flavor, write @<flavor> at the end of the depend
string, like:

RUN_DEPENDS=	something:origin@foo

Submitted by:	bapt, bdrewery, antoine
Reviewed by:	portmgr
More infos:	https://wiki.freebsd.org/Ports/FlavorsMigration
Todo List:	https://wiki.freebsd.org/Ports/FlavorsAndSubPackages
With hat:	portmgr
Differential Revision: https://reviews.freebsd.org/D10327
This commit is contained in:
Mathieu Arnold 2017-09-26 14:14:44 +00:00
parent e6f5dab676
commit e2e97eb2bc
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=450663
3 changed files with 97 additions and 15 deletions

View file

@ -59,8 +59,13 @@ check_dep() {
IFS=${myifs}
case "${2}" in
/*) d=${2} ;;
*) d=${PORTSDIR}/${2} ;;
/*) d=${2} ;;
*) d=${PORTSDIR}/${2} ;;
esac
case "${d}" in
*@*/*) ;; # Ignore @ in the path which would not be a flavor
*@*) d=${d%@*} ;;
esac
case " ${checked} " in

View file

@ -94,13 +94,15 @@ find_lib()
anynotfound=0
err=0
for _line in ${dp_RAWDEPENDS} ; do
# ensure we never leak flavors
unset FLAVOR
myifs=${IFS}
IFS=:
set -- ${_line}
IFS=${myifs}
if [ $# -lt 2 -o $# -gt 3 ]; then
echo "Error: bad dependency syntax in ${dp_DEPTYPE}" >&2
echo "expecting: pattern:origin[:target]" >&2
echo "expecting: pattern:origin[@flavour][:target]" >&2
echo "got: ${_line}" >&2
err=1
continue
@ -125,6 +127,13 @@ for _line in ${dp_RAWDEPENDS} ; do
/*) ;;
*) origin="${PORTSDIR}/${origin}" ;;
esac
case "${origin}" in
*@*/*) ;; # Ignore @ in the path which would not be a flavor
*@*)
export FLAVOR="${origin##*@}"
origin=${origin%@*}
;;
esac
depends_args="${dp_DEPENDS_ARGS}"
target=${dp_DEPENDS_TARGET}

View file

@ -1056,6 +1056,9 @@ SCRIPTSDIR?= ${PORTSDIR}/Mk/Scripts
LIB_DIRS?= /lib /usr/lib ${LOCALBASE}/lib
STAGEDIR?= ${WRKDIR}/stage
NOTPHONY?=
FLAVORS?=
FLAVOR?=
PORTS_FEATURES+= FLAVORS
MINIMAL_PKG_VERSION= 1.6.0
_PORTS_DIRECTORIES+= ${PKG_DBDIR} ${PREFIX} ${WRKDIR} ${EXTRACT_WRKDIR} \
@ -1071,6 +1074,21 @@ _PORTS_DIRECTORIES+= ${PKG_DBDIR} ${PREFIX} ${WRKDIR} ${EXTRACT_WRKDIR} \
.include "${PORTSDIR}/Mk/bsd.commands.mk"
.if !empty(FLAVOR)
. if empty(FLAVORS)
IGNORE= FLAVOR is defined while this port does not have FLAVORS.
. elif ! ${FLAVORS:M${FLAVOR}}
IGNORE= Unknown flavor '${FLAVOR}', possible flavors: ${FLAVORS}.
. endif
.endif
.if !empty(FLAVORS) && empty(FLAVOR)
FLAVOR= ${FLAVORS:[1]}
.endif
# Do not leak flavors to childs make
.MAKEOVERRIDES:= ${MAKEOVERRIDES:NFLAVOR=*}
.if defined(CROSS_TOOLCHAIN)
.if !defined(CROSS_SYSROOT)
IGNORE= CROSS_SYSROOT should be defined
@ -1508,6 +1526,11 @@ PKG_NOTES+= expiration_date
PKG_NOTE_expiration_date= ${EXPIRATION_DATE}
.endif
.if !empty(FLAVOR)
PKG_NOTES+= flavor
PKG_NOTE_flavor= ${FLAVOR}
.endif
TEST_ARGS?= ${MAKE_ARGS}
TEST_ENV?= ${MAKE_ENV}
@ -1576,7 +1599,13 @@ MAKE_ENV+= NM=${NM} \
CONFIGURE_ENV+= PKG_CONFIG_SYSROOT_DIR="${CROSS_SYSROOT}"
.endif
WRKDIR?= ${WRKDIRPREFIX}${.CURDIR}/work
.if empty(FLAVOR)
_WRKDIR= work
.else
_WRKDIR= work-${FLAVOR}
.endif
WRKDIR?= ${WRKDIRPREFIX}${.CURDIR}/${_WRKDIR}
.if !defined(IGNORE_MASTER_SITE_GITHUB) && defined(USE_GITHUB) && empty(USE_GITHUB:Mnodefault)
WRKSRC?= ${WRKDIR}/${GH_PROJECT}-${GH_TAGNAME_EXTRACT}
.endif
@ -3680,18 +3709,57 @@ do-clean:
.endif
.if !target(clean)
clean:
pre-clean: clean-msg
clean-msg:
@${ECHO_MSG} "===> Cleaning for ${PKGNAME}"
.if empty(FLAVORS)
CLEAN_DEPENDENCIES=
.if !defined(NOCLEANDEPENDS)
CLEAN_DEPENDENCIES+= limited-clean-depends-noflavor
limited-clean-depends-noflavor:
@cd ${.CURDIR} && ${MAKE} limited-clean-depends
.endif
@${ECHO_MSG} "===> Cleaning for ${PKGNAME}"
.if target(pre-clean)
@cd ${.CURDIR} && ${MAKE} pre-clean
CLEAN_DEPENDENCIES+= pre-clean-noflavor
pre-clean-noflavor:
@cd ${.CURDIR} && ${SETENV} ${MAKE} pre-clean
.endif
@cd ${.CURDIR} && ${MAKE} do-clean
CLEAN_DEPENDENCIES+= do-clean-noflavor
do-clean-noflavor:
@cd ${.CURDIR} && ${SETENV} ${MAKE} do-clean
.if target(post-clean)
@cd ${.CURDIR} && ${MAKE} post-clean
CLEAN_DEPENDENCIES+= post-clean-noflavor
post-clean-${_f}:
@cd ${.CURDIR} && ${SETENV} ${MAKE} post-clean
.endif
.ORDER: ${CLEAN_DEPENDENCIES}
clean: ${CLEAN_DEPENDENCIES}
.endif
.for _f in ${FLAVORS}
CLEAN_DEPENDENCIES=
.if !defined(NOCLEANDEPENDS)
CLEAN_DEPENDENCIES+= limited-clean-depends-${_f}
limited-clean-depends-${_f}:
@cd ${.CURDIR} && ${MAKE} FLAVOR=${_f} limited-clean-depends
.endif
.if target(pre-clean)
CLEAN_DEPENDENCIES+= pre-clean-${_f}
pre-clean-${_f}:
@cd ${.CURDIR} && ${SETENV} FLAVOR=${_f} ${MAKE} pre-clean
.endif
CLEAN_DEPENDENCIES+= do-clean-${_f}
do-clean-${_f}:
@cd ${.CURDIR} && ${SETENV} FLAVOR=${_f} ${MAKE} do-clean
.if target(post-clean)
CLEAN_DEPENDENCIES+= post-clean-${_f}
post-clean-${_f}:
@cd ${.CURDIR} && ${SETENV} FLAVOR=${_f} ${MAKE} post-clean
.endif
.ORDER: ${CLEAN_DEPENDENCIES}
clean: ${CLEAN_DEPENDENCIES}
.endfor
.endif
.if !target(distclean)
@ -4217,12 +4285,12 @@ missing-packages:
# first to avoid gratuitous breakage.
. if !target(describe)
_EXTRACT_DEPENDS=${EXTRACT_DEPENDS:C/^[^ :]+:([^ :]+)(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_PATCH_DEPENDS=${PATCH_DEPENDS:C/^[^ :]+:([^ :]+)(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_FETCH_DEPENDS=${FETCH_DEPENDS:C/^[^ :]+:([^ :]+)(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_LIB_DEPENDS=${LIB_DEPENDS:C/^[^ :]+:([^ :]+)(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_BUILD_DEPENDS=${BUILD_DEPENDS:C/^[^ :]+:([^ :]+)(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,} ${_LIB_DEPENDS}
_RUN_DEPENDS=${RUN_DEPENDS:C/^[^ :]+:([^ :]+)(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,} ${_LIB_DEPENDS}
_EXTRACT_DEPENDS=${EXTRACT_DEPENDS:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_PATCH_DEPENDS=${PATCH_DEPENDS:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_FETCH_DEPENDS=${FETCH_DEPENDS:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_LIB_DEPENDS=${LIB_DEPENDS:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_BUILD_DEPENDS=${BUILD_DEPENDS:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,} ${_LIB_DEPENDS}
_RUN_DEPENDS=${RUN_DEPENDS:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,} ${_LIB_DEPENDS}
. if exists(${DESCR})
_DESCR=${DESCR}
. else