Я настроил его с помощью maturin, и локально он работает нормально - он построит колесо (.whl), внутри которого находится мой код Python и общий объект расширения Rust, как я и ожидал.
Мне нужно скомпилировать это с помощью Yocto (к сожалению, я застрял на Langdale), чтобы поместить его во встроенную корневую файловую систему, и я быстро пришел к выводу, что мне придется отказаться от maturin ради setuptools-rust, поскольку в Yocto Langdale вообще нет поддержки maturin.
Итак, теперь мой проект Rust/Python/PyO3 настроен очень похоже на setuptools-rust пример, и я могу собрать его локально, и сгенерированное колесо будет содержать то, что я ожидал.
Макет каталога:
Код: Выделить всё
.
├── Cargo.lock
├── Cargo.toml
├── MANIFEST.in
├── pyproject.toml
├── python
│ ├── my_project
│ │ └── my_module.py
│ └── tests
│ └── test_my_module.py
└── src
└── lib.rs
Код: Выделить всё
project.tomlКод: Выделить всё
[build-system]
requires = ["setuptools>=61.0.0", "setuptools-rust"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages]
find = { where = ["python"] }
[[tool.setuptools-rust.ext-modules]]
target = "my_project._lib"
path = "Cargo.toml"
binding = "PyO3"
Код: Выделить всё
MANIFEST.in:
include Cargo.toml
recursive-include src *.rs
Код: Выделить всё
Cargo.tomlКод: Выделить всё
[lib]
name = "_lib"
crate-type = ["cdylib"]
path = "src/lib.rs"
[dependencies]
pyo3 = "0.22.0"
Код: Выделить всё
inherit externalsrc
EXTERNALSRC = "${TOPDIR}/../../my_project"
DEPENDS += " \
python3-tomli-native \
python3-setuptools-rust-native"
inherit python_setuptools_build_meta
Код: Выделить всё
| File "build/tmp/work/cortexa72-cortexa53-xilinx-linux/my_package/1.0-r0/recipe-sysroot-native/usr/lib/python3.10/site-packages/picobuild/__init__.py", line 93, in __init__
| pyproject = tomllib.load(f)
| AttributeError: module 'tomli' has no attribute 'load'
Код: Выделить всё
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/METADATA
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/RECORD
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/WHEEL
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/top_level.txt
/usr/lib/python3.10/site-packages/my_project/__pycache__/my_project.cpython-310.pyc
/usr/lib/python3.10/site-packages/my_project/my_project.py
/usr/lib/python3.10/site-packages/tests/__pycache__/test_my_project.cpython-310.pyc
/usr/lib/python3.10/site-packages/tests/test_my_project.py
Посмотрев в журнал bitbake, я вижу, что используется что-то под названием «picobuild»:
Код: Выделить всё
DEBUG: python3-my-project-1.0-r0 do_compile: Executing shell function do_compile
+ cd build/tmp/work/cortexa72-cortexa53-xilinx-linux/python3-my-project/1.0-r0/python3-my-project-1.0
+ do_compile
+ export _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata
+ _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata
+ python_pep517_do_compile
+ nativepython3 -m picobuild --source /.../build/../../python/my_project --dest /.../build/tmp/work/cortexa72-cortexa53-xilinx-linux/python3-my-project/1.0-r0/dist --wheel
...
https ://patchwork.yoctoproject.org/project/oe-core/cover/20220526171001.4074388-1-ross.burton@arm.com/
Но новое сообщение от января 2023 года, похоже, предполагает что «picobuild» было изменено обратно на «build» (намек на «миграцию»):
https://patchwork.yoctoproject.org/proj ... ore/patch/ 20230112112336.2254765-4-ross.burton@arm.com/#7902
Кто-нибудь знает историю этого? Является ли "picobuild" моей проблемой в том, что он каким-то образом не поддерживает плагин setuptools-rust?
Вместо этого наследование от python_setuptools3_rust python_setuptools_build_meta успешно собирает и упаковывает части Python моего проекта, но расширение Rust (я ожидал увидеть файл .so или .pyd) полностью отсутствует. Я думаю, это связано с тем, что python_setuptools3_rust не использует шаг сборки, совместимый с PEP-517, и напрямую вызывает setup.py bdist_wheel, что пропускает настройку Rust в pyproject.toml.
На этом этапе у меня закончилась документация или примеры, которые могли бы мне помочь. Я немного не понимаю, как действовать дальше.
Очень жаль, что я застрял с Йокто Лэнгдейлом, потому что последний LTS, Scarthgap, похоже, уже созрел< /code> поддержка.
Подробнее здесь: https://stackoverflow.com/questions/788 ... enembedded