summaryrefslogtreecommitdiffstats
path: root/meta/classes-recipe/cargo_common.bbclass
diff options
context:
space:
mode:
authorAlex Kiernan <alex.kiernan@gmail.com>2023-03-31 07:45:22 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-04-01 11:36:26 +0100
commit0d099fa404b037d46baf63c9a89a8b83c5bf607f (patch)
treeb3dcd902bb5d1b5912eeb914d772f87112c18e90 /meta/classes-recipe/cargo_common.bbclass
parent15dc92a4b19baedbb9bfa95fbe2c8b6a7c9987c8 (diff)
downloadpoky-0d099fa404b037d46baf63c9a89a8b83c5bf607f.tar.gz
cargo_common.bbclass: Support local github repos
Since disable network was added cargo configurations which reference git repos fail as they attempt to fetch across the network as part of do_compile, even if EXTRA_OECARGO_PATHS to add them as part of `paths` is used, as this is documented as only working for packages which exist in crates.io. Add parsing of the SRC_URIs for git repos and include `[patch]` sections to redirect to the checked out source repos which the bitbake fetcher has already populated. There are still cases which don't work - if you have multiple copies of the same repo with different revisions, there's currently no way to represent that and anything using a repo which has a virtual manifest will fail to build (see https://github.com/rust-lang/cargo/issues/4934). (From OE-Core rev: 684a8af41c5bb70db68e75f72bdc4c9b09630810) Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes-recipe/cargo_common.bbclass')
-rw-r--r--meta/classes-recipe/cargo_common.bbclass30
1 files changed, 30 insertions, 0 deletions
diff --git a/meta/classes-recipe/cargo_common.bbclass b/meta/classes-recipe/cargo_common.bbclass
index f503a001dd..63b1382908 100644
--- a/meta/classes-recipe/cargo_common.bbclass
+++ b/meta/classes-recipe/cargo_common.bbclass
@@ -116,6 +116,36 @@ cargo_common_do_configure () {
116 EOF 116 EOF
117} 117}
118 118
119python cargo_common_do_patch_paths() {
120 cargo_config = os.path.join(d.getVar("CARGO_HOME"), "config")
121 if not os.path.exists(cargo_config):
122 return
123
124 src_uri = (d.getVar('SRC_URI') or "").split()
125 if len(src_uri) == 0:
126 return
127
128 patches = dict()
129 workdir = d.getVar('WORKDIR')
130 fetcher = bb.fetch2.Fetch(src_uri, d)
131 for url in fetcher.urls:
132 ud = fetcher.ud[url]
133 if ud.type == 'git':
134 name = ud.parm.get('name')
135 destsuffix = ud.parm.get('destsuffix')
136 if name is not None and destsuffix is not None:
137 repo = '%s://%s%s' % (ud.proto, ud.host, ud.path)
138 path = '%s = { path = "%s" }' % (name, os.path.join(workdir, destsuffix))
139 patches.setdefault(repo, []).append(path)
140
141 with open(cargo_config, "a+") as config:
142 for k, v in patches.items():
143 print('\n[patch."%s"]' % k, file=config)
144 for name in v:
145 print(name, file=config)
146}
147do_configure[postfuncs] += "cargo_common_do_patch_paths"
148
119oe_cargo_fix_env () { 149oe_cargo_fix_env () {
120 export CC="${RUST_TARGET_CC}" 150 export CC="${RUST_TARGET_CC}"
121 export CXX="${RUST_TARGET_CXX}" 151 export CXX="${RUST_TARGET_CXX}"