pw_symbolizer: Get llvm-symbolizer path from Bazel
Bug: b/355527449
Change-Id: I14120583aed72eea7cc7603ad6caa8c21de89665
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/226254
Commit-Queue: Taylor Cramer <cramertj@google.com>
Reviewed-by: Ted Pudlik <tpudlik@google.com>
Reviewed-by: Taylor Cramer <cramertj@google.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
diff --git a/pw_symbolizer/py/BUILD.bazel b/pw_symbolizer/py/BUILD.bazel
index 2d9ae23..32c7d9a 100644
--- a/pw_symbolizer/py/BUILD.bazel
+++ b/pw_symbolizer/py/BUILD.bazel
@@ -12,11 +12,32 @@
# License for the specific language governing permissions and limitations under
# the License.
+load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
load("@rules_python//python:defs.bzl", "py_library")
load("//pw_build:python.bzl", "pw_py_test")
package(default_visibility = ["//visibility:public"])
+# Path to the `llvm-symbolizer` binary for the toolchain being
+# decoded.
+#
+# This should be overriden for toolchains which don't use
+# `@llvm-toolchain`.
+label_flag(
+ name = "llvm-symbolizer",
+ build_setting_default = "@llvm_toolchain//:bin/llvm-symbolizer",
+)
+
+# Symlink the `llvm-symbolizer` binary (whose path may be different
+# based on the label flag above) into a common location.
+copy_file(
+ name = "llvm-symbolizer-symlink",
+ src = ":llvm-symbolizer",
+ out = "llvm-symbolizer-copy",
+ allow_symlink = True,
+ is_executable = True,
+)
+
py_library(
name = "pw_symbolizer",
srcs = [
@@ -24,6 +45,7 @@
"pw_symbolizer/llvm_symbolizer.py",
"pw_symbolizer/symbolizer.py",
],
+ data = [":llvm-symbolizer-symlink"],
imports = ["."],
)
diff --git a/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py b/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py
index 75dfca4..e93f4a2 100644
--- a/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py
+++ b/pw_symbolizer/py/pw_symbolizer/llvm_symbolizer.py
@@ -20,6 +20,18 @@
from pathlib import Path
from pw_symbolizer import symbolizer
+# If the script is being run through Bazel, our support binaries are provided
+# at well known locations in its runfiles.
+try:
+ from python.runfiles import runfiles # type: ignore
+
+ r = runfiles.Create()
+ _LLVM_SYMBOLIZER = r.Rlocation(
+ 'pigweed/pw_symbolizer/py/llvm-symbolizer-copy'
+ )
+except ImportError:
+ _LLVM_SYMBOLIZER = 'llvm-symbolizer'
+
class LlvmSymbolizer(symbolizer.Symbolizer):
"""A symbolizer that wraps llvm-symbolizer."""
@@ -35,7 +47,7 @@
if llvm_symbolizer_binary:
self._symbolizer_binary = str(llvm_symbolizer_binary)
else:
- self._symbolizer_binary = 'llvm-symbolizer'
+ self._symbolizer_binary = _LLVM_SYMBOLIZER
if shutil.which(self._symbolizer_binary) is None:
raise FileNotFoundError(
'llvm-symbolizer not installed. Run bootstrap, or download '