Skip to content

Instantly share code, notes, and snippets.

@kuuote
Created February 25, 2025 15:53
Show Gist options
  • Save kuuote/f2f6458364352f71373af6311d84e540 to your computer and use it in GitHub Desktop.
Save kuuote/f2f6458364352f71373af6311d84e540 to your computer and use it in GitHub Desktop.

日報

  • 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吐き出せた
    • 後はこれを 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 は切っておかないとバイナリが実行できないので死ぬ
          • それはそう
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment