aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/globals.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/globals.cc')
-rw-r--r--src/libstore/globals.cc211
1 files changed, 123 insertions, 88 deletions
diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc
index 5c22f1406..c75ebdd0e 100644
--- a/src/libstore/globals.cc
+++ b/src/libstore/globals.cc
@@ -10,36 +10,63 @@
namespace nix {
-string nixStore = "/UNINIT";
-string nixDataDir = "/UNINIT";
-string nixLogDir = "/UNINIT";
-string nixStateDir = "/UNINIT";
-string nixDBPath = "/UNINIT";
-string nixConfDir = "/UNINIT";
-string nixLibexecDir = "/UNINIT";
-string nixBinDir = "/UNINIT";
-
-bool keepFailed = false;
-bool keepGoing = false;
-bool tryFallback = false;
-Verbosity buildVerbosity = lvlError;
-unsigned int maxBuildJobs = 1;
-unsigned int buildCores = 1;
-bool readOnlyMode = false;
-string thisSystem = "unset";
-time_t maxSilentTime = 0;
-time_t buildTimeout = 0;
-Paths substituters;
-bool useBuildHook = true;
-bool printBuildTrace = false;
-
-
-static bool settingsRead = false;
-
-static std::map<string, Strings> settings;
-
-/* Overriden settings. */
-std::map<string, Strings> settingsCmdline;
+Settings settings;
+
+
+Settings::Settings()
+{
+ keepFailed = false;
+ keepGoing = false;
+ tryFallback = false;
+ buildVerbosity = lvlError;
+ maxBuildJobs = 1;
+ buildCores = 1;
+ readOnlyMode = false;
+ thisSystem = SYSTEM;
+ maxSilentTime = 0;
+ buildTimeout = 0;
+ useBuildHook = true;
+ printBuildTrace = false;
+ reservedSize = 1024 * 1024;
+ fsyncMetadata = true;
+ useSQLiteWAL = true;
+ syncBeforeRegistering = false;
+ useSubstitutes = true;
+ useChroot = false;
+ dirsInChroot.insert("/dev");
+ dirsInChroot.insert("/dev/pts");
+ impersonateLinux26 = false;
+ keepLog = true;
+ compressLog = true;
+ cacheFailure = false;
+ pollInterval = 5;
+ checkRootReachability = false;
+ gcKeepOutputs = false;
+ gcKeepDerivations = true;
+ autoOptimiseStore = true;
+ envKeepDerivations = false;
+}
+
+
+void Settings::processEnvironment()
+{
+ nixStore = canonPath(getEnv("NIX_STORE_DIR", getEnv("NIX_STORE", NIX_STORE_DIR)));
+ nixDataDir = canonPath(getEnv("NIX_DATA_DIR", NIX_DATA_DIR));
+ nixLogDir = canonPath(getEnv("NIX_LOG_DIR", NIX_LOG_DIR));
+ nixStateDir = canonPath(getEnv("NIX_STATE_DIR", NIX_STATE_DIR));
+ nixDBPath = getEnv("NIX_DB_DIR", nixStateDir + "/db");
+ nixConfDir = canonPath(getEnv("NIX_CONF_DIR", NIX_CONF_DIR));
+ nixLibexecDir = canonPath(getEnv("NIX_LIBEXEC_DIR", NIX_LIBEXEC_DIR));
+ nixBinDir = canonPath(getEnv("NIX_BIN_DIR", NIX_BIN_DIR));
+
+ string subs = getEnv("NIX_SUBSTITUTERS", "default");
+ if (subs == "default") {
+ substituters.push_back(nixLibexecDir + "/nix/substituters/copy-from-other-stores.pl");
+ substituters.push_back(nixLibexecDir + "/nix/substituters/download-using-manifests.pl");
+ substituters.push_back(nixLibexecDir + "/nix/substituters/download-from-binary-cache.pl");
+ } else
+ substituters = tokenizeString(subs, ":");
+}
string & at(Strings & ss, unsigned int n)
@@ -50,7 +77,7 @@ string & at(Strings & ss, unsigned int n)
}
-static void readSettings()
+void Settings::loadConfFile()
{
Path settingsFile = (format("%1%/%2%") % nixConfDir % "nix.conf").str();
if (!pathExists(settingsFile)) return;
@@ -78,95 +105,103 @@ static void readSettings()
Strings::iterator i = tokens.begin();
advance(i, 2);
- settings[name] = Strings(i, tokens.end());
+ settings[name] = concatStringsSep(" ", Strings(i, tokens.end())); // FIXME: slow
};
-
- settings.insert(settingsCmdline.begin(), settingsCmdline.end());
-
- settingsRead = true;
}
-Strings querySetting(const string & name, const Strings & def)
+void Settings::set(const string & name, const string & value)
{
- if (!settingsRead) readSettings();
- std::map<string, Strings>::iterator i = settings.find(name);
- return i == settings.end() ? def : i->second;
+ settings[name] = value;
+ overrides[name] = value;
}
-string querySetting(const string & name, const string & def)
+void Settings::update()
{
- Strings defs;
- defs.push_back(def);
+ get(tryFallback, "build-fallback");
+ get(maxBuildJobs, "build-max-jobs");
+ get(buildCores, "build-cores");
+ get(thisSystem, "system");
+ get(maxSilentTime, "build-max-silent-time");
+ get(buildTimeout, "build-timeout");
+ get(reservedSize, "gc-reserved-space");
+ get(fsyncMetadata, "fsync-metadata");
+ get(useSQLiteWAL, "use-sqlite-wal");
+ get(syncBeforeRegistering, "sync-before-registering");
+ get(useSubstitutes, "build-use-substitutes");
+ get(buildUsersGroup, "build-users-group");
+ get(useChroot, "build-use-chroot");
+ get(dirsInChroot, "build-chroot-dirs");
+ get(impersonateLinux26, "build-impersonate-linux-26");
+ get(keepLog, "build-keep-log");
+ get(compressLog, "build-compress-log");
+ get(cacheFailure, "build-cache-failure");
+ get(pollInterval, "build-poll-interval");
+ get(checkRootReachability, "gc-check-reachability");
+ get(gcKeepOutputs, "gc-keep-outputs");
+ get(gcKeepDerivations, "gc-keep-derivations");
+ get(autoOptimiseStore, "auto-optimise-store");
+ get(envKeepDerivations, "env-keep-derivations");
+}
- Strings value = querySetting(name, defs);
- if (value.size() != 1)
- throw Error(format("configuration option `%1%' should not be a list") % name);
- return value.front();
+void Settings::get(string & res, const string & name)
+{
+ SettingsMap::iterator i = settings.find(name);
+ if (i == settings.end()) return;
+ res = i->second;
}
-bool queryBoolSetting(const string & name, bool def)
+void Settings::get(bool & res, const string & name)
{
- string v = querySetting(name, def ? "true" : "false");
- if (v == "true") return true;
- else if (v == "false") return false;
+ SettingsMap::iterator i = settings.find(name);
+ if (i == settings.end()) return;
+ if (i->second == "true") res = true;
+ else if (i->second == "false") res = false;
else throw Error(format("configuration option `%1%' should be either `true' or `false', not `%2%'")
- % name % v);
+ % name % i->second);
}
-unsigned int queryIntSetting(const string & name, unsigned int def)
+void Settings::get(PathSet & res, const string & name)
{
- int n;
- if (!string2Int(querySetting(name, int2String(def)), n) || n < 0)
- throw Error(format("configuration setting `%1%' should have an integer value") % name);
- return n;
+ SettingsMap::iterator i = settings.find(name);
+ if (i == settings.end()) return;
+ res.clear();
+ Strings ss = tokenizeString(i->second);
+ res.insert(ss.begin(), ss.end());
}
-void overrideSetting(const string & name, const Strings & value)
+template<class N> void Settings::get(N & res, const string & name)
{
- if (settingsRead) settings[name] = value;
- settingsCmdline[name] = value;
+ SettingsMap::iterator i = settings.find(name);
+ if (i == settings.end()) return;
+ if (!string2Int(i->second, res))
+ throw Error(format("configuration setting `%1%' should have an integer value") % name);
}
-void reloadSettings()
+string Settings::pack()
{
- settingsRead = false;
- settings.clear();
+ string s;
+ foreach (SettingsMap::iterator, i, settings) {
+ if (i->first.find('\n') != string::npos ||
+ i->first.find('=') != string::npos ||
+ i->second.find('\n') != string::npos)
+ throw Error("illegal option name/value");
+ s += i->first; s += '='; s += i->second; s += '\n';
+ }
+ return s;
}
-void setDefaultsFromEnvironment()
+Settings::SettingsMap Settings::getOverrides()
{
- /* Setup Nix paths. */
- nixStore = canonPath(getEnv("NIX_STORE_DIR", getEnv("NIX_STORE", NIX_STORE_DIR)));
- nixDataDir = canonPath(getEnv("NIX_DATA_DIR", NIX_DATA_DIR));
- nixLogDir = canonPath(getEnv("NIX_LOG_DIR", NIX_LOG_DIR));
- nixStateDir = canonPath(getEnv("NIX_STATE_DIR", NIX_STATE_DIR));
- nixDBPath = getEnv("NIX_DB_DIR", nixStateDir + "/db");
- nixConfDir = canonPath(getEnv("NIX_CONF_DIR", NIX_CONF_DIR));
- nixLibexecDir = canonPath(getEnv("NIX_LIBEXEC_DIR", NIX_LIBEXEC_DIR));
- nixBinDir = canonPath(getEnv("NIX_BIN_DIR", NIX_BIN_DIR));
-
- string subs = getEnv("NIX_SUBSTITUTERS", "default");
- if (subs == "default") {
- substituters.push_back(nixLibexecDir + "/nix/substituters/copy-from-other-stores.pl");
- substituters.push_back(nixLibexecDir + "/nix/substituters/download-using-manifests.pl");
- } else
- substituters = tokenizeString(subs, ":");
-
- /* Get some settings from the configuration file. */
- thisSystem = querySetting("system", SYSTEM);
- maxBuildJobs = queryIntSetting("build-max-jobs", 1);
- buildCores = queryIntSetting("build-cores", 1);
- maxSilentTime = queryIntSetting("build-max-silent-time", 0);
- buildTimeout = queryIntSetting("build-timeout", 0);
+ return overrides;
}
-
+
}