| # Copyright 2021 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/testing/golden_file.gni") |
| import("//third_party/protobuf/proto_library.gni") |
| |
| # Used internally by golden_go_proto() to verify that a generated .pb.go |
| # file matches a golden reference. This is similar to the golden_file() |
| # template, except that it will intentionally ignore the version numbers |
| # for protoc, protoc-gen-go and protoc-gen-go-grpc embedded in the files |
| # to make it easier to roll new versions of the sources or the compiler |
| # and plugins. |
| # |
| # Arguments are: |
| # |
| # current (required) |
| # Path to the current version of the file. This is typically generated |
| # by another target that would be listed in deps. |
| # |
| # golden (required) |
| # Path to reference file to compare with current one. |
| # |
| # deps |
| # Usual GN meaning. |
| # |
| template("_golden_go_proto_file") { |
| assert(defined(invoker.golden), "golden is a required parameter") |
| assert(defined(invoker.current), "current is a required parameter") |
| |
| action(target_name) { |
| forward_variables_from(invoker, "*") |
| |
| script = "//build/go/verify_golden_go_proto_file.py" |
| |
| stamp_file = "$target_gen_dir/$target_name.verified" |
| |
| inputs = [ |
| current, |
| golden, |
| ] |
| |
| outputs = [ stamp_file ] |
| |
| args = [ |
| "--golden", |
| rebase_path(golden, root_build_dir), |
| "--current", |
| rebase_path(current, root_build_dir), |
| "--stamp", |
| rebase_path(stamp_file, root_build_dir), |
| "--fuchsia-dir", |
| rebase_path("//", root_build_dir), |
| ] |
| |
| if (bless_goldens) { |
| args += [ "--bless" ] |
| } |
| } |
| } |
| |
| # Compiles a protocol buffer for Go and defines it as a golden checked-in file |
| # in the source tree. |
| # |
| # Parameters (all delegate to proto_library) |
| # |
| # generate_descriptor_set (optional, default false) |
| # Generate a descriptor set file. |
| # |
| # generate_go_grpc (optional, default false) |
| # Generate a gRPC protobuf stub. |
| # |
| # import_protobuf_full (optional) |
| # Allows .proto files to import .proto files from protobuf_full, without |
| # adding a dependency on all the C++ code in that library. |
| template("golden_go_proto") { |
| _generate_go_grpc = |
| defined(invoker.generate_go_grpc) && invoker.generate_go_grpc |
| _proto_name = "${target_name}_proto" |
| if (_generate_go_grpc) { |
| _proto_name += "_grpc" |
| } |
| |
| proto_library(_proto_name) { |
| forward_variables_from(invoker, |
| [ |
| "generate_descriptor_set", |
| "import_protobuf_full", |
| "sources", |
| ]) |
| generate_cc = false |
| if (_generate_go_grpc) { |
| generate_go_grpc = true |
| } else { |
| generate_go = true |
| } |
| generate_python = false |
| } |
| |
| _here = rebase_path(".", "//") |
| _proto_dir = "${root_gen_dir}/go-proto-gen/src/${_here}" |
| _goldens = [] |
| foreach(source, invoker.sources) { |
| _name = get_path_info(source, "name") |
| if (_generate_go_grpc) { |
| _name += "_grpc" |
| } |
| _dir = rebase_path(get_path_info(source, "dir"), ".") |
| |
| _output = "${_name}.pb.go" |
| _golden_name = "${_name}_pb_go_diff" |
| _golden_go_proto_file(_golden_name) { |
| golden = "${_dir}/${_output}" |
| current = "${_proto_dir}/${golden}" |
| deps = [ ":${_proto_name}" ] |
| } |
| _goldens += [ ":${_golden_name}" ] |
| } |
| |
| if (defined(invoker.generate_descriptor_set) && |
| invoker.generate_descriptor_set) { |
| _target_name = target_name |
| if (_generate_go_grpc) { |
| _target_name += "_grpc" |
| } |
| _golden_name = "${_target_name}_desc_pb_diff" |
| golden_file(_golden_name) { |
| golden = "${_dir}/${_target_name}.desc.pb" |
| current = "${target_out_dir}/${_proto_name}.desc.pb" |
| deps = [ ":${_proto_name}" ] |
| } |
| |
| _goldens += [ ":${_golden_name}" ] |
| } |
| |
| group(target_name) { |
| public_deps = [ ":${_proto_name}" ] + _goldens |
| } |
| } |