pkgsrc/lang/go/go-dep.mk

140 lines
5 KiB
Makefile

# $NetBSD: go-dep.mk,v 1.2 2019/09/10 20:01:06 rillig Exp $
#
# This file implements dep (https://github.com/golang/dep) support in pkgsrc.
#
# === Package-settable variables ===
#
# GO_DEPS
# This is a list of dependencies of the format url:sha[:dir]. These
# dependencies can be generated using the print-go-deps helper target
# against an extracted WRKSRC, which parses the Godeps file contained in
# the source that would normally be used by dep.
#
# Currently only GitHub URLs are supported, so if a Godeps dependency
# uses a different URL, the equivalent GitHub URL needs to be calculated
# and the original URL added as the optional :dir argument. This file
# contains a list of GODEP_REDIRECTS which translates common redirects,
# and additions to this list are encouraged.
#
# The print-go-deps target will reduce SHA strings to the first 8
# characters to avoid long lines, but the extracted archive will use the
# full SHA.
#
# Examples:
# github.com/golang/protobuf:92554152
# github.com/collectd/go-collectd:2ce14454:collectd.org
# github.com/uber-go/atomic:8474b86a:go.uber.org/atomic
# github.com/golang/time:26559e0f:golang.org/x/time
#
# GODEP_REDIRECTS
# Maps a URL or subset of a URL to its GitHub equivalent. URLs that are
# likely to be used across multiple packages should be added to this
# file, otherwise add them to the individual package Makefile.
#
# Examples:
# collectd.org=github.com/collectd/go-collectd
# golang.org/x=github.com/golang
#
# Keywords: go golang deps go-deps print-go-deps
_VARGROUPS+= godeps
_PKG_VARS.godeps= GO_DEPS GODEP_REDIRECTS
_USE_VARS.godeps= PKGNAME_NOREV \
MASTER_SITE_GITHUB DEFAULT_DISTFILES \
WRKDIR BUILDLINK_DIR DESTDIR PREFIX \
TEST_ENV
_DEF_VARS.godeps= DISTFILES DIST_SUBDIR MAKE_ENV \
${GO_DEPS:@dep@ \
${:U GODEP_URL GODEP_SHA GODEP_DIR GODEP_TGZ \
:@var@${var}.${dep} @} \
SITES.${GODEP_TGZ.${dep}} @} \
PRINT_PLIST_AWK
_IGN_VARS.godeps= _GODEP_AWK _GO_DIST_BASE
_LISTED_VARS.godeps= GO_DEPS GODEP_REDIRECTS DISTFILES *_ENV
#
# When using GO_DEPS a lot of additional distfiles will be added with just SHAs
# for their filename. Setting DIST_SUBDIR is required to keep things sensible.
#
DIST_SUBDIR= ${PKGNAME_NOREV}
#
# For now fetching via GitHub is mandatory.
#
DISTFILES?= ${DEFAULT_DISTFILES}
.for dep in ${GO_DEPS}
GODEP_URL.${dep}:= ${dep:C/:/ /g:[1]}
GODEP_SHA.${dep}:= ${dep:C/:/ /g:[2]}
GODEP_DIR.${dep}:= ${dep:C/:/ /g:[3]}
. if empty(GODEP_DIR.${dep})
GODEP_DIR.${dep}:= ${GODEP_URL.${dep}}
. endif
GODEP_TGZ.${dep}:= ${GODEP_SHA.${dep}}.tar.gz
SITES.${GODEP_TGZ.${dep}}:= ${MASTER_SITE_GITHUB}${GODEP_URL.${dep}:S,github.com/,,}/archive/
DISTFILES+= ${GODEP_TGZ.${dep}}
.PHONY: post-extract-${GODEP_URL.${dep}}
post-extract: post-extract-${GODEP_URL.${dep}}
post-extract-${GODEP_URL.${dep}}:
# We can't use :H here as the GODEP_DIR might just be a host.name
@${MKDIR} `${DIRNAME} ${WRKDIR}/src/${GODEP_DIR.${dep}}`
# The * glob is used as we shorten the SHA to 8 characters to keep
# GO_DEPS lines a reasonable length, but the extracted distfile uses
# the full SHA.
@${MV} ${WRKDIR}/${GODEP_URL.${dep}:T}-${GODEP_SHA.${dep}}* \
${WRKDIR}/src/${GODEP_DIR.${dep}}
.endfor
#
# Non-GitHub sites which are listed in Godeps files but redirect to GitHub. We
# fetch them from GitHub but move the source to the expected directory name.
#
GODEP_REDIRECTS+= collectd.org=github.com/collectd/go-collectd
GODEP_REDIRECTS+= go.uber.org=github.com/uber-go
GODEP_REDIRECTS+= go4.org=github.com/go4org/go4
GODEP_REDIRECTS+= golang.org/x=github.com/golang
GODEP_REDIRECTS+= google.golang.org/appengine=github.com/golang/appengine
GODEP_REDIRECTS+= google.golang.org/genproto=github.com/google/go-genproto
GODEP_REDIRECTS+= google.golang.org/grpc=github.com/grpc/grpc-go
GODEP_REDIRECTS+= gopkg.in/DATA-DOG/go-sqlmock.v1=github.com/DATA-DOG/go-sqlmock
GODEP_REDIRECTS+= gopkg.in/check.v1=github.com/go-check/check
GODEP_REDIRECTS+= gopkg.in/mgo.v2=github.com/go-mgo/mgo
GODEP_REDIRECTS+= gopkg.in/tomb.v2=github.com/go-tomb/tomb
GODEP_REDIRECTS+= gopkg.in/yaml.v2=github.com/go-yaml/yaml
GODEP_REDIRECTS+= honnef.co/go/tools=github.com/dominikh/go-tools
.for url in ${GODEP_REDIRECTS}
_GODEP_FROM.${url}:= ${url:C/=/ /g:[1]}
_GODEP_TO.${url}:= ${url:C/=/ /g:[2]}
.endfor
#
# Add a print-go-deps target to aid GO_DEPS generation. This depends on the
# current format of the Gopkg.lock file which may change.
#
_GODEP_AWK+= BEGIN { name=""; rev=""; dir=""; }
_GODEP_AWK+= $$1 == "name" { \
gsub(/\"/, "", $$NF); \
${GODEP_REDIRECTS:@url@ \
if (match($$NF, "^${_GODEP_FROM.${url}}")) { \
dir=$$NF; \
gsub("^${_GODEP_FROM.${url}}", \
"${_GODEP_TO.${url}}", $$NF); \
}@} \
name = $$NF; \
}
_GODEP_AWK+= $$1 == "revision" { \
gsub(/\"/, "", $$NF); \
rev = substr($$NF, 1, 8); \
}
_GODEP_AWK+= name && rev { \
printf("GO_DEPS+=\t%s:%s%s\n", \
name, rev, \
(dir) ? ":" dir : ""); \
name=""; rev=""; dir=""; \
}
.PHONY: print-go-deps
print-go-deps:
${RUN} ${AWK} ${_GODEP_AWK:Q} ${WRKSRC}/Gopkg.lock