aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/README-oe-go-mod-autogen.txt
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/README-oe-go-mod-autogen.txt')
-rw-r--r--scripts/README-oe-go-mod-autogen.txt120
1 files changed, 120 insertions, 0 deletions
diff --git a/scripts/README-oe-go-mod-autogen.txt b/scripts/README-oe-go-mod-autogen.txt
new file mode 100644
index 00000000..80a35e52
--- /dev/null
+++ b/scripts/README-oe-go-mod-autogen.txt
@@ -0,0 +1,120 @@
+Description:
+
+ oe-go-mod-autogen.py is a helper script for go mod recipes. It is based
+ on intiial efforts to use only the git fetcher versus golangs module
+ infrastructure.
+
+ Example:
+
+ a) generate
+
+ cmd: <path_to>/meta-virtualization/scripts/oe-go-mod-autogen.py \
+ --repo https://github.com/docker/compose --rev v2.20.3
+ output: src_uri.inc, relocation.inc, modules.txt
+
+ b) Copy the three generated files to replace the original ones.
+
+ c) update SRCREV
+
+ Edit the recipe to update PV and the main SRCREV, and
+ docker-compose is upgraded.
+
+ See --help for more explanations and examples.
+
+ Below are some technical details.
+
+ * get module's repo from module name
+
+ This script checks the following two URLs to determine the module's repo.
+ 1. https://<module_name_tweaked>?=go-get=1
+ 2. https://pkg.go.dev/<module_name_tweaked>
+
+ The module_name_tweaked is derived from module_name, with the last components
+ removed one by one. Let me use two examples to explain this.
+
+ For module_name sigs.k8s.io/json, the sigs.k8s.io/json is first used as
+ module_name_tweaked for searching. And we can correctly get the repo URL, so
+ the search stops.
+
+ For module_name github.com/k3s-io/etcd/api/v3, the following ones are used
+ as module_name_tweaked:
+ github.com/k3s-io/etcd/api/v3
+ github.com/k3s-io/etcd/api
+ github.com/k3s-io/etcd
+ And when searching 'github.com/k3s-io/etcd', we get the repo URL, so the search
+ stops.
+
+ * determine the srcdir:destdir mapping in 'vendor' creation
+
+ To correctly form the 'vendor' directory, the mapping is critical.
+ This script makes use of tag matching and path matching to determine
+ the subpath in the repo for the module.
+
+ * avoid subpath being overriden by parent path
+
+ We need to avoid subpath being overriden by parent path. This is needed
+ for both SRC_URI ordering in src_uri.inc and the sites mapping ordering
+ in relocation.inc. This script simply uses the length as the ordering key,
+ simply for the reason that if a path is a subpath of another path, it must
+ be longer.
+
+ * the .git suffix is removed to sync with each other
+
+ Unlike normal recipes, go mod recipe usually have many SRC_URIs. This script
+ remove the '.git' suffix from repo URL so that the repo URLs are in sync
+ with each.
+
+ * basic directory hierarchy and caching mechanism
+
+ <cwd>/repos: hold the repos downloaded and checked
+ <cwd>/wget-contents: hold the contents to determine the module's repo
+ <cwd>/wget-contents/<module_name>.repo_url.cache: the repo value cache
+ This is to avoid unnecessary URL fetching and repo cloning.
+
+ * the ERROR_OUT_ON_FETCH_AND_CHECKOUT_FAILURE switch in script
+
+ The script must get the correct repo_url, fullsrc_rev and subpath for
+ each required module in go.mod to correctly generate the src_uri.inc and
+ relocation.inc files. If this process fails for any required module, this
+ script stop immediately, as I deliberately set ERROR_OUT_ON_FETCH_AND_CHECKOUT_FAILURE
+ to True in this script. The purpose is to encourage people to report
+ problems to meta-virt so that we can improve this script according to
+ these feedbacks. But this variable can set to False, then the script
+ only records the failed modules in self.modules_unhandled with reasons
+ added, people can modify the generated src_uri.inc and relocation.inc
+ to manually handle these unhandled modules if they are urgent to
+ add/upgrade some go mod recipes.
+
+
+Debug tips:
+
+If the do_compile task exits with a go mod / fetch error, this is due
+to some sort of compilation error during the go build. The log file
+can be huge. To figure out what broke, try the following:
+
+ % cd ${S}/src/import
+ % grep -v ^HASH ../../../temp/log.do_compile
+
+This will likely highlight what broke. It is often that either the wrong
+revision was used (and there will be go build errors) or that a fetched
+repository used the wrong source or destination. Seeing what module
+couldn't be found, will allow you to locate the SRC_URI fetch in question,
+how it was relocated. Either the source or destination may be wrong.
+
+As an example, k3s was failing with the following error:
+
+ go: finding module for package sigs.k8s.io/kustomize/kustomize/v5/commands/build
+ vendor/k8s.io/kubectl/pkg/cmd/kustomize/kustomize.go:25:2: cannot query module due to -mod=vendor
+ WARNING: exit code 1 from a shell command.
+
+Which leads to looking at the SRC_URI and vendor fetch, which was not
+using the proper source for kustomize.
+
+ sigs.k8s.io/kustomize/kustomize/v5:sigs.k8s.io/kustomize/kustomize:force \
+
+had to be changed to:
+
+ sigs.k8s.io/kustomize/kustomize/v5:sigs.k8s.io/kustomize/kustomize/v5/kustomize:force \
+
+To get the commands/build subirectory from the source into the proper
+vendor location.