--- name: cross-build description: 組み込み機器向けの C/C++ プログラムを、設定ファイルに書いたコマンドでビルドし、結果(エラーと警告の行、できたファイルの有無・更新・サイズ・CPU の種類)を返す。機器で動かすプログラムのビルド・コンパイル・クロスコンパイル(make など)を依頼されたとき、その設定を確かめるときに使う。 --- # cross-build sdk_env(クロスツールチェーンを使えるようにするスクリプト)を読み込んでからビルドのコマンドを動かし、結果を返す。 設定ファイルは `<作業フォルダ>/.cross-build/config.yaml`。各項目の意味は、項目のすぐ上のコメントにある。 ないときは、設定のスキルで準備するよう、利用者に伝える。 ## コマンド スクリプトは `uv run` で動かす。 作業フォルダで動かすか、`--workdir "<作業フォルダ>"` を付ける。パスは `"…"` で囲む。 | すること | コマンド | | --- | --- | | ビルドする | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/cross_build.py" run` | | 設定を確かめる。何も作らない | `uv run --project "<このスキルのフォルダ>" "<このスキルのフォルダ>/scripts/cross_build.py" check` | run は、最長で `timeout_seconds`(既定 480 秒)に 1 分を足した時間かかる。コマンドを動かすツールの待ち時間は、それより長くする。そこまで待てないときは、バックグラウンドで動かし、終わってから結果を読む。 ## 結果 標準出力に JSON を1つ返す。終了コードは、0 が成功、1 がビルドの失敗、2 が設定や引数の問題。 ビルドの出力は、標準エラー出力にそのまま出る。 | 項目 | 中身 | | --- | --- | | `ok` | 成功したら `true` | | `message` | 起きたことと、確かめること。利用者にはこれを伝える | | `problems` | 設定の問題の一覧(終了コード 2 のとき) | | `config` | 設定ファイルの場所 | | `exit_code` | run:ビルドのコマンドの終了コード(時間切れ、途中で止められたとき、シェルを起動できなかったときは `null`) | | `duration_seconds`、`timed_out` | run:かかった秒数と、時間切れで止めたか | | `error_lines`、`warning_lines` | run:エラーと警告らしい行(それぞれ最大 20 行) | | `tail` | run:出力の最後の 30 行 | | `outputs` | run:設定の `outputs` のファイルごとに、`path`、`exists`、`updated`(今回のビルドで変わったか)、`size`(バイト数)、`elf_machine`(ELF なら CPU の種類。例:`ARM`、`AArch64`、`x86-64`) | | `notes`、`settings` | check:見つかった注意点と、読み取った設定の値 | - `error_lines`・`warning_lines`・`tail` の1行は、最大 300 字。 - 失敗したら、`message` と、`error_lines`(なければ `tail`)の主な行を伝える。 - check の `ok` が `true` でも、`notes` があれば伝える。 - `updated` が `false` のファイルは前のビルドのままで、ソースの変更が入っていないかもしれない。 - `elf_machine` が機器の CPU と違うとき(PC と同じ `x86-64` のときなど)は、機器向けのコンパイラーが使われていない。`sdk_env` を確かめる。 次のときは、[reference/shells.md](reference/shells.md) を読む。 - sdk_env の読み込みに失敗したとき - cmd で `%変数%` が置き換わらないとき - WSL の中の SDK を使うとき - Windows で bash が見つからないとき - エラーの行の拾い方を知りたいとき ## してはいけないこと - このスクリプトを通さずにビルドしない。sdk_env が読み込まれず、できたファイルの確かめも行われない。 - 同じ source_dir で、run を同時に2つ動かさない。 - `updated` が `false` のファイルを、今回ビルドしたものとして扱わない。 - 設定を依頼されたときも、`build_command` に機器への転送や書き込みのコマンドを入れない。 - 依頼されていないのに、設定ファイルを書き換えない。