ビルドが通らない時はソースコードを読む
AardwolfっていうRustプログラムをビルドしようと、公式のインストールドキュメントに従ってやってみてもビルドが通らない。
% RUST_BACKTRACE=1 cargo run --bin setup Compiling aardwolf v0.1.0 (/Users/ikeda/src/github.com/Aardwolf-Social/aardwolf) error: failed to run custom build command for `aardwolf v0.1.0 (/Users/ikeda/src/github.com/Aardwolf-Social/aardwolf)` process didn't exit successfully: `/Users/ikeda/src/github.com/Aardwolf-Social/aardwolf/target/debug/build/aardwolf-d833dd1a280ec7ae/build-script-build` (exit code: 101) --- stdout Feature selected: CARGO_FEATURE_SIMPLE_LOGGING --- stderr thread 'main' panicked at 'Couldn't compile translations: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:997:5 stack backtrace: 0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace at src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:39 1: std::sys_common::backtrace::_print at src/libstd/sys_common/backtrace.rs:70 2: std::panicking::default_hook::{{closure}} at src/libstd/sys_common/backtrace.rs:58 at src/libstd/panicking.rs:200 3: std::panicking::default_hook at src/libstd/panicking.rs:215 4: <std::panicking::begin_panic::PanicPayload<A> as core::panic::BoxMeUp>::get at src/libstd/panicking.rs:478 5: std::panicking::continue_panic_fmt at src/libstd/panicking.rs:385 6: std::panicking::try::do_call at src/libstd/panicking.rs:312 7: core::char::methods::<impl char>::escape_debug at src/libcore/panicking.rs:85 8: rocket_i18n::compile_po::{{closure}} at /rustc/f29b4fbd742b8180edb5e06cad0977b08881541b/src/libcore/macros.rs:16 9: rocket_i18n::compile_po::{{closure}} at /rustc/f29b4fbd742b8180edb5e06cad0977b08881541b/src/libcore/result.rs:825 10: rocket_i18n::update_po::{{closure}} at /Users/ikeda/.cargo/registry/src/github.com-1ecc6299db9ec823/rocket_i18n-0.3.1/src/lib.rs:212 11: build_script_build::build_translations at ./build.rs:18 12: build_script_build::main at ./build.rs:12 13: std::rt::lang_start::{{closure}} at /rustc/f29b4fbd742b8180edb5e06cad0977b08881541b/src/libstd/rt.rs:64 14: std::panicking::try::do_call at src/libstd/rt.rs:49 at src/libstd/panicking.rs:297 15: panic_unwind::dwarf::eh::read_encoded_pointer at src/libpanic_unwind/lib.rs:92 16: <std::panicking::begin_panic::PanicPayload<A> as core::panic::BoxMeUp>::get at src/libstd/panicking.rs:276 at src/libstd/panic.rs:388 at src/libstd/rt.rs:48 17: std::rt::lang_start at /rustc/f29b4fbd742b8180edb5e06cad0977b08881541b/src/libstd/rt.rs:64 18: build_script_build::validate_features
Rustに不慣れなのと、このリポジトリーじゃなくて依存リポジトリーの中でパニックを起こしていて何か自分には手が出ないような気がしてしまう。ググったりGitHubのイシューを覗いたりして見るけど手掛かりがなく諦めようかと思ったけど、今日同僚が「エラー見ても分からん」って言ったのに「そういう時はソースコード見るしかないですねえ」とか返しちゃった手前逃げ道もないのでコードを見た。プロジェクト直下の ./build.rs
は単に rocket_i18n::compile_po
を呼んでいるだけで何もできることはなさそうなのでその先へ。 .cargo/registry/src/github.com-1ecc6299db9ec823/rocket_i18n-0.3.1/src/lib.rs
って書いてあって「えっ、crates.ioからインストールしてるんじゃないの?」と訝しみつつGitHubを見てみたらAardwolf用にパッチを当てているようだ。しょうがないからチェックアウトしてきて該当ファイルの該当行へ。そしたら
Command::new("msgfmt")
.arg(format!("--output-file={}", mo_path.to_str().unwrap()))
.arg(po_path)
.status()
.map(|s| {
if !s.success() {
panic!("Couldn't compile translations")
}
})
.expect("Couldn't compile translations");
これはRustよく分かんなくても分かる。 msgfmt
なるコマンドを呼び出しているのだから、実際にそのコマンドだけ呼んでみたらヒントになるかも知れない。
% type msgfmt msgfmt not found
ない。ググるとgettextのコマンドらしいことが分かる(i18nの文脈なので納得)。
% brew install gettext Updating Homebrew... Warning: gettext 0.19.8.1 is already installed and up-to-date To reinstall 0.19.8.1, run `brew reinstall gettext`
あれ? 入ってる? 何で呼べてないの? って思って更にググると、どうもHomebrewで入れるだけだとパスが通らないらしい。というわけで .zshrc
でパスを通して動かす。
export PATH=/usr/local/opt/gettext/bin:$PATH
% source ~/.zshrc % cargo run --bin setup Compiling aardwolf v0.1.0 (/Users/ikeda/src/github.com/Aardwolf-Social/aardwolf) Finished dev [unoptimized + debuginfo] target(s) in 4.16s Running `target/debug/setup` using database url `postgresql://aardwolf:p4ssw0rd@127.0.0.1:5432/aardwolf' to setup the aardwolf database database migrations were successfully run, you're ready to go! cargo run --bin setup 3.54s user 0.80s system 98% cpu 4.382 total
動いた!