summaryrefslogtreecommitdiff
path: root/Mk/Uses
diff options
context:
space:
mode:
authorDmitri Goutnik <dmgk@FreeBSD.org>2021-02-19 13:12:11 +0000
committerDmitri Goutnik <dmgk@FreeBSD.org>2021-02-19 13:12:11 +0000
commitced9d0ec74bf7bac0054c1c6298aae01eca987bb (patch)
treea21be22da28c8ab20813e77505c137e81341a11a /Mk/Uses
parentupdate check_ssl_cert to 1.137.0 (diff)
Mk/Uses/go.mk: Add support for using Go for dependency management
Add support for offloading dependency management to Go using `go mod download`. Reviewed by: swills Differential Revision: https://reviews.freebsd.org/D28184
Notes
Notes: svn path=/head/; revision=566063
Diffstat (limited to 'Mk/Uses')
-rw-r--r--Mk/Uses/go.mk69
1 files changed, 60 insertions, 9 deletions
diff --git a/Mk/Uses/go.mk b/Mk/Uses/go.mk
index 07a6743054b6..99f26afcd42b 100644
--- a/Mk/Uses/go.mk
+++ b/Mk/Uses/go.mk
@@ -19,6 +19,11 @@
#
# You can set the following variables to control the process.
#
+# GO_MODULE
+# The name of the module as specified by "module" directive in go.mod.
+# In most cases, this is the only requred variable for ports that
+# use Go modules.
+#
# GO_PKGNAME
# The name of the package when building in GOPATH mode. This
# is the directory that will be created in ${GOPATH}/src. If not set
@@ -93,6 +98,9 @@ CGO_LDFLAGS+= -L${LOCALBASE}/lib
GOARM?= ${ARCH:C/armv//}
.endif
+GO_GOPROXY?= https://proxy.golang.org
+GO_GOSUMDB?= sum.golang.org
+
# Read-only variables
GO_CMD= ${LOCALBASE}/bin/go
@@ -105,15 +113,33 @@ GO_ENV+= CGO_ENABLED=${CGO_ENABLED} \
.if ${go_ARGS:Mmodules}
GO_BUILDFLAGS+= -mod=vendor
GO_TESTFLAGS+= -mod=vendor
+GO_GOPATH= ${DISTDIR}/go/${PKGORIGIN:S,/,_,g}
GO_WRKSRC= ${WRKSRC}
-GO_ENV+= GOPATH="" \
+GO_ENV+= GOPATH="${GO_GOPATH}" \
GOBIN="${GO_WRKDIR_BIN}" \
GO111MODULE=on \
- GOPROXY=off \
- GO_NO_VENDOR_CHECKS=1
+ GOFLAGS=-modcacherw \
+ GOSUMDB=${GO_GOSUMDB}
+. if defined(GO_MODULE)
+GO_MODNAME= ${GO_MODULE:C/^([^@]*)(@([^@]*)?)/\1/}
+GO_MODVERSION= ${GO_MODULE:C/^([^@]*)(@([^@]*)?)/\2/:M@*:S/^@//:S/^$/${DISTVERSIONFULL}/}
+GO_MODFILE= ${GO_MODVERSION}.mod
+GO_DISTFILE= ${GO_MODVERSION}.zip
+DIST_SUBDIR= go/${PKGORIGIN:S,/,_,g}/${DISTNAME}
+MASTER_SITES= ${GO_GOPROXY}/${GO_MODNAME}/@v/
+DISTFILES= ${GO_MODFILE} ${GO_DISTFILE}
+EXTRACT_ONLY= ${GO_DISTFILE}
+WRKSRC= ${WRKDIR}/${GO_MODNAME}@${GO_MODVERSION}
+FETCH_DEPENDS+= ${GO_CMD}:${GO_PORT} \
+ ca_root_nss>0:security/ca_root_nss
+USES+= zip
+. else
+GO_ENV+= GO_NO_VENDOR_CHECKS=1
+. endif
.else
+GO_GOPATH= ${WRKDIR}
GO_WRKSRC= ${WRKDIR}/src/${GO_PKGNAME}
-GO_ENV+= GOPATH="${WRKDIR}" \
+GO_ENV+= GOPATH="${GO_GOPATH}" \
GOBIN="" \
GO111MODULE=off
.endif
@@ -131,10 +157,23 @@ _USES_POST+= go
.if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_GO_POST_MK)
_INCLUDE_USES_GO_POST_MK= yes
-.if !target(post-extract) && empty(go_ARGS)
+.if !target(post-fetch) && ${go_ARGS:Mmodules} && defined(GO_MODULE)
+post-fetch:
+ @${ECHO_MSG} "===> Fetching ${GO_MODNAME} dependencies";
+ @(cd ${DISTDIR}/${DIST_SUBDIR}; \
+ ${RLN} ${GO_MODFILE} go.mod; \
+ ${SETENV} ${GO_ENV} ${GO_CMD} mod download -x)
+.endif
+
+.if !target(post-extract)
+. if empty(go_ARGS)
post-extract:
@${MKDIR} ${GO_WRKSRC:H}
@${LN} -sf ${WRKSRC} ${GO_WRKSRC}
+. elif ${go_ARGS:Mmodules} && defined(GO_MODULE)
+post-extract:
+ @(cd ${GO_WRKSRC}; ${SETENV} ${GO_ENV} ${GO_CMD} mod vendor)
+. endif
.endif
.if !target(do-build) && empty(go_ARGS:Mno_targets)
@@ -146,7 +185,7 @@ do-build:
pkg=$$(${ECHO_CMD} $${t} | \
${SED} -Ee 's/^([^:]*).*$$/\1/' -e 's/^${PORTNAME}$$/./'); \
${ECHO_MSG} "===> Building $${out} from $${pkg}"; \
- ${SETENV} ${MAKE_ENV} ${GO_ENV} ${GO_CMD} build ${GO_BUILDFLAGS} \
+ ${SETENV} ${MAKE_ENV} ${GO_ENV} GOPROXY=off ${GO_CMD} build ${GO_BUILDFLAGS} \
-o ${GO_WRKDIR_BIN}/$${out} \
$${pkg}; \
done)
@@ -176,9 +215,21 @@ do-test:
done)
.endif
+.if ${go_ARGS:Mmodules} && defined(GO_MODULE)
+gomod-clean:
+ @${ECHO_MSG} "===> Cleaning Go module cache"
+ @${SETENV} ${GO_ENV} ${GO_CMD} clean -modcache
+
+# Hook up to distclean
+.if !target(post-clean) && !make(clean)
+post-clean: gomod-clean
+ @${RM} -r ${GO_GOPATH}
+.endif
+.endif
+
# Helper targets for port maintainers
-.if ${go_ARGS:Mmodules}
+.if ${go_ARGS:Mmodules} && !defined(GO_MODULE)
_MODULES2TUPLE_CMD= modules2tuple
gomod-vendor-deps:
@if ! type ${GO_CMD} > /dev/null 2>&1; then \
@@ -189,11 +240,11 @@ gomod-vendor-deps:
fi
gomod-vendor: gomod-vendor-deps patch
- @cd ${WRKSRC}; ${SETENV} GOPATH=${WRKDIR}/.gopath GOFLAGS=-modcacherw ${GO_CMD} mod vendor; \
+ @cd ${WRKSRC}; ${SETENV} ${GO_ENV} ${GO_CMD} mod vendor; \
[ -r vendor/modules.txt ] && ${_MODULES2TUPLE_CMD} vendor/modules.txt
gomod-vendor-diff: gomod-vendor-deps patch
- @cd ${WRKSRC}; ${SETENV} GOPATH=${WRKDIR}/.gopath GOFLAGS=-modcacherw ${GO_CMD} mod vendor; \
+ @cd ${WRKSRC}; ${SETENV} ${GO_ENV} ${GO_CMD} mod vendor; \
[ -r vendor/modules.txt ] && ${_MODULES2TUPLE_CMD} vendor/modules.txt | ${SED} 's|GH_TUPLE=| |; s| \\$$||' | ${GREP} -v ' \\' > ${WRKDIR}/GH_TUPLE-new.txt && \
echo ${GH_TUPLE} | ${TR} -s " " "\n" | ${SED} "s|^| |" > ${WRKDIR}/GH_TUPLE-old.txt && \
${DIFF} ${WRKDIR}/GH_TUPLE-old.txt ${WRKDIR}/GH_TUPLE-new.txt || exit 0