# Copyright 2021 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( "//pw_build:pigweed.bzl", "pw_cc_binary", "pw_facade", ) load("//targets/host_device_simulator:transition.bzl", "host_device_simulator_binary") package(default_visibility = ["//visibility:public"]) licenses(["notice"]) constraint_setting( name = "system_example_tracing_setting", ) constraint_value( name = "system_example_tracing", constraint_setting = ":system_example_tracing_setting", ) cc_library( name = "config", hdrs = [ "public/pw_system/config.h", ], deps = [":config_override"], ) label_flag( name = "config_override", build_setting_default = ":default_config", ) cc_library( name = "default_config", defines = [ # TODO(b/260641850): Remove this Bazel-only default configuration once # pw_trace builds with Bazel. "PW_SYSTEM_ENABLE_TRACE_SERVICE=0", ], ) cc_library( name = "pw_system", deps = [ ":init", ":io", ":extra_platform_libs", ":target_hooks", ":work_queue", # pw_system has (transitive) dependencies on pw_assert and pw_log. So, # we add deps on the backend_impl here, saving the user from having to # add them manually to their cc_binary target. # # When implementing a backend for pw_assert or pw_log, *do not* depend # on @pigweed//pw_system:pw_system. Instead, depend on the appropriate # component library. See :log_backend, below, for an examples. "//pw_assert:backend_impl", "//pw_log:backend_impl", ], ) # Any platform-specific pw_system components. At the very least, this should # include platform-specific initialization code. It may also include linker # scripts. # # TODO: https://github.com/bazelbuild/bazel/issues/22457 - Recommend using # @bazel_tool//tools/cpp:link_extra_libs instead, once they're not propagated # to the exec configuration. label_flag( name = "extra_platform_libs", build_setting_default = "//targets/host_device_simulator:boot", ) cc_library( name = "log", srcs = [ "log.cc", ], hdrs = [ "pw_system_private/log.h", ], deps = [ ":config", ":rpc_server", "//pw_log_rpc:log_service", "//pw_log_rpc:rpc_log_drain", "//pw_log_rpc:rpc_log_drain_thread", "//pw_multisink", "//pw_sync:lock_annotations", "//pw_sync:mutex", ], ) cc_library( name = "log_backend", srcs = [ "log_backend.cc", ], deps = [ ":config", ":log", "//pw_bytes", "//pw_chrono:system_clock", "//pw_log:proto_utils", "//pw_log:pw_log.facade", "//pw_log_string:handler_facade", "//pw_log_tokenized:handler_facade", "//pw_log_tokenized:headers", "//pw_metric:global", "//pw_multisink", "//pw_result", "//pw_string", "//pw_sync:interrupt_spin_lock", "//pw_sync:lock_annotations", "//pw_tokenizer", ], # Log backends, like assert backends, generally need to be alwayslink'ed # because we don't inform Bazel correctly about dependencies on them. We # only add them as deps of binary targets, not intermediate library targets, # to avoid circular dependencies. But this may lead the linker to eagerly # remove some symbols defined here as unused. alwayslink = 1, ) cc_library( name = "rpc_server", srcs = [ "hdlc_rpc_server.cc", ], hdrs = [ "public/pw_system/rpc_server.h", ], includes = ["public"], deps = [ ":config", ":io", "//pw_assert", "//pw_hdlc", "//pw_hdlc:default_addresses", "//pw_hdlc:rpc_channel_output", "//pw_sync:mutex", "//pw_thread:thread_core", "//pw_trace", ], ) cc_library( name = "thread_snapshot_service", srcs = [ "thread_snapshot_service.cc", ], hdrs = [ "public/pw_system/thread_snapshot_service.h", ], includes = ["public"], deps = [ "//pw_rpc", "//pw_thread:thread_snapshot_service", ], ) pw_facade( name = "io", hdrs = [ "public/pw_system/io.h", ], backend = ":io_backend", includes = ["public"], deps = [ "//pw_stream", ], ) label_flag( name = "io_backend", build_setting_default = "//pw_system:target_io", ) cc_library( name = "init", srcs = [ "init.cc", ], hdrs = [ "public/pw_system/init.h", ], includes = ["public"], deps = [ ":file_manager", ":log", ":rpc_server", ":target_hooks", ":thread_snapshot_service", ":transfer_service", ":work_queue", "//pw_metric:global", "//pw_metric:metric_service_pwpb", "//pw_rpc/pwpb:echo_service", "//pw_thread:thread", ] + select({ ":system_example_tracing": [ ":file_service", ":trace_service", "//pw_trace", ], "//conditions:default": [ ], }), ) cc_library( name = "work_queue", srcs = [ "work_queue.cc", ], hdrs = [ "public/pw_system/work_queue.h", ], includes = ["public"], deps = [ ":config", "//pw_work_queue", ], ) cc_library( name = "target_io", srcs = [ "target_io.cc", ], includes = ["public"], deps = [ ":io.facade", "//pw_stream", "//pw_stream:sys_io_stream", ], ) cc_library( name = "socket_target_io", srcs = [ "socket_target_io.cc", ], includes = ["public"], deps = [ ":config", ":io.facade", "//pw_assert", "//pw_stream", "//pw_stream:socket_stream", ], ) cc_library( name = "transfer_handlers", srcs = [ "transfer_handlers.cc", ], hdrs = [ "public/pw_system/transfer_handlers.h", ], includes = ["public"], deps = [ "//pw_persistent_ram", "//pw_trace_tokenized:config", "//pw_transfer", ], ) cc_library( name = "file_manager", srcs = [ "file_manager.cc", ], hdrs = [ "public/pw_system/file_manager.h", ], includes = ["public"], deps = [ ":config", ":transfer_handlers", "//pw_file:flat_file_system", "//pw_persistent_ram:flat_file_system_entry", ] + select({ ":system_example_tracing": [ ":trace_service", ], "//conditions:default": [ ], }), ) cc_library( name = "transfer_service", srcs = [ "transfer_service.cc", ], hdrs = [ "public/pw_system/transfer_service.h", ], includes = ["public"], deps = [ ":file_manager", "//pw_transfer", ], ) cc_library( name = "file_service", srcs = [ "file_service.cc", ], hdrs = [ "public/pw_system/file_service.h", ], includes = ["public"], deps = [ ":file_manager", ], ) cc_library( name = "trace_service", srcs = [ "trace_service.cc", ], hdrs = [ "public/pw_system/trace_service.h", ], includes = ["public"], deps = [ ":transfer_handlers", "//pw_persistent_ram", "//pw_trace_tokenized:trace_service_pwpb", ], ) cc_library( name = "target_hooks", hdrs = [ "public/pw_system/target_hooks.h", ], includes = ["public"], deps = [ ":target_hooks_backend", "//pw_thread:thread", ], ) label_flag( name = "target_hooks_backend", build_setting_default = ":target_hooks_multiplexer", ) # This isn't the best solution, but it's close enough for now. Target hooks are # not generically related to an OS, and should be inject-able by downstream # projects. For now, assume the pre-baked OS-specific hooks are good enough. cc_library( name = "target_hooks_multiplexer", visibility = ["@pigweed//targets:__pkg__"], deps = select({ "//pw_build/constraints/rtos:freertos": [":freertos_target_hooks"], "//conditions:default": [":stl_target_hooks"], }), ) cc_library( name = "stl_target_hooks", srcs = [ "stl_target_hooks.cc", ], includes = ["public"], deps = [ ":config", "//pw_thread:thread", "//pw_thread_stl:thread", ], ) cc_library( name = "freertos_target_hooks", srcs = [ "freertos_target_hooks.cc", ], hdrs = [ "public/pw_system/target_hooks.h", ], includes = ["public"], target_compatible_with = [ "//pw_build/constraints/rtos:freertos", ], deps = [ ":config", "//pw_thread:thread", "//pw_thread_freertos:thread", ], ) pw_cc_binary( name = "system_example", # This is marked as testonly because the example app pulls in the RPC unit # test runner. In a real production binary, you wouldn't want to have any # testonly dependencies. testonly = True, srcs = ["example_user_app_init.cc"], deps = [ ":pw_system", "//pw_unit_test:rpc_service", ], ) host_device_simulator_binary( name = "simulator_system_example", testonly = True, binary = ":system_example", )