aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/eval.hh4
-rw-r--r--src/libexpr/imported-drv-to-derivation.nix21
-rw-r--r--src/libexpr/local.mk2
-rw-r--r--src/libexpr/parser.y6
-rw-r--r--src/libexpr/primops.cc15
-rw-r--r--src/nix-env/buildenv.nix25
-rw-r--r--src/nix-env/user-env.cc4
-rw-r--r--src/nix/local.mk2
8 files changed, 69 insertions, 10 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index cc212258d..f6c96bd68 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -146,8 +146,8 @@ public:
Expr * parseExprFromFile(const Path & path, StaticEnv & staticEnv);
/* Parse a Nix expression from the specified string. */
- Expr * parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv);
- Expr * parseExprFromString(const string & s, const Path & basePath);
+ Expr * parseExprFromString(std::string_view s, const Path & basePath, StaticEnv & staticEnv);
+ Expr * parseExprFromString(std::string_view s, const Path & basePath);
Expr * parseStdin();
diff --git a/src/libexpr/imported-drv-to-derivation.nix b/src/libexpr/imported-drv-to-derivation.nix
new file mode 100644
index 000000000..eab8b050e
--- /dev/null
+++ b/src/libexpr/imported-drv-to-derivation.nix
@@ -0,0 +1,21 @@
+attrs @ { drvPath, outputs, name, ... }:
+
+let
+
+ commonAttrs = (builtins.listToAttrs outputsList) //
+ { all = map (x: x.value) outputsList;
+ inherit drvPath name;
+ type = "derivation";
+ };
+
+ outputToAttrListElement = outputName:
+ { name = outputName;
+ value = commonAttrs // {
+ outPath = builtins.getAttr outputName attrs;
+ inherit outputName;
+ };
+ };
+
+ outputsList = map outputToAttrListElement outputs;
+
+in (builtins.head outputsList).value
diff --git a/src/libexpr/local.mk b/src/libexpr/local.mk
index 6acb0150c..d1982927c 100644
--- a/src/libexpr/local.mk
+++ b/src/libexpr/local.mk
@@ -39,3 +39,5 @@ $(eval $(call install-file-in, $(d)/nix-expr.pc, $(prefix)/lib/pkgconfig, 0644))
$(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
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index afa1fd439..9c769e803 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -611,13 +611,13 @@ Expr * EvalState::parseExprFromFile(const Path & path, StaticEnv & staticEnv)
}
-Expr * EvalState::parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv)
+Expr * EvalState::parseExprFromString(std::string_view s, const Path & basePath, StaticEnv & staticEnv)
{
- return parse(s.c_str(), "(string)", basePath, staticEnv);
+ return parse(s.data(), "(string)", basePath, staticEnv);
}
-Expr * EvalState::parseExprFromString(const string & s, const Path & basePath)
+Expr * EvalState::parseExprFromString(std::string_view s, const Path & basePath)
{
return parseExprFromString(s, basePath, staticBaseEnv);
}
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 083caf04a..b0f8b4414 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -122,10 +122,17 @@ static void prim_scopedImport(EvalState & state, const Pos & pos, Value * * args
mkString(*(outputsVal->listElems()[outputs_index++]), o.first);
}
w.attrs->sort();
- Value fun;
- state.evalFile(settings.nixDataDir + "/nix/corepkgs/imported-drv-to-derivation.nix", fun);
- state.forceFunction(fun, pos);
- mkApp(v, fun, w);
+
+ static Value * fun = nullptr;
+ if (!fun) {
+ fun = state.allocValue();
+ state.eval(state.parseExprFromString(
+ #include "imported-drv-to-derivation.nix.gen.hh"
+ , "/"), *fun);
+ }
+
+ state.forceFunction(*fun, pos);
+ mkApp(v, *fun, w);
state.forceAttrs(v, pos);
} else {
state.forceAttrs(*args[0]);
diff --git a/src/nix-env/buildenv.nix b/src/nix-env/buildenv.nix
new file mode 100644
index 000000000..0bac4c44b
--- /dev/null
+++ b/src/nix-env/buildenv.nix
@@ -0,0 +1,25 @@
+{ derivations, manifest }:
+
+derivation {
+ name = "user-environment";
+ system = "builtin";
+ builder = "builtin:buildenv";
+
+ inherit manifest;
+
+ # !!! grmbl, need structured data for passing this in a clean way.
+ derivations =
+ map (d:
+ [ (d.meta.active or "true")
+ (d.meta.priority or 5)
+ (builtins.length d.outputs)
+ ] ++ map (output: builtins.getAttr output d) d.outputs)
+ derivations;
+
+ # Building user environments remotely just causes huge amounts of
+ # network traffic, so don't do that.
+ preferLocalBuild = true;
+
+ # Also don't bother substituting.
+ allowSubstitutes = false;
+}
diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc
index 8e4ecda4e..717431b7a 100644
--- a/src/nix-env/user-env.cc
+++ b/src/nix-env/user-env.cc
@@ -106,7 +106,9 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
/* Get the environment builder expression. */
Value envBuilder;
- state.evalFile(state.findFile("nix/buildenv.nix"), envBuilder);
+ state.eval(state.parseExprFromString(
+ #include "buildenv.nix.gen.hh"
+ , "/"), envBuilder);
/* Construct a Nix expression that calls the user environment
builder with the manifest as argument. */
diff --git a/src/nix/local.mk b/src/nix/local.mk
index fff101a63..64eb8ef7d 100644
--- a/src/nix/local.mk
+++ b/src/nix/local.mk
@@ -24,4 +24,6 @@ $(foreach name, \
$(eval $(call install-symlink, nix, $(bindir)/$(name))))
$(eval $(call install-symlink, $(bindir)/nix, $(libexecdir)/nix/build-remote))
+src/nix-env/nix-env.cc: src/nix-env/buildenv.nix.gen.hh
+
$(d)/flake.cc: $(d)/flake-template.nix.gen.hh