Switching To Lix

or: how to make your existing configuration Delicious

If you have an existing configuration on NixOS or nix-darwin, there are a couple of ways to switch to Lix, all of which are relatively easy.

  • Using Lix from nixpkgs:
    • Potentially slightly older version of Lix
    • Working binary caching
    • Programs like nix-eval-jobs and colmena still use the default version of Nix (may be unacceptable depending on your use case)
  • Using the Lix NixOS module:
    • Fresh version of Lix right out of the freezer
    • You will be compiling Lix yourself, for now at least
    • Programs like nix-eval-jobs and colmena have the version of Nix they use overridden by an overlay such that most of the system uses Lix.

Using Lix from nixpkgs

This approach has some caveats: since it is not using an overlay, it does not set the version of Nix depended on by other tools like colmena or nix-eval-jobs. Consequently, those tools will be using whichever version of CppNix is default in nixpkgs, likely leading to an inconsistent experience. It is, however, easy, and it does not take the few minutes to compile Lix from source.

Add the following code to your NixOS configuration:

{ pkgs, ... }:
{
  nix.package = pkgs.lix;
}

That’s it, you’re done.

You can verify that it works by running the following command:

$ nix --version
nix (Lix, like Nix) 2.90.0

Using the Lix NixOS module

The Lix NixOS module is the way to get the most consistent experience using Lix, and to have a system that has Lix as the default Nix implementation wherever possible by using an overlay to replace pkgs.nix. It will result in building Lix from source, which takes a few minutes on every update, which is a perfect time to get up, get some water, and stretch for a bit.

Flake-based Configurations

Adding Lix to a flake-based configuration is relatively simple. First, add the Lix module to your flake inputs:

{
  inputs = {

    # Add this section to your flake inputs!
    #
    # Note that this assumes you have a flake-input called nixpkgs,
    # which is often the case. If you've named it something else,
    # you'll need to change the `nixpkgs` below.
    lix-module = {
      url = "https://git.lix.systems/lix-project/nixos-module/archive/2.90.0.tar.gz";
      inputs.nixpkgs.follows = "nixpkgs";
    };

  }

  # <rest of configuration omitted>
}

Next, add the lix-module as one of the arguments to your output function:

{
  # <configuration above omitted>

  # Add the `lix-module` argument to your output function, as below:
  outputs = {nixpkgs, lix-module, ...}: {
      # <rest of configuration omitted>
  }
}

Add the Lix NixOS Module to your configuration:

{
  # <configuration above omitted>

  # Add the `lix-module` argument to your output function, as below:
  outputs = {nixpkgs, lix-module, ...}: {

      # The configuration here is an example; it will look slightly different
      # based on your platform (NixOS, nix-darwin) and architecture.
      nixosConfigurations.your-box = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux"

        modules = [

          # This is the important part -- add this line to your module list!
          lix-module.nixosModules.default
        ];

      };
  }

  # <configuration below omitted>
}

Rebuild and switch into your new system (either using nixos-rebuild or darwin-rebuild). You should now be using Lix! You can verify this by asking the nix command to report its version:

$ nix --version
nix (Lix, like Nix) 2.90.0

As long as you see Lix in the output, you’re good! If you’re not sure what to do now, it’s a great time to check out some of the community’s resources on Nix.

Non-Flake Configurations

If you’re not using flakes, you can set up your configuration to automatically pull down a Lix release tarball, and then add it to your configuration.nix.

Open your /etc/nixos/configuration.nix in the editor of your choice. Find the imports section, and add the line provided in the configuration

{ config, lib, pkgs, ... }:
{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix

      # This includes the Lix NixOS module in your configuration along with the
      # matching version of Lix itself.
      #
      # The sha256 hashes were obtained with the following command in Lix (n.b.
      # this relies on --unpack, which is only in Lix and CppNix > 2.18):
      # nix store prefetch-file --name source --unpack https://git.lix.systems/lix-project/lix/archive/2.90.0.tar.gz
      #
      # Note that the tag (e.g. 2.90.0) in the URL here is what determines
      # which version of Lix you'll wind up with.
      (let
        module = fetchTarball {
          name = "source";
          url = "https://git.lix.systems/lix-project/nixos-module/archive/2.90.0.tar.gz";
          sha256 = "sha256-yEO2cGNgzm9x/XxiDQI+WckSWnZX63R8aJLBRSXtYNE=";
        };
        lixSrc = fetchTarball {
          name = "source";
          url = "https://git.lix.systems/lix-project/lix/archive/2.90.0.tar.gz";
          sha256 = "sha256-f8k+BezKdJfmE+k7zgBJiohtS3VkkriycdXYsKOm3sc=";
        };
        # This is the core of the code you need; it is an exercise to the
        # reader to write the sources in a nicer way, or by using npins or
        # similar pinning tools.
        in import "${module}/module.nix" { lix = lixSrc; }
      )
    ];

  # <configuration below omitted>
}

Rebuild and switch into your new system (either using nixos-rebuild or darwin-rebuild). You should now be using Lix! You can verify this by asking the nix command to report its version:

$ nix --version
nix (Lix, like Nix) 2.90.0

As long as you see Lix in the output, you’re good! If you’re not sure what to do now, it’s a great time to check out some of the community’s resources on Nix.

Having Trouble?

One quick thing to check: have you set nix.package anywhere in your configuration? If so, your configuration option will override the Lix module. You’ll want to remove it, first – or, if you’re feeling savvy, point it to the provided Lix package.

Otherwise: If you’re having difficulty installing Lix, don’t panic! Hop on over to our community page, and check out the various ways to find help.