diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-11-19 12:03:01 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-11-19 12:03:01 +0000 |
commit | fd7ac09f1073179d9ac439c3e9fb12a1bf00a7d5 (patch) | |
tree | 8059ddcedf09dd7b74a93b2fb1309368d722abdb /src/nix-instantiate | |
parent | ac68840e79ce74f05ee8b31bb1d528c98b9c7f76 (diff) |
* Refactoring (step 2).
Diffstat (limited to 'src/nix-instantiate')
-rw-r--r-- | src/nix-instantiate/Makefile.am | 11 | ||||
-rw-r--r-- | src/nix-instantiate/main.cc | 117 |
2 files changed, 128 insertions, 0 deletions
diff --git a/src/nix-instantiate/Makefile.am b/src/nix-instantiate/Makefile.am new file mode 100644 index 000000000..91843f663 --- /dev/null +++ b/src/nix-instantiate/Makefile.am @@ -0,0 +1,11 @@ +bin_PROGRAMS = nix-instantiate + +nix_instantiate_SOURCES = main.cc +nix_instantiate_LDADD = ../libmain/libmain.a ../libexpr/libexpr.a \ + ../libstore/libstore.a ../libutil/libutil.a \ + ../boost/format/libformat.a -L../../externals/inst/lib -ldb_cxx \ + -lsglr -lATB -lconversion -lasfix2 -lmept -lATerm + +AM_CXXFLAGS = \ + -I.. -I../../externals/inst/include -I../libutil -I../libstore \ + -I../libexpr -I../libmain diff --git a/src/nix-instantiate/main.cc b/src/nix-instantiate/main.cc new file mode 100644 index 000000000..aa6883ff8 --- /dev/null +++ b/src/nix-instantiate/main.cc @@ -0,0 +1,117 @@ +#include <map> +#include <iostream> + +#include "globals.hh" +#include "normalise.hh" +#include "shared.hh" +#include "eval.hh" + + +#if 0 +static Path searchPath(const Paths & searchDirs, const Path & relPath) +{ + if (string(relPath, 0, 1) == "/") return relPath; + + for (Paths::const_iterator i = searchDirs.begin(); + i != searchDirs.end(); i++) + { + Path path = *i + "/" + relPath; + if (pathExists(path)) return path; + } + + throw Error( + format("path `%1%' not found in any of the search directories") + % relPath); +} +#endif + + +static Expr evalStdin(EvalState & state) +{ + startNest(nest, lvlTalkative, format("evaluating standard input")); + Expr e = ATreadFromFile(stdin); + if (!e) + throw Error(format("unable to read a term from stdin")); + return evalExpr(state, e); +} + + +static void printNixExpr(EvalState & state, Expr e) +{ + ATMatcher m; + ATermList es; + + if (atMatch(m, e) >> "Attrs" >> es) { + Expr a = queryAttr(e, "type"); + if (a && evalString(state, a) == "derivation") { + a = queryAttr(e, "drvPath"); + if (a) { + cout << format("%1%\n") % evalPath(state, a); + return; + } + } + } + + if (ATgetType(e) == AT_LIST) { + for (ATermIterator i((ATermList) e); i; ++i) + printNixExpr(state, evalExpr(state, *i)); + return; + } + + throw badTerm("top level does not evaluate to one or more Nix expressions", e); +} + + +void run(Strings args) +{ + EvalState state; + Strings files; + bool readStdin = false; + +#if 0 + state.searchDirs.push_back("."); + state.searchDirs.push_back(nixDataDir + "/nix"); +#endif + + for (Strings::iterator it = args.begin(); + it != args.end(); ) + { + string arg = *it++; + +#if 0 + if (arg == "--includedir" || arg == "-I") { + if (it == args.end()) + throw UsageError(format("argument required in `%1%'") % arg); + state.searchDirs.push_back(*it++); + } + else +#endif + if (arg == "--verbose" || arg == "-v") + verbosity = (Verbosity) ((int) verbosity + 1); + else if (arg == "-") + readStdin = true; + else if (arg[0] == '-') + throw UsageError(format("unknown flag `%1%`") % arg); + else + files.push_back(arg); + } + + openDB(); + + if (readStdin) { + Expr e = evalStdin(state); + printNixExpr(state, e); + } + + for (Strings::iterator it = files.begin(); + it != files.end(); it++) + { + Expr e = evalFile(state, absPath(*it)); + printNixExpr(state, e); + } + + printEvalStats(state); +} + + +string programId = "nix-instantiate"; |