From 7417d8e86e9b1bfa47482f29604315f5ec2696bf Mon Sep 17 00:00:00 2001 From: Robert Helgesson Date: Fri, 20 Oct 2017 23:22:47 +0200 Subject: [PATCH] nixpkgs: add module --- modules/default.nix | 6 +- modules/misc/news.nix | 12 ++++ modules/misc/nixpkgs.nix | 119 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 modules/misc/nixpkgs.nix diff --git a/modules/default.nix b/modules/default.nix index a87299472..4cba27ffb 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -11,12 +11,13 @@ with lib; let modules = [ - ./home-environment.nix ./files.nix + ./home-environment.nix ./manual.nix ./misc/fontconfig.nix ./misc/gtk.nix ./misc/news.nix + ./misc/nixpkgs.nix ./misc/pam.nix ./programs/bash.nix ./programs/beets.nix @@ -73,9 +74,10 @@ let fold f res res.config.warnings; pkgsModule = { - config._module.args.pkgs = lib.mkForce pkgs; config._module.args.baseModules = modules; + config._module.args.pkgs = lib.mkDefault pkgs; config._module.check = check; + config.nixpkgs.system = mkDefault pkgs.system; }; rawModule = lib.evalModules { diff --git a/modules/misc/news.nix b/modules/misc/news.nix index b17b04542..dc546ed06 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -410,6 +410,18 @@ in automatically whenever you do a switch. ''; } + + { + time = "2017-10-23T23:26:17+00:00"; + message = '' + A new module is available: 'nixpkgs'. + + Like the identically named NixOS module, this allows you to + set Nixpkgs options and define Nixpkgs overlays. Note, the + changes you make here will not automatically apply to Nix + commands run outside Home Manager. + ''; + } ]; }; } diff --git a/modules/misc/nixpkgs.nix b/modules/misc/nixpkgs.nix new file mode 100644 index 000000000..d86e2fd1c --- /dev/null +++ b/modules/misc/nixpkgs.nix @@ -0,0 +1,119 @@ +# Adapted from Nixpkgs. + +{ config, lib, pkgs, ... }: + +with lib; + +let + + isConfig = x: + builtins.isAttrs x || builtins.isFunction x; + + optCall = f: x: + if builtins.isFunction f + then f x + else f; + + mergeConfig = lhs_: rhs_: + let + lhs = optCall lhs_ { inherit pkgs; }; + rhs = optCall rhs_ { inherit pkgs; }; + in + lhs // rhs // + optionalAttrs (lhs ? packageOverrides) { + packageOverrides = pkgs: + optCall lhs.packageOverrides pkgs // + optCall (attrByPath ["packageOverrides"] ({}) rhs) pkgs; + } // + optionalAttrs (lhs ? perlPackageOverrides) { + perlPackageOverrides = pkgs: + optCall lhs.perlPackageOverrides pkgs // + optCall (attrByPath ["perlPackageOverrides"] ({}) rhs) pkgs; + }; + + configType = mkOptionType { + name = "nixpkgs-config"; + description = "nixpkgs config"; + check = traceValIfNot isConfig; + merge = args: fold (def: mergeConfig def.value) {}; + }; + + overlayType = mkOptionType { + name = "nixpkgs-overlay"; + description = "nixpkgs overlay"; + check = builtins.isFunction; + merge = lib.mergeOneOption; + }; + + _pkgs = import ( + filterAttrs (n: v: v != null) config.nixpkgs + ); + +in + +{ + options.nixpkgs = { + config = mkOption { + default = null; + example = { allowBroken = true; }; + type = types.nullOr configType; + description = '' + The configuration of the Nix Packages collection. (For + details, see the Nixpkgs documentation.) It allows you to set + package configuration options. + + If null, then configuration is taken from + the fallback location, for example, + ~/.config/nixpkgs/config.nix. + ''; + }; + + overlays = mkOption { + default = null; + example = literalExample + '' + [ (self: super: { + openssh = super.openssh.override { + hpnSupport = true; + withKerberos = true; + kerberos = self.libkrb5; + }; + }; + ) ] + ''; + type = types.nullOr (types.listOf overlayType); + description = '' + List of overlays to use with the Nix Packages collection. (For + details, see the Nixpkgs documentation.) It allows you to + override packages globally. This is a function that takes as + an argument the original Nixpkgs. The + first argument should be used for finding dependencies, and + the second should be used for overriding recipes. + + If null, then the overlays are taken from + the fallback location, for example, + ~/.config/nixpkgs/overlays. + ''; + }; + + system = mkOption { + type = types.str; + example = "i686-linux"; + internal = true; + description = '' + Specifies the Nix platform type for which the user environment + should be built. If unset, it defaults to the platform type of + your host system. Specifying this option is useful when doing + distributed multi-platform deployment, or when building + virtual machines. + ''; + }; + }; + + config = { + _module.args = { + pkgs = _pkgs; + pkgs_i686 = _pkgs.pkgsi686Linux; + }; + }; +}