aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/misc/nixpkgs.nix
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/modules/misc/nixpkgs.nix')
-rw-r--r--home-manager/modules/misc/nixpkgs.nix152
1 files changed, 152 insertions, 0 deletions
diff --git a/home-manager/modules/misc/nixpkgs.nix b/home-manager/modules/misc/nixpkgs.nix
new file mode 100644
index 00000000000..e7c0d8f25ea
--- /dev/null
+++ b/home-manager/modules/misc/nixpkgs.nix
@@ -0,0 +1,152 @@
+# 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 = x:
+ let traceXIfNot = c:
+ if c x then true
+ else lib.traceSeqN 1 x false;
+ in traceXIfNot isConfig;
+ merge = args: fold (def: mergeConfig def.value) {};
+ };
+
+ overlayType = mkOptionType {
+ name = "nixpkgs-overlay";
+ description = "nixpkgs overlay";
+ check = builtins.isFunction;
+ merge = lib.mergeOneOption;
+ };
+
+ _pkgs = import <nixpkgs> (
+ 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.
+
+ </para><para>
+
+ If <literal>null</literal>, then configuration is taken from
+ the fallback location, for example,
+ <filename>~/.config/nixpkgs/config.nix</filename>.
+
+ </para><para>
+
+ Note, this option will not apply outside your Home Manager
+ configuration like when installing manually through
+ <command>nix-env</command>. If you want to apply it both
+ inside and outside Home Manager you can put it in a separate
+ file and include something like
+
+ <programlisting language="nix">
+ nixpkgs.config = import ./nixpkgs-config.nix;
+ xdg.configFile."nixpkgs/config.nix".source = ./nixpkgs-config.nix;
+ </programlisting>
+
+ in your Home Manager configuration.
+ '';
+ };
+
+ 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 <emphasis>original</emphasis> Nixpkgs. The
+ first argument should be used for finding dependencies, and
+ the second should be used for overriding recipes.
+
+ </para><para>
+
+ If <literal>null</literal>, then the overlays are taken from
+ the fallback location, for example,
+ <filename>~/.config/nixpkgs/overlays</filename>.
+
+ </para><para>
+
+ Like <varname>nixpkgs.config</varname> this option only
+ applies within the Home Manager configuration. See
+ <varname>nixpkgs.config</varname> for a suggested setup that
+ works both internally and externally.
+ '';
+ };
+
+ 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 =
+ if _pkgs.stdenv.isLinux && _pkgs.stdenv.hostPlatform.isx86
+ then _pkgs.pkgsi686Linux
+ else { };
+ };
+ };
+}