diff --git a/flake.nix b/flake.nix index fa00bffcdf92..f16bc7d05fce 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,8 @@ nixpkgs = self; }; - lib = import ./lib; + libVersionInfoOverlay = import ./lib/flake-version-info.nix self; + lib = (import ./lib).extend libVersionInfoOverlay; forAllSystems = lib.genAttrs lib.systems.flakeExposed; in @@ -20,13 +21,7 @@ nixosSystem = args: import ./nixos/lib/eval-config.nix ( - args // { - modules = args.modules ++ [{ - system.nixos.versionSuffix = - ".${final.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}"; - system.nixos.revision = final.mkIf (self ? rev) self.rev; - }]; - } // lib.optionalAttrs (! args?system) { + args // { inherit (self) lib; } // lib.optionalAttrs (! args?system) { # Allow system to be set modularly in nixpkgs.system. # We set it to null, to remove the "legacy" entrypoint's # non-hermetic default. @@ -53,7 +48,11 @@ # attribute it displays `omitted` instead of evaluating all packages, # which keeps `nix flake show` on Nixpkgs reasonably fast, though less # information rich. - legacyPackages = forAllSystems (system: import ./. { inherit system; }); + legacyPackages = forAllSystems (system: + (import ./. { inherit system; }).extend (final: prev: { + lib = prev.lib.extend libVersionInfoOverlay; + }) + ); nixosModules = { notDetected = ./nixos/modules/installer/scan/not-detected.nix; diff --git a/lib/flake-version-info.nix b/lib/flake-version-info.nix new file mode 100644 index 000000000000..de15be94bee8 --- /dev/null +++ b/lib/flake-version-info.nix @@ -0,0 +1,20 @@ +# This function produces a lib overlay to be used by the nixpkgs +# & nixpkgs/lib flakes to provide meaningful values for +# `lib.trivial.version` et al.. +# +# Internal and subject to change, don't use this anywhere else! +# Instead, consider using a public interface, such as this flake here +# in this directory, `lib/`, or use the nixpkgs flake, which applies +# this logic for you in its `lib` output attribute. + +self: # from the flake + +finalLib: prevLib: # lib overlay + +{ + trivial = prevLib.trivial // { + versionSuffix = + ".${finalLib.substring 0 8 (self.lastModifiedDate or "19700101")}.${self.shortRev or "dirty"}"; + revisionWithDefault = default: self.rev or default; + }; +} diff --git a/lib/flake.nix b/lib/flake.nix index 0b5e54d547c5..ca09ed5f4a42 100644 --- a/lib/flake.nix +++ b/lib/flake.nix @@ -1,5 +1,10 @@ { description = "Library of low-level helper functions for nix expressions."; - outputs = { self }: { lib = import ./.; }; + outputs = { self }: + let + lib0 = import ./.; + in { + lib = lib0.extend (import ./flake-version-info.nix self); + }; } diff --git a/lib/trivial.nix b/lib/trivial.nix index caff77190fde..b3fb54a7add4 100644 --- a/lib/trivial.nix +++ b/lib/trivial.nix @@ -1,6 +1,18 @@ { lib }: -rec { +let + inherit (lib.trivial) + isFunction + isInt + functionArgs + pathExists + release + setFunctionArgs + toBaseDigits + version + versionSuffix + warn; +in { ## Simple (higher order) functions @@ -439,7 +451,7 @@ rec { */ functionArgs = f: if f ? __functor - then f.__functionArgs or (lib.functionArgs (f.__functor f)) + then f.__functionArgs or (functionArgs (f.__functor f)) else builtins.functionArgs f; /* Check whether something is a function or something