| # Copyright 2022 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//build/compiled_action.gni") |
| import("//build/rust/rustc_library.gni") |
| |
| # Generate a rust library based on the provided protobufs. |
| # |
| # sources (required) |
| # The paths to the .proto sources |
| # |
| # packages (required) |
| # The protobuf packages represented by the specified sources and |
| # their dependencies |
| # |
| # include_dirs (optional, default = []) |
| # Directories in which to search for imported proto files. |
| # |
| # deps (optional, default = []) |
| # Additional rust crates for the generated library to depend on. It is not |
| # necessary to include the prost runtime, it is included implicitly. |
| # |
| # Ex: |
| # rust_proto_library("vm_guest_proto") { |
| # sources = [ |
| # "vm_guest.proto", |
| # ] |
| # packages = [ |
| # "vm_tools", "google.protobuf", |
| # ] |
| # include_dirs = [ |
| # "//third_party/protobuf/src" |
| # ] |
| # } |
| # |
| # rustc_binary("bin") { |
| # edition = "2021" |
| # output_name = "example" |
| # deps = [ |
| # ":vm_guest_proto", |
| # ] |
| # sources = [ |
| # "src/main.rs", |
| # ] |
| # } |
| |
| template("rust_proto_library") { |
| assert(defined(invoker.sources), "Need protobuf sources for $target_name") |
| proto_sources = rebase_path(invoker.sources, root_build_dir) |
| assert(defined(invoker.packages), |
| "The protobuf packages that are being generated should be specified.") |
| proto_packages = invoker.packages |
| |
| if (!defined(invoker.include_dirs)) { |
| proto_include_dirs = [] |
| } else { |
| proto_include_dirs = rebase_path(invoker.include_dirs, root_build_dir) |
| } |
| |
| crate_deps = [ "//third_party/rust_crates:prost" ] |
| if (defined(invoker.deps)) { |
| crate_deps += invoker.deps |
| } |
| |
| target_crate_root = "${target_gen_dir}/${target_name}" |
| |
| # The rust code we expect to be generated by our compiled action |
| expected_outputs = [] |
| foreach(package, proto_packages) { |
| expected_outputs += [ "${target_crate_root}/${package}.rs" ] |
| } |
| |
| rebased_out_dir = rebase_path(target_crate_root, root_build_dir) |
| |
| protoc_label = "//third_party/protobuf:protoc($host_toolchain)" |
| protoc_path = get_label_info(protoc_label, "root_out_dir") + "/protoc" |
| |
| prost_build_label = |
| "//tools/protobuf/rust_proto:prost_build_standalone($host_toolchain)" |
| prost_build_path = get_label_info(prost_build_label, "root_out_dir") + |
| "/prost_build_standalone" |
| |
| include_args = [] |
| foreach(dir, proto_include_dirs) { |
| include_args += [ |
| "--include-dirs", |
| dir, |
| ] |
| } |
| |
| proto_args = [] |
| foreach(proto, proto_sources) { |
| proto_args += [ |
| "--protos", |
| proto, |
| ] |
| } |
| |
| _main_target_label = get_label_info(":$target_name", "label_with_toolchain") |
| |
| action("gen_${target_name}") { |
| script = "//tools/protobuf/rust_proto/prost_build_wrapper.py" |
| inputs = [ |
| prost_build_path, |
| protoc_path, |
| ] |
| deps = [ |
| prost_build_label, |
| protoc_label, |
| ] |
| sources = invoker.sources |
| outputs = [ "${target_crate_root}/lib.rs" ] + expected_outputs |
| depfile = "$target_gen_dir/$target_name.d" |
| args = |
| [ |
| "--protoc", |
| rebase_path(protoc_path, root_build_dir), |
| "--prost_build", |
| rebase_path(prost_build_path, root_build_dir), |
| "--out-dir", |
| rebased_out_dir, |
| "--gn-target", |
| _main_target_label, |
| "--depfile", |
| rebase_path(depfile, root_build_dir), |
| "--expected-outputs", |
| ] + rebase_path(outputs, root_build_dir) + [ "--expected-packages" ] + |
| proto_packages + include_args + proto_args |
| } |
| |
| rustc_library(target_name) { |
| edition = "2021" |
| deps = [ ":gen_${target_name}" ] + crate_deps |
| source_root = "${target_crate_root}/lib.rs" |
| sources = get_target_outputs(":gen_${target_name}") |
| } |
| } |