summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-08-01 10:26:13 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-08-01 19:00:47 +0200
commit03f948f4b10e916052a2234448b6658b80ee9143 (patch)
tree8eb0e2c26a31fd83fa0691b0d8fde55a15942a9d /src/buildtool/execution_api
parented71beee3e3a2bbfcba24281ad9e28a0f6df4054 (diff)
downloadjustbuild-03f948f4b10e916052a2234448b6658b80ee9143.tar.gz
Execution API: support cwd
... following the remote-execution standard that all output paths (but none of the input paths) are relative to the working directory. Therefore, the executor has to do the path translation. For our implementation of the API interface - the local API now handles cwd correctly, - the remote API forwards cwd correctly, and - the git API continues to report actions as not implemented.
Diffstat (limited to 'src/buildtool/execution_api')
-rw-r--r--src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp1
-rw-r--r--src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp3
-rw-r--r--src/buildtool/execution_api/common/execution_api.hpp4
-rw-r--r--src/buildtool/execution_api/execution_service/execution_server.cpp1
-rw-r--r--src/buildtool/execution_api/git/git_api.hpp1
-rw-r--r--src/buildtool/execution_api/local/local_action.cpp14
-rw-r--r--src/buildtool/execution_api/local/local_action.hpp4
-rw-r--r--src/buildtool/execution_api/local/local_api.hpp2
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_action.cpp3
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_action.hpp2
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp2
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.hpp1
12 files changed, 31 insertions, 7 deletions
diff --git a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp
index 09462bec..d4a096fb 100644
--- a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp
+++ b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp
@@ -210,6 +210,7 @@ template <class T>
// [Action][build.bazel.remote.execution.v2.Action] for migration.
// (https://github.com/bazelbuild/remote-apis/blob/e1fe21be4c9ae76269a5a63215bb3c72ed9ab3f0/build/bazel/remote/execution/v2/remote_execution.proto#L646)
msg.set_allocated_platform(CreatePlatform(*request.properties).release());
+ msg.set_working_directory(*request.cwd);
std::copy(request.command_line->begin(),
request.command_line->end(),
pb::back_inserter(msg.mutable_arguments()));
diff --git a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp
index c48e605d..0b006273 100644
--- a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp
+++ b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp
@@ -144,6 +144,9 @@ struct BazelMsgFactory::ActionDigestRequest final {
/// \brief The command line.
VectorPtr<std::string> const command_line;
+ /// \brief The workingg direcotry
+ gsl::not_null<std::string const*> const cwd;
+
/// \brief The paths of output files.
VectorPtr<std::string> const output_files;
diff --git a/src/buildtool/execution_api/common/execution_api.hpp b/src/buildtool/execution_api/common/execution_api.hpp
index 2108c68d..c9ee276b 100644
--- a/src/buildtool/execution_api/common/execution_api.hpp
+++ b/src/buildtool/execution_api/common/execution_api.hpp
@@ -46,7 +46,8 @@ class IExecutionApi {
/// \brief Create a new action.
/// \param[in] root_digest Digest of the build root.
/// \param[in] command Command as argv vector
- /// \param[in] output_files List of paths to output files.
+ /// \param[in] cwd Working direcotry, relative to execution root
+ /// \param[in] output_files List of paths to output files, relative to cwd
/// \param[in] output_dirs List of paths to output directories.
/// \param[in] env_vars The environment variables to set.
/// \param[in] properties Platform properties to set.
@@ -54,6 +55,7 @@ class IExecutionApi {
[[nodiscard]] virtual auto CreateAction(
ArtifactDigest const& root_digest,
std::vector<std::string> const& command,
+ std::string const& cwd,
std::vector<std::string> const& output_files,
std::vector<std::string> const& output_dirs,
std::map<std::string, std::string> const& env_vars,
diff --git a/src/buildtool/execution_api/execution_service/execution_server.cpp b/src/buildtool/execution_api/execution_service/execution_server.cpp
index b77ad9d3..2e56bd04 100644
--- a/src/buildtool/execution_api/execution_service/execution_server.cpp
+++ b/src/buildtool/execution_api/execution_service/execution_server.cpp
@@ -136,6 +136,7 @@ auto ExecutionServiceImpl::GetIExecutionAction(
auto i_execution_action = api_.CreateAction(
ArtifactDigest{action.input_root_digest()},
{c->arguments().begin(), c->arguments().end()},
+ c->working_directory(),
{c->output_files().begin(), c->output_files().end()},
{c->output_directories().begin(), c->output_directories().end()},
env_vars,
diff --git a/src/buildtool/execution_api/git/git_api.hpp b/src/buildtool/execution_api/git/git_api.hpp
index 139291ef..43afc14a 100644
--- a/src/buildtool/execution_api/git/git_api.hpp
+++ b/src/buildtool/execution_api/git/git_api.hpp
@@ -42,6 +42,7 @@ class GitApi final : public IExecutionApi {
[[nodiscard]] auto CreateAction(
ArtifactDigest const& /*root_digest*/,
std::vector<std::string> const& /*command*/,
+ std::string const& /*cwd*/,
std::vector<std::string> const& /*output_files*/,
std::vector<std::string> const& /*output_dirs*/,
std::map<std::string, std::string> const& /*env_vars*/,
diff --git a/src/buildtool/execution_api/local/local_action.cpp b/src/buildtool/execution_api/local/local_action.cpp
index aac6bb39..8cc1d242 100644
--- a/src/buildtool/execution_api/local/local_action.cpp
+++ b/src/buildtool/execution_api/local/local_action.cpp
@@ -82,6 +82,7 @@ class BuildCleanupAnchor {
auto LocalAction::Execute(Logger const* logger) noexcept
-> IExecutionResponse::Ptr {
+
auto do_cache = CacheEnabled(cache_flag_);
auto action = CreateActionDigest(root_digest_, not do_cache);
if (not action) {
@@ -174,7 +175,7 @@ auto LocalAction::Run(bazel_re::Digest const& action_id) const noexcept
SystemCommand system{"LocalExecution"};
auto const exit_code =
- system.Execute(cmdline, env_vars_, build_root, *exec_path);
+ system.Execute(cmdline, env_vars_, build_root / cwd_, *exec_path);
if (exit_code.has_value()) {
Output result{};
result.action.set_exit_code(*exit_code);
@@ -187,7 +188,7 @@ auto LocalAction::Run(bazel_re::Digest const& action_id) const noexcept
result.action.set_allocated_stderr_digest(digest_ptr);
}
- if (CollectAndStoreOutputs(&result.action, build_root)) {
+ if (CollectAndStoreOutputs(&result.action, build_root / cwd_)) {
if (cache_flag_ == CacheFlag::CacheOutput) {
if (not local_context_.storage->ActionCache().StoreResult(
action_id, result.action)) {
@@ -343,14 +344,15 @@ auto LocalAction::CreateDirectoryStructure(
};
return std::all_of(output_files_.begin(),
output_files_.end(),
- [&exec_path, &create_dir](auto const& local_path) {
- auto dir = (exec_path / local_path).parent_path();
+ [this, &exec_path, &create_dir](auto const& local_path) {
+ auto dir =
+ (exec_path / cwd_ / local_path).parent_path();
return create_dir(dir);
}) and
std::all_of(output_dirs_.begin(),
output_dirs_.end(),
- [&exec_path, &create_dir](auto const& local_path) {
- return create_dir(exec_path / local_path);
+ [this, &exec_path, &create_dir](auto const& local_path) {
+ return create_dir(exec_path / cwd_ / local_path);
});
}
diff --git a/src/buildtool/execution_api/local/local_action.hpp b/src/buildtool/execution_api/local/local_action.hpp
index b2016ed7..4d256302 100644
--- a/src/buildtool/execution_api/local/local_action.hpp
+++ b/src/buildtool/execution_api/local/local_action.hpp
@@ -65,6 +65,7 @@ class LocalAction final : public IExecutionAction {
LocalContext const& local_context_;
ArtifactDigest const root_digest_{};
std::vector<std::string> const cmdline_{};
+ std::string const cwd_{};
std::vector<std::string> output_files_{};
std::vector<std::string> output_dirs_{};
std::map<std::string, std::string> const env_vars_{};
@@ -76,6 +77,7 @@ class LocalAction final : public IExecutionAction {
gsl::not_null<LocalContext const*> local_context,
ArtifactDigest root_digest,
std::vector<std::string> command,
+ std::string cwd,
std::vector<std::string> output_files,
std::vector<std::string> output_dirs,
std::map<std::string, std::string> env_vars,
@@ -83,6 +85,7 @@ class LocalAction final : public IExecutionAction {
: local_context_{*local_context},
root_digest_{std::move(root_digest)},
cmdline_{std::move(command)},
+ cwd_{std::move(cwd)},
output_files_{std::move(output_files)},
output_dirs_{std::move(output_dirs)},
env_vars_{std::move(env_vars)},
@@ -100,6 +103,7 @@ class LocalAction final : public IExecutionAction {
BazelMsgFactory::ActionDigestRequest request{
.command_line = &cmdline_,
+ .cwd = &cwd_,
.output_files = &output_files_,
.output_dirs = &output_dirs_,
.env_vars = &env_vars,
diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp
index 3a40272e..eadf45b7 100644
--- a/src/buildtool/execution_api/local/local_api.hpp
+++ b/src/buildtool/execution_api/local/local_api.hpp
@@ -61,6 +61,7 @@ class LocalApi final : public IExecutionApi {
[[nodiscard]] auto CreateAction(
ArtifactDigest const& root_digest,
std::vector<std::string> const& command,
+ std::string const& cwd,
std::vector<std::string> const& output_files,
std::vector<std::string> const& output_dirs,
std::map<std::string, std::string> const& env_vars,
@@ -69,6 +70,7 @@ class LocalApi final : public IExecutionApi {
return IExecutionAction::Ptr{new LocalAction{&local_context_,
root_digest,
command,
+ cwd,
output_files,
output_dirs,
env_vars,
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_action.cpp b/src/buildtool/execution_api/remote/bazel/bazel_action.cpp
index 4190ea19..dcbddb8d 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_action.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_action.cpp
@@ -26,6 +26,7 @@ BazelAction::BazelAction(
std::shared_ptr<BazelNetwork> network,
bazel_re::Digest root_digest,
std::vector<std::string> command,
+ std::string cwd,
std::vector<std::string> output_files,
std::vector<std::string> output_dirs,
std::map<std::string, std::string> const& env_vars,
@@ -33,6 +34,7 @@ BazelAction::BazelAction(
: network_{std::move(network)},
root_digest_{std::move(root_digest)},
cmdline_{std::move(command)},
+ cwd_{std::move(cwd)},
output_files_{std::move(output_files)},
output_dirs_{std::move(output_dirs)},
env_vars_{BazelMsgFactory::CreateMessageVectorFromMap<
@@ -122,6 +124,7 @@ auto BazelAction::CreateBundlesForAction(BazelBlobContainer* blobs,
}
BazelMsgFactory::ActionDigestRequest request{
.command_line = &cmdline_,
+ .cwd = &cwd_,
.output_files = &output_files_,
.output_dirs = &output_dirs_,
.env_vars = &env_vars_,
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_action.hpp b/src/buildtool/execution_api/remote/bazel/bazel_action.hpp
index 8316cec1..7bf62a45 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_action.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_action.hpp
@@ -44,6 +44,7 @@ class BazelAction final : public IExecutionAction {
std::shared_ptr<BazelNetwork> const network_;
bazel_re::Digest const root_digest_;
std::vector<std::string> const cmdline_;
+ std::string const cwd_;
std::vector<std::string> output_files_;
std::vector<std::string> output_dirs_;
std::vector<bazel_re::Command_EnvironmentVariable> const env_vars_;
@@ -55,6 +56,7 @@ class BazelAction final : public IExecutionAction {
std::shared_ptr<BazelNetwork> network,
bazel_re::Digest root_digest,
std::vector<std::string> command,
+ std::string cwd,
std::vector<std::string> output_files,
std::vector<std::string> output_dirs,
std::map<std::string, std::string> const& env_vars,
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
index d3dc1b2f..2f54a377 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
@@ -213,6 +213,7 @@ BazelApi::~BazelApi() = default;
auto BazelApi::CreateAction(
ArtifactDigest const& root_digest,
std::vector<std::string> const& command,
+ std::string const& cwd,
std::vector<std::string> const& output_files,
std::vector<std::string> const& output_dirs,
std::map<std::string, std::string> const& env_vars,
@@ -221,6 +222,7 @@ auto BazelApi::CreateAction(
return std::unique_ptr<BazelAction>{new BazelAction{network_,
root_digest,
command,
+ cwd,
output_files,
output_dirs,
env_vars,
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
index 5946f0f7..6b2a6f17 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
@@ -58,6 +58,7 @@ class BazelApi final : public IExecutionApi {
[[nodiscard]] auto CreateAction(
ArtifactDigest const& root_digest,
std::vector<std::string> const& command,
+ std::string const& cwd,
std::vector<std::string> const& output_files,
std::vector<std::string> const& output_dirs,
std::map<std::string, std::string> const& env_vars,