RustのcrossはNixOSで動かない

以上です。だと味気ないので原因を簡単に。 crossとはdockerコマンドをラップしてRustでのクロスコンパイルを簡単に実現できるツールなのだけど、 現行のcrossの実装ではライブラリ、ツールチェーンをホストの環境からイメージ内にマウントすることで実現しているのだが、これが問題になる。

ご存知のようにNixOSではldすらハッシュ付きで/nix/store/xxxxxx-みたいなパスに配置されており、 NixOSのrustupでもツールチェーンのインストール時にバイナリパッチで利用するldを書き換えてインストールするようにしてある。 なので存在しないldを読みに行こうとしてsh: 1: cargo: not foundなんて言われることになる。

幸いdocker in dockerはサポートされてあるのでdocker in dockerで使いましょう。 ホスト環境に依存しないdockerイメージにしてくれれば楽なんだけど……