737ed88f35
Allow global config settings to be defined in multiple Config classes. For example, this means that libutil can have settings and evaluator settings can be moved out of libstore. The Config classes are registered in a new GlobalConfig class to which config files etc. are applied. Relevant to https://github.com/NixOS/nix/issues/2009 in that it removes the need for ad hoc handling of useCaseHack, which was the underlying cause of that issue.
116 lines
2.9 KiB
C++
116 lines
2.9 KiB
C++
#include <algorithm>
|
|
|
|
#include "command.hh"
|
|
#include "common-args.hh"
|
|
#include "eval.hh"
|
|
#include "globals.hh"
|
|
#include "legacy.hh"
|
|
#include "shared.hh"
|
|
#include "store-api.hh"
|
|
#include "progress-bar.hh"
|
|
#include "finally.hh"
|
|
|
|
extern std::string chrootHelperName;
|
|
|
|
void chrootHelper(int argc, char * * argv);
|
|
|
|
namespace nix {
|
|
|
|
std::string programPath;
|
|
|
|
struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
|
{
|
|
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
|
|
{
|
|
mkFlag()
|
|
.longName("help")
|
|
.shortName('h')
|
|
.description("show usage information")
|
|
.handler([&]() { showHelpAndExit(); });
|
|
|
|
mkFlag()
|
|
.longName("help-config")
|
|
.description("show configuration options")
|
|
.handler([&]() {
|
|
std::cout << "The following configuration options are available:\n\n";
|
|
Table2 tbl;
|
|
std::map<std::string, Config::SettingInfo> settings;
|
|
globalConfig.getSettings(settings);
|
|
for (const auto & s : settings)
|
|
tbl.emplace_back(s.first, s.second.description);
|
|
printTable(std::cout, tbl);
|
|
throw Exit();
|
|
});
|
|
|
|
mkFlag()
|
|
.longName("version")
|
|
.description("show version information")
|
|
.handler([&]() { printVersion(programName); });
|
|
}
|
|
|
|
void printFlags(std::ostream & out) override
|
|
{
|
|
Args::printFlags(out);
|
|
std::cout <<
|
|
"\n"
|
|
"In addition, most configuration settings can be overriden using '--<name> <value>'.\n"
|
|
"Boolean settings can be overriden using '--<name>' or '--no-<name>'. See 'nix\n"
|
|
"--help-config' for a list of configuration settings.\n";
|
|
}
|
|
|
|
void showHelpAndExit()
|
|
{
|
|
printHelp(programName, std::cout);
|
|
std::cout << "\nNote: this program is EXPERIMENTAL and subject to change.\n";
|
|
throw Exit();
|
|
}
|
|
};
|
|
|
|
void mainWrapped(int argc, char * * argv)
|
|
{
|
|
verbosity = lvlError;
|
|
settings.verboseBuild = false;
|
|
|
|
/* The chroot helper needs to be run before any threads have been
|
|
started. */
|
|
if (argc > 0 && argv[0] == chrootHelperName) {
|
|
chrootHelper(argc, argv);
|
|
return;
|
|
}
|
|
|
|
initNix();
|
|
initGC();
|
|
|
|
programPath = argv[0];
|
|
string programName = baseNameOf(programPath);
|
|
|
|
{
|
|
auto legacy = (*RegisterLegacyCommand::commands)[programName];
|
|
if (legacy) return legacy(argc, argv);
|
|
}
|
|
|
|
NixArgs args;
|
|
|
|
args.parseCmdline(argvToStrings(argc, argv));
|
|
|
|
initPlugins();
|
|
|
|
if (!args.command) args.showHelpAndExit();
|
|
|
|
Finally f([]() { stopProgressBar(); });
|
|
|
|
if (isatty(STDERR_FILENO))
|
|
startProgressBar();
|
|
|
|
args.command->prepare();
|
|
args.command->run();
|
|
}
|
|
|
|
}
|
|
|
|
int main(int argc, char * * argv)
|
|
{
|
|
return nix::handleExceptions(argv[0], [&]() {
|
|
nix::mainWrapped(argc, argv);
|
|
});
|
|
}
|