アペフチ

ビルドが通らない時はソースコードを読む

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

動いた!