pkgsrc-wip/mk/svn-package.mk

185 lines
5.6 KiB
Makefile

# $NetBSD$
#
# This file provides simple access to Subversion repositories, so that
# packages can be created from Subversion instead of from released
# tarballs. Whenever a package is fetched from Subversion, an archive
# is created from it and saved below ${DISTDIR}, to save bandwidth.
#
# User-settable variables:
#
# CHECKOUT_DATE (optional)
# Date to check out in ISO format (YYYY-MM-DD).
#
# When a package doesn't specify a SVN_REVISION, it is checked out from
# the HEAD revision, and the PKGREVISION is set based on the date.
# To keep this date stable during a bulk build (which may span
# one or more midnights), this can be set to a fixed date.
#
# Package-settable variables:
#
# SVN_REPO (required)
# The URL of the Subversion repository.
#
# Example: https://svn.code.sf.net/p/projectname/code/trunk
#
# SVN_EXTRACTDIR (optional)
# The directory where the repository is checked out, relative to
# ${WRKDIR}.
#
# Default:
# For SVN_EXTRACTDIR, the default value is derived from SVN_REPO
# (so for https://svn.example.org/repos/project/trunk, it becomes
# project).
#
# For SVN_EXTRACTDIR.${repo}, the default is ${repo}.
#
# SVN_REVISION (optional)
# The revision to check out.
#
# Example: 12345
#
# SVN_REPOSITORIES (optional)
# If the package needs multiple Subversion repositories, this
# is the list of repository IDs. For each of these repositories,
# parameterized variants of the above variables are defined.
#
# Example:
# SVN_REPOSITORIES= stable latest
# SVN_REPO.stable= https://svn.code.sf.net/p/project/code/tag/1.0.0
# SVN_REPO.latest= https://svn.code.sf.net/p/project/code/trunk
#
# Keywords: svn subversion
BUILD_DEPENDS+= subversion-base-[0-9]*:../../devel/subversion-base
# Defaults for package-settable variables
DISTFILES?= # empty
.if defined(CHECKOUT_DATE)
PKGREVISION?= ${CHECKOUT_DATE:S/-//g}
.else
PKGREVISION?= ${_SVN_PKGREVISION_CMD:sh}
.endif
# The common case of a single repository
.if defined(SVN_REPO)
SVN_EXTRACTDIR?= ${SVN_REPO:S,/$,,:S,/trunk$,,:S,/code$,,:T}
SVN_REPOSITORIES+= default
SVN_REPO.default= ${SVN_REPO}
SVN_EXTRACTDIR.default= ${SVN_EXTRACTDIR}
. for varbase in SVN_REVISION
. if defined(${varbase})
${varbase}.default= ${${varbase}}
. endif
. endfor
WRKSRC?= ${WRKDIR}/${SVN_EXTRACTDIR}
.endif
SVN_REPOSITORIES?= # none
.if empty(SVN_REPOSITORIES)
PKG_FAIL_REASON+= "[svn-package.mk] SVN_REPOSITORIES must be set."
.endif
.for repo in ${SVN_REPOSITORIES}
. if empty(SVN_REPO.${repo})
PKG_FAIL_REASON+= "[svn-package.mk] SVN_REPO."${repo:Q}" must be set."
. endif
. if defined(SVN_MODULE.${repo}) # To be removed after 2019-01-01
WARNINGS+= "[svn-package.mk] SVN_MODULE.* is obsolete; use SVN_EXTRACTDIR.${repo} instead."
SVN_EXTRACTDIR.${repo}?= ${SVN_MODULE.${repo}}
. endif
. if defined(SVN_ENV.${repo}) # To be removed after 2019-01-01
WARNINGS+= "[svn-package.mk] SVN_ENV.* is obsolete."
. endif
.endfor
USE_TOOLS+= date gzip pax
_SVN_CMD= ${PREFIX}/bin/svn
_SVN_CONFIG_DIR= ${WRKDIR}/.subversion
_SVN_CHECKOUT_FLAGS= --config-dir=${_SVN_CONFIG_DIR} --non-interactive
_SVN_PKGREVISION_CMD= ${DATE} -u +'%Y%m%d'
_SVN_DISTDIR= ${DISTDIR}/svn-packages
# Definition of repository-specific variables
.for repo in ${SVN_REPOSITORIES}
SVN_EXTRACTDIR.${repo}?= ${repo}
. if defined(CHECKOUT_DATE)
SVN_REVISION.${repo}?= {${CHECKOUT_DATE}T00:00:00Z}
. else
SVN_REVISION.${repo}?= HEAD
. endif
# The cached archive
_SVN_DISTFILE.${repo}= ${PKGBASE}-${repo}-svnarchive.tar.gz
# Define the shell variables used by the following commands
_SVN_CMD.vars.${repo}= \
repo=${SVN_REPO.${repo}:Q}; \
extractdir=${SVN_EXTRACTDIR.${repo}:Q}; \
archive=${_SVN_DISTDIR}/${_SVN_DISTFILE.${repo}:Q}; \
revision=${SVN_REVISION.${repo}:Q}
# Extract the cached archive
_SVN_CMD.extract_archive.${repo}= \
if [ -f "$$archive" ]; then \
${STEP_MSG} "Extracting cached Subversion archive $${archive\#\#*/}."; \
gzip -d -c "$$archive" | pax -r; \
fi
# Install client certificates for authentication
. if !empty(SVN_CERTS.${repo})
_SVN_CMD.install_certs.${repo}= \
${MKDIR} ${_SVN_CONFIG_DIR}/auth/svn.ssl.server; \
${CP} ${SVN_CERTS.${repo}} ${_SVN_CONFIG_DIR}/auth/svn.ssl.server
. else
_SVN_CMD.install_certs.${repo}= \
${DO_NADA}
. endif
# Check out the repository or update the cached one
_SVN_CMD.fetch_repo.${repo}= \
if [ ! -d "$$extractdir" ]; then \
${STEP_MSG} "Checking out revision $$revision from repository $$repo."; \
${_SVN_CMD} checkout -r "$$revision" ${SVN_CHECKOUT_FLAGS} \
"$$repo" "$$extractdir"; \
else \
${STEP_MSG} "Updating to revision $$revision."; \
${_SVN_CMD} update -r "$$revision" ${SVN_CHECKOUT_FLAGS} "$$extractdir"; \
fi
# Create the cached archive from the checked out repository
_SVN_CMD.create_archive.${repo}= \
${STEP_MSG} "Creating cached Subversion archive $${archive\#\#*/}."; \
${MKDIR} "$${archive%/*}"; \
pax -w "$$extractdir" | gzip > "$$archive.tmp"; \
${MV} "$$archive.tmp" "$$archive"
.endfor
pre-extract: do-svn-extract
do-svn-extract: .PHONY
.for repo in ${SVN_REPOSITORIES}
${RUN} \
cd ${WRKDIR}; \
${_SVN_CMD.vars.${repo}}; \
${_SVN_CMD.install_certs.${repo}}; \
${_SVN_CMD.extract_archive.${repo}}; \
${_SVN_CMD.fetch_repo.${repo}}; \
${_SVN_CMD.create_archive.${repo}}
.endfor
# Debug info for show-all and show-all-svn
_VARGROUPS+= svn
_USER_VARS.svn+= CHECKOUT_DATE
_PKG_VARS.svn+= SVN_REPO SVN_REVISION SVN_EXTRACTDIR SVN_REPOSITORIES
_SYS_VARS.svn+= DISTFILES PKGREVISION
_SYS_VARS.svn+= _SVN_DISTDIR
.for repo in ${SVN_REPOSITORIES}
. for varbase in SVN_REPO SVN_EXTRACTDIR SVN_REVISION SVN_CERTS
_PKG_VARS.svn+= ${varbase}.${repo}
. endfor
. for varbase in _SVN_DISTFILE
_SYS_VARS.svn+= ${varbase}.${repo}
. endfor
.endfor