Skip to content

Commit

Permalink
pw_bloat: Build and run pw bloat CLI command in Bazel
Browse files Browse the repository at this point in the history
Defines the pw_bloat Python code as a Bazel library target and adds a
runnable Bazel binary which invokes the equivalent of the `pw bloat`
command.

Usable as

  bazel run //pw_bloat/py:bloat -- /abs/path/to/binary.elf

Tested: The above command works from both outside and within an
activated Pigweed environment, and `pw bloat` continues to function
within a Pigweed environment.

Change-Id: I79fb799e9be184f4f7d0da2865f0cf388cf9b615
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/215456
Lint: Lint 🤖 <[email protected]>
Presubmit-Verified: CQ Bot Account <[email protected]>
Reviewed-by: Armando Montanez <[email protected]>
Commit-Queue: Alexei Frolov <[email protected]>
  • Loading branch information
frolv authored and CQ Bot Account committed Jun 11, 2024
1 parent c9d7fa4 commit e59a11c
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 2 deletions.
9 changes: 9 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,15 @@ cipd_repository(
tag = "version:pw_transfer_test_binaries_528098d588f307881af83f769207b8e6e1b57520-linux-amd64-cipd.cipd",
)

# Set up bloaty size profiler.
# Required by: pigweed.
# Used in modules: //pw_bloat.
cipd_repository(
name = "bloaty",
path = "fuchsia/third_party/bloaty/${os}-amd64",
tag = "git_revision:c057ba4f43db0506d4ba8c096925b054b02a8bd3",
)

# Set up Starlark library.
# Required by: io_bazel_rules_go, com_google_protobuf, rules_python
# Used in modules: None.
Expand Down
45 changes: 45 additions & 0 deletions pw_bloat/py/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Copyright 2024 The Pigweed Authors
#
# 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
#
# https://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.

load("@rules_python//python:defs.bzl", "py_binary", "py_library")
load("//pw_build:selects.bzl", "TARGET_COMPATIBLE_WITH_HOST_SELECT")

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

py_library(
name = "pw_bloat",
srcs = [
"pw_bloat/bloat.py",
"pw_bloat/bloaty_config.py",
"pw_bloat/label.py",
"pw_bloat/label_output.py",
],
data = ["@bloaty//:all"],
imports = ["."],
deps = [
"@pigweed//pw_cli/py:pw_cli",
"@python_packages_pyelftools//:pkg",
"@rules_python//python/runfiles",
],
)

py_binary(
name = "bloat",
srcs = ["pw_bloat/__main__.py"],
main = "pw_bloat/__main__.py",
target_compatible_with = select(TARGET_COMPATIBLE_WITH_HOST_SELECT),
deps = [":pw_bloat"],
)
14 changes: 12 additions & 2 deletions pw_bloat/py/pw_bloat/bloat.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,18 @@ def run_bloaty(
subprocess.CalledProcessError: The Bloaty invocation failed.
"""

default_bloaty = 'bloaty'
bloaty_path = os.getenv('BLOATY_PATH', default_bloaty)
try:
# If running from within a Bazel context, find the Bloaty executable
# within the project's runfiles.
# pylint: disable=import-outside-toplevel
from rules_python.python.runfiles import runfiles # type: ignore

r = runfiles.Create()
bloaty_path = r.Rlocation("bloaty/bloaty")
except ImportError:
# Outside of Bazel, use Bloaty from the system path.
default_bloaty = 'bloaty'
bloaty_path = os.getenv('BLOATY_PATH', default_bloaty)

cmd = [
bloaty_path,
Expand Down

0 comments on commit e59a11c

Please sign in to comment.