blob: 4847e15d3d5ccee3ce2fa4513966c272e67aade9 [file]
# Copyright 2025 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("@com_google_protobuf//bazel:proto_library.bzl", "proto_library")
load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@sphinxdocs//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load("//pw_bloat:pw_size_diff.bzl", "pw_size_diff")
load("//pw_bloat:pw_size_table.bzl", "pw_size_table")
load("//pw_build:compatibility.bzl", "incompatible_with_mcu")
load(
"//pw_protobuf_compiler:pw_proto_library.bzl",
"nanopb_proto_library",
"nanopb_rpc_proto_library",
"pw_proto_filegroup",
"pwpb_proto_library",
"raw_rpc_proto_library",
)
load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")
package(
default_visibility = ["//visibility:public"],
features = ["-layering_check"],
)
licenses(["notice"])
cc_library(
name = "metric",
srcs = [
"metric.cc",
"metric_64bit.cc",
],
hdrs = [
"public/pw_metric/config.h",
"public/pw_metric/global.h",
"public/pw_metric/list.h",
"public/pw_metric/metric.h",
],
implementation_deps = ["//pw_assert:check"],
strip_include_prefix = "public",
deps = [
"//pw_containers:intrusive_list",
"//pw_log",
"//pw_memory:no_destructor",
"//pw_numeric:checked_arithmetic",
"//pw_span",
"//pw_tokenizer",
"//pw_tokenizer:base64",
],
)
cc_library(
name = "global",
srcs = ["global.cc"],
hdrs = [
"public/pw_metric/global.h",
],
deps = [
":metric",
"//pw_containers:intrusive_list",
],
)
# Common MetricWalker/MetricWriter used by RPC service.
cc_library(
name = "metric_walker",
srcs = ["metric_walker.cc"],
hdrs = ["public/pw_metric/metric_walker.h"],
strip_include_prefix = "public",
tags = ["noclangtidy"],
visibility = ["//visibility:private"],
deps = [
":metric",
"//pw_assert:check",
"//pw_containers:intrusive_list",
"//pw_containers:vector",
"//pw_function",
"//pw_result",
"//pw_status",
"//pw_tokenizer",
],
)
cc_library(
name = "metric_service_nanopb",
srcs = ["metric_service_nanopb.cc"],
hdrs = [
"public/pw_metric/metric_service_nanopb.h",
"public/pw_metric/nanopb_metric_writer.h",
],
implementation_deps = [
"//pw_assert:check",
"//pw_containers:vector",
],
strip_include_prefix = "public",
deps = [
":metric",
":metric_proto_nanopb_rpc",
":metric_walker",
"//pw_containers:intrusive_list",
"//pw_status",
],
)
cc_library(
name = "metric_service_pwpb",
srcs = ["metric_service_pwpb.cc"],
hdrs = [
"public/pw_metric/metric_service_pwpb.h",
"public/pw_metric/pwpb_metric_writer.h",
],
implementation_deps = [
"//pw_assert:check",
"//pw_containers:vector",
],
includes = [
"metric_proto_cc.pwpb.pb/pw_metric",
"metric_proto_cc.raw_rpc.pb/pw_metric",
],
strip_include_prefix = "public",
deps = [
":metric",
":metric_proto_pwpb",
":metric_proto_raw_rpc",
":metric_walker",
"//pw_bytes",
"//pw_containers:intrusive_list",
"//pw_preprocessor",
"//pw_protobuf",
"//pw_rpc/raw:server_api",
"//pw_span",
"//pw_status",
],
)
pw_proto_filegroup(
name = "metric_proto_and_options",
srcs = [
"pw_metric_proto/metric_service.proto",
],
options_files = [
"pw_metric_proto/metric_service.options",
"pw_metric_proto/metric_service.pwpb_options",
],
)
proto_library(
name = "metric_proto",
srcs = [":metric_proto_and_options"],
strip_import_prefix = "/pw_metric",
deps = [
"//pw_tokenizer:tokenizer_proto",
],
)
py_proto_library(
name = "metric_proto_py_pb2",
deps = [":metric_proto"],
)
pwpb_proto_library(
name = "metric_proto_pwpb",
deps = [":metric_proto"],
)
nanopb_proto_library(
name = "metric_proto_nanopb",
deps = [":metric_proto"],
)
nanopb_rpc_proto_library(
name = "metric_proto_nanopb_rpc",
nanopb_proto_library_deps = [":metric_proto_nanopb"],
deps = [":metric_proto"],
)
raw_rpc_proto_library(
name = "metric_proto_raw_rpc",
deps = [":metric_proto"],
)
pw_cc_test(
name = "metric_test",
srcs = [
"metric_test.cc",
],
deps = [
":metric",
],
)
pw_cc_test(
name = "global_test",
srcs = [
"global_test.cc",
],
# TODO: https://pwbug.dev/325509758 - Doesn't work on the Pico yet; has test
# failures.
target_compatible_with = select({
"//pw_build/constraints/chipset:rp2040": ["@platforms//:incompatible"],
"//conditions:default": [],
}),
deps = [
":global",
],
)
pw_cc_test(
name = "metric_service_nanopb_test",
srcs = [
"metric_service_nanopb_test.cc",
],
deps = [
":metric_service_nanopb",
":metric_walker",
"//pw_rpc:test_helpers",
"//pw_rpc/nanopb:test_method_context",
],
)
pw_cc_test(
name = "metric_service_pwpb_test",
srcs = [
"metric_service_pwpb_test.cc",
],
deps = [
":metric_service_pwpb",
":metric_walker",
"//pw_rpc:test_helpers",
"//pw_rpc/pwpb:test_method_context",
"//pw_rpc/raw:test_method_context",
"//pw_stream",
],
)
pw_size_diff(
name = "one_metric_size_diff",
base = "//pw_metric/size_report:base",
label = "1 metric and 1 group, no dump or export",
target = "//pw_metric/size_report:one_metric",
)
pw_size_diff(
name = "dump_size_diff",
base = "//pw_metric/size_report:base",
label = "(+) dump group and metrics to log",
target = "//pw_metric/size_report:dump",
)
pw_size_diff(
name = "more_metrics_size_diff",
base = "//pw_metric/size_report:dump",
label = "(+) 1 group (+) 4 metrics",
target = "//pw_metric/size_report:more_metrics",
)
pw_size_table(
name = "metric_size_report",
reports = [
":one_metric_size_diff",
":dump_size_diff",
":more_metrics_size_diff",
],
)
sphinx_docs_library(
name = "docs",
srcs = [
"docs.rst",
":metric_size_report",
],
prefix = "pw_metric/",
target_compatible_with = incompatible_with_mcu(),
)