component: add SUBPACKAGES

This commit add SUBPACKAGES support to the framework.

Fix users of _LICENSE_DIR
Fix multi/dual license
Add annotation to packages about being a subpkg
Make do-depends aware of the subpackages
Add PKGBASE.subpkg variable
Fix actual-package-depends target
Fix dependencies in sub-packages
Implement LICENSE support
Fix PLIST_FILES.subpkg
Make DESCR.subpkg warning message shorter
Add SUBPACKES to the list of OPTIONS_HELPERS
Fix _strip_perms
Simplify METADIR as in the original patch
Fix _PLIST
Fix the case when there are no subpackages
Fix typo
Fix _PKGDIR initialization
Fix PLIST
Fix typo in RE
Fix METADIR
Fix type in PKGFILE
Fix [build|run]-depends-list targets
Initial import of the subpackage framework
This import is based on https://reviews.freebsd.org/D16457

PR:		275735
Differential Revision:	https://reviews.freebsd.org/D40549
This commit is contained in:
Luca Pizzamiglio 2024-01-01 22:53:32 +01:00
parent 39e841a05a
commit 47564762a3
6 changed files with 313 additions and 124 deletions

View File

@ -69,6 +69,12 @@ check_dep() {
d=${overlay}/${2}
f=
case "${d}" in
*~*/*) ;; # Ignore ~ in the path which would not be a subpkg
*~*)
d=${d%~*}
;;
esac
case "${d}" in
*@*/*) ;; # Ignore @ in the path which would not be a flavor
*@*)
f=${d##*@}

View File

@ -21,15 +21,22 @@ install_depends()
{
origin=$1
target=$2
depends_args=$3
subpkg=$3
depends_args=$4
if [ -z "${dp_USE_PACKAGE_DEPENDS}" -a -z "${dp_USE_PACKAGE_DEPENDS_ONLY}" ]; then
MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args}
return 0
fi
port_var_fetch "${origin}" "${depends_args}" \
PKGFILE pkgfile \
PKGBASE pkgbase
if [ -z "${subpkg}" ]; then
port_var_fetch "${origin}" "${depends_args}" \
PKGFILE pkgfile \
PKGBASE pkgbase
else
port_var_fetch "${origin}" "${depends_args}" \
PKGFILE.${subpkg} pkgfile \
PKGBASE.${subpkg} pkgbase
fi
if [ -r "${pkgfile}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then
echo "===> Installing existing package ${pkgfile}"
@ -123,12 +130,18 @@ for _line in ${dp_RAWDEPENDS} ; do
continue
fi
subpkg=
case "${origin}" in
*@*/*) ;; # Ignore @ in the path which would not be a flavor
*@*)
export FLAVOR="${origin##*@}"
origin=${origin%@*}
;;
*~*/*) ;; # Ignore ~ in the path which would not be a subpackage
*~*)
subpkg="${origin##*~}"
origin=${origin%~*}
;;
esac
case "${origin}" in
@ -194,7 +207,7 @@ for _line in ${dp_RAWDEPENDS} ; do
fi
# Now actually install the dependencies
install_depends "${origin}" "${target}" "${depends_args}"
install_depends "${origin}" "${target}" "${subpkg}" "${depends_args}"
# Recheck if the installed dependency validates the pattern except for /nonexistent
[ "${fct}" = "false" ] || ${fct} "${pattern}"
echo "===> Returning to build of ${dp_PKGNAME}"

View File

@ -6,7 +6,8 @@
# Strip (owner,group,perm) from keywords
_strip_perms() {
sed -Ee 's/^@\([^)]*\)[[:space:]]+//' \
-e 's/^(@[[:alpha:]]+)\([^)]*\)[[:space:]]+/\1 /'
-e 's/^(@[[:alpha:]]+)\([^)]*\)[[:space:]]+/\1 /' \
-e 's/^@@[[:alnum:]]+@@//'
}
# Expand TMPPLIST to absolute paths, splitting files and dirs into separate

View File

