aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-03-11 16:34:46 +0100
committerEelco Dolstra <edolstra@gmail.com>2020-03-11 17:04:51 +0100
commite188fe7c6d4b243ed62ca3d0e47abfd0eec95f79 (patch)
tree4fbb0a36dd2a295930abe9c1a3722350de48926e /src
parent35f66517350402792aded1b677a47526e23e78ef (diff)
Move call-flake.nix into libexpr
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/flake/call-flake.nix22
-rw-r--r--src/libexpr/flake/flake.cc11
-rw-r--r--src/libexpr/local.mk2
-rw-r--r--src/libstore/local-store.cc2
4 files changed, 34 insertions, 3 deletions
diff --git a/src/libexpr/flake/call-flake.nix b/src/libexpr/flake/call-flake.nix
new file mode 100644
index 000000000..c59a0c75f
--- /dev/null
+++ b/src/libexpr/flake/call-flake.nix
@@ -0,0 +1,22 @@
+locks: rootSrc: rootSubdir:
+
+let
+
+ callFlake = sourceInfo: subdir: locks:
+ let
+ flake = import (sourceInfo + "/" + subdir + "/flake.nix");
+
+ inputs = builtins.mapAttrs (n: v:
+ if v.flake or true
+ then callFlake (fetchTree (removeAttrs v.locked ["dir"])) (v.locked.dir or "") v.inputs
+ else fetchTree v.locked) locks;
+
+ outputs = flake.outputs (inputs // { self = result; });
+
+ result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; };
+ in
+ assert flake.edition == 201909;
+
+ result;
+
+in callFlake rootSrc rootSubdir (builtins.fromJSON locks).inputs
diff --git a/src/libexpr/flake/flake.cc b/src/libexpr/flake/flake.cc
index 9d8a5f950..249ceba6c 100644
--- a/src/libexpr/flake/flake.cc
+++ b/src/libexpr/flake/flake.cc
@@ -623,7 +623,6 @@ void callFlake(EvalState & state,
const LockedInputs & lockedInputs,
Value & vRes)
{
- auto vCallFlake = state.allocValue();
auto vLocks = state.allocValue();
auto vRootSrc = state.allocValue();
auto vRootSubdir = state.allocValue();
@@ -636,7 +635,15 @@ void callFlake(EvalState & state,
mkString(*vRootSubdir, flake.lockedRef.subdir);
- state.evalFile(canonPath(settings.nixDataDir + "/nix/corepkgs/call-flake.nix", true), *vCallFlake);
+ static Value * vCallFlake = nullptr;
+
+ if (!vCallFlake) {
+ vCallFlake = state.allocValue();
+ state.eval(state.parseExprFromString(
+ #include "call-flake.nix.gen.hh"
+ , "/"), *vCallFlake);
+ }
+
state.callFunction(*vCallFlake, *vLocks, *vTmp1, noPos);
state.callFunction(*vTmp1, *vRootSrc, *vTmp2, noPos);
state.callFunction(*vTmp2, *vRootSubdir, vRes, noPos);
diff --git a/src/libexpr/local.mk b/src/libexpr/local.mk
index d1982927c..eb7243b29 100644
--- a/src/libexpr/local.mk
+++ b/src/libexpr/local.mk
@@ -41,3 +41,5 @@ $(foreach i, $(wildcard src/libexpr/flake/*.hh), \
$(eval $(call install-file-in, $(i), $(includedir)/nix/flake, 0644)))
$(d)/primops.cc: $(d)/imported-drv-to-derivation.nix.gen.hh
+
+$(d)/flake/flake.cc: $(d)/flake/call-flake.nix.gen.hh
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index e00556645..2025af33e 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -343,7 +343,7 @@ void LocalStore::openDB(State & state, bool create)
/* Initialise the database schema, if necessary. */
if (create) {
- const char * schema =
+ static const char schema[] =
#include "schema.sql.gen.hh"
;
db.exec(schema);