diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/common/cli.hpp | 7 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 26 |
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( |