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 10:48:43 +01:00
outputs = { self }:
2019-06-19 11:43:26 +01:00
let
2023-10-31 12:38:29 +00:00
libVersionInfoOverlay = import ./lib/flake-version-info.nix self ;
2023-09-06 14:08:46 +01:00
lib = ( import ./lib ) . extend libVersionInfoOverlay ;
2022-11-08 18:38:35 +00:00
forAllSystems = lib . genAttrs lib . systems . flakeExposed ;
2024-06-07 05:18:15 +01:00
jobs = forAllSystems ( system : import ./pkgs/top-level/release.nix {
nixpkgs = self ;
inherit system ;
} ) ;
2019-06-19 11:43:26 +01:00
in
2019-02-11 11:27:17 +00:00
{
2024-09-20 11:47:13 +01: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)
* /
2020-07-23 16:36:45 +01:00
lib = lib . extend ( final : prev : {
2022-01-02 13:11:21 +00:00
2024-09-20 11:47:13 +01: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 11:47:13 +01: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 10:38:30 +01:00
import ./nixos/lib/eval-config.nix (
2023-12-13 09:20:58 +00:00
{
lib = final ;
2022-06-09 10:38:30 +01: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 10:38:30 +01:00
) ;
2020-07-23 16:36:45 +01:00
} ) ;
2019-02-11 11:27:17 +00:00
2024-06-07 05:20:49 +01:00
checks = forAllSystems ( system : {
tarball = jobs . ${ system } . tarball ;
2024-10-16 16:34:44 +01: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
# Exclude armv6l-linux due to "cannot bootstrap GHC on this platform ('armv6l-linux' with libc 'defaultLibc')"
&& system != " a r m v 6 l - l i n u x "
# Exclude riscv64-linux due to "cannot bootstrap GHC on this platform ('riscv64-linux' with libc 'defaultLibc')"
&& system != " r i s c v 6 4 - l i n u x "
)
{
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 05:20:49 +01: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 12:05:28 +01: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 05:20:49 +01:00
} ) ;
2019-05-29 20:21:56 +01:00
2019-06-19 11:43:26 +01:00
htmlDocs = {
2024-06-07 05:20:49 +01:00
nixpkgsManual = builtins . mapAttrs ( _ : jobSet : jobSet . manual ) jobs ;
2019-06-19 11:43:26 +01:00
nixosManual = ( import ./nixos/release-small.nix {
2019-08-30 10:48:43 +01:00
nixpkgs = self ;
2024-06-07 05:20:49 +01:00
} ) . nixos . manual ;
2019-06-19 11:43:26 +01:00
} ;
2024-10-16 16:46:44 +01: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 03:25:59 +01:00
2024-09-20 11:47:13 +01: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 18:01:23 +01:00
2024-09-20 11:47:13 +01: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 18:01:23 +01:00
nixosModules = {
2022-10-06 15:52:38 +01:00
notDetected = ./nixos/modules/installer/scan/not-detected.nix ;
2023-05-07 14:37:28 +01:00
2024-09-20 11:47:13 +01:00
/* *
2023-05-07 14:37:28 +01: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 18:01:23 +01:00
} ;
2019-02-11 11:27:17 +00:00
} ;
}