Ensure that -I flags get included in nixPath

Also fixes #261.
This commit is contained in:
Eelco Dolstra 2014-05-26 16:50:36 +02:00
parent a8edf185a9
commit 39d72640c2
8 changed files with 33 additions and 18 deletions

View file

@ -35,11 +35,11 @@ bool parseOptionArg(const string & arg, Strings::iterator & i,
bool parseSearchPathArg(const string & arg, Strings::iterator & i, bool parseSearchPathArg(const string & arg, Strings::iterator & i,
const Strings::iterator & argsEnd, EvalState & state) const Strings::iterator & argsEnd, Strings & searchPath)
{ {
if (arg != "-I") return false; if (arg != "-I") return false;
if (i == argsEnd) throw UsageError(format("`%1%' requires an argument") % arg);; if (i == argsEnd) throw UsageError(format("`%1%' requires an argument") % arg);;
state.addToSearchPath(*i++, true); searchPath.push_back(*i++);
return true; return true;
} }

View file

@ -10,7 +10,7 @@ bool parseOptionArg(const string & arg, Strings::iterator & i,
Bindings & autoArgs); Bindings & autoArgs);
bool parseSearchPathArg(const string & arg, Strings::iterator & i, bool parseSearchPathArg(const string & arg, Strings::iterator & i,
const Strings::iterator & argsEnd, EvalState & state); const Strings::iterator & argsEnd, Strings & searchPath);
Path lookupFileArg(EvalState & state, string s); Path lookupFileArg(EvalState & state, string s);

View file

@ -153,7 +153,7 @@ static Symbol getName(const AttrName & name, EvalState & state, Env & env)
} }
EvalState::EvalState() EvalState::EvalState(const Strings & _searchPath)
: sWith(symbols.create("<with>")) : sWith(symbols.create("<with>"))
, sOutPath(symbols.create("outPath")) , sOutPath(symbols.create("outPath"))
, sDrvPath(symbols.create("drvPath")) , sDrvPath(symbols.create("drvPath"))
@ -219,11 +219,10 @@ EvalState::EvalState()
#endif #endif
/* Initialise the Nix expression search path. */ /* Initialise the Nix expression search path. */
searchPathInsertionPoint = searchPath.end();
Strings paths = tokenizeString<Strings>(getEnv("NIX_PATH", ""), ":"); Strings paths = tokenizeString<Strings>(getEnv("NIX_PATH", ""), ":");
foreach (Strings::iterator, i, paths) addToSearchPath(*i); for (auto & i : _searchPath) addToSearchPath(i);
for (auto & i : paths) addToSearchPath(i);
addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs"); addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs");
searchPathInsertionPoint = searchPath.begin();
createBaseEnv(); createBaseEnv();
} }

View file

@ -113,11 +113,10 @@ private:
typedef list<std::pair<string, Path> > SearchPath; typedef list<std::pair<string, Path> > SearchPath;
SearchPath searchPath; SearchPath searchPath;
SearchPath::iterator searchPathInsertionPoint;
public: public:
EvalState(); EvalState(const Strings & _searchPath);
~EvalState(); ~EvalState();
void addToSearchPath(const string & s, bool warn = false); void addToSearchPath(const string & s, bool warn = false);

View file

@ -629,7 +629,7 @@ void EvalState::addToSearchPath(const string & s, bool warn)
path = absPath(path); path = absPath(path);
if (pathExists(path)) { if (pathExists(path)) {
debug(format("adding path `%1%' to the search path") % path); debug(format("adding path `%1%' to the search path") % path);
searchPath.insert(searchPathInsertionPoint, std::pair<string, Path>(prefix, path)); searchPath.push_back(std::pair<string, Path>(prefix, path));
} else if (warn) } else if (warn)
printMsg(lvlError, format("warning: Nix search path entry `%1%' does not exist, ignoring") % path); printMsg(lvlError, format("warning: Nix search path entry `%1%' does not exist, ignoring") % path);
} }

View file

@ -58,6 +58,7 @@ struct Globals
bool removeAll; bool removeAll;
string forceName; string forceName;
bool prebuiltOnly; bool prebuiltOnly;
Globals(const Strings & searchPath) : state(searchPath) { }
}; };
@ -1351,7 +1352,17 @@ void run(Strings args)
Strings opFlags, opArgs, remaining; Strings opFlags, opArgs, remaining;
Operation op = 0; Operation op = 0;
Globals globals; /* FIXME: hack. */
Strings searchPath;
Strings args2;
for (Strings::iterator i = args.begin(); i != args.end(); ) {
string arg = *i++;
if (!parseSearchPathArg(arg, i, args.end(), searchPath))
args2.push_back(arg);
}
args = args2;
Globals globals(searchPath);
globals.instSource.type = srcUnknown; globals.instSource.type = srcUnknown;
globals.instSource.nixExprPath = getDefNixExprPath(); globals.instSource.nixExprPath = getDefNixExprPath();
@ -1372,8 +1383,6 @@ void run(Strings args)
else if (parseOptionArg(arg, i, args.end(), else if (parseOptionArg(arg, i, args.end(),
globals.state, globals.instSource.autoArgs)) globals.state, globals.instSource.autoArgs))
; ;
else if (parseSearchPathArg(arg, i, args.end(), globals.state))
;
else if (arg == "--force-name") // undocumented flag for nix-install-package else if (arg == "--force-name") // undocumented flag for nix-install-package
globals.forceName = needArg(i, args, arg); globals.forceName = needArg(i, args, arg);
else if (arg == "--uninstall" || arg == "-e") else if (arg == "--uninstall" || arg == "-e")

View file

@ -91,7 +91,17 @@ void processExpr(EvalState & state, const Strings & attrPaths,
void run(Strings args) void run(Strings args)
{ {
EvalState state; /* FIXME: hack. */
Strings searchPath;
Strings args2;
for (Strings::iterator i = args.begin(); i != args.end(); ) {
string arg = *i++;
if (!parseSearchPathArg(arg, i, args.end(), searchPath))
args2.push_back(arg);
}
args = args2;
EvalState state(searchPath);
Strings files; Strings files;
bool readStdin = false; bool readStdin = false;
bool fromArgs = false; bool fromArgs = false;
@ -127,8 +137,6 @@ void run(Strings args)
} }
else if (parseOptionArg(arg, i, args.end(), state, autoArgs)) else if (parseOptionArg(arg, i, args.end(), state, autoArgs))
; ;
else if (parseSearchPathArg(arg, i, args.end(), state))
;
else if (arg == "--add-root") { else if (arg == "--add-root") {
if (i == args.end()) if (i == args.end())
throw UsageError("`--add-root' requires an argument"); throw UsageError("`--add-root' requires an argument");

View file

@ -3,7 +3,7 @@ with builtins;
assert pathExists <nix/buildenv.nix>; assert pathExists <nix/buildenv.nix>;
assert length nixPath == 3; assert length nixPath == 6;
assert length (filter (x: x.prefix == "nix") nixPath) == 1; assert length (filter (x: x.prefix == "nix") nixPath) == 1;
assert length (filter (x: baseNameOf x.path == "dir4") nixPath) == 1; assert length (filter (x: baseNameOf x.path == "dir4") nixPath) == 1;