diff options
Diffstat (limited to 'meta/classes-recipe/cargo-update-recipe-crates.bbclass')
-rw-r--r-- | meta/classes-recipe/cargo-update-recipe-crates.bbclass | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/meta/classes-recipe/cargo-update-recipe-crates.bbclass b/meta/classes-recipe/cargo-update-recipe-crates.bbclass new file mode 100644 index 0000000000..697460d215 --- /dev/null +++ b/meta/classes-recipe/cargo-update-recipe-crates.bbclass @@ -0,0 +1,46 @@ +# +# Copyright OpenEmbedded Contributors +# +# SPDX-License-Identifier: MIT +# + +## +## Purpose: +## This class is used to update the list of crates in SRC_URI +## by reading Cargo.lock in the source tree. +## +## See meta/recipes-devtools/python/python3-bcrypt_*.bb for an example +## +## To perform the update: bitbake -c update_crates recipe-name + +addtask do_update_crates after do_patch +do_update_crates[depends] = "python3-native:do_populate_sysroot" +do_update_crates[nostamp] = "1" + +# The directory where to search for Cargo.lock files +CARGO_LOCK_SRC_DIR ??= "${S}" + +do_update_crates() { + nativepython3 - <<EOF + +def get_crates(f): + import tomllib + c_list = '# from %s' % os.path.relpath(f, '${CARGO_LOCK_SRC_DIR}') + c_list += '\nSRC_URI += " \\\' + crates = tomllib.load(open(f, 'rb')) + for c in crates['package']: + if 'source' in c and 'crates.io' in c['source']: + c_list += '\n crate://crates.io/%s/%s \\\' % (c['name'], c['version']) + c_list += '\n"\n' + return c_list + +import os +crates = "# Autogenerated with 'bitbake -c update_crates ${PN}'\n\n" +for root, dirs, files in os.walk('${CARGO_LOCK_SRC_DIR}'): + for file in files: + if file == 'Cargo.lock': + crates += get_crates(os.path.join(root, file)) +open(os.path.join('${THISDIR}', '${BPN}'+"-crates.inc"), 'w').write(crates) + +EOF +} |