Am 11.02.2025 um 23:59 schrieb Bruce Ashfield:
In message: [OE-core] [RFC PATCH 18/30] classes: add vendor class for go
on 11/02/2025 Stefan Herbrechtsmeier via lists.openembedded.org wrote:

From: Stefan Herbrechtsmeier<stefan.herbrechtsme...@weidmueller.com>

Add a vendor class for go to resolve the dependency SRC_URIs from a
go.sum file and run populate the go mod vendor folder.

Signed-off-by: Stefan Herbrechtsmeier<stefan.herbrechtsme...@weidmueller.com>
---

  meta/classes-recipe/vendor_go.bbclass | 59 +++++++++++++++++++++++++++
  1 file changed, 59 insertions(+)
  create mode 100644 meta/classes-recipe/vendor_go.bbclass

diff --git a/meta/classes-recipe/vendor_go.bbclass 
b/meta/classes-recipe/vendor_go.bbclass
new file mode 100644
index 0000000000..dc5f8d1d8d
--- /dev/null
+++ b/meta/classes-recipe/vendor_go.bbclass
@@ -0,0 +1,59 @@
+# Copyright (C) 2025 Weidmueller Interface GmbH & Co. KG
+# Stefan Herbrechtsmeier<stefan.herbrechtsme...@weidmueller.com>
+#
+# SPDX-License-Identifier: MIT
+#
+
+# The directory of the go.mod file relative to the root directory, per default
+# assume there's a file directly in the root directory
+GO_SRC_DIR ?= ""
+
+# The path to the go.mod file
+GO_MANIFEST_DIR ?= "${GO_SRC_PATH}/go.mod"
+
+# The path to go.sum file
+GO_LOCK_DIR ?="${@os.path.join(os.path.dirname(d.getVar('GO_MANIFEST_DIR')), 'go.sum')}"
+
+# The URL of the go proxy
+GO_PROXY ?="https://proxy.golang.org";
+
+GO_SRC_PATH = "${S}/${GO_SRC_DIR}"
+GO_SRC_SUBDIR ="${@os.path.relpath(d.getVar('CARGO_SRC_PATH'), 
d.getVar('WORKDIR'))}"
+GO_SRC_URI_FILE = "${VENDOR_DIR}/go-source-uris.txt"
+SRC_URI_FILES:append = " ${GO_SRC_URI_FILE}"
+
+inherit go-mod vendor
+
+GO_INSTALL_PREFIX = "."
+GO_SRC_PATH = "${S}"
+GO_SRCURI_DESTSUFFIX = ""
+
+GOMODCACHE = "invalid"
+GO_MOD_CACHE_DIR = "go/pkg/mod"
+GO_WORKPATH = "${GO_SRC_PATH}"
+GO_MOD_RECRDEPTASK = ""
+
+GOBUILDFLAGS:append = " -mod=vendor"
+
+python vendor_go_do_vendor_resolve() {
+    import oe.vendor
+    import oe.vendor.go
+
+    lock_file_dir = d.getVar("GO_LOCK_DIR")
+    lock_file_subdir = get_early_source_dir(d, lock_file_dir)
+    proxy = d.getVar("GO_PROXY")
+    cache_subdir = d.getVar("GO_MOD_CACHE_DIR")
+    src_uris = oe.vendor.go.resolve_src_uris(lock_file_subdir, proxy, 
cache_subdir)
+    with open(d.getVar("GO_SRC_URI_FILE"), "w") as f:
+        oe.vendor.dump(f, src_uris)
+}
+
+run_go_mod_vendor() {
+    cd ${GO_SRC_PATH}
+    export GOMODCACHE="${UNPACKDIR}/${GO_MOD_CACHE_DIR}"
+    ${GO} mod vendor
What happens if a module isn't in the unpackdir ? I assume it goes
to the go infrastructure and fetches the module ? Or is it
impossible for one to not be in the cache (i.e. is it
always fully pre-poulated via the vendor_go_do_vendor_resolve ?)
A missing packages leads to an build error because the network is disabled. But this shouldn't happen because the resolve task add all modules to the dynamic SRC_URI.

It is unclear to me how the vendor'd modules get into an archive
that can be saved for future reproducible builds (can you point
me at that glue?).

The do_vendor_resolve task add all modules from the go.sum to the dynamic SRC_URI. The fetch and unpack task fetch the modules and unpack it to the cache. The go mod vendor command create a vendor directory from the populated cache. Depending on the archiver class function the archive contains the created vendor directory in S or the recipe and dynamic SRC_URI archives.
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#211251): 
https://lists.openembedded.org/g/openembedded-core/message/211251
Mute This Topic: https://lists.openembedded.org/mt/111123541/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to