@ -153,10 +153,13 @@ _LICENSE_LIST_PORT_VARS= PERMS NAME GROUPS
# few more targets only.
_LICENSE_DIR?= ${PREFIX}/share/licenses/${PKGNAME}
. for sp in ${_PKGS}
_LICENSE_DIR.${sp}?= ${PREFIX}/share/licenses/${PKGNAME${_SP.${sp}}}
_LICENSE_CATALOG.${sp}?= ${_LICENSE_DIR.${sp}}/catalog.mk
_LICENSE_REPORT.${sp}?= ${_LICENSE_DIR.${sp}}/LICENSE
. endfor
_LICENSE_STORE?= ${PORTSDIR}/Templates/Licenses
_LICENSE_CATALOG?= ${_LICENSE_DIR}/catalog.mk
_LICENSE_CATALOG_TMP?= ${WRKDIR}/.license-catalog.mk
_LICENSE_REPORT?= ${_LICENSE_DIR}/LICENSE
_LICENSE_REPORT_TMP?= ${WRKDIR}/.license-report
_LICENSE_COOKIE?= ${WRKDIR}/.license_done.${PORTNAME}.${PREFIX:S/\//_/g}
@ -771,30 +774,47 @@ ${_LICENSE_COOKIE}:
# Package list entries, and installation
. if !defined(NO_LICENSES_INSTALL)
PLIST_FILES+= ${_LICENSE_CATALOG} \
${_LICENSE_REPORT}
. if ${_LICENSE_COMB} == "single"
PLIST_FILES+= ${_LICENSE_DIR}/${_LICENSE}
. else
. for lic in ${_LICENSE}
. if defined(_LICENSE_FILE_${lic})
PLIST_FILES+= ${_LICENSE_DIR}/${lic}
. for sp in ${_PKGS}
. if ${sp} == ${PKGBASE}
PLIST_FILES+= ${_LICENSE_CATALOG.${sp}} \
${_LICENSE_REPORT.${sp}}
. if ${_LICENSE_COMB} == "single"
PLIST_FILES+= ${_LICENSE_DIR.${sp}}/${_LICENSE}
. else
. for lic in ${_LICENSE}
. if defined(_LICENSE_FILE_${lic})
PLIST_FILES+= ${_LICENSE_DIR.${sp}}/${lic}
. endif
. endfor
. endif
. endfor
. endif
. else
PLIST_FILES${_SP.${sp}}+= ${_LICENSE_CATALOG.${sp}} \
${_LICENSE_REPORT.${sp}}
. if ${_LICENSE_COMB} == "single"
PLIST_FILES${_SP.${sp}}+= ${_LICENSE_DIR.${sp}}/${_LICENSE}
. else
. for lic in ${_LICENSE}
. if defined(_LICENSE_FILE_${lic})
PLIST_FILES${_SP.${sp}}+= ${_LICENSE_DIR.${sp}}/${lic}
. endif
. endfor
. endif
. endif
install-license:
@${MKDIR} ${STAGEDIR}${_LICENSE_DIR}
@${INSTALL_DATA} ${_LICENSE_CATALOG_TMP} ${STAGEDIR}${_LICENSE_CATALOG}
@${INSTALL_DATA} ${_LICENSE_REPORT_TMP} ${STAGEDIR}${_LICENSE_REPORT}
. if ${_LICENSE_COMB} == "single"
@${INSTALL_DATA} ${_LICENSE_FILE} ${STAGEDIR}${_LICENSE_DIR}/${_LICENSE}
. else
. for lic in ${_LICENSE}
@${INSTALL_DATA} ${_LICENSE_FILE_${lic}} ${STAGEDIR}${_LICENSE_DIR}/${lic}
. endfor
. endif
install-license: install-license.${sp}
install-license.${sp}:
@${MKDIR} ${STAGEDIR}${_LICENSE_DIR.${sp}}
@${INSTALL_DATA} ${_LICENSE_CATALOG_TMP} ${STAGEDIR}${_LICENSE_CATALOG.${sp}}
@${INSTALL_DATA} ${_LICENSE_REPORT_TMP} ${STAGEDIR}${_LICENSE_REPORT.${sp}}
. if ${_LICENSE_COMB} == "single"
@${INSTALL_DATA} ${_LICENSE_FILE} ${STAGEDIR}${_LICENSE_DIR.${sp}}/${_LICENSE}
. else
. for lic in ${_LICENSE}
@${INSTALL_DATA} ${_LICENSE_FILE_${lic}} ${STAGEDIR}${_LICENSE_DIR.${sp}}/${lic}
. endfor
. endif
. endfor
. endif
. else # !LICENSE

View File

@ -197,8 +197,8 @@ _ALL_OPTIONS_HELPERS= ${_OPTIONS_DEPENDS:S/$/_DEPENDS/} \
CONFIGURE_ENABLE CONFIGURE_OFF CONFIGURE_ON \
CONFIGURE_WITH IMPLIES MESON_ARGS MESON_DISABLED \
MESON_ENABLED MESON_FALSE MESON_OFF MESON_ON MESON_TRUE \
PREVENTS PREVENTS_MSG QMAKE_OFF QMAKE_ON USE USE_OFF \
VARS VARS_OFF
PREVENTS PREVENTS_MSG QMAKE_OFF QMAKE_ON \
SUBPACKAGES SUBPACKAGES_OFF USE USE_OFF VARS VARS_OFF
# The format here is target_family:priority:target-type
_OPTIONS_TARGETS= fetch:300:pre fetch:500:do fetch:700:post \
@ -455,6 +455,19 @@ ALL_OPTIONS= ${OPTIONS_DEFINE}
_OPTIONS_${target}?=
. endfor
# Handle subpackages before the rest to be able to handle options helpers
# with subpackages
. for opt in ${_REALLY_ALL_POSSIBLE_OPTIONS}
. if ${PORT_OPTIONS:M${opt}}
. if defined(${opt}_SUBPACKAGES)
SUBPACKAGES+= ${${opt}_SUBPACKAGES}
. endif
. else
. if defined(${opt}_SUBPACKAGES_OFF)
SUBPACKAGES+= ${${opt}_SUBPACKAGES_OFF}
. endif
. endif
. endfor
. for opt in ${_REALLY_ALL_POSSIBLE_OPTIONS}
# PLIST_SUB
PLIST_SUB?=
@ -540,6 +553,11 @@ ${flags}+= ${${opt}_${flags}}
. if defined(${opt}_${deptype}_DEPENDS)
${deptype}_DEPENDS+= ${${opt}_${deptype}_DEPENDS}
. endif
. for p in ${SUBPACKAGES}
. if defined(${opt}_${deptype}_DEPENDS.${p})
${deptype}_DEPENDS.{p}+= ${${opt}_${deptype}_DEPENDS.${p}}
. endif
. endfor
. endfor
. for target in ${_OPTIONS_TARGETS}
_target= ${target:C/:.*//}
@ -611,6 +629,11 @@ ${flags}+= ${${opt}_${flags}_OFF}
. if defined(${opt}_${deptype}_DEPENDS_OFF)
${deptype}_DEPENDS+= ${${opt}_${deptype}_DEPENDS_OFF}
. endif
. for p in ${SUBPACKAGES}
. if defined(${opt}_${deptype}_DEPENDS_OFF.${p})
${deptype}_DEPENDS.{p}+= ${${opt}_${deptype}_DEPENDS_OFF.${p}}
. endif
. endfor
. endfor
. for target in ${_OPTIONS_TARGETS}
_target= ${target:C/:.*//}

View File

@ -2196,6 +2196,7 @@ PKGMESSAGE?= ${PKGDIR}/pkg-message
_PKGMESSAGES+= ${PKGMESSAGE}
TMPPLIST?= ${WRKDIR}/.PLIST.mktmp
_PLIST?= ${WRKDIR}/.PLIST
# backward compatibility for users
. if defined(_PKG_TRANSITIONING_TO_NEW_EXT)
@ -2229,11 +2230,6 @@ ALL_TARGET?= all
INSTALL_TARGET?= install
INSTALL_TARGET+= ${LATE_INSTALL_ARGS}
# Integrate with the license auditing framework
. if !defined (DISABLE_LICENSES)
.include "${PORTSDIR}/Mk/bsd.licenses.mk"
. endif
# Popular master sites
.include "${PORTSDIR}/Mk/bsd.sites.mk"
@ -2607,14 +2603,6 @@ check-categories:
PKGREPOSITORYSUBDIR?= All
PKGREPOSITORY?= ${PACKAGES}/${PKGREPOSITORYSUBDIR}
. if exists(${PACKAGES})
PACKAGES:= ${PACKAGES:S/:/\:/g}
_HAVE_PACKAGES= yes
PKGFILE?= ${PKGREPOSITORY}/${PKGNAME}${PKG_SUFX}
. else
PKGFILE?= ${.CURDIR}/${PKGNAME}${PKG_SUFX}
. endif
WRKDIR_PKGFILE= ${WRKDIR}/pkg/${PKGNAME}${PKG_SUFX}
# The "latest version" link -- ${PKGNAME} minus everthing after the last '-'
PKGLATESTREPOSITORY?= ${PACKAGES}/Latest
@ -2627,6 +2615,75 @@ PKGOLDLATESTFILE= ${PKGLATESTREPOSITORY}/${PKGBASE}.${PKG_COMPRESSION_FORMAT}
PKGOLDSIGFILE= ${PKGLATESTREPOSITORY}/${PKGBASE}.${PKG_COMPRESSION_FORMAT}.sig
. endif
_PKGS= ${PKGBASE}
PORTS_FEATURES+= SUBPACKAGES
. if defined(SUBPACKAGES)
. if ${SUBPACKAGES:Mmain}
DEV_ERROR+= "SUBPACKAGES cannot contain 'main', it is a reserved value"
. endif
. for sp in ${SUBPACKAGES}
. if ${sp:C/[[:lower:][:digit:]_]//g}
_BAD_SUBPACKAGES_NAMES+= ${sp}
. endif
. endfor
. if !empty(_BAD_SUBPACKAGES_NAMES)
DEV_ERROR+= "SUBPACKAGES cannot subpackages that are not all [a-z0-9_]: ${_BAD_SUBPACKAGES_NAMES}"
. endif
. endif
. for sp in ${SUBPACKAGES}
# If a FRAMEWORK generated package needs to override its subpackage package name
# it can do it with this mechanism
. if !defined(_PKGS.${sp})
_PKGS.${sp}= ${PKGBASE}-${sp}
. endif
_PKGS+= ${_PKGS.${sp}}
PKGBASE.${sp}= ${_PKGS.${sp}}
_SP.${_PKGS.${sp}}=.${sp}
. endfor
. if !defined(_DID_SUBPACKAGES_HELPERS)
_DID_SUBPACKAGES_HELPERS= yes
_SUBPACKAGE_HELPERS_FILE= DESCR PKGINSTALL PKGDEINSTALL PKGMESSAGE \
PKGPREINSTALL PKGPOSTINSTALL PKGPREDEINSTALL PKGPOSTDEINSTALL \
PKGPREUPGRADE PKGPOSTUPGRADE PKGUPGRADE
. for sp in ${SUBPACKAGES}
# These overwrite the current value
. for v in ${_SUBPACKAGE_HELPERS_FILE}
${v}.${sp}?= ${$v}.${sp}
. endfor
_PKGMESSAGES.${sp}= ${PKGMESSAGE}.${sp}
. if !exists(${DESCR.${sp}})
DESCR.${sp}= ${DESCR}
DEV_WARNING+= "DESCR.${sp} needs to point to an existing file."
. endif
COMMENT.${sp}?= ${COMMENT} (subpkg: ${sp})
. endfor
. endif
. if exists(${PACKAGES})
PACKAGES:= ${PACKAGES:S/:/\:/g}
_HAVE_PACKAGES= yes
_PKGDIR= ${PKGREPOSITORY}
. else
_PKGDIR= ${.CURDIR}
. endif
. for sp in ${_PKGS}
PKGNAME${_SP.${sp}}= ${sp}-${PKGVERSION}
PKGNAMES+= ${PKGNAME${_SP.${sp}}}
PKGFILE${_SP.${sp}}= ${_PKGDIR}/${PKGNAME${_SP.${sp}}}${PKG_SUFX}
. endfor
_EXTRA_PACKAGE_TARGET_DEP+= ${_PKGDIR}
. for sp in ${_PKGS}
WRKDIR_PKGFILE${_SP.${sp}}= ${WRKDIR}/pkg/${PKGNAME${_SP.${sp}}}${PKG_SUFX}
. endfor
# Integrate with the license auditing framework
. if !defined (DISABLE_LICENSES)
.include "${PORTSDIR}/Mk/bsd.licenses.mk"
. endif
CONFIGURE_SCRIPT?= configure
CONFIGURE_CMD?= ./${CONFIGURE_SCRIPT}
CONFIGURE_TARGET?= ${HOSTARCH}-portbld-${OPSYS:tl}${OSREL}
@ -3402,10 +3459,6 @@ do-test:
_EXTRA_PACKAGE_TARGET_DEP+= ${PKGFILE}
_PORTS_DIRECTORIES+= ${PKGREPOSITORY}
${PKGFILE}: ${WRKDIR_PKGFILE} ${PKGREPOSITORY}
@${LN} -f ${WRKDIR_PKGFILE} ${PKGFILE} 2>/dev/null \
|| ${CP} -f ${WRKDIR_PKGFILE} ${PKGFILE}
. if ${PKGORIGIN} == "ports-mgmt/pkg" || ${PKGORIGIN} == "ports-mgmt/pkg-devel"
_EXTRA_PACKAGE_TARGET_DEP+= ${PKGLATESTREPOSITORY}
_PORTS_DIRECTORIES+= ${PKGLATESTREPOSITORY}
@ -3431,14 +3484,29 @@ ${PKGOLDSIGFILE}: ${PKGLATESTREPOSITORY}
. endif
# from here this will become a loop for subpackages
${WRKDIR_PKGFILE}: ${TMPPLIST} create-manifest ${WRKDIR}/pkg
@if ! ${SETENV} ${PKG_ENV} ${PKG_CREATE} ${PKG_CREATE_ARGS} -m ${METADIR} -p ${TMPPLIST} -o ${WRKDIR}/pkg ${PKGNAME}; then \
. for sp in ${_PKGS}
${_PLIST}.${sp}: ${TMPPLIST}
@if [ "${PKGBASE}" = "${sp}" ]; then \
${SED} "/^@comment /d; /@@/d" ${TMPPLIST} > ${.TARGET} ; \
else \
${SED} -n "s/@@${sp:S/${PKGBASE}-//}@@//p" ${TMPPLIST} > ${.TARGET} ; \
fi
${WRKDIR_PKGFILE${_SP.${sp}}}: ${_PLIST}.${sp} create-manifest ${WRKDIR}/pkg
@echo "===> Building ${PKGNAME${_SP.${sp}}}"
@if ! ${SETENV} ${PKG_ENV} ${PKG_CREATE} ${PKG_CREATE_ARGS} -m ${METADIR}.${sp} -p ${_PLIST}.${sp} -o ${WRKDIR}/pkg ${PKGNAME}; then \
cd ${.CURDIR} && eval ${MAKE} delete-package >/dev/null; \
exit 1; \
fi
#
# Temporary will be later dynamically added per subpackages
_EXTRA_PACKAGE_TARGET_DEP+= ${WRKDIR_PKGFILE}
_EXTRA_PACKAGE_TARGET_DEP+= ${WRKDIR_PKGFILE${_SP.${sp}}}
${PKGFILE${_SP.${sp}}}: ${WRKDIR_PKGFILE${_SP.${sp}}}
@${LN} -f ${WRKDIR_PKGFILE${_SP.${sp}}} ${PKGFILE${_SP.${sp}}} 2>/dev/null \
|| ${CP} -f ${WRKDIR_PKGFILE${_SP.${sp}}} ${PKGFILE${_SP.${sp}}}
_EXTRA_PACKAGE_TARGET_DEP+= ${PKGFILE${_SP.${sp}}}
. endfor
# This will be the end of the loop
. if !target(do-package)
@ -3455,14 +3523,18 @@ do-package: ${_EXTRA_PACKAGE_TARGET_DEP} ${WRKDIR}/pkg
. if !target(delete-package)
delete-package:
@${ECHO_MSG} "===> Deleting package for ${PKGNAME}"
. for sp in ${_PKGS}
@${ECHO_MSG} "===> Deleting package for ${sp}"
# When staging, the package may only be in the workdir if not root
@${RM} ${PKGFILE} ${WRKDIR_PKGFILE} 2>/dev/null || :
@${RM} ${PKGFILE${_SP.${sp}}} ${WRKDIR_PKGFILE${_SP.${sp}}} 2>/dev/null || :
. endfor
. endif
. if !target(delete-package-list)
delete-package-list:
@${ECHO_CMD} "[ -f ${PKGFILE} ] && (${ECHO_CMD} deleting ${PKGFILE}; ${RM} ${PKGFILE})"
. for sp in ${_PKGS}
@${ECHO_CMD} "[ -f ${PKGFILE${_SP.${sp}}} ] && (${ECHO_CMD} deleting ${PKGFILE${_SP.${sp}}}; ${RM} ${PKGFILE${_SP.${sp}}})"
. endfor
. endif
# Used by scripts and users to install a package from local repository.
@ -3474,13 +3546,16 @@ _INSTALL_PKG_ARGS= -f
. if defined(INSTALLS_DEPENDS)
_INSTALL_PKG_ARGS+= -A
. endif
install-package:
@if [ -f "${WRKDIR}/pkg/${PKGNAME}${PKG_SUFX}" ]; then \
_pkgfile="${WRKDIR_PKGFILE}"; \
. for sp in ${_PKGS}
install-package: install-package.${sp}
install-package.${sp}:
@if [ -f "${WRKDIR_PKGFILE${_SP.${sp}}}" ]; then \
_pkgfile="${WRKDIR_PKGFILE${_SP.${sp}}}"; \
else \
_pkgfile="${PKGFILE}"; \
_pkgfile="${PKGFILE${_SP.${sp}}}"; \
fi; \
${PKG_ADD} ${_INSTALL_PKG_ARGS} $${_pkgfile}
. endfor
. endif
# Utility targets follow
@ -3673,7 +3748,7 @@ install-message:
test-message:
@${ECHO_MSG} "===> Testing for ${PKGNAME}"
package-message:
@${ECHO_MSG} "===> Building package for ${PKGNAME}"
@${ECHO_MSG} "===> Building packages for ${PKGNAME}"
# Empty pre-* and post-* targets
@ -3743,14 +3818,16 @@ deinstall:
${SU_CMD} "${MAKE} ${.TARGET}"
@${ECHO_MSG} "===> Returning to user credentials"
. else
@${ECHO_MSG} "===> Deinstalling for ${PKGBASE}"
@if ${PKG_INFO} -e ${PKGBASE}; then \
p=`${PKG_INFO} -q -O ${PKGBASE}`; \
. for _sp in ${_PKGS}
@${ECHO_MSG} "===> Deinstalling for ${_sp}"
@if ${PKG_INFO} -e ${_sp}; then \
p=`${PKG_INFO} -q -O ${_sp}`; \
${ECHO_MSG} "===> Deinstalling $${p}"; \
${PKG_DELETE} -f ${PKGBASE} ; \
${PKG_DELETE} -f ${_sp} ; \
else \
${ECHO_MSG} "===> ${PKGBASE} not installed, skipping"; \
${ECHO_MSG} "===> ${_sp} not installed, skipping"; \
fi
. endfor
@${RM} ${INSTALL_COOKIE} ${PACKAGE_COOKIE}
. endif
. endif
@ -3976,7 +4053,7 @@ package-name:
repackage: pre-repackage package
pre-repackage:
@${RM} ${PACKAGE_COOKIE}
@${RM} ${PACKAGE_COOKIE} ${TMPPLIST}*
. endif
# Build a package but don't check the cookie for installation, also don't
@ -3994,10 +4071,13 @@ package-noinstall: package
depends: pkg-depends extract-depends patch-depends lib-depends fetch-depends build-depends run-depends
. for deptype in PKG EXTRACT PATCH FETCH BUILD LIB RUN TEST
. for sp in ${_PKGS}
${deptype}_DEPENDS_ALL+= ${${deptype}_DEPENDS${_SP.${sp}}}
. endfor
${deptype:tl}-depends:
. if defined(${deptype}_DEPENDS) && !defined(NO_DEPENDS)
. if !empty(${deptype}_DEPENDS_ALL) && !defined(NO_DEPENDS)
@${SETENV} \
dp_RAWDEPENDS="${${deptype}_DEPENDS}" \
dp_RAWDEPENDS="${${deptype}_DEPENDS_ALL}" \
dp_DEPTYPE="${deptype}_DEPENDS" \
dp_DEPENDS_TARGET="${DEPENDS_TARGET}" \
dp_DEPENDS_PRECLEAN="${DEPENDS_PRECLEAN}" \
@ -4026,7 +4106,7 @@ ${deptype:tl}-depends:
# Dependency lists: both build and runtime, recursive. Print out directory names.
_UNIFIED_DEPENDS=${PKG_DEPENDS} ${EXTRACT_DEPENDS} ${PATCH_DEPENDS} ${FETCH_DEPENDS} ${BUILD_DEPENDS} ${LIB_DEPENDS} ${RUN_DEPENDS} ${TEST_DEPENDS}
_UNIFIED_DEPENDS=${PKG_DEPENDS_ALL} ${EXTRACT_DEPENDS_ALL} ${PATCH_DEPENDS_ALL} ${FETCH_DEPENDS_ALL} ${BUILD_DEPENDS_ALL} ${LIB_DEPENDS_ALL} ${RUN_DEPENDS_ALL} ${TEST_DEPENDS_ALL}
_DEPEND_SPECIALS= ${_UNIFIED_DEPENDS:M*\:*\:*:C,^[^:]*:([^:]*):.*$,\1,}
. for d in ${_UNIFIED_DEPENDS:M*\:/*}
@ -4079,9 +4159,9 @@ ALL-DEPENDS-LIST= ${DEPENDS-LIST} -r ${_UNIFIED_DEPENDS:Q}
ALL-DEPENDS-FLAVORS-LIST= ${DEPENDS-LIST} -f -r ${_UNIFIED_DEPENDS:Q}
DEINSTALL-DEPENDS-FLAVORS-LIST= ${DEPENDS-LIST} -f -r ${_UNIFIED_DEPENDS:N${PKG_DEPENDS}:Q}
MISSING-DEPENDS-LIST= ${DEPENDS-LIST} -m ${_UNIFIED_DEPENDS:Q}
BUILD-DEPENDS-LIST= ${DEPENDS-LIST} "${PKG_DEPENDS} ${EXTRACT_DEPENDS} ${PATCH_DEPENDS} ${FETCH_DEPENDS} ${BUILD_DEPENDS} ${LIB_DEPENDS}"
RUN-DEPENDS-LIST= ${DEPENDS-LIST} "${LIB_DEPENDS} ${RUN_DEPENDS}"
TEST-DEPENDS-LIST= ${DEPENDS-LIST} ${TEST_DEPENDS:Q}
BUILD-DEPENDS-LIST= ${DEPENDS-LIST} "${PKG_DEPENDS_ALL} ${EXTRACT_DEPENDS_ALL} ${PATCH_DEPENDS_ALL} ${FETCH_DEPENDS_ALL} ${BUILD_DEPENDS_ALL} ${LIB_DEPENDS_ALL}"
RUN-DEPENDS-LIST= ${DEPENDS-LIST} "${LIB_DEPENDS_ALL} ${RUN_DEPENDS_ALL}"
TEST-DEPENDS-LIST= ${DEPENDS-LIST} ${TEST_DEPENDS_ALL:Q}
CLEAN-DEPENDS-LIST= ${DEPENDS-LIST} -wr ${_UNIFIED_DEPENDS:Q}
CLEAN-DEPENDS-LIMITED-LIST= ${DEPENDS-LIST} -w ${_UNIFIED_DEPENDS:Q}
@ -4170,7 +4250,7 @@ fetch-required: fetch
@${ECHO_MSG} "===> Fetching all required distfiles for ${PKGNAME} and dependencies"
. for deptype in PKG EXTRACT PATCH FETCH BUILD RUN
. if defined(${deptype}_DEPENDS)
@targ=fetch; deps="${${deptype}_DEPENDS}"; ${FETCH_LIST}
@targ=fetch; deps="${${deptype}_DEPENDS_ALL}"; ${FETCH_LIST}
. endif
. endfor
. endif
@ -4182,7 +4262,7 @@ fetch-required-list: fetch-list
. if !defined(NO_DEPENDS)
. for deptype in PKG EXTRACT PATCH FETCH BUILD RUN
. if defined(${deptype}_DEPENDS)
@targ=fetch-list; deps="${${deptype}_DEPENDS}"; ${FETCH_LIST}
@targ=fetch-list; deps="${${deptype}_DEPENDS_ALL}"; ${FETCH_LIST}
. endif
. endfor
. endif
@ -4221,7 +4301,7 @@ package-depends-list:
@${PACKAGE-DEPENDS-LIST}
. endif
_LIB_RUN_DEPENDS= ${LIB_DEPENDS} ${RUN_DEPENDS}
_LIB_RUN_DEPENDS= ${LIB_DEPENDS_ALL} ${RUN_DEPENDS_ALL}
PACKAGE-DEPENDS-LIST?= \
if [ "${CHILD_DEPENDS}" ]; then \
installed=$$(${PKG_INFO} -qO ${PKGORIGIN} 2>/dev/null || \
@ -4240,6 +4320,11 @@ PACKAGE-DEPENDS-LIST?= \
for dir in ${_LIB_RUN_DEPENDS:C,[^:]*:([^:]*):?.*,\1,}; do \
unset flavor; \
case $${dir} in \
*~*) \
dir=$${dir%~*}; \
;; \
esac; \
case $${dir} in \
*@*) \
flavor=$${dir\#*@}; \
dir=$${dir%@*}; \
@ -4268,61 +4353,85 @@ PACKAGE-DEPENDS-LIST?= \
fi; \
done
ACTUAL-PACKAGE-DEPENDS?= \
# FIXME: SELF_DEPENDS can only be used to depend on sub packages whose
# package name has not been overrided by the framework, otherwize the
# assumption made below that the package name is "PKGBASE-$$self" is broken.
. for sp in ${_PKGS}
ACTUAL-PACKAGE-DEPENDS${_SP.${sp}}?= \
depfiles="" ; \
for lib in ${LIB_DEPENDS:C/\:.*//}; do \
for lib in ${LIB_DEPENDS${_SP.${sp}}:C/\:.*//}; do \
depfiles="$$depfiles `${SETENV} LIB_DIRS="${LIB_DIRS}" LOCALBASE="${LOCALBASE}" ${SH} ${SCRIPTSDIR}/find-lib.sh $${lib}`" ; \
done ; \
${SETENV} PKG_BIN="${PKG_BIN}" ${SH} ${SCRIPTSDIR}/actual-package-depends.sh $${depfiles} ${RUN_DEPENDS:C/(.*)\:.*/"\1"/}
for self in ${SELF_DEPENDS${_SP.${sp}}}; do \
if [ "$$self" = "main" ]; then \
printf "\"%s\": {origin: \"%s\", version: \"%s\"}\n" ${PKGBASE} ${PKGORIGIN} ${PKGVERSION}; \
else \
printf "\"%s-%s\": {origin: \"%s\", version: \"%s\"}\n" ${PKGBASE} $$self ${PKGORIGIN} ${PKGVERSION}; \
fi ; \
done ; \
${SETENV} PKG_BIN="${PKG_BIN}" ${SH} ${SCRIPTSDIR}/actual-package-depends.sh $${depfiles} ${RUN_DEPENDS${_SP.${sp}}:C/(.*)\:.*/"\1"/}
. endfor
PKG_NOTES_ENV?=
. for note in ${PKG_NOTES}
PKG_NOTES_ENV+= dp_PKG_NOTE_${note}=${PKG_NOTE_${note}:Q}
. endfor
create-manifest:
. for sp in ${_PKGS}
PKG_NOTES.${sp}= ${PKG_NOTES}
PKG_NOTES_ENV.${sp}= ${PKG_NOTES_ENV}
. if ${sp} != ${PKGBASE}
PKG_NOTES.${sp}+= subpackage
PKG_NOTES_ENV.${sp}+= dp_PKG_NOTE_subpackage=${_SP.${sp}:S/^.//1}
. endif
create-manifest: create-manifest.${sp}
create-manifest.${sp}:
@${SETENV} \
dp_SCRIPTSDIR='${SCRIPTSDIR}' \
dp_ACTUAL_PACKAGE_DEPENDS='${ACTUAL-PACKAGE-DEPENDS}' \
dp_ACTUAL_PACKAGE_DEPENDS='${ACTUAL-PACKAGE-DEPENDS${_SP.${sp}}}' \
dp_CATEGORIES='${CATEGORIES:u:S/$/,/}' \
dp_COMMENT=${COMMENT:Q} \
dp_COMMENT=${COMMENT${_SP.${sp}}:Q} \
dp_COMPLETE_OPTIONS_LIST='${COMPLETE_OPTIONS_LIST}' \
dp_DEPRECATED=${DEPRECATED:Q} \
dp_DESCR='${DESCR}' \
dp_DESCR='${DESCR${_SP.${sp}}}' \
dp_EXPIRATION_DATE='${EXPIRATION_DATE}' \
dp_GROUPS='${GROUPS:u:S/$/,/}' \
dp_LICENSE='${LICENSE:u:S/$/,/}' \
dp_LICENSE_COMB='${LICENSE_COMB}' \
dp_MAINTAINER='${MAINTAINER}' \
dp_METADIR='${METADIR}' \
dp_METADIR='${METADIR}.${sp}' \
dp_NO_ARCH='${NO_ARCH}' \
dp_PKGBASE='${PKGBASE}' \
dp_PKGDEINSTALL='${PKGDEINSTALL}' \
dp_PKGINSTALL='${PKGINSTALL}' \
dp_PKGMESSAGES='${_PKGMESSAGES}' \
dp_PKGBASE='${sp}' \
dp_PKGDEINSTALL='${PKGDEINSTALL${_SP.${sp}}}' \
dp_PKGINSTALL='${PKGINSTALL${_SP.${sp}}}' \
dp_PKGMESSAGES='${_PKGMESSAGES${_SP.${sp}}}' \
dp_PKGORIGIN='${PKGORIGIN}' \
dp_PKGPOSTDEINSTALL='${PKGPOSTDEINSTALL}' \
dp_PKGPOSTINSTALL='${PKGPOSTINSTALL}' \
dp_PKGPREDEINSTALL='${PKGPREDEINSTALL}' \
dp_PKGPREINSTALL='${PKGPREINSTALL}' \
dp_PKGPOSTDEINSTALL='${PKGPOSTDEINSTALL${_SP.${sp}}}' \
dp_PKGPOSTINSTALL='${PKGPOSTINSTALL${_SP.${sp}}}' \
dp_PKGPREDEINSTALL='${PKGPREDEINSTALL${_SP.${sp}}}' \
dp_PKGPREINSTALL='${PKGPREINSTALL${_SP.${sp}}}' \
dp_PKGVERSION='${PKGVERSION}' \
dp_PKG_BIN='${PKG_BIN}' \
dp_PKG_IGNORE_DEPENDS='${PKG_IGNORE_DEPENDS}' \
dp_PKG_NOTES='${PKG_NOTES}' \
dp_PKG_NOTES='${PKG_NOTES.${sp}}' \
dp_PORT_OPTIONS='${PORT_OPTIONS}' \
dp_PREFIX='${PREFIX}' \
dp_USERS='${USERS:u:S/$/,/}' \
dp_WWW='${WWW}' \
${PKG_NOTES_ENV} \
${PKG_NOTES_ENV.${sp}} \
${SH} ${SCRIPTSDIR}/create-manifest.sh
. endfor
# Print out package names.
package-depends:
@${PACKAGE-DEPENDS-LIST} | ${AWK} '{print $$1":"$$3}'
actual-package-depends:
@${ACTUAL-PACKAGE-DEPENDS}
. for sp in ${_PKGS}
actual-package-depends: actual-package-depends.${sp}
actual-package-depends.${sp}:
@${ACTUAL-PACKAGE-DEPENDS${_SP.${sp}}}
. endfor
# Build packages for port and dependencies
@ -4369,12 +4478,12 @@ install-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_ALL:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_PATCH_DEPENDS=${PATCH_DEPENDS_ALL:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_FETCH_DEPENDS=${FETCH_DEPENDS_ALL:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_LIB_DEPENDS=${LIB_DEPENDS_ALL:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,}
_BUILD_DEPENDS=${BUILD_DEPENDS_ALL:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,} ${_LIB_DEPENDS}
_RUN_DEPENDS=${RUN_DEPENDS_ALL:C/^[^ :]+:([^ :@]+)(@[^ :]+)?(:[^ :]+)?/\1/:O:u:C,(^[^/]),${PORTSDIR}/\1,} ${_LIB_DEPENDS}
. if exists(${DESCR})
_DESCR=${DESCR}
. else
@ -4399,11 +4508,11 @@ describe-${f}:
. endif # empty(FLAVORS)
. endif
. if empty(FLAVORS) || defined(_DESCRIBE_WITH_FLAVOR)
. if empty(FLAVORS) || defined(_DESCRIBE_WITH_FLAVOR)
. if defined(_DESCRIBE_WITH_FLAVOR)
. if defined(_DESCRIBE_WITH_FLAVOR)
_JSON_OBJ_NAME="\"${FLAVOR}-${.CURDIR:T}\":"
. endif
. endif
describe-json:
@(${ECHO_CMD} "${_JSON_OBJ_NAME} { ";\
@ -4450,10 +4559,10 @@ describe-json:
${ECHO_CMD} \"use_gitlab\":\"${USE_GITLAB}\", ;\
${ECHO_CMD} \"www\":\"${WWW:Q}\" ;\
${ECHO_CMD} "}" >> ${INDEX_OUT})
. else # empty(FLAVORS)
. else # empty(FLAVORS)
describe-json: ${FLAVORS:S/^/describe-json-/}
_LAST_FLAVOR = ${FLAVORS:[-1]}
. for f in ${FLAVORS}
. for f in ${FLAVORS}
describe-json-${f}:
@if [ "${f}" == "${FLAVORS:[1]}" ]; then \
${ECHO_CMD} "{" ;\
@ -4465,8 +4574,8 @@ describe-json-${f}:
${ECHO_CMD} "}" ;\
fi; \
. endfor
. endif # empty(FLAVORS)
. endfor
. endif # empty(FLAVORS)
www-site:
@${ECHO_CMD} ${_WWW}
@ -4559,6 +4668,13 @@ generate-plist: ${WRKDIR}
@for file in ${PLIST_FILES}; do \
${ECHO_CMD} $${file} | ${SED} ${PLIST_SUB_SANITIZED:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} >> ${TMPPLIST}; \
done
. for sp in ${_PKGS}
. if ${sp} != ${PKGBASE}
@for file in ${PLIST_FILES${_SP.${sp}}}; do \
${ECHO_CMD} $${file} | ${SED} ${PLIST_SUB_SANITIZED:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} -e 's/^/@@${_SP.${sp}:S/^.//}@@/' >> ${TMPPLIST}; \
done
. endif
. endfor
. if !empty(PLIST)
. for f in ${PLIST}
@if [ -f "${f}" ]; then \
@ -4572,6 +4688,13 @@ generate-plist: ${WRKDIR}
@${ECHO_CMD} ${dir} | ${SED} ${PLIST_SUB_SANITIZED:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} -e 's,^,@dir ,' >> ${TMPPLIST}
. endfor
. for sp in ${_PKGS}
. if ${sp} != ${PKGBASE}
. for dir in ${PLIST_DIRS${_SP.${sp}}}
@${ECHO_CMD} ${dir} | ${SED} ${PLIST_SUB_SANITIZED:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} -e 's,^,@@${_SP.${sp}:S/^.//}@@@dir ,' >> ${TMPPLIST}
. endfor
. endif
. endfor
. endif
${TMPPLIST}:
@ -4725,20 +4848,20 @@ stage-qa:
pretty-flavors-package-names: .PHONY
. if empty(FLAVORS)
@${ECHO_CMD} "no flavor: ${PKGNAME}"
@${ECHO_CMD} "no flavor: ${_PKGS}"
. else
. for f in ${FLAVORS}
@${ECHO_CMD} -n "${f}: "
@cd ${.CURDIR} && ${SETENV} FLAVOR=${f} ${MAKE} -B -V PKGNAME
@cd ${.CURDIR} && ${SETENV} -i FLAVOR=${f} ${MAKE} -B -V _PKGS
. endfor
. endif
flavors-package-names: .PHONY
. if empty(FLAVORS)
@${ECHO_CMD} "${PKGNAME}"
@${ECHO_CMD} "${_PKGS}"
. else
. for f in ${FLAVORS}
@cd ${.CURDIR} && ${SETENV} FLAVOR=${f} ${MAKE} -B -V PKGNAME
@cd ${.CURDIR} && ${SETENV} -i FLAVOR=${f} ${MAKE} -B -V _PKGS | ${XARGS} -n 1
. endfor
. endif
@ -4749,19 +4872,22 @@ STAGE_ARGS= -i ${STAGEDIR}
STAGE_ARGS= -N
. endif
fake-pkg:
. if defined(INSTALLS_DEPENDS)
. if !defined(NO_PKG_REGISTER)
. for sp in ${_PKGS}
fake-pkg: fake-pkg.${sp}
fake-pkg.${sp}: ${_PLIST}.${sp}
. if defined(INSTALLS_DEPENDS)
. if !defined(NO_PKG_REGISTER)
@${ECHO_MSG} "===> Registering installation for ${PKGNAME} as automatic"
. endif
@${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_REGISTER} -d ${STAGE_ARGS} -m ${METADIR} -f ${TMPPLIST}
. else
. if !defined(NO_PKG_REGISTER)
. endif
@${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_REGISTER} -d ${STAGE_ARGS} -m ${METADIR}.${sp} -f ${_PLIST}.${sp}
. else
. if !defined(NO_PKG_REGISTER)
@${ECHO_MSG} "===> Registering installation for ${PKGNAME}"
. endif
@${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_REGISTER} ${STAGE_ARGS} -m ${METADIR}.${sp} -f ${_PLIST}.${sp}
. endif
@${SETENV} ${PKG_ENV} FORCE_POST="${_FORCE_POST_PATTERNS}" ${PKG_REGISTER} ${STAGE_ARGS} -m ${METADIR} -f ${TMPPLIST}
. endif
@${RM} -r ${METADIR}
@${RM} -r ${METADIR}.${sp}
. endfor
. endif
# Depend is generally meaningless for arbitrary ports, but if someone wants