Skip to content

Commit

Permalink
Seperate GetSelfPath implementation for Blaze and Bazel
Browse files Browse the repository at this point in the history
In Blaze, we keep using "/proc/self/exe", but in Bazel we resolve this symlink
to the actual Bazel binary.

This is essentially a rollback of
d79ec03
only for Bazel, because it solved an issue that rare in Bazel,
but it's preventing users from running Bazel inside a Linux docker container on Apple Silicon machines.

Fixes #15076

Closes #14391

RELNOTES: None
PiperOrigin-RevId: 441198110
  • Loading branch information
meteorcloudy authored and copybara-github committed Apr 12, 2022
1 parent 5c73d86 commit d3435b0
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 7 deletions.
1 change: 1 addition & 0 deletions src/main/cpp/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ cc_library(
"//conditions:default": [
"blaze_util_linux.cc",
"blaze_util_posix.cc",
"get_self_path_linux.cc",
],
}),
hdrs = [
Expand Down
7 changes: 0 additions & 7 deletions src/main/cpp/blaze_util_linux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,6 @@ void WarnFilesystemType(const blaze_util::Path &output_base) {
}
}

string GetSelfPath(const char* argv0) {
// The file to which this symlink points could change contents or go missing
// concurrent with execution of the Bazel client, so we don't eagerly resolve
// it.
return "/proc/self/exe";
}

uint64_t GetMillisecondsMonotonic() {
struct timespec ts = {};
clock_gettime(CLOCK_MONOTONIC, &ts);
Expand Down
44 changes: 44 additions & 0 deletions src/main/cpp/get_self_path_linux.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2022 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <unistd.h>
#include <limits.h>

#include "src/main/cpp/blaze_util_platform.h"
#include "src/main/cpp/util/errors.h"
#include "src/main/cpp/util/exit_code.h"
#include "src/main/cpp/util/logging.h"

namespace blaze {

using blaze_util::GetLastErrorString;
using std::string;

string GetSelfPath(const char* argv0) {
char buffer[PATH_MAX] = {};
ssize_t bytes = readlink("/proc/self/exe", buffer, sizeof(buffer));
if (bytes == sizeof(buffer)) {
// symlink contents truncated
bytes = -1;
errno = ENAMETOOLONG;
}
if (bytes == -1) {
BAZEL_DIE(blaze_exit_code::INTERNAL_ERROR)
<< "error reading /proc/self/exe: " << GetLastErrorString();
}
buffer[bytes] = '\0'; // readlink does not NUL-terminate
return string(buffer);
}

} // namespace blaze

0 comments on commit d3435b0

Please sign in to comment.