diff --git a/lib/default.nix b/lib/default.nix index e919509e724a..22eb5440c282 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -11,6 +11,9 @@ let callLibs = file: import file { lib = self; }; in { + # interacting with flakes + flakes = callLibs ./flakes.nix; + # often used, or depending on very little trivial = callLibs ./trivial.nix; fixedPoints = callLibs ./fixed-points.nix; @@ -59,6 +62,7 @@ let # linux kernel configuration kernel = callLibs ./kernel.nix; + inherit (self.flakes) callLocklessFlake; inherit (builtins) add addErrorContext attrNames concatLists deepSeq elem elemAt filter genericClosure genList getAttr hasAttr head isAttrs isBool isInt isList isString length diff --git a/lib/flakes.nix b/lib/flakes.nix new file mode 100644 index 000000000000..4dc027b6c9b3 --- /dev/null +++ b/lib/flakes.nix @@ -0,0 +1,22 @@ +{ lib }: + +rec { + + /* imports a flake.nix without acknowledging its lock file, useful for + referencing subflakes from a parent flake. The second argument allows + specifying the inputs of this flake. + + Example: + callLocklessFlake { + path = ./directoryContainingFlake; + inputs = { inherit nixpkgs; }; + } + */ + callLocklessFlake = { path, inputs ? { } }: + let + self = { outPath = path; } // + ((import (path + "/flake.nix")).outputs (inputs // { self = self; })); + in + self; + +} diff --git a/lib/tests/flakes/subflakeTest/flake.nix b/lib/tests/flakes/subflakeTest/flake.nix new file mode 100644 index 000000000000..3a8edd5e8c50 --- /dev/null +++ b/lib/tests/flakes/subflakeTest/flake.nix @@ -0,0 +1,8 @@ +{ + outputs = { self, subflake, callLocklessFlake }: rec { + x = (callLocklessFlake { + path = subflake; + inputs = {}; + }).subflakeOutput; + }; +} diff --git a/lib/tests/flakes/subflakeTest/subflake/flake.nix b/lib/tests/flakes/subflakeTest/subflake/flake.nix new file mode 100644 index 000000000000..41566b52090c --- /dev/null +++ b/lib/tests/flakes/subflakeTest/subflake/flake.nix @@ -0,0 +1,5 @@ +{ + outputs = { self }: { + subflakeOutput = 1; + }; +} diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index c5d1d431677a..f7e62a71eee1 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -22,6 +22,15 @@ in runTests { +# FLAKES + + testCallLocklessFlake = { + expr = callLocklessFlake { + path = ./flakes/subflakeTest; + inputs = { subflake = ./flakes/subflakeTest/subflake; inherit callLocklessFlake; }; + }; + expected = { x = 1; outPath = ./flakes/subflakeTest; }; + }; # TRIVIAL