summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/common/cli.hpp7
-rw-r--r--src/buildtool/main/main.cpp26
2 files changed, 31 insertions, 2 deletions
diff --git a/src/buildtool/common/cli.hpp b/src/buildtool/common/cli.hpp
index 17ebd3f0..fdfb08b9 100644
--- a/src/buildtool/common/cli.hpp
+++ b/src/buildtool/common/cli.hpp
@@ -30,6 +30,7 @@ struct CommonArguments {
/// \brief Arguments required for analysing targets.
struct AnalysisArguments {
+ std::string defines{};
std::filesystem::path config_file{};
std::optional<nlohmann::json> target{};
std::optional<std::string> target_file_name{};
@@ -137,6 +138,12 @@ static inline auto SetupAnalysisArguments(
gsl::not_null<AnalysisArguments*> const& clargs,
bool with_graph = true) {
app->add_option(
+ "-D,--defines",
+ clargs->defines,
+ "Define configuration variables via an in-line JSON object.\n"
+ "Latest wins. Supersedes values provided via --config")
+ ->type_name("JSON");
+ app->add_option(
"-c,--config", clargs->config_file, "Path to configuration file.")
->type_name("PATH");
app->add_option_function<std::vector<std::string>>(
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index 6dd8ea7f..cb34fa91 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -244,6 +244,7 @@ void SetupHashGenerator() {
[[nodiscard]] auto ReadConfiguration(AnalysisArguments const& clargs) noexcept
-> Configuration {
+ Configuration config{};
if (not clargs.config_file.empty()) {
if (not std::filesystem::exists(clargs.config_file)) {
Logger::Log(LogLevel::Error,
@@ -260,7 +261,7 @@ void SetupHashGenerator() {
clargs.config_file.string());
std::exit(kExitFailure);
}
- return Configuration{map};
+ config = Configuration{map};
} catch (std::exception const& e) {
Logger::Log(LogLevel::Error,
"Parsing config file {} failed with error:\n{}",
@@ -269,7 +270,28 @@ void SetupHashGenerator() {
std::exit(kExitFailure);
}
}
- return Configuration{};
+
+ if (not clargs.defines.empty()) {
+ try {
+ auto map =
+ Expression::FromJson(nlohmann::json::parse(clargs.defines));
+ if (not map->IsMap()) {
+ Logger::Log(LogLevel::Error,
+ "Defines {} does not contain a map.",
+ clargs.defines);
+ std::exit(kExitFailure);
+ }
+ config = config.Update(map);
+ } catch (std::exception const& e) {
+ Logger::Log(LogLevel::Error,
+ "Parsing defines {} failed with error:\n{}",
+ clargs.defines,
+ e.what());
+ std::exit(kExitFailure);
+ }
+ }
+
+ return config;
}
[[nodiscard]] auto DetermineCurrentModule(