2020-02-10 15:36:53 +00:00
# Experimental flake interface to Nixpkgs.
# See https://github.com/NixOS/rfcs/pull/49 for details.
2019-02-11 11:27:17 +00:00
{
description = " A c o l l e c t i o n o f p a c k a g e s f o r t h e N i x p a c k a g e m a n a g e r " ;
2019-08-30 09:48:43 +00:00
outputs = { self }:
2019-06-19 10:43:26 +00:00
let
2023-10-31 12:38:29 +00:00
libVersionInfoOverlay = import ./lib/flake-version-info.nix self ;
2023-09-06 13:08:46 +00:00
lib = ( import ./lib ) . extend libVersionInfoOverlay ;
2022-11-08 18:38:35 +00:00
forAllSystems = lib . genAttrs lib . systems . flakeExposed ;
2024-06-07 04:18:15 +00:00
jobs = forAllSystems ( system : import ./pkgs/top-level/release.nix {
nixpkgs = self ;
inherit system ;
} ) ;
2019-06-19 10:43:26 +00:00
in
2019-02-11 11:27:17 +00:00
{
2024-09-20 10:47:13 +00:00
/* *
` nixpkgs . lib ` is a combination of the [ Nixpkgs library ] ( https://nixos.org/manual/nixpkgs/unstable/ #id-1.4), and other attributes
that are _not_ part of the Nixpkgs library , but part of the Nixpkgs flake :
- ` lib . nixosSystem ` for creating a NixOS system configuration
- ` lib . nixos ` for other NixOS-provided functionality , such as [ ` runTest ` ] ( https://nixos.org/manual/nixos/unstable/ #sec-call-nixos-test-outside-nixos)
* /
lib: Discourage use of extend
It creates interoperability issues that can not be reconciled by
`lib` or maintainers of projects that use the Nixpkgs library.
Occasionally, end users may be able to solve the problems they run
into, but most are not prepared to deal with this set of problems,
nor should they be.
Typical conflict:
- User wants to propagate their own lib, because it has some function
they like to use throughout their projects
- Project maintainer requires the project's lib to be used
No sane language uses a single namespace for combining all the things.
(Arguably not even C with its extensive use of prefixing)
Meanwhile, in Nix, all symbols are first class variables. We don't even
have the concept of a global top-level namespace to pour everything into.
With `lib` you can try to approximate that, I get the appeal of its
apparent simplicity, but since `lib` can't be global, we just don't even
get that apparent simplicity.
I apologize for not offering concrete solutions to this in the text.
The manuals are limited to reference documentation.
Alternatives - of which we have multiple - are best provided in
task-oriented documentation, e.g. nix.dev.
2025-01-23 07:27:29 +00:00
# DON'T USE lib.extend TO ADD NEW FUNCTIONALITY.
# THIS WAS A MISTAKE. See the warning in lib/default.nix.
2020-07-23 15:36:45 +00:00
lib = lib . extend ( final : prev : {
2022-01-02 13:11:21 +00:00
2024-09-20 10:47:13 +00:00
/* *
Other NixOS-provided functionality , such as [ ` runTest ` ] ( https://nixos.org/manual/nixos/unstable/ #sec-call-nixos-test-outside-nixos).
See also ` lib . nixosSystem ` .
* /
2022-01-02 13:11:21 +00:00
nixos = import ./nixos/lib { lib = final ; } ;
2024-09-20 10:47:13 +00:00
/* *
Create a NixOS system configuration .
Example :
lib . nixosSystem {
modules = [ ./configuration.nix ] ;
}
Inputs :
- ` modules ` ( list of paths or inline modules ) : The NixOS modules to include in the system configuration .
- ` specialArgs ` ( attribute set ) : Extra arguments to pass to all modules , that are available in ` imports ` but can not be extended or overridden by the ` modules ` .
- ` modulesLocation ` ( path ) : A default location for modules that aren't passed by path , used for error messages .
Legacy inputs :
- ` system ` : Legacy alias for ` nixpkgs . hostPlatform ` , but this is already set in the generated ` hardware-configuration . nix ` , included by ` configuration . nix ` .
- ` pkgs ` : Legacy alias for ` nixpkgs . pkgs ` ; use ` nixpkgs . pkgs ` and ` nixosModules . readOnlyPkgs ` instead .
* /
2021-12-17 14:30:32 +00:00
nixosSystem = args :
2022-06-09 09:38:30 +00:00
import ./nixos/lib/eval-config.nix (
2023-12-13 09:20:58 +00:00
{
lib = final ;
2022-06-09 09:38:30 +00:00
# Allow system to be set modularly in nixpkgs.system.
# We set it to null, to remove the "legacy" entrypoint's
# non-hermetic default.
system = null ;
2024-01-03 16:41:57 +00:00
modules = args . modules ++ [
# This module is injected here since it exposes the nixpkgs self-path in as
# constrained of contexts as possible to avoid more things depending on it and
# introducing unnecessary potential fragility to changes in flakes itself.
#
# See: failed attempt to make pkgs.path not copy when using flakes:
# https://github.com/NixOS/nixpkgs/pull/153594#issuecomment-1023287913
( { config , pkgs , lib , . . . }: {
config . nixpkgs . flake . source = self . outPath ;
} )
] ;
} // builtins . removeAttrs args [ " m o d u l e s " ]
2022-06-09 09:38:30 +00:00
) ;
2020-07-23 15:36:45 +00:00
} ) ;
2019-02-11 11:27:17 +00:00
2024-06-07 04:20:49 +00:00
checks = forAllSystems ( system : {
tarball = jobs . ${ system } . tarball ;
2024-10-16 15:34:44 +00:00
} // lib . optionalAttrs
(
self . legacyPackages . ${ system } . stdenv . hostPlatform . isLinux
# Exclude power64 due to "libressl is not available on the requested hostPlatform" with hostPlatform being power64
&& ! self . legacyPackages . ${ system } . targetPlatform . isPower64
)
{
2023-12-29 00:08:45 +00:00
# Test that ensures that the nixosSystem function can accept a lib argument
2023-12-30 10:25:54 +00:00
# Note: prefer not to extend or modify `lib`, especially if you want to share reusable modules
# alternatives include: `import` a file, or put a custom library in an option or in `_module.args.<libname>`
2023-12-29 00:08:45 +00:00
nixosSystemAcceptsLib = ( self . lib . nixosSystem {
2024-06-07 04:20:49 +00:00
pkgs = self . legacyPackages . ${ system } ;
2023-12-29 00:08:45 +00:00
lib = self . lib . extend ( final : prev : {
ifThisFunctionIsMissingTheTestFails = final . id ;
} ) ;
modules = [
./nixos/modules/profiles/minimal.nix
( { lib , . . . }: lib . ifThisFunctionIsMissingTheTestFails {
# Define a minimal config without eval warnings
nixpkgs . hostPlatform = " x 8 6 _ 6 4 - l i n u x " ;
boot . loader . grub . enable = false ;
fileSystems . " / " . device = " n o d e v " ;
2023-12-30 10:25:54 +00:00
# See https://search.nixos.org/options?show=system.stateVersion&query=stateversion
2024-09-08 11:05:28 +00:00
system . stateVersion = lib . trivial . release ; # DON'T do this in real configs!
2023-12-29 00:08:45 +00:00
} )
] ;
} ) . config . system . build . toplevel ;
2024-06-07 04:20:49 +00:00
} ) ;
2019-05-29 19:21:56 +00:00
2019-06-19 10:43:26 +00:00
htmlDocs = {
2024-06-07 04:20:49 +00:00
nixpkgsManual = builtins . mapAttrs ( _ : jobSet : jobSet . manual ) jobs ;
2019-06-19 10:43:26 +00:00
nixosManual = ( import ./nixos/release-small.nix {
2019-08-30 09:48:43 +00:00
nixpkgs = self ;
2024-06-07 04:20:49 +00:00
} ) . nixos . manual ;
2019-06-19 10:43:26 +00:00
} ;
2024-10-16 15:46:44 +00:00
devShells = forAllSystems ( system :
{ } // lib . optionalAttrs
(
# Exclude armv6l-linux because "Package ‘ ghc-9.6.6’ in .../pkgs/development/compilers/ghc/common-hadrian.nix:579 is not available on the requested hostPlatform"
system != " a r m v 6 l - l i n u x "
# Exclude riscv64-linux because "Package ‘ ghc-9.6.6’ in .../pkgs/development/compilers/ghc/common-hadrian.nix:579 is not available on the requested hostPlatform"
&& system != " r i s c v 6 4 - l i n u x "
# Exclude FreeBSD because "Package ‘ ghc-9.6.6’ in .../pkgs/development/compilers/ghc/common-hadrian.nix:579 is not available on the requested hostPlatform"
&& ! self . legacyPackages . ${ system } . stdenv . hostPlatform . isFreeBSD
)
{
/* * A s h e l l t o g e t t o o l i n g f o r N i x p k g s d e v e l o p m e n t . S e e n i x p k g s / s h e l l . n i x . */
default = import ./shell.nix { inherit system ; } ;
} ) ;
2024-08-10 02:25:59 +00:00
2024-09-20 10:47:13 +00:00
/* *
A nested structure of [ packages ] ( https://nix.dev/manual/nix/latest/glossary #package-attribute-set) and other values.
The " l e g a c y " in ` legacyPackages ` doesn't imply that the packages exposed
through this attribute are " l e g a c y " packages . Instead , ` legacyPackages `
is used here as a substitute attribute name for ` packages ` . The problem
with ` packages ` is that it makes operations like ` nix flake show
nixpkgs ` unusably slow due to the sheer number of packages the Nix CLI
needs to evaluate . But when the Nix CLI sees a ` legacyPackages `
attribute it displays ` omitted ` instead of evaluating all packages ,
which keeps ` nix flake show ` on Nixpkgs reasonably fast , though less
information rich .
The reason why finding the tree structure of ` legacyPackages ` is slow ,
is that for each attribute in the tree , it is necessary to check whether
the attribute value is a package or a package set that needs further
evaluation . Evaluating the attribute value tends to require a significant
amount of computation , even considering lazy evaluation .
* /
2023-12-09 10:57:56 +00:00
legacyPackages = forAllSystems ( system :
2023-12-10 12:25:14 +00:00
( import ./. { inherit system ; } ) . extend ( final : prev : {
lib = prev . lib . extend libVersionInfoOverlay ;
} )
2023-12-09 10:57:56 +00:00
) ;
2019-09-13 17:01:23 +00:00
2024-09-20 10:47:13 +00:00
/* *
Optional modules that can be imported into a NixOS configuration .
Example :
# flake.nix
outputs = { nixpkgs , . . . }: {
nixosConfigurations = {
foo = nixpkgs . lib . nixosSystem {
modules = [
./foo/configuration.nix
nixpkgs . nixosModules . notDetected
] ;
} ;
} ;
} ;
* /
2019-09-13 17:01:23 +00:00
nixosModules = {
2022-10-06 14:52:38 +00:00
notDetected = ./nixos/modules/installer/scan/not-detected.nix ;
2023-05-07 13:37:28 +00:00
2024-09-20 10:47:13 +00:00
/* *
2023-05-07 13:37:28 +00:00
Make the ` nixpkgs . * ` configuration read-only . Guarantees that ` pkgs `
is the way you initialize it .
Example :
{
imports = [ nixpkgs . nixosModules . readOnlyPkgs ] ;
nixpkgs . pkgs = nixpkgs . legacyPackages . x86_64-linux ;
}
* /
readOnlyPkgs = ./nixos/modules/misc/nixpkgs/read-only.nix ;
2019-09-13 17:01:23 +00:00
} ;
2019-02-11 11:27:17 +00:00
} ;
}