From 24ac316ff58e2c1deca8dc329705b0810414c8db Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Date: Sat, 19 Dec 2020 16:35:18 +0100 Subject: [PATCH] package/pkg-golang.mk: implement Go vendoring support This commit introduces the download post-process script support/download/go-post-process, and hooks it into the Go package infrastructure. The -modcacherw flag is added to ensure that the Go cache is read/write, and can be deleted properly upon "make clean". The <pkg>_LICENSE variable of golang packages is expanded with ", vendored dependencies licenses probably not listed" as currently for all packages, the licenses of the vendored dependencies are not taken into account. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> --- package/pkg-golang.mk | 13 +++++++++++- support/download/go-post-process | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100755 support/download/go-post-process diff --git a/package/pkg-golang.mk b/package/pkg-golang.mk index d07242310d..35bcb1673b 100644 --- a/package/pkg-golang.mk +++ b/package/pkg-golang.mk @@ -42,12 +42,13 @@ define inner-golang-package $(2)_BUILD_OPTS += \ -ldflags "$$($(2)_LDFLAGS)" \ + -modcacherw \ -tags "$$($(2)_TAGS)" \ -trimpath \ -p $(PARALLEL_JOBS) # Target packages need the Go compiler on the host. -$(2)_DEPENDENCIES += host-go +$(2)_DOWNLOAD_DEPENDENCIES += host-go $(2)_BUILD_TARGETS ?= . @@ -81,6 +82,16 @@ define $(2)_GEN_GOMOD endef $(2)_POST_PATCH_HOOKS += $(2)_GEN_GOMOD +$(2)_DOWNLOAD_POST_PROCESS = go +$(2)_DL_ENV = \ + $(HOST_GO_COMMON_ENV) \ + GOPROXY=direct \ + BR_GOMOD=$$($(2)_GOMOD) + +# Due to vendoring, it is pretty likely that not all licenses are +# listed in <pkg>_LICENSE. +$(2)_LICENSE += , vendored dependencies licenses probably not listed + # Build step. Only define it if not already defined by the package .mk # file. ifndef $(2)_BUILD_CMDS diff --git a/support/download/go-post-process b/support/download/go-post-process new file mode 100755 index 0000000000..be202a4c0f --- /dev/null +++ b/support/download/go-post-process @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +. "${0%/*}/helpers" + +# Parse our options +while getopts "n:o:" OPT; do + case "${OPT}" in + o) output="${OPTARG}";; + n) base_name="${OPTARG}";; + :) error "option '%s' expects a mandatory argument\n" "${OPTARG}";; + \?) error "unknown option '%s'\n" "${OPTARG}";; + esac +done + +# Already vendored tarball, nothing to do +if tar tf "${output}" | grep -q "^[^/]*/vendor" ; then + exit 0 +fi + +post_process_unpack "${base_name}" "${output}" + +# Do the Go vendoring +pushd "${base_name}" > /dev/null + +if [ ! -f go.mod ]; then + echo "ERROR: no vendor/ folder and no go.mod, aborting" + exit 1 +fi + +go mod vendor -v -modcacherw +popd > /dev/null + +post_process_repack $(pwd) "${base_name}" "${output}"