Changeset View
Changeset View
Standalone View
Standalone View
Mk/Uses/go.mk
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
# | # | ||||
# This variable must not be set by individual ports! | # This variable must not be set by individual ports! | ||||
# | # | ||||
# MAINTAINER: ports@FreeBSD.org | # MAINTAINER: ports@FreeBSD.org | ||||
.if !defined(_INCLUDE_USES_GO_MK) | .if !defined(_INCLUDE_USES_GO_MK) | ||||
_INCLUDE_USES_GO_MK= yes | _INCLUDE_USES_GO_MK= yes | ||||
.if !empty(go_ARGS:Nmodules:Nno_targets:Nrun) | . if !empty(go_ARGS:Nmodules:Nno_targets:Nrun) | ||||
IGNORE= USES=go has invalid arguments: ${go_ARGS:Nmodules:Nno_targets:Nrun} | IGNORE= USES=go has invalid arguments: ${go_ARGS:Nmodules:Nno_targets:Nrun} | ||||
.endif | . endif | ||||
# Settable variables | # Settable variables | ||||
.if empty(GO_PKGNAME) | . if empty(GO_PKGNAME) | ||||
. if !empty(GH_SUBDIR) | . if !empty(GH_SUBDIR) | ||||
GO_PKGNAME= ${GH_SUBDIR:S|^src/||} | GO_PKGNAME= ${GH_SUBDIR:S|^src/||} | ||||
. elif !empty(GL_SUBDIR) | . elif !empty(GL_SUBDIR) | ||||
GO_PKGNAME= ${GL_SUBDIR:S|^src/||} | GO_PKGNAME= ${GL_SUBDIR:S|^src/||} | ||||
. else | . else | ||||
GO_PKGNAME= ${PORTNAME} | GO_PKGNAME= ${PORTNAME} | ||||
. endif | . endif | ||||
.endif | . endif | ||||
GO_TARGET?= ${GO_PKGNAME} | GO_TARGET?= ${GO_PKGNAME} | ||||
GO_TESTTARGET?= ./... | GO_TESTTARGET?= ./... | ||||
GO_BUILDFLAGS+= -v -buildmode=exe -trimpath | GO_BUILDFLAGS+= -v -buildmode=exe -trimpath | ||||
.if !defined(WITH_DEBUG) && empty(GO_BUILDFLAGS:M-ldflags*) | . if !defined(WITH_DEBUG) && empty(GO_BUILDFLAGS:M-ldflags*) | ||||
GO_BUILDFLAGS+= -ldflags=-s | GO_BUILDFLAGS+= -ldflags=-s | ||||
.endif | . endif | ||||
GO_TESTFLAGS+= -v | GO_TESTFLAGS+= -v | ||||
CGO_ENABLED?= 1 | CGO_ENABLED?= 1 | ||||
CGO_CFLAGS+= -I${LOCALBASE}/include | CGO_CFLAGS+= -I${LOCALBASE}/include | ||||
CGO_LDFLAGS+= -L${LOCALBASE}/lib | CGO_LDFLAGS+= -L${LOCALBASE}/lib | ||||
.if ${ARCH} == armv6 || ${ARCH} == armv7 | . if ${ARCH} == armv6 || ${ARCH} == armv7 | ||||
GOARM?= ${ARCH:C/armv//} | GOARM?= ${ARCH:C/armv//} | ||||
.endif | . endif | ||||
GO_GOPROXY?= https://proxy.golang.org | GO_GOPROXY?= https://proxy.golang.org | ||||
GO_GOSUMDB?= sum.golang.org | GO_GOSUMDB?= sum.golang.org | ||||
# Read-only variables | # Read-only variables | ||||
GO_CMD= ${LOCALBASE}/bin/go | GO_CMD= ${LOCALBASE}/bin/go | ||||
GO_WRKDIR_BIN= ${WRKDIR}/bin | GO_WRKDIR_BIN= ${WRKDIR}/bin | ||||
GO_ENV+= CGO_ENABLED=${CGO_ENABLED} \ | GO_ENV+= CGO_ENABLED=${CGO_ENABLED} \ | ||||
CGO_CFLAGS="${CGO_CFLAGS}" \ | CGO_CFLAGS="${CGO_CFLAGS}" \ | ||||
CGO_LDFLAGS="${CGO_LDFLAGS}" \ | CGO_LDFLAGS="${CGO_LDFLAGS}" \ | ||||
GOARM=${GOARM} | GOARM=${GOARM} | ||||
.if ${go_ARGS:Mmodules} | . if ${go_ARGS:Mmodules} | ||||
GO_BUILDFLAGS+= -mod=vendor | GO_BUILDFLAGS+= -mod=vendor | ||||
GO_TESTFLAGS+= -mod=vendor | GO_TESTFLAGS+= -mod=vendor | ||||
GO_GOPATH= ${DISTDIR}/go/${PKGORIGIN:S,/,_,g} | GO_GOPATH= ${DISTDIR}/go/${PKGORIGIN:S,/,_,g} | ||||
GO_WRKSRC= ${WRKSRC} | GO_WRKSRC= ${WRKSRC} | ||||
GO_ENV+= GOPATH="${GO_GOPATH}" \ | GO_ENV+= GOPATH="${GO_GOPATH}" \ | ||||
GOBIN="${GO_WRKDIR_BIN}" \ | GOBIN="${GO_WRKDIR_BIN}" \ | ||||
GO111MODULE=on \ | GO111MODULE=on \ | ||||
GOFLAGS=-modcacherw \ | GOFLAGS=-modcacherw \ | ||||
GOSUMDB=${GO_GOSUMDB} | GOSUMDB=${GO_GOSUMDB} | ||||
. if defined(GO_MODULE) | . if defined(GO_MODULE) | ||||
GO_MODNAME= ${GO_MODULE:C/^([^@]*)(@([^@]*)?)/\1/} | GO_MODNAME= ${GO_MODULE:C/^([^@]*)(@([^@]*)?)/\1/} | ||||
GO_MODVERSION= ${GO_MODULE:C/^([^@]*)(@([^@]*)?)/\2/:M@*:S/^@//:S/^$/${DISTVERSIONFULL}/} | GO_MODVERSION= ${GO_MODULE:C/^([^@]*)(@([^@]*)?)/\2/:M@*:S/^@//:S/^$/${DISTVERSIONFULL}/} | ||||
GO_MODFILE= ${GO_MODVERSION}.mod | GO_MODFILE= ${GO_MODVERSION}.mod | ||||
GO_DISTFILE= ${GO_MODVERSION}.zip | GO_DISTFILE= ${GO_MODVERSION}.zip | ||||
DIST_SUBDIR= go/${PKGORIGIN:S,/,_,g}/${DISTNAME} | DIST_SUBDIR= go/${PKGORIGIN:S,/,_,g}/${DISTNAME} | ||||
MASTER_SITES+= ${GO_GOPROXY}/${GO_MODNAME:C/([A-Z])/!\1/g:tl}/@v/ | MASTER_SITES+= ${GO_GOPROXY}/${GO_MODNAME:C/([A-Z])/!\1/g:tl}/@v/ | ||||
DISTFILES+= ${GO_MODFILE} ${GO_DISTFILE} | DISTFILES+= ${GO_MODFILE} ${GO_DISTFILE} | ||||
EXTRACT_ONLY+= ${GO_DISTFILE} | EXTRACT_ONLY+= ${GO_DISTFILE} | ||||
WRKSRC= ${WRKDIR}/${GO_MODNAME}@${GO_MODVERSION} | WRKSRC= ${WRKDIR}/${GO_MODNAME}@${GO_MODVERSION} | ||||
FETCH_DEPENDS+= ${GO_CMD}:${GO_PORT} \ | FETCH_DEPENDS+= ${GO_CMD}:${GO_PORT} \ | ||||
ca_root_nss>0:security/ca_root_nss | ca_root_nss>0:security/ca_root_nss | ||||
USES+= zip | USES+= zip | ||||
. else | . else | ||||
GO_ENV+= GO_NO_VENDOR_CHECKS=1 | GO_ENV+= GO_NO_VENDOR_CHECKS=1 | ||||
. endif | . endif | ||||
.else | . else | ||||
GO_GOPATH= ${WRKDIR} | GO_GOPATH= ${WRKDIR} | ||||
GO_WRKSRC= ${WRKDIR}/src/${GO_PKGNAME} | GO_WRKSRC= ${WRKDIR}/src/${GO_PKGNAME} | ||||
GO_ENV+= GOPATH="${GO_GOPATH}" \ | GO_ENV+= GOPATH="${GO_GOPATH}" \ | ||||
GOBIN="" \ | GOBIN="" \ | ||||
GO111MODULE=off | GO111MODULE=off | ||||
.endif | . endif | ||||
GO_PORT?= lang/go | GO_PORT?= lang/go | ||||
BUILD_DEPENDS+= ${GO_CMD}:${GO_PORT} | BUILD_DEPENDS+= ${GO_CMD}:${GO_PORT} | ||||
.if ${go_ARGS:Mrun} | . if ${go_ARGS:Mrun} | ||||
RUN_DEPENDS+= ${GO_CMD}:${GO_PORT} | RUN_DEPENDS+= ${GO_CMD}:${GO_PORT} | ||||
.endif | . endif | ||||
_USES_POST+= go | _USES_POST+= go | ||||
.endif # !defined(_INCLUDE_USES_GO_MK) | .endif # !defined(_INCLUDE_USES_GO_MK) | ||||
.if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_GO_POST_MK) | .if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_GO_POST_MK) | ||||
_INCLUDE_USES_GO_POST_MK= yes | _INCLUDE_USES_GO_POST_MK= yes | ||||
.if !target(post-fetch) && ${go_ARGS:Mmodules} && defined(GO_MODULE) | . if !target(post-fetch) && ${go_ARGS:Mmodules} && defined(GO_MODULE) | ||||
post-fetch: | post-fetch: | ||||
@${ECHO_MSG} "===> Fetching ${GO_MODNAME} dependencies"; | @${ECHO_MSG} "===> Fetching ${GO_MODNAME} dependencies"; | ||||
@(cd ${DISTDIR}/${DIST_SUBDIR}; \ | @(cd ${DISTDIR}/${DIST_SUBDIR}; \ | ||||
[ -e go.mod ] || ${RLN} ${GO_MODFILE} go.mod; \ | [ -e go.mod ] || ${RLN} ${GO_MODFILE} go.mod; \ | ||||
${SETENV} ${GO_ENV} GOPROXY=${GO_GOPROXY} ${GO_CMD} mod download -x) | ${SETENV} ${GO_ENV} GOPROXY=${GO_GOPROXY} ${GO_CMD} mod download -x) | ||||
.endif | . endif | ||||
.if !target(post-extract) | . if !target(post-extract) | ||||
. if empty(go_ARGS) | . if empty(go_ARGS) | ||||
post-extract: | post-extract: | ||||
@${MKDIR} ${GO_WRKSRC:H} | @${MKDIR} ${GO_WRKSRC:H} | ||||
@${LN} -sf ${WRKSRC} ${GO_WRKSRC} | @${LN} -sf ${WRKSRC} ${GO_WRKSRC} | ||||
. elif ${go_ARGS:Mmodules} && defined(GO_MODULE) | . elif ${go_ARGS:Mmodules} && defined(GO_MODULE) | ||||
post-extract: | post-extract: | ||||
@(cd ${GO_WRKSRC}; ${SETENV} ${GO_ENV} GOPROXY=off ${GO_CMD} mod vendor) | @(cd ${GO_WRKSRC}; ${SETENV} ${GO_ENV} GOPROXY=off ${GO_CMD} mod vendor) | ||||
. endif | . endif | ||||
.endif | . endif | ||||
.if !target(do-build) && empty(go_ARGS:Mno_targets) | . if !target(do-build) && empty(go_ARGS:Mno_targets) | ||||
do-build: | do-build: | ||||
(cd ${GO_WRKSRC}; \ | (cd ${GO_WRKSRC}; \ | ||||
for t in ${GO_TARGET}; do \ | for t in ${GO_TARGET}; do \ | ||||
out=$$(${BASENAME} $$(${ECHO_CMD} $${t} | \ | out=$$(${BASENAME} $$(${ECHO_CMD} $${t} | \ | ||||
${SED} -Ee 's/^[^:]*:([^:]+).*$$/\1/' -e 's/^\.$$/${PORTNAME}/')); \ | ${SED} -Ee 's/^[^:]*:([^:]+).*$$/\1/' -e 's/^\.$$/${PORTNAME}/')); \ | ||||
pkg=$$(${ECHO_CMD} $${t} | \ | pkg=$$(${ECHO_CMD} $${t} | \ | ||||
${SED} -Ee 's/^([^:]*).*$$/\1/' -e 's/^${PORTNAME}$$/./'); \ | ${SED} -Ee 's/^([^:]*).*$$/\1/' -e 's/^${PORTNAME}$$/./'); \ | ||||
${ECHO_MSG} "===> Building $${out} from $${pkg}"; \ | ${ECHO_MSG} "===> Building $${out} from $${pkg}"; \ | ||||
${SETENV} ${MAKE_ENV} ${GO_ENV} GOPROXY=off ${GO_CMD} build ${GO_BUILDFLAGS} \ | ${SETENV} ${MAKE_ENV} ${GO_ENV} GOPROXY=off ${GO_CMD} build ${GO_BUILDFLAGS} \ | ||||
-o ${GO_WRKDIR_BIN}/$${out} \ | -o ${GO_WRKDIR_BIN}/$${out} \ | ||||
$${pkg}; \ | $${pkg}; \ | ||||
done) | done) | ||||
.endif | . endif | ||||
.if !target(do-install) && empty(go_ARGS:Mno_targets) | . if !target(do-install) && empty(go_ARGS:Mno_targets) | ||||
do-install: | do-install: | ||||
for t in ${GO_TARGET}; do \ | for t in ${GO_TARGET}; do \ | ||||
dst=$$(${ECHO_CMD} $${t} | \ | dst=$$(${ECHO_CMD} $${t} | \ | ||||
${SED} -Ee 's/^[^:]*:([^:]+).*$$/\1/' -e 's/^\.$$/${PORTNAME}/'); \ | ${SED} -Ee 's/^[^:]*:([^:]+).*$$/\1/' -e 's/^\.$$/${PORTNAME}/'); \ | ||||
src=$$(${BASENAME} $${dst}); \ | src=$$(${BASENAME} $${dst}); \ | ||||
case $${dst} in \ | case $${dst} in \ | ||||
/*) dst=${STAGEDIR}$${dst}; ${MKDIR} $$(${DIRNAME} $${dst}) ;; \ | /*) dst=${STAGEDIR}$${dst}; ${MKDIR} $$(${DIRNAME} $${dst}) ;; \ | ||||
*) dst=${STAGEDIR}${PREFIX}/bin/$${src} ;; \ | *) dst=${STAGEDIR}${PREFIX}/bin/$${src} ;; \ | ||||
esac; \ | esac; \ | ||||
${ECHO_MSG} "===> Installing $${src} as $${dst}"; \ | ${ECHO_MSG} "===> Installing $${src} as $${dst}"; \ | ||||
${INSTALL_PROGRAM} ${GO_WRKDIR_BIN}/$${src} $${dst}; \ | ${INSTALL_PROGRAM} ${GO_WRKDIR_BIN}/$${src} $${dst}; \ | ||||
done | done | ||||
.endif | . endif | ||||
.if !target(do-test) && empty(go_ARGS:Mno_targets) | . if !target(do-test) && empty(go_ARGS:Mno_targets) | ||||
do-test: | do-test: | ||||
(cd ${GO_WRKSRC}; \ | (cd ${GO_WRKSRC}; \ | ||||
for t in ${GO_TESTTARGET}; do \ | for t in ${GO_TESTTARGET}; do \ | ||||
${ECHO_MSG} "===> Testing $${t}"; \ | ${ECHO_MSG} "===> Testing $${t}"; \ | ||||
${SETENV} ${MAKE_ENV} ${GO_ENV} GOPROXY=off ${GO_CMD} test ${GO_TESTFLAGS} $${t}; \ | ${SETENV} ${MAKE_ENV} ${GO_ENV} GOPROXY=off ${GO_CMD} test ${GO_TESTFLAGS} $${t}; \ | ||||
done) | done) | ||||
.endif | . endif | ||||
.if ${go_ARGS:Mmodules} && defined(GO_MODULE) | . if ${go_ARGS:Mmodules} && defined(GO_MODULE) | ||||
gomod-clean: | gomod-clean: | ||||
.if exists(${GO_CMD}) | . if exists(${GO_CMD}) | ||||
@${ECHO_MSG} "===> Cleaning Go module cache" | @${ECHO_MSG} "===> Cleaning Go module cache" | ||||
@${SETENV} ${GO_ENV} ${GO_CMD} clean -modcache | @${SETENV} ${GO_ENV} ${GO_CMD} clean -modcache | ||||
.else | . else | ||||
@${ECHO_MSG} "===> Skipping since ${GO_CMD} is not installed" | @${ECHO_MSG} "===> Skipping since ${GO_CMD} is not installed" | ||||
.endif | . endif | ||||
# Hook up to distclean | # Hook up to distclean | ||||
.if !target(post-clean) && !make(clean) | . if !target(post-clean) && !make(clean) | ||||
post-clean: gomod-clean | post-clean: gomod-clean | ||||
@${RM} -r ${GO_GOPATH} | @${RM} -r ${GO_GOPATH} | ||||
.endif | . endif | ||||
.endif | . endif | ||||
# Helper targets for port maintainers | # Helper targets for port maintainers | ||||
.if ${go_ARGS:Mmodules} && !defined(GO_MODULE) | . if ${go_ARGS:Mmodules} && !defined(GO_MODULE) | ||||
_MODULES2TUPLE_CMD= modules2tuple | _MODULES2TUPLE_CMD= modules2tuple | ||||
gomod-vendor-deps: | gomod-vendor-deps: | ||||
@if ! type ${GO_CMD} > /dev/null 2>&1; then \ | @if ! type ${GO_CMD} > /dev/null 2>&1; then \ | ||||
${ECHO_MSG} "===> Please install \"${GO_PORT}\""; exit 1; \ | ${ECHO_MSG} "===> Please install \"${GO_PORT}\""; exit 1; \ | ||||
fi; \ | fi; \ | ||||
if ! type ${_MODULES2TUPLE_CMD} > /dev/null 2>&1; then \ | if ! type ${_MODULES2TUPLE_CMD} > /dev/null 2>&1; then \ | ||||
${ECHO_MSG} "===> Please install \"ports-mgmt/modules2tuple\""; exit 1; \ | ${ECHO_MSG} "===> Please install \"ports-mgmt/modules2tuple\""; exit 1; \ | ||||
fi | fi | ||||
gomod-vendor: gomod-vendor-deps patch | gomod-vendor: gomod-vendor-deps patch | ||||
@cd ${WRKSRC}; ${SETENV} ${GO_ENV} ${GO_CMD} mod vendor; \ | @cd ${WRKSRC}; ${SETENV} ${GO_ENV} ${GO_CMD} mod vendor; \ | ||||
[ -r vendor/modules.txt ] && ${_MODULES2TUPLE_CMD} vendor/modules.txt | [ -r vendor/modules.txt ] && ${_MODULES2TUPLE_CMD} vendor/modules.txt | ||||
gomod-vendor-diff: gomod-vendor-deps patch | gomod-vendor-diff: gomod-vendor-deps patch | ||||
@cd ${WRKSRC}; ${SETENV} ${GO_ENV} ${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 && \ | [ -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 && \ | 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 | ${DIFF} ${WRKDIR}/GH_TUPLE-old.txt ${WRKDIR}/GH_TUPLE-new.txt || exit 0 | ||||
.endif | . endif | ||||
.endif # defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_GO_POST_MK) | .endif # defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_GO_POST_MK) |