- fzfをいい感じにVimから利用したい
- →helixがnucleoというfzfと同じアルゴリズムで動くマッチングライブラリを公開している
- →wasmにしてdenopsから使えるようにできそう?
- →そういやどれくらいの実装コストで達成できるのか試してないな?
- みたいな流れでwasm生成できる環境を作ろうとしていた
- コーディングそっちのけでNixでRustコードをwasmにコンパイルする環境を組んでいた
- ドキュメントにはcrossSystem使えって書いてあるが、使おうとするとstdenvごとビルドし直そうとするので大量のビルドが走ってつらくてやめた
- fenix入れてみたけどでかいデータ降ってきたしこれ維持するのなんか嫌だとなった
- よく考えたらrustc-wasm32がrustcへのエイリアスになってるんだから何かハックしたらビルドできるんちゃうのん?と思った
- 実際rustcをパスに突っ込んで
rustc --print target-list
を叩くとかなりの量のtargetをサポートするようにビルドしてあるのが分かる nix shell
でcargo用意して直接叩いたらwasm吐き出せた
- 実際rustcをパスに突っ込んで
- 後はこれを
rustPlatform.buildRustPackage
の上でできれば勝ちというわけbuildRustPackage
ではログ見たら分かるけどtargetを明示している。これがどこで決まるかというと、この部分stdenv.targetPlatform.rust.rustcTarget
が利用される- targetPlatform自体は正攻法で指定するには、先述したcrossSystemを使うしかない
- まずはnixpkgsの引数でホスト側のrustcを書き換えてみた
- wasm用のrustcなど無いって怒られた。それはそうだ
- stdenvにある値なのでoverlayでstdenv書き換えればええんちゃう?
- なぜか無限再帰が発生して死んだ
- 別のnixpkgsインスタンスから引っ張ってきた物でやったら爆死した
- そのままstdenvすげかえてもだめだった
- buildRustPackageに与えるstdenvを変えてみた
- そもそも該当部分が外(rustPlatform)から注入されるのでだめぽ
- ここまでやって、rustPlatformを生成する関数が公開されていることに気付いた
- stdenv与えられるので、ここに与えるstdenvを強引に書き換えれば行けるのでは?と思ってやったら勝った
{ pkgs ? import <nixpkgs> { }, }: let lib = pkgs.lib; rustPlatform = pkgs.makeRustPlatform { inherit (pkgs) rustc cargo; stdenv = lib.recursiveUpdate pkgs.stdenv { targetPlatform.rust = { cargoShortTarget = "wasm32-unknown-unknown"; rustcTarget = "wasm32-unknown-unknown"; }; }; }; in rustPlatform.buildRustPackage { name = "hoge"; src = ./.; nativeBuildInputs = [ pkgs.lld ]; cargoLock = { lockFile = ./Cargo.lock; }; doCheck = false; }
- 結局こうなった
cargoShortTarget
も与えないとcargoInstallPostBuildHook
で落ちる- wasmのリンク用に
nativeBuildInputs
にlldを突っ込んでいる doCheck
は切っておかないとバイナリが実行できないので死ぬ- それはそう
- stdenv与えられるので、ここに与えるstdenvを強引に書き換えれば行けるのでは?と思ってやったら勝った
Created
February 25, 2025 15:53
-
-
Save kuuote/f2f6458364352f71373af6311d84e540 to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment