Rust でクロスプラットフォーム対応するときに便利だった Cargo Plugin: cross
これ
使い方
cargo install cross
cross build --target i686-unknown-linux-gnu
実際に Travis で動かしている k-iter/.travis.yml at master · ROki1988/k-iter とかを見るとよいかも。
発端
前回 AWS Kinesis Stream をひたすら見るやつを作ったわけですが、バイナリも用意せねば、となりました。
んで、Windows は AppVeyor でサクッとできました。macOS 向けも Travis 上でできました。
でもなぜか、一部の Linux 向けのバイナリができない。
で、調べて cross にいきつきました。
苦悩の跡
めっちゃ頑張った…
Travis CI の設定をパクッt(ry
Travis CI で Linux (x86_64, i686, aarch64) 向け(とついでに macOS 向け)に Rust で書いたツールのバイナリをリリースする - はやくプログラムになりたい
上記のような記事を公開いただいていて、パクれ との記述にありがとうございます!!!と適用してみました。
Build #9 - ROki1988/k-iter - Travis CI がビルド結果になります。
文面に書くと、macOS 向けと x86_64 Linux 向けのビルドに成功し、i686 Linux 向けと AArch64 Linux 向けに失敗しました。なぜだ…
ハッハーン…いつものだな?
OpenSSL を疑いました。
というのも、Rust で OpenSSL を使用する場合、crate が対応しているバージョンがインストールされていないとビルドできなかったり、実行できなかったりするからです。
rust-openssl/build.rs at master · sfackler/rust-openssl を全部見切れていないので事情は定かでないですが、ビルド時にいろいろ見に行っている模様。
ので、
- OpenSSL をインストールしたり
- OpenSSL のバージョン確認したり
- パス確認したり
- OpenSSL のバージョン指定でインストールしようとしたり
- sfackler/rust-openssl: OpenSSL bindings for Rust の環境変数での指定を使ってたり
しましたが、ことごとくダメでした。
ただ最後の環境変数指定でもできなかったときのエラーメッセージをボヤっと見てピンときて、クロス環境向けにビルドされた OpenSSL のがいるのか!と仮説を立てました。
とはいうものの
さすがにクロスのバイナリそれぞれ用意して云々はハードル高いぞ…と、なんかあるやろで見つけたのが cross になります。
上記にて使われているのを発見して、参考にさせていただきました。
結果としてビルドもできて、やったーというところです。
タグ切ったところ、パクってきた拝借してきた設定どおりにきちんと Github に公開されました。
つかってみて
すっごい考えられてるというか、賢くやってはるなーというかんじです。
CLI のコマンドも cargo
から cross
に変えるだけですし、docker 環境がない場合とある場合も同じように動いてくれますし、CI のキャッシュも効きますし。
AWS Lambda の時も感じましたけど、コンテナホント便利ですね。
あとはテストとかにも使いたいんだよなぁ。こう…#[test]
の下とかにアトリビュート書いて実現できると嬉しいかも。