Generic FLAVORS work.

- Enable FLAVORS.
- Make make describe flavors aware.
- Add a qa check for unique package names amongst flavors.
- Make MOVEDlint understand flavors.
- Add a bit of sanity check to make sure FLAVORS stay lowercase.
- Various fixes.

Reviewed by:	portmgr
Sponsored by:	Absolight
Differential Revision:	https://reviews.freebsd.org/D12577
This commit is contained in:
Mathieu Arnold 2017-11-30 15:33:29 +00:00
parent 9d8e2a3c3d
commit 30c4ca5784
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=455205
4 changed files with 139 additions and 17 deletions

27
CHANGES
View File

@ -10,6 +10,33 @@ in the release notes and/or placed into UPDATING.
All ports committers are allowed to commit to this file.
20171130:
AUTHOR: mat@FreeBSD.org
Flavors are a way to have multiple variations of a port. The port is built
multiple times, with the variations. To declare flavors, set the FLAVORS
variable to the flavors you want defined. The first flavor will be the
default:
FLAVORS= flavor1 flavor2
The flavors MUST be lowercase, and can contain [[:lower:][:digit:]_].
Then, when building the port, pass the FLAVOR as an argument after make to
select the flavor.
$ make install FLAVOR=flavor2
In the port, you can then change the behavior depending on the value of the
FLAVOR variable. Note that the different flavors MUST have different
PKGNAMEs. Be sure to guard against an empty FLAVOR variable by using
${FLAVOR:U}:
.if ${FLAVOR:U} == flavor2
PKGNAMESUFFIX= -foo
OPTIONS_DEFAULT+= FOO
.endif
20171020:
AUTHOR: ak@FreeBSD.org

View File

@ -841,9 +841,26 @@ gemdeps()
return $rc
}
flavors()
{
local rc pkgnames uniques
rc=0
if [ -n "${FLAVOR}" ]; then
pkgnames=$(make -C "${CURDIR}" flavors-package-names|sort)
uniques=$(echo "${pkgnames}"|uniq)
if [ "$pkgnames" != "${uniques}" ]; then
err "Package names are not uniques with flavors:"
make -C "${CURDIR}" pretty-flavors-package-names >&2
err "maybe use <flavor>_PKGNAMEPREFIX/SUFFIX".
rc=1
fi
fi
return ${rc}
}
checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo"
checks="$checks suidfiles libtool libperl prefixvar baselibs terminfo"
checks="$checks proxydeps sonames perlcore no_arch gemdeps"
checks="$checks proxydeps sonames perlcore no_arch gemdeps flavors"
ret=0
cd ${STAGEDIR}

View File

@ -1065,8 +1065,7 @@ FLAVOR?=
.if !defined(_FLAVOR)
_FLAVOR:= ${FLAVOR}
.endif
# XXX: We have no real FLAVORS support in ports or tools yet.
#PORTS_FEATURES+= FLAVORS
PORTS_FEATURES+= FLAVORS
MINIMAL_PKG_VERSION= 1.6.0
_PORTS_DIRECTORIES+= ${PKG_DBDIR} ${PREFIX} ${WRKDIR} ${EXTRACT_WRKDIR} \
@ -1082,18 +1081,6 @@ _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=*}
@ -1470,6 +1457,32 @@ ${_f}_ARGS:= ${f:C/^[^\:]*(\:|\$)//:S/,/ /g}
.include "${USESDIR}/${f:C/\:.*//}.mk"
.endfor
.if !empty(FLAVORS)
. if ${FLAVORS:Mall}
DEV_ERROR+= "FLAVORS cannot contain 'all', it is a reserved value"
. endif
. for f in ${FLAVORS}
. if ${f:C/[[:lower:][:digit:]_]//g}
_BAD_FLAVOR_NAMES+= ${f}
. endif
. endfor
. if !empty(_BAD_FLAVOR_NAMES)
DEV_ERROR+= "FLAVORS contains flavors that are not all [a-z0-9_]: ${_BAD_FLAVOR_NAMES}"
. endif
.endif
.if !empty(FLAVOR)
. if empty(FLAVORS)
IGNORE= FLAVOR is defined (to ${FLAVOR}) 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
EXTRACT_SUFX?= .tar.gz
.if defined(USE_LINUX_PREFIX)
@ -1562,6 +1575,9 @@ QA_ENV+= STAGEDIR=${STAGEDIR} \
LOCALBASE=${LOCALBASE} \
"STRIP=${STRIP}" \
TMPPLIST=${TMPPLIST} \
CURDIR='${.CURDIR}' \
FLAVOR=${FLAVOR} \
FLAVORS='${FLAVORS}' \
BUNDLE_LIBS=${BUNDLE_LIBS} \
LDCONFIG_DIR="${LDCONFIG_DIR}" \
PKGORIGIN=${PKGORIGIN} \
@ -4025,11 +4041,17 @@ deinstall-depends:
fetch-specials:
@${ECHO_MSG} "===> Fetching all distfiles required by ${PKGNAME} for building"
@for dir in ${_DEPEND_SPECIALS}; do \
case $${dir} in \
*@*) \
flavor=$${dir#*@}; \
dir=$${dir%@*}; \
;; \
esac; \
case $$dir in \
/*) ;; \
*) dir=${PORTSDIR}/$$dir ;; \
esac; \
(cd $$dir; ${MAKE} fetch); \
(cd $$dir; ${MAKE} FLAVOR=$${flavor} fetch); \
done
.endif
@ -4323,6 +4345,7 @@ INDEX_OUT=${INDEX_TMPDIR}/${INDEXFILE}.desc.aggr
INDEX_OUT=/dev/stdout
. endif
. if empty(FLAVORS) || defined(_DESCRIBE_WITH_FLAVOR)
describe:
@(${ECHO_CMD} -n "${PKGNAME}|${.CURDIR}|${PREFIX}|"; \
${ECHO_CMD} -n ${COMMENT:Q}; \
@ -4337,6 +4360,13 @@ describe:
;; \
esac; \
done < ${DESCR}; ${ECHO_CMD}) >>${INDEX_OUT}
. else # empty(FLAVORS)
describe: ${FLAVORS:S/^/describe-/}
. for f in ${FLAVORS}
describe-${f}:
@cd ${.CURDIR} && ${MAKE} -B FLAVOR=${f} -D_DESCRIBE_WITH_FLAVOR describe
. endfor
. endif # empty(FLAVORS)
. endif
www-site:
@ -4618,6 +4648,25 @@ stage-qa:
.endif
.endif
pretty-flavors-package-names: .PHONY
.if empty(FLAVORS)
@${ECHO_CMD} "no flavor: ${PKGNAME}"
.else
.for f in ${FLAVORS}
@${ECHO_CMD} -n "${f}: "
@cd ${.CURDIR} && ${MAKE} -B FLAVOR=${f} -V PKGNAME
.endfor
.endif
flavors-package-names: .PHONY
.if empty(FLAVORS)
@${ECHO_CMD} "${PKGNAME}"
.else
.for f in ${FLAVORS}
@cd ${.CURDIR} && ${MAKE} -B FLAVOR=${f} -V PKGNAME
.endfor
.endif
# Fake installation of package so that user can pkg delete it later.
.if !target(fake-pkg)
STAGE_ARGS= -i ${STAGEDIR}

View File

@ -80,15 +80,44 @@ $3 !~ /^20[0-3][0-9]-[01][0-9]-[0-3][0-9]$/ {
}
lastdate = $3
from_flavor=""
if ($1 ~ "@") {
from_flavor=$1
sub("@.*", "", $1)
sub(".*@", "", from_flavor)
}
if (system("test -f " portsdir "/" $1 "/Makefile")) {
delete missing[$1]
} else {
printf "%5d: %s must be marked as resurrected\n", NR, $1 | sort
if (from_flavor != "") {
if (!system("test \"" from_flavor "\" = \"`make -C " portsdir "/" $1 " -VFLAVORS:M" from_flavor "`\"")) {
printf "%5d: %s still has the %s flavor\n", NR, $1, from_flavor | sort
}
# No else because the port is there but does not have the flavor,
# so it should be ok.
} else {
printf "%5d: %s must be marked as resurrected\n", NR, $1 | sort
}
}
if ($2) {
to_flavor=""
if ($2 ~ "@") {
to_flavor=$2
sub("@.*", "", $2)
sub(".*@", "", to_flavor)
}
if (system("test -f " portsdir "/" $2 "/Makefile"))
missing[$2] = NR
else
if (to_flavor != "") {
if (system("test \"" to_flavor "\" = \"`make -C " portsdir "/" $2 " -VFLAVORS:M" to_flavor "`\"")) {
printf "%5d: %s does not have the %s flavor\n", NR, $2, to_flavor | sort
error[NR] = 1
}
}
}
# Produces too many false positives