Skip to content

Development with nix

devins2518 edited this page Jun 7, 2022 · 26 revisions

Traditional approach

Here is a sample shell.nix for building/developing zig.

with import <nixpkgs> {};

pkgs.mkShell {
  nativeBuildInputs = with pkgs; [
    cmake
    gdb
    ninja
    qemu
    wasmtime
  ] ++ (with llvmPackages_13; [
    clang
    clang-unwrapped
    lld
    llvm
  ]);

  hardeningDisable = [ "all" ];
}

The hardeningDisable part is crucial, otherwise you will get compile errors.

Flake

Alternatively, you can use this sample flake.nix:

{
  description = "A flake for Zig development";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    flake-compat = {
      url = "github:edolstra/flake-compat";
      flake = false;
    };
  };

  outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system:
    let
      pkgs = inputs.nixpkgs.legacyPackages.${system};
    in
      {
         devShell.${system} = pkgs.mkShell {
           nativeBuildInputs = with pkgs; [
             cmake
             gdb
             ninja
             qemu
             wasmtime
           ] ++ (with llvmPackages_13; [
             clang
             clang-unwrapped
             lld
             llvm
           ]);

           hardeningDisable = [ "all" ];
         };
      }
  );
}

Notes for macOS users

If using macOS, you will need to build llvm yourself and use the system's clang to build zig. This is possible using the sample shell.nix below.

with import <nixpkgs> { };

pkgs.mkShellNoCC {
  nativeBuildInputs = with pkgs; [ cmake gdb ninja qemu wasmtime ];

  hardeningDisable = [ "all" ];
}