NixでRustとWASMを扱う
問題点
コンパイルターゲットにWASMを追加しないといけない
rustupが必要になる
宣言的にインストールと設定を行いたいのでrustupを使いたくない
解決策
overlay
nixpkgsを上書きするNixの機能
rust-overlayはNix Flakesを利用しているRustプロジェクトなら必ず使われている
rustup要らず
rustcやcargoなど全てのツールチェインをインストールできる
Mozilla公式のnixpkgs-mozillaにもRustのoverlayが含まれている
oxalica/rust-overlayはMozillaのRustのoverlayのより良い代替品を名乗っている
RustとNixの親和性はコミュニティレベルでも高い
設定
rust-overlayはtargetを配列で指定できる
direnvと併用すると幸せになる
code: flake.nix
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay.url = "github:oxalica/rust-overlay";
};
outputs = {
nixpkgs,
flake-utils,
rust-overlay,
...
}:
system: let
pkgs = import nixpkgs {
inherit system;
};
in {
devShell = pkgs.mkShell {
nativeBuildInputs = with pkgs; [
(rust-bin.stable.latest.default.override {
})
wasmtime
];
};
}
);
}
使ってみる
code: shell
$ cargo new wasm-rust && cd ./wasm-rust
$ rustc ./src/main.rs --target wasm32-wasi
$ wasmtime ./main.wasm
Hello, world!
楽しい