Skip to content

Commit

Permalink
nix-env: respect meta.outputsToInstall
Browse files Browse the repository at this point in the history
  • Loading branch information
vcunat committed Feb 23, 2016
1 parent 8f71bc3 commit 03cbb9a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 7 deletions.
4 changes: 4 additions & 0 deletions doc/manual/command-ref/nix-env.xml
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,10 @@ number of possible ways:
linkend="rsec-nix-store-realise">realised</link> and
installed.</para></listitem>

<listitem><para>By default all outputs are installed for each derivation.
That can be reduced by setting <literal>meta.outputsToInstall</literal>.
</para></listitem> <!-- TODO: link nixpkgs docs on the ability to override those. -->

</itemizedlist>

</para>
Expand Down
24 changes: 20 additions & 4 deletions src/libexpr/get-drvs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ string DrvInfo::queryOutPath()
}


DrvInfo::Outputs DrvInfo::queryOutputs()
DrvInfo::Outputs DrvInfo::queryOutputs(bool onlyOutputsToInstall)
{
if (outputs.empty()) {
/* Get the ‘outputs’ list. */
Expand All @@ -55,7 +55,23 @@ DrvInfo::Outputs DrvInfo::queryOutputs()
} else
outputs["out"] = queryOutPath();
}
return outputs;
if (!onlyOutputsToInstall || !attrs)
return outputs;

/* Check for `meta.outputsToInstall` and return `outputs` reduced to that. */
const Value * outTI = queryMeta("outputsToInstall");
if (!outTI) return outputs;
const auto errMsg = Error("this derivation has bad ‘meta.outputsToInstall’");
/* ^ this shows during `nix-env -i` right under the bad derivation */
if (!outTI->isList()) throw errMsg;
Outputs result;
for (auto i = outTI->listElems(); i != outTI->listElems() + outTI->listSize(); ++i) {
if ((*i)->type != tString) throw errMsg;
auto out = outputs.find((*i)->string.s);
if (out == outputs.end()) throw errMsg;
result.insert(*out);
}
return result;
}


Expand Down Expand Up @@ -192,8 +208,8 @@ typedef set<Bindings *> Done;


/* Evaluate value `v'. If it evaluates to a set of type `derivation',
then put information about it in `drvs' (unless it's already in
`doneExprs'). The result boolean indicates whether it makes sense
then put information about it in `drvs' (unless it's already in `done').
The result boolean indicates whether it makes sense
for the caller to recursively search for derivations in `v'. */
static bool getDerivation(EvalState & state, Value & v,
const string & attrPath, DrvInfos & drvs, Done & done,
Expand Down
3 changes: 2 additions & 1 deletion src/libexpr/get-drvs.hh
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ public:
string queryDrvPath();
string queryOutPath();
string queryOutputName();
Outputs queryOutputs();
/** Return the list of outputs. The "outputs to install" are determined by `mesa.outputsToInstall`. */
Outputs queryOutputs(bool onlyOutputsToInstall = false);

StringSet queryMetaNames();
Value * queryMeta(const string & name);
Expand Down
4 changes: 2 additions & 2 deletions src/nix-env/user-env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
if (drvPath != "")
mkString(*state.allocAttr(v, state.sDrvPath), i.queryDrvPath());

// Copy each output.
DrvInfo::Outputs outputs = i.queryOutputs();
// Copy each output meant for installation.
DrvInfo::Outputs outputs = i.queryOutputs(true);
Value & vOutputs = *state.allocAttr(v, state.sOutputs);
state.mkList(vOutputs, outputs.size());
unsigned int m = 0;
Expand Down

0 comments on commit 03cbb9a

Please sign in to comment.