chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

組み込みRust:かつて通っていたプロジェクトのビルドが通らなくなる→build.rsを加えて解消

課題:以前ビルドできていたプロジェクトのビルドできない状況になった。
結果:build.rsを加えたらエラー解消
詳細:
ビルドエラーメッセージは以下(長いので抜粋)

 Compiling tsp_xiao_try v0.1.0 (/home/<usr_id>/lang/rust/tsp_xiao_try)
error: linking with `ldproxy` failed: exit status: 101
  |
  = note: LC_ALL="C" PATH="/home/xxx/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/xxx.rustup/toolchains/esp/riscv32-esp-elf/esp-2021r2-patch5-8_4_0/riscv32-esp-elf/bin:/home/sxxx.rustup/toolchains/esp/xtensa-esp32-elf/esp-2021r2-patch5-8_4_0/xtensa-esp32-elf/bin:/home/xxx.rustup/toolchains/esp/xtensa-esp32s3-elf/esp-2021r2-pat
                     *略*
  = note: [ldproxy] Running ldproxy
          thread 'main' panicked at 'Cannot locate argument '--ldproxy-linker <linker>'', /home/xxxx/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ldproxy-0.3.3/src/main.rs:44:13
          stack backtrace:

リンカでエラーが発生してるようだ。

Cannot locate argument '--ldproxy-linker <linker>

ldproxy-linkerの引数が渡されていないから??
どうやったら解消できるのか分からず。。。

エラーメッセージでぐぐると、同じエラーの記載あり
Build failures · esp-rs/rust-build Wiki · GitHub
上記サイトによると、build.rsが無いのが原因であると。。

reason: missing build.rs

場当たり的だが、テンプレートプロジェクトから、build.rsをコピー(以前は無しで動いていたはずだが、、しかもこの内容でいいのか不明)

// Necessary because of this issue: https://github.com/rust-lang/cargo/issues/9641
fn main() -> Result<(), Box<dyn std::error::Error>> {
    embuild::build::CfgArgs::output_propagated("ESP_IDF")?;
    embuild::build::LinkArgs::output_propagated("ESP_IDF")?;
    Ok(())
}

結果、ビルドは通った。build.rsってそんなに重要なのか。このファイルがリンカ―とどう関係しているのかも読み取れず。。
■追記
別のプロジェクトもビルドNGに陥り、エラーが解消できずずっと悩んでいた。重要視していなかった、ビルドをコントロールするファイル類をきっちり書かないと安定してビルドできないことが分かった(分かっている人には当たり前なのかもしれませんが)
file: ust-toolchain.toml

[toolchain]
channel = "nightly"
components = ["rust-src"]

file: build.rs

// Necessary because of this issue: https://github.com/rust-lang/cargo/issues/9641
fn main() -> Result<(), Box<dyn std::error::Error>> {
    embuild::build::CfgArgs::output_propagated("ESP_IDF")?;
    embuild::build::LinkArgs::output_propagated("ESP_IDF")?;
    Ok(())
}

file: .cargo/config.toml

[build]
target = "riscv32imc-esp-espidf"

[target.riscv32imc-esp-espidf]
linker = "ldproxy"
runner = "espflash flash --monitor" # Select this runner for espflash v2.x.x
rustflags = ["-C", "default-linker-libraries"]

[unstable]
build-std = ["std", "panic_abort"]

[env]
ESP_IDF_VERSION = "release/v4.4"

この状態で、rustupでtoolchainを確認すると以下

$ rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /home/sumi/.rustup

installed toolchains
--------------------

stable-x86_64-unknown-linux-gnu
nightly-2023-02-28-x86_64-unknown-linux-gnu
nightly-x86_64-unknown-linux-gnu (default)
esp

installed targets for active toolchain
--------------------------------------

riscv32imac-unknown-none-elf
riscv32imc-unknown-none-elf
x86_64-unknown-linux-gnu

active toolchain
----------------

nightly-x86_64-unknown-linux-gnu (overridden by '/home/xxxx/lang/rust/tsp_xiao_ok/rust-toolchain.toml')
rustc 1.71.0-nightly (521f4dae1 2023-05-19)