aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Arnold <mat@FreeBSD.org>2017-11-30 15:33:29 +0000
committerMathieu Arnold <mat@FreeBSD.org>2017-11-30 15:33:29 +0000
commit30c4ca57841f7ed00f4b8bd08e9fb77a99ea03c2 (patch)
treec68f282f056cada60fad8fc282c20f9ffdbfd0ee
parent9d8e2a3c3d58395efca06a2610bf09873ae61918 (diff)
downloadports-30c4ca57841f7ed00f4b8bd08e9fb77a99ea03c2.tar.gz
ports-30c4ca57841f7ed00f4b8bd08e9fb77a99ea03c2.zip
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
Notes
Notes: svn path=/head/; revision=455205
-rw-r--r--CHANGES27
-rw-r--r--Mk/Scripts/qa.sh19
-rw-r--r--Mk/bsd.port.mk79
-rwxr-xr-xTools/scripts/MOVEDlint.awk31
4 files changed, 139 insertions, 17 deletions
diff --git a/CHANGES b/CHANGES
index 9f025708e1b8..b8c9e431d6a0 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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
diff --git a/Mk/Scripts/qa.sh b/Mk/Scripts/qa.sh
index 2ec5167be71a..868043601a92 100644
--- a/Mk/Scripts/qa.sh
+++ b/Mk/Scripts/qa.sh
@@ -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}
diff --git a/Mk/bsd.port.mk b/Mk/bsd.port.mk
index 21b5dd601410..689033f34421 100644
--- a/Mk/bsd.port.mk
+++ b/Mk/bsd.port.mk
@@ -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}
diff --git a/Tools/scripts/MOVEDlint.awk b/Tools/scripts/MOVEDlint.awk
index e2445ba44f41..60de5f90dd52 100755
--- a/Tools/scripts/MOVEDlint.awk
+++ b/Tools/scripts/MOVEDlint.awk
@@ -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