Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to override 2 (two) packages in Nixos configuration.nix

Tags:

nix

nixos

I have some package to override in my configuration.nix. So I write the code as follows:

nixpkgs.config = {
  allowUnfree = true;
  packageOverrides = {
    pkgs: rec {
      #mumble + pulse audio
      mumble = pkgs.mumble.override {
        pulseSupport = true;
      };

      #kernel for intel ethernet and Testing e1000e package override
      linuxPackages.e1000e = pkgs.linuxPackages.e1000e.overrideDerivation (attrs: {
        name = "e1000e-3.3.3-${config.boot.kernelPackages.kernel.version}";
        src = fetchurl {
          url = "https://www.dropbox.com/s/pxx883hx9763ygn/e1000e-3.3.3.tar.gz?dl=0";
          sha256 = "1s2w54927fsxg0f037h31g3qkajgn5jd0x3yi1chxsyckrcr0x80";
        };
      });
    };
  };
};

but when I do nixos-rebuild switch, I got the following error:

syntax error, unexpected ':', expecting '.' or '=', at 37,11

which is at pkgs: rec {...

What did I do wrong? At first I write it by separating the pkgs like this:

packageOverrides = {
  pkgs: with pkgs: {......}; #this is for mumble
  pkgs: rec {...}; #this is for kernel
};

and still got the same error.

like image 562
Rizary Avatar asked Mar 15 '16 00:03

Rizary


1 Answers

The proper solution is:

nixpkgs.config = {

  allowUnfree = true;

  packageOverrides = super: let self = super.pkgs; in {

    mumble = super.mumble.override { pulseSupport = true; };

    linuxPackages = super.linuxPackages // {
      e1000e = super.linuxPackages.e1000e.overrideDerivation (old: {
        name = "e1000e-3.3.3-${config.boot.kernelPackages.kernel.version}";
        src = fetchurl {
          url = "https://www.dropbox.com/s/pxx883hx9763ygn/e1000e-3.3.3.tar.gz?dl=0";
          sha256 = "1s2w54927fsxg0f037h31g3qkajgn5jd0x3yi1chxsyckrcr0x80";
        };
      });
    };
  };
}

The variable super refers to the Nixpkgs set before the overrides are applied and self refers to it after the overrides are applied. It's important to distinguish these two explicitly to avoid infinite recursions, etc.

Also, note that your override

linuxPackages.e1000e = pkgs.linuxPackages.e1000e.overrideDerivation ...

replaces the linuxPackages attribute set with one that contains nothing but the (overriden) e1000e derivation. That's probably not what you want.

like image 171
Peter Simons Avatar answered Sep 21 '22 22:09

Peter Simons