aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Burdette <bburdette@gmail.com>2020-11-09 16:48:35 -0700
committerBen Burdette <bburdette@gmail.com>2020-11-09 16:48:35 -0700
commit107c91f5fe6248548c292d28d0ad53c0de7ceeba (patch)
treeaf7eab1f21e0a589619c467201c717ab506c209f
parentdc7d1322efbaa176bff38b1ad15eab6e11c83340 (diff)
auto-call error
-rw-r--r--src/libexpr/eval.cc23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index d6366050c..e52e8dcf2 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1370,7 +1370,28 @@ void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res)
if (j != args.end()) {
actualArgs->attrs->push_back(*j);
} else if (!i.def) {
- throwTypeError("cannot auto-call a function that has an argument without a default value ('%1%')", i.name);
+ throwUndefinedVarError(R"(cannot auto-call a function that has an argument without a default value ('%1%')
+ An 'auto-call' is when a nix expression is evaluated without any external arguments. If that
+ nix expression is a function, and that function's arguments all have default values, then all is well.
+
+ But if the function arguments don't have default values, then evaluation fails.
+
+ The classic case for this error is evaluating a nix file with nix-build that expects to be evaluated by callPackage.
+ # in 'callPackage' format: expression is a function that takes an argument 'stdenv'.
+ # callPackage would implicitly pull 'stdenv' from nixpkgs, then call this function.
+ { stdenv }:
+ stdenv.mkDerivation {
+ ...
+
+ # in 'auto-call' format: nixpkgs is imported explicitly, and used directly.
+ let
+ nixpkgs = import <nixpkgs> {};
+ in
+ nixpkgs.stdenv.mkDerivation {
+ ...
+
+ See this nix pill for more information re callPackage format:
+ https://nixos.org/guides/nix-pills/callpackage-design-pattern.html)", i.name);
}
}
}