diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2012-01-17 23:07:22 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2012-01-17 23:07:22 +0000 |
commit | 4e624849b686894f8a4c23a56098f4d47634a85c (patch) | |
tree | 517d2938dfb90ba4a9a321084169dcadd8edd3c1 /src/nix-store | |
parent | 2a3f4110c54a10ebee67403a699cb8f951fca858 (diff) | |
download | guix-4e624849b686894f8a4c23a56098f4d47634a85c.tar.gz |
* Added a command ‘nix-store --print-env $drvpath’ that prints out the
environment of the given derivation in a format that can be sourced by the shell, e.g. $ eval "$(nix-store --print-env $(nix-instantiate /etc/nixos/nixpkgs -A pkg))" $ NIX_BUILD_TOP=/tmp $ source $stdenv/setup This is especially useful to reproduce the environment used to build a package outside of its builder for development purposes. TODO: add a nix-build option to do the above and fetch the dependencies of the derivation as well.
Diffstat (limited to 'src/nix-store')
-rw-r--r-- | src/nix-store/nix-store.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index b9f8d927a3..2e1d3f044b 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -382,6 +382,39 @@ static void opQuery(Strings opFlags, Strings opArgs) } +static string shellEscape(const string & s) +{ + string r; + foreach (string::const_iterator, i, s) + if (*i == '\'') r += "'\\''"; else r += *i; + return r; +} + + +static void opPrintEnv(Strings opFlags, Strings opArgs) +{ + if (!opFlags.empty()) throw UsageError("unknown flag"); + if (opArgs.size() != 1) throw UsageError("`--print-env' requires one derivation store path"); + + Path drvPath = opArgs.front(); + Derivation drv = derivationFromPath(*store, drvPath); + + /* Print each environment variable in the derivation in a format + that can be sourced by the shell. */ + foreach (StringPairs::iterator, i, drv.env) + cout << format("export %1%; %1%='%2%'\n") % i->first % shellEscape(i->second); + + /* Also output the arguments. This doesn't preserve whitespace in + arguments. */ + cout << "export _args; _args='"; + foreach (Strings::iterator, i, drv.args) { + if (i != drv.args.begin()) cout << ' '; + cout << shellEscape(*i); + } + cout << "'\n"; +} + + static void opReadLog(Strings opFlags, Strings opArgs) { if (!opFlags.empty()) throw UsageError("unknown flag"); @@ -754,6 +787,8 @@ void run(Strings args) op = opDelete; else if (arg == "--query" || arg == "-q") op = opQuery; + else if (arg == "--print-env") + op = opPrintEnv; else if (arg == "--read-log" || arg == "-l") op = opReadLog; else if (arg == "--dump-db") |