ビルドが通らない時はソースコードを読む
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_featuresRustに不慣れなのと、このリポジトリーじゃなくて依存リポジトリーの中でパニックを起こしていて何か自分には手が出ないような気がしてしまう。ググったり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動いた!