diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-02-26 10:16:30 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-03-10 16:28:59 +0100 |
commit | d53358c350898091d9cf2ba76ccdfa9e590275ee (patch) | |
tree | 46f7e89bbc18dd3df3039a08a757c3b622d7cb1c | |
parent | d1cfcdcb8909f35cdd1591dda099a5370648bbba (diff) | |
download | justbuild-d53358c350898091d9cf2ba76ccdfa9e590275ee.tar.gz |
Make graph-dumping options cummulative
If --dump-graph or --dump-plain-graph is given several times, the
action graph wil also be written several times. In this way, regular
use of those options will not be affected by adding them implicitly
through invocation-logging options in the rc file.
-rw-r--r-- | src/buildtool/build_engine/target_map/result_map.hpp | 20 | ||||
-rw-r--r-- | src/buildtool/common/cli.hpp | 26 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 12 | ||||
-rw-r--r-- | test/buildtool/build_engine/target_map/result_map.test.cpp | 7 |
4 files changed, 37 insertions, 28 deletions
diff --git a/src/buildtool/build_engine/target_map/result_map.hpp b/src/buildtool/build_engine/target_map/result_map.hpp index 14fd8f11..9753b9e0 100644 --- a/src/buildtool/build_engine/target_map/result_map.hpp +++ b/src/buildtool/build_engine/target_map/result_map.hpp @@ -18,9 +18,9 @@ #include <algorithm> #include <compare> #include <cstddef> +#include <filesystem> #include <fstream> #include <functional> -#include <iomanip> #include <iterator> #include <memory> #include <mutex> @@ -381,15 +381,21 @@ class ResultTargetMap { } template <bool kIncludeOrigins = true> - auto ToFile(std::string const& graph_file, + auto ToFile(std::vector<std::filesystem::path> const& destinations, gsl::not_null<Statistics const*> const& stats, gsl::not_null<Progress*> const& progress, int indent = 2) const -> void { - Logger::Log( - LogLevel::Info, "Dumping action graph to file {}.", graph_file); - std::ofstream os(graph_file); - os << std::setw(indent) << ToJson<kIncludeOrigins>(stats, progress) - << std::endl; + if (not destinations.empty()) { + // As serialization is expensive, compute the string only once + auto data = ToJson<kIncludeOrigins>(stats, progress).dump(indent); + for (auto const& graph_file : destinations) { + Logger::Log(LogLevel::Info, + "Dumping action graph to file {}.", + graph_file.string()); + std::ofstream os(graph_file); + os << data << std::endl; + } + } } void Clear(gsl::not_null<TaskSystem*> const& ts) { diff --git a/src/buildtool/common/cli.hpp b/src/buildtool/common/cli.hpp index ef6c043c..a8acea87 100644 --- a/src/buildtool/common/cli.hpp +++ b/src/buildtool/common/cli.hpp @@ -73,8 +73,8 @@ struct AnalysisArguments { std::optional<std::filesystem::path> target_root; std::optional<std::filesystem::path> rule_root; std::optional<std::filesystem::path> expression_root; - std::optional<std::filesystem::path> graph_file; - std::optional<std::filesystem::path> graph_file_plain; + std::vector<std::filesystem::path> graph_file; + std::vector<std::filesystem::path> graph_file_plain; std::optional<std::filesystem::path> artifacts_to_build_file; std::optional<std::filesystem::path> serve_errors_file; }; @@ -346,16 +346,22 @@ static inline auto SetupAnalysisArguments( "errors as json.") ->type_name("PATH"); if (with_graph) { - app->add_option( + app->add_option_function<std::string>( "--dump-graph", - clargs->graph_file, + [clargs](auto const& file_) { + clargs->graph_file.emplace_back(file_); + }, "File path for writing the action graph description to.") - ->type_name("PATH"); - app->add_option("--dump-plain-graph", - clargs->graph_file_plain, - "File path for writing the action graph description " - "(without origins) to.") - ->type_name("PATH"); + ->type_name("PATH") + ->trigger_on_parse(); + app->add_option_function<std::string>( + "--dump-plain-graph", + [clargs](auto const& file_) { + clargs->graph_file_plain.emplace_back(file_); + }, + "File path for writing the action graph description to.") + ->type_name("PATH") + ->trigger_on_parse(); app->add_option("--dump-artifacts-to-build", clargs->artifacts_to_build_file, "File path for writing the artifacts to build to.") diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index e4ac6a02..b8579b55 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -1150,14 +1150,10 @@ auto main(int argc, char* argv[]) -> int { not_eligible); } - if (arguments.analysis.graph_file) { - analyse_result->result_map.ToFile( - *arguments.analysis.graph_file, &stats, &progress); - } - if (arguments.analysis.graph_file_plain) { - analyse_result->result_map.ToFile</*kIncludeOrigins=*/false>( - *arguments.analysis.graph_file_plain, &stats, &progress); - } + analyse_result->result_map.ToFile( + arguments.analysis.graph_file, &stats, &progress); + analyse_result->result_map.ToFile</*kIncludeOrigins=*/false>( + arguments.analysis.graph_file_plain, &stats, &progress); auto const [artifacts, runfiles] = ReadOutputArtifacts(analyse_result->target); if (arguments.analysis.artifacts_to_build_file) { diff --git a/test/buildtool/build_engine/target_map/result_map.test.cpp b/test/buildtool/build_engine/target_map/result_map.test.cpp index e326c725..7e4228f5 100644 --- a/test/buildtool/build_engine/target_map/result_map.test.cpp +++ b/test/buildtool/build_engine/target_map/result_map.test.cpp @@ -81,7 +81,7 @@ TEST_CASE("empty map", "[result_map]") { R"({"actions": {}, "blobs": [], "trees": {}})"_json); auto filename = (GetTestDir() / "test_empty.graph").string(); - map.ToFile(filename, &stats, &progress); + map.ToFile({std::filesystem::path(filename)}, &stats, &progress); std::ifstream file(filename); nlohmann::json from_file{}; file >> from_file; @@ -146,7 +146,7 @@ TEST_CASE("origins creation", "[result_map]") { 0}])"_json; auto filename = (GetTestDir() / "test_with_origins.graph").string(); - map.ToFile(filename, &stats, &progress); + map.ToFile({std::filesystem::path(filename)}, &stats, &progress); std::ifstream file(filename); nlohmann::json from_file{}; file >> from_file; @@ -182,7 +182,8 @@ TEST_CASE("blobs uniqueness", "[result_map]") { {"trees", nlohmann::json::object()}}); auto filename = (GetTestDir() / "test_unique_blobs.graph").string(); - map.ToFile</*kIncludeOrigins=*/false>(filename, &stats, &progress); + map.ToFile</*kIncludeOrigins=*/false>( + {std::filesystem::path(filename)}, &stats, &progress); std::ifstream file(filename); nlohmann::json from_file{}; file >> from_file; |