// Copyright 2022 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. package { default_applicable_licenses: ["external_pigweed_license"], } java_library { name: "pw_rpc_java_client", srcs: ["java/main/dev/pigweed/pw_rpc/*.java"], visibility: ["//visibility:public"], static_libs: [ "pw_log_android_java", "pw_rpc_packet_proto_java_lite", ], libs: [ "auto_value_annotations", "guava", "jsr305", "libprotobuf-java-lite", ], plugins: ["auto_value_plugin"], sdk_version: "current", } java_library_static { name: "pw_rpc_packet_proto_java_lite", host_supported: true, proto: { type: "lite", }, srcs: ["internal/packet.proto"], sdk_version: "current", } java_library_static { name: "pw_rpc_echo_proto_java_lite", visibility: ["//visibility:public"], host_supported: true, proto: { type: "lite", }, srcs: ["echo.proto"], sdk_version: "current", } filegroup { name: "pw_rpc_src_files", srcs: [ "call.cc", "channel.cc", "channel_list.cc", "client.cc", "client_call.cc", "client_server.cc", "endpoint.cc", "fake_channel_output.cc", "packet.cc", "packet_meta.cc", "server.cc", "server_call.cc", "service.cc", ], } // Do not use this directly. It is used by the pw_rpc_defaults to keep the // path to the "public" directory relative to this module. cc_library_headers { name: "pw_rpc_include_dirs", export_include_dirs: [ "public", ], vendor_available: true, host_supported: true, } // This rule must be instantiated, i.e. // // cc_library_static { // name: "pw_rpc_", // defaults: [ // "pw_rpc_cflags_", // "pw_rpc_defaults", // ], // } // // where pw_rpc_cflags_ defines your flags, i.e. // // cc_defaults { // name: "pw_rpc_cflags_", // cflags: [ // "-DPW_RPC_USE_GLOBAL_MUTEX=0", // "-DPW_RPC_COMPLETION_REQUEST_CALLBACK", // "-DPW_RPC_DYNAMIC_ALLOCATION", // ], // } // // see pw_rpc_nanopb_defaults, pw_rpc_raw_defaults cc_defaults { name: "pw_rpc_defaults", cpp_std: "c++20", defaults: [ "pw_android_common_backends", ], header_libs: [ "fuchsia_sdk_lib_fit", "fuchsia_sdk_lib_stdcompat", "pw_assert", "pw_log", "pw_rpc_include_dirs", "pw_sync", ], export_header_lib_headers: [ "fuchsia_sdk_lib_fit", "fuchsia_sdk_lib_stdcompat", "pw_assert", "pw_log", "pw_rpc_include_dirs", "pw_sync", ], static_libs: [ "pw_bytes", "pw_containers", "pw_function", "pw_polyfill", "pw_preprocessor", "pw_protobuf", "pw_result", "pw_span", "pw_status", "pw_stream", "pw_string", "pw_sync_baremetal", "pw_toolchain", "pw_varint", ], export_static_lib_headers: [ "pw_bytes", "pw_containers", "pw_function", "pw_polyfill", "pw_preprocessor", "pw_protobuf", "pw_result", "pw_span", "pw_status", "pw_stream", "pw_string", "pw_sync_baremetal", "pw_toolchain", "pw_varint", ], generated_headers: [ "pw_rpc_internal_packet_pwpb_h", ], export_generated_headers: [ "pw_rpc_internal_packet_pwpb_h", ], srcs: [ ":pw_rpc_src_files", ], } genrule { name: "pw_rpc_internal_packet_pwpb_h", srcs: ["internal/packet.proto"], cmd: "python3 $(location pw_protobuf_compiler_py) " + "--out-dir=$$(dirname $(location pw_rpc/internal/packet.pwpb.h)) " + "--plugin-path=$(location pw_protobuf_plugin_py) " + "--compile-dir=$$(dirname $(in)) " + "--sources $(in) " + "--language pwpb " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc) ", out: [ "pw_rpc/internal/packet.pwpb.h", ], tools: [ "aprotoc", "pw_protobuf_plugin_py", "pw_protobuf_compiler_py", ], } genrule { name: "pw_rpc_internal_packet_py", srcs: ["internal/packet.proto"], cmd: "python3 $(location pw_protobuf_compiler_py) " + "--out-dir=$(genDir) " + "--compile-dir=$$(dirname $(in)) " + "--sources $(in) " + "--language python " + "--no-generate-type-hints " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", out: [ "packet_pb2.py", ], tools: [ "aprotoc", "pw_protobuf_compiler_py", ], } // Generate cc and header nanopb files. // The output file names are based on the srcs file name with a .pb.c / .pb.h extension. genrule_defaults { name: "pw_rpc_generate_nanopb_proto", cmd: "in_files=($(in)); compile_dir=$$(dirname $${in_files[0]}); " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location protoc-gen-nanopb) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language nanopb " + "--sources $(in) " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "protoc-gen-nanopb", "pw_protobuf_compiler_py", ], } // Same as pw_rpc_generate_nanopb_proto but the proto files are compiled with a // single prefix, which can be added with pw_rpc_add_prefix_to_proto. // Since pw_rpc_add_prefix_to_proto may include .option files as an input, only // .proto files are passed to the compile script. Make sure .option files are // prefixed in the same rule as their .proto files. // // See the pw_rpc_echo_service_nanopb target for an example. The echo.proto file // is compiled with "pw_rpc" as the prefix. genrule_defaults { name: "pw_rpc_generate_nanopb_proto_with_prefix", cmd: "in_files=($(in)); prefix_dir=$$(dirname $${in_files[0]}); " + "compile_dir=$$(dirname $${prefix_dir}); proto_files=(); " + "for f in \"$${in_files[@]}\"; do " + "if [[ \"$${f##*.}\" == \"proto\" ]]; then " + "proto_files+=(\"$${f}\"); fi; done; " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location protoc-gen-nanopb) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language nanopb " + "--sources $${proto_files} " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "protoc-gen-nanopb", "pw_protobuf_compiler_py", ], } // Generate the header nanopb RPC file. // The output file name is based on the srcs file name with a .rpc.pb.h extension. genrule_defaults { name: "pw_rpc_generate_nanopb_rpc_header", cmd: "in_files=($(in)); compile_dir=$$(dirname $${in_files[0]}); " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_rpc_plugin_nanopb_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language nanopb_rpc " + "--sources $(in) " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_compiler_py", "pw_rpc_plugin_nanopb_py", ], } // Same as pw_rpc_generate_nanopb_rpc_header but the proto files are compiled // with a single prefix, which can be added with pw_rpc_add_prefix_to_proto. // Since pw_rpc_add_prefix_to_proto may include .option files as an input, only // .proto files are passed to the compile script. Make sure .option files are // prefixed in the same rule as their .proto files. // // See the pw_rpc_echo_service_nanopb target for an example. The echo.proto file // is compiled with "pw_rpc" as the prefix. genrule_defaults { name: "pw_rpc_generate_nanopb_rpc_header_with_prefix", cmd: "in_files=($(in)); prefix_dir=$$(dirname $${in_files[0]}); " + "compile_dir=$$(dirname $${prefix_dir}); proto_files=(); " + "for f in \"$${in_files[@]}\"; do " + "if [[ \"$${f##*.}\" == \"proto\" ]]; then " + "proto_files+=(\"$${f}\"); fi; done; " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_rpc_plugin_nanopb_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language nanopb_rpc " + "--sources $${proto_files} " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_compiler_py", "pw_rpc_plugin_nanopb_py", ], } // Generate the header raw RPC file. // The output file name is based on the srcs file name with a .raw_rpc.pb.h extension. genrule_defaults { name: "pw_rpc_generate_raw_rpc_header", cmd: "in_files=($(in)); compile_dir=$$(dirname $${in_files[0]}); " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_rpc_plugin_rawpb_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language raw_rpc " + "--sources $(in) " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_compiler_py", "pw_rpc_plugin_rawpb_py", ], } // Same as pw_rpc_generate_raw_rpc_header but the proto files are compiled with // a single prefix, which can be added with pw_rpc_add_prefix_to_proto. // Since pw_rpc_add_prefix_to_proto may include .option files as an input, only // .proto files are passed to the compile script. Make sure .option files are // prefixed in the same rule as their .proto files. // // See the pw_rpc_echo_service_pwpb target for an example. The echo.proto file // is compiled with "pw_rpc" as the prefix. genrule_defaults { name: "pw_rpc_generate_raw_rpc_header_with_prefix", cmd: "in_files=($(in)); prefix_dir=$$(dirname $${in_files[0]}); " + "compile_dir=$$(dirname $${prefix_dir}); proto_files=(); " + "for f in \"$${in_files[@]}\"; do " + "if [[ \"$${f##*.}\" == \"proto\" ]]; then " + "proto_files+=(\"$${f}\"); fi; done; " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_rpc_plugin_rawpb_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language raw_rpc " + "--sources $${proto_files} " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_compiler_py", "pw_rpc_plugin_rawpb_py", ], } // Generate header pwpb files. // The output file names are based on the srcs file name with a .pwpb.h extension. genrule_defaults { name: "pw_rpc_generate_pwpb_proto", cmd: "in_files=($(in)); compile_dir=$$(dirname $${in_files[0]}); " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_protobuf_plugin_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language pwpb " + "--sources $(in) " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_plugin_py", "pw_protobuf_compiler_py", ], } // Same as pw_rpc_generate_pwpb_proto but the proto files are compiled with a // single prefix, which can be added with pw_rpc_add_prefix_to_proto. // Since pw_rpc_add_prefix_to_proto may include .option files as an input, only // .proto files are passed to the compile script. Make sure .option files are // prefixed in the same rule as their .proto files. // // See the pw_rpc_echo_service_pwpb target for an example. The echo.proto file // is compiled with "pw_rpc" as the prefix. genrule_defaults { name: "pw_rpc_generate_pwpb_proto_with_prefix", cmd: "in_files=($(in)); prefix_dir=$$(dirname $${in_files[0]}); " + "compile_dir=$$(dirname $${prefix_dir}); proto_files=(); " + "for f in \"$${in_files[@]}\"; do " + "if [[ \"$${f##*.}\" == \"proto\" ]]; then " + "proto_files+=(\"$${f}\"); fi; done; " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_protobuf_plugin_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language pwpb " + "--sources $${proto_files} " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_plugin_py", "pw_protobuf_compiler_py", ], } // Generate the header pwpb RPC file. // The output file name is based on the srcs file name with a .rpc.pwpb.h extension. genrule_defaults { name: "pw_rpc_generate_pwpb_rpc_header", cmd: "in_files=($(in)); compile_dir=$$(dirname $${in_files[0]}); " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_rpc_plugin_pwpb_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language pwpb_rpc " + "--sources $(in) " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_compiler_py", "pw_rpc_plugin_pwpb_py", ], } // Same as pw_rpc_generate_pwpb_rpc_header but the proto files are compiled // with a single prefix, which can be added with pw_rpc_add_prefix_to_proto. // Since pw_rpc_add_prefix_to_proto may include .option files as an input, only // .proto files are passed to the compile script. Make sure .option files are // prefixed in the same rule as their .proto files. // // See the pw_rpc_echo_service_pwpb target for an example. The echo.proto file // is compiled with "pw_rpc" as the prefix. genrule_defaults { name: "pw_rpc_generate_pwpb_rpc_header_with_prefix", cmd: "in_files=($(in)); prefix_dir=$$(dirname $${in_files[0]}); " + "compile_dir=$$(dirname $${prefix_dir}); proto_files=(); " + "for f in \"$${in_files[@]}\"; do " + "if [[ \"$${f##*.}\" == \"proto\" ]]; then " + "proto_files+=(\"$${f}\"); fi; done; " + "python3 $(location pw_protobuf_compiler_py) " + "--plugin-path=$(location pw_rpc_plugin_pwpb_py) " + "--out-dir=$(genDir) " + "--compile-dir=$${compile_dir} " + "--language pwpb_rpc " + "--sources $${proto_files} " + "--no-experimental-proto3-optional " + "--protoc=$(location aprotoc)", tools: [ "aprotoc", "pw_protobuf_compiler_py", "pw_rpc_plugin_pwpb_py", ], } // Copies the proto files to a prefix directory to add the prefix to the // compiled proto. The prefix is taken from the directory name of the first // item listen in out. genrule_defaults { name: "pw_rpc_add_prefix_to_proto", cmd: "out_files=($(out)); prefix=$$(dirname $${out_files[0]}); " + "mkdir -p $${prefix}; cp -t $${prefix} $(in);", } genrule { name: "pw_rpc_echo_proto_with_prefix", defaults: ["pw_rpc_add_prefix_to_proto"], srcs: [ "echo.options", "echo.proto", ], out: [ "pw_rpc/echo.options", "pw_rpc/echo.proto", ], } genrule { name: "pw_rpc_echo_rpc_header", defaults: ["pw_rpc_generate_nanopb_rpc_header_with_prefix"], srcs: [":pw_rpc_echo_proto_with_prefix"], out: ["pw_rpc/echo.rpc.pb.h"], } genrule { name: "pw_rpc_echo_proto_header", defaults: ["pw_rpc_generate_nanopb_proto_with_prefix"], srcs: [":pw_rpc_echo_proto_with_prefix"], out: ["pw_rpc/echo.pb.h"], } genrule { name: "pw_rpc_echo_proto_source", defaults: ["pw_rpc_generate_nanopb_proto_with_prefix"], srcs: [":pw_rpc_echo_proto_with_prefix"], out: ["pw_rpc/echo.pb.c"], } // This is a copy of the echo.pb.h header, since the generated echo.pb.c // includes it by file name, while pw_rpc/nanopb/echo_service_nanopb.h includes // it with a prefix. // Soong makes it very hard to add include directories when they don't come from // modules, so this is a kludge to add an include directory path without a // prefix. genrule { name: "pw_rpc_echo_proto_header_copy", cmd: "cp $(in) $(out)", srcs: [":pw_rpc_echo_proto_header"], out: ["echo.pb.h"], } cc_library_static { name: "pw_rpc_echo_service_nanopb", cpp_std: "c++20", vendor_available: true, host_supported: true, export_include_dirs: ["public/pw_rpc"], generated_headers: [ "pw_rpc_echo_proto_header", "pw_rpc_echo_proto_header_copy", "pw_rpc_echo_rpc_header", ], export_generated_headers: [ "pw_rpc_echo_proto_header", "pw_rpc_echo_proto_header_copy", "pw_rpc_echo_rpc_header", ], generated_sources: ["pw_rpc_echo_proto_source"], static_libs: ["libprotobuf-c-nano"], } genrule { name: "pw_rpc_echo_pwpb_rpc_header", defaults: ["pw_rpc_generate_pwpb_rpc_header_with_prefix"], srcs: [":pw_rpc_echo_proto_with_prefix"], out: ["pw_rpc/echo.rpc.pwpb.h"], } genrule { name: "pw_rpc_echo_pwpb_proto_header", defaults: ["pw_rpc_generate_pwpb_proto_with_prefix"], srcs: [":pw_rpc_echo_proto_with_prefix"], out: ["pw_rpc/echo.pwpb.h"], } cc_library_static { name: "pw_rpc_echo_service_pwpb", cpp_std: "c++20", vendor_available: true, host_supported: true, export_include_dirs: ["public/pw_rpc"], generated_headers: [ "pw_rpc_echo_pwpb_proto_header", "pw_rpc_echo_pwpb_rpc_header", ], export_generated_headers: [ "pw_rpc_echo_pwpb_proto_header", "pw_rpc_echo_pwpb_rpc_header", ], } python_library_host { name: "pw_rpc_internal_packet_py_lib", srcs: [ ":pw_rpc_internal_packet_py", ], pkg_path: "pw_rpc/internal", }