| # Copyright 2020 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/dart/dart_library.gni") |
| import("//build/dart/dart_tool.gni") |
| import("//build/dart/test.gni") |
| |
| group("strict_deps_group") { |
| deps = [ ":strict_deps" ] |
| } |
| |
| dart_library_target_name = "dart_strict_deps_proto" |
| dart_library_package_name = "tools.dart-strict-deps.$dart_library_target_name" |
| |
| dart_tool("strict_deps") { |
| package_name = "strict_deps" |
| main_dart = "bin/main.dart" |
| source_dir = "bin" |
| output_name = "strict_deps" |
| deps = [ |
| ":$dart_library_target_name", |
| "./library:dart_strict_deps_lib", |
| "//third_party/dart-pkg/pub/args", |
| ] |
| } |
| |
| # This is the generated dart package's source root directory (where the |
| # pubspec.yaml, etc. go). |
| package_root_dir = "$target_gen_dir/$dart_library_target_name" |
| |
| # This is where we put the generated files. |
| package_gen_dir = "$package_root_dir/lib" |
| |
| proto_input_filepaths = [ "protos/models.proto" ] |
| |
| # Compute the list of generated files. |
| proto_output_filepaths = [] |
| foreach(source, proto_input_filepaths) { |
| # Extract where the generated file will be. |
| gen_dir = get_path_info(source, "gen_dir") |
| |
| # extract the non-extension part of the file. |
| name_part = get_path_info(source, "name") |
| |
| source_prefix = |
| "$package_gen_dir/" + rebase_path(gen_dir, target_gen_dir) + "/$name_part" |
| |
| proto_output_filepaths += [ |
| "${source_prefix}.pb.dart", |
| "${source_prefix}.pbenum.dart", |
| "${source_prefix}.pbjson.dart", |
| "${source_prefix}.pbserver.dart", |
| ] |
| } |
| |
| protoc_label = "//third_party/protobuf:protoc($host_toolchain)" |
| protoc_gen_dart_label = "//tools/protobuf/protoc_gen_dart($host_toolchain)" |
| |
| protoc_path = get_label_info(protoc_label, "root_out_dir") + "/protoc" |
| proto_gen_target = dart_library_target_name + "_generate_bindings" |
| copy_pubspec_target = dart_library_target_name + "_copy_pubspec" |
| |
| generated_file("protoc_gen_dart_snapshot_info") { |
| visibility = [ ":*" ] |
| outputs = [ "$target_gen_dir/${target_name}.snapshot_info" ] |
| data_keys = [ "rebased_snapshot_path" ] |
| walk_keys = [ "rebased_snapshot_path_barrier" ] |
| rebase = root_build_dir |
| deps = [ protoc_gen_dart_label ] |
| } |
| |
| # This target runs the protoc tool to generate dart sources |
| action(proto_gen_target) { |
| visibility = [ ":*" ] |
| |
| plugin_path = get_label_info(protoc_gen_dart_label, "root_out_dir") + |
| "/dart-tools/protoc_gen_dart" |
| |
| # dart snapshot dependency information. |
| depfile = "$target_gen_dir/${target_name}.d" |
| snapshot_info_target = ":protoc_gen_dart_snapshot_info" |
| snapshot_info_files = get_target_outputs(snapshot_info_target) |
| snapshot_info_file = snapshot_info_files[0] |
| |
| proto_outputs_file = "${target_gen_dir}/${target_name}_proto.outputs" |
| write_file(proto_outputs_file, |
| rebase_path(proto_output_filepaths, root_build_dir)) |
| |
| script = "//build/secondary/third_party/protobuf/protoc_wrapper.py" |
| sources = proto_input_filepaths |
| inputs = [ |
| protoc_path, |
| plugin_path, |
| snapshot_info_file, |
| proto_outputs_file, |
| ] + proto_input_filepaths |
| outputs = proto_output_filepaths |
| |
| args = [ |
| # path to compiler |
| "--protoc", |
| rebase_path(protoc_path, root_build_dir), |
| |
| # the directory the supplied proto paths are in |
| "--proto-in-dir", |
| rebase_path(".", root_build_dir), |
| |
| # extra import dir for .proto files: the root of fuchsia tree |
| "--import-dir=" + rebase_path("//", root_build_dir), |
| |
| # the dart bindings generator |
| "--plugin", |
| rebase_path(plugin_path, root_build_dir), |
| |
| # output path of where bindings are generated |
| "--plugin-out-dir", |
| rebase_path(package_gen_dir, root_build_dir), |
| |
| # plugin dependency information |
| "--plugin-depfile", |
| rebase_path(depfile, root_build_dir), |
| "--plugin-depfile-deps", |
| rebase_path(snapshot_info_file, root_build_dir), |
| "--plugin-depfile-outputs", |
| rebase_path(proto_outputs_file, root_build_dir), |
| ] |
| |
| # the proto files themselves |
| args += proto_input_filepaths |
| |
| deps = [ |
| # dart plugin for the protobuf compiler |
| protoc_gen_dart_label, |
| |
| # protobuf compiler |
| protoc_label, |
| |
| # snapshot information for the dart plugin |
| snapshot_info_target, |
| ] |
| } |
| |
| copy(copy_pubspec_target) { |
| visibility = [ ":*" ] |
| |
| sources = [ "//build/dart/empty_pubspec.yaml" ] |
| |
| outputs = [ "$package_root_dir/pubspec.yaml" ] |
| } |
| |
| # Using the dart sources generated from "gen" above, this constructs a dart |
| # library out of them. |
| dart_library(dart_library_target_name) { |
| disable_analysis = true |
| package_root = package_root_dir |
| source_dir = "lib" |
| package_name = dart_library_package_name |
| |
| sources = rebase_path(proto_output_filepaths, "$package_root/lib") |
| |
| deps = [ |
| ":$copy_pubspec_target", |
| ":$proto_gen_target", |
| "//third_party/dart-pkg/pub/protobuf", |
| ] |
| } |
| |
| dart_test("dart_strict_deps_tests") { |
| sources = [ |
| "dependency_check_test.dart", |
| "file_processor_test.dart", |
| ] |
| deps = [ |
| ":dart_strict_deps_proto", |
| "./library:dart_strict_deps_lib", |
| "//third_party/dart-pkg/pub/analyzer", |
| "//third_party/dart-pkg/pub/mockito", |
| "//third_party/dart-pkg/pub/package_config", |
| "//third_party/dart-pkg/pub/quiver", |
| "//third_party/dart-pkg/pub/test", |
| ] |
| } |
| |
| group("tests") { |
| testonly = true |
| deps = [ ":dart_strict_deps_tests($host_toolchain)" ] |
| } |