From a7dbd4ef62bbc61452aacb3cc69452567d12490c Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Thu, 10 Jul 2025 16:51:44 -0700 Subject: [PATCH] Improve handling of carbon-busybox symlinks in bazel (#5795) Trying to make the handling of `bazel build //toolchain; bazel clean; bazel build //toolchain; ./bazel-bin/toolchain/carbon` work more consistently. --- toolchain/install/busybox_info.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/toolchain/install/busybox_info.cpp b/toolchain/install/busybox_info.cpp index dde460dd593a..8b90f56e6490 100644 --- a/toolchain/install/busybox_info.cpp +++ b/toolchain/install/busybox_info.cpp @@ -35,22 +35,23 @@ auto GetBusyboxInfo(const char* argv0) -> ErrorOr { BusyboxInfo info = {.bin_path = FindExecutablePath(argv0_path.c_str()), .mode = GetMode(argv0_path)}; - if (info.bin_path.filename() == "carbon-busybox") { - // Check for bazel structure. For example, this makes work: - // /bin/sh -c "exec -a carbon ./bazel-bin/toolchain/carbon" - // /bin/sh -c "exec -a llvm-symbolizer ./bazel-bin/toolchain/carbon" - if (std::filesystem::exists(info.bin_path.string() + ".runfiles")) { + // Now search through any symlinks to locate the installed busybox binary. + while (true) { + if (info.bin_path.filename() == "carbon-busybox") { + // Check for bazel structure. For example, this makes work: + // /bin/sh -c "exec -a carbon ./bazel-bin/toolchain/carbon" + // /bin/sh -c "exec -a llvm-symbolizer ./bazel-bin/toolchain/carbon" + // + // This will never occur in a "bin" subdirectory, so doesn't need to be + // handled in the other return path. std::string prefix_root = info.bin_path.parent_path().string() + "/prefix_root/lib/carbon/carbon-busybox"; if (std::filesystem::exists(prefix_root)) { info.bin_path = prefix_root; } + return info; } - return info; - } - // Now search through any symlinks to locate the installed busybox binary. - while (true) { // If we've not already reached the busybox, look for it relative to the // current binary path. This can help more immediately locate an // installation tree, and avoids walking through a final layer of symlinks @@ -92,9 +93,6 @@ auto GetBusyboxInfo(const char* argv0) -> ErrorOr { // Do a path join, to handle relative symlinks. info.bin_path = parent_path / symlink_target; - if (info.bin_path.filename() == "carbon-busybox") { - return info; - } } }