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 ?)

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?).

Bruce

> +}
> +do_unpack[postfuncs] += "run_go_mod_vendor"
> +do_unpack[depends] += 
> "${@oe.utils.build_depends_string(d.getVar('DEPENDS_GOLANG'), 
> 'do_populate_sysroot')}"
> +
> +EXPORT_FUNCTIONS do_vendor_resolve
> -- 
> 2.39.5
> 

> 
> 
> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#211197): 
https://lists.openembedded.org/g/openembedded-core/message/211197
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