summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/build_engine/target_map/result_map.hpp20
-rw-r--r--src/buildtool/common/cli.hpp26
-rw-r--r--src/buildtool/main/main.cpp12
-rw-r--r--test/buildtool/build_engine/target_map/result_map.test.cpp7
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;