みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

Yocto Project Poetryプロジェクトのレシピ

はじめに

前回pythonのサンプルプログラムを作成するためにpoetryを使用したが、あまりにも素人過ぎていろいろ雑だったのでもう少し調べる。

環境

Yocto Project VS Code連携機能を試す(C/C++)の環境を使用する。

poetryのプロジェクト

poetry

poetryはpipでインストールできる。

$ pip3 install --user poetry

下記の設定を行うことでプロジェクトごとにvirtualenv環境が作成される。 virtualenvに依存ライブラリなどをインストールした場合など、VS Codeなどで認識されるようになるらしい。

$ poetry config virtualenvs.in-project true --local

プロジェクト作成

poetry newでプロジェクトを作成する。

$ poetry new hello
$ cd hello

下記のようなツリーが作成される。

.
├── README.md
├── hello
│   └── __init__.py
├── pyproject.toml
└── tests
    └── __init__.py

pythonスクリプト

hello/main.pyを下記の内容で作成する。

def run():
    print("Hello world!")


if __name__ == '__main__':
        run()

ここではrun関数がエントリポイントになるような構造にしている。

venvにパッケージをインストール

下記のコマンドを実行することでvirtualenv環境に作成中のプロジェクトをインストールすることができる。

$ poetry install

venvでスクリプトを実行

下記のコマンドでスクリプトをvirtualenv環境で実行できる。

$ poetry run python hello/main.py

下記のコマンドでvirtualenv環境に入ることもできる。

$ poetry shell

抜ける場合はexit

gitリポジトリ

ローカルリポジトリ

下記のコマンドを実行し、gitリポジトリにする。

$ git init
$ git add .
$ git commit -m 'initial'
$ git branch -m main

ベアリポジトリ

ベアリポジトリの作成

$ sudo mkdir -p /opt/repos/hello.git
$ sudo chmod 777 /opt/repos/hello.git
$ cd /opt/repos/hello.git
$ git init --bare --shared

ベアリポジトリに登録

$ git remote add example ssh://localhost:/opt/repos/hello.git
$ git push example main

レシピの作成

レシピを作成する。

workspaceへ展開

devtoolでベアリポジトリからworkspaceに展開する

$ devtool add ssh://localhost:/opt/repos/hello.git -B main

python3のパッケージなので、レシピ名はpython3-helloとなる。

パッケージをビルド

$ devtool build python3-hello

パッケージの内容

パッケージの内容を確認する。

$ pushd ./tmp/work/cortexa57-poky-linux/python3-hello/0.1.0+git/packages-split
$ tree python3-hello

パッケージに収録されるファイル。

python3-hello
└── usr
    └── lib
        └── python3.12
            └── site-packages
                ├── hello
                │   ├── __init__.py
                │   ├── __pycache__
                │   │   ├── __init__.cpython-312.pyc
                │   │   └── main.cpython-312.pyc
                │   └── main.py
                └── hello-0.1.0.dist-info
                    ├── METADATA
                    ├── RECORD
                    └── WHEEL

poetryで作成されたpythonプロジェクトがきちんと収録されている。

実行コマンド

pythonのパッケージをインストールすると例えば/usr/bin/helloのように実行できるようなスクリプトがほしい。 poetryではそのようなスクリプトを自動生成することができる。

pyproject.tomlに下記の行を追加する。

[tool.poetry.scripts]
hello = "hello.main:run"

下記のような書式となっている。

<コマンド名> = "<プロジェクト名>.<モジュール名>:<エントリポイント関数>"

パッケージの再確認

pyproject.tomlに[tool.poetry.scripts]の内容を追加したあとパッケージを再ビルドする。

$ devtool build python3-hello

パッケージに収録されるファイル。

python3-hello
└── usr
    ├── bin
    │   └── hello
    └── lib
        └── python3.12
            └── site-packages
                ├── hello
                │   ├── __init__.py
                │   ├── __pycache__
                │   │   ├── __init__.cpython-312.pyc
                │   │   └── main.cpython-312.pyc
                │   └── main.py
                └── hello-0.1.0.dist-info
                    ├── METADATA
                    ├── RECORD
                    ├── WHEEL
                    └── entry_points.txt

レシピを全く変更していないのにusr/bin/helloがきちんとパッケージに反映されている。 python_poetry_core.bbclassが優秀なのでこのように追従してくれる。

レシピ

poetryのプロジェクトからdevtoolが作成したレシピは以下のような内容になっている。

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

SRC_URI = "git://localhost/opt/repos/hello.git;protocol=ssh;branch=main"

# Modify these as desired
PV = "0.1.0+git"
SRCREV = "8c4d8e9fa6ed1bbe2417fd3afb935facbf19a2eb"

S = "${WORKDIR}/git"

inherit python_poetry_core

poetryのプロジェクトを作成時にライセンスをきちんと設定しなかったのでCLOSEDになっているが、 これはプロジェクト作成時に設定しておけば反映される。

レシピとしてはかなりシンプルで、タスクの定義は完全にpython_poetry_core.bbclassにまかせている。

まとめ

poetryは優秀。それに対応するpython_poetry_core.bbclassも優秀。