特に理由はないのですが Zig を触ってみたくなったので、Nix で Zig プロジェクトを管理する方法を調べました。 最初に出てきた検索結果は(流石に)mitchellh の zig-overlay です。 ドキュメントが十分にあって分かりやすいですが、使用例の一部が目に留まりました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  # ...

  outputs = {
    self,
    nixpkgs,
    flake-utils,
    ...
  } @ inputs: let
    overlays = [
      # Other overlays
      (final: prev: {
        zigpkgs = inputs.zig.packages.${prev.system};
      })
    ];

    # Our supported systems are the same supported systems as the Zig binaries
    systems = builtins.attrNames inputs.zig.packages;
  in
    flake-utils.lib.eachSystem systems (
      # ...
    );
}

出典:zig-overlay/templates/init/flake.nix

flake-utils を使った flake では普通lib.eachDefaultSystemを呼ぶことが多いのですが、この例では対応システムを明示的に宣言していますね。 具体的にどのシステムが対応されるのか知りたくて、すぐnix replを叩いてみたんですけど、そこで、外部の flake はどうやって読み込むんだっけ?って気づいて手が止まりました。

現行ディレクトリに flake がある場合は:lfで済みますが、zig-overlay は GitHub 上での flake なので、別の方法が必要です。

ネットで調べてみるとbuiltins.getFlakeという関数があり、これで flake の出力を直接取れそうです。

nix-repl> zig = builtins.getFlake "github:mitchellh/zig-overlay"

nix-repl> builtins.attrNames zig.packages
[
  "aarch64-darwin"
  "aarch64-linux"
  "x86_64-darwin"
  "x86_64-linux"
]

つまり、先ほど見たsystemsflake-utils.lib.defaultSystemsと同じですね。

これ、わざわざ宣言する意味あるのかな(笑)