gn2bp: Split genrule for proto to source and header

genrule needs to generate .h files or .c files so that other modules can
specify the genrule from the srcs, headers.

Test: ./update_result.sh
Change-Id: If3bd3301b1ae3d2b02f867ea20a80110c5d44349
diff --git a/tools/gn2bp/Android.bp.swp b/tools/gn2bp/Android.bp.swp
index 92ae832..f4b991c 100644
--- a/tools/gn2bp/Android.bp.swp
+++ b/tools/gn2bp/Android.bp.swp
@@ -1969,6 +1969,12 @@
     static_libs: [
         "cronet_aml_third_party_protobuf_protobuf_full",
     ],
+    generated_headers: [
+        "cronet_aml_net_cert_root_store_proto_full_gen_headers",
+    ],
+    export_generated_headers: [
+        "cronet_aml_net_cert_root_store_proto_full_gen_headers",
+    ],
     defaults: [
         "cronet_aml_defaults",
     ],
@@ -2027,8 +2033,32 @@
          "--py-out-dir " +
          "$(genDir)/clang_x64/pyproto/net/cert/root_store_proto_full/",
     out: [
-        "clang_x64/pyproto/net/cert/root_store_proto_full/root_store_pb2.py",
         "net/cert/root_store_proto_full/root_store.pb.cc",
+    ],
+    tool_files: [
+        "tools/protoc_wrapper/protoc_wrapper.py",
+    ],
+}
+
+// GN: //net/cert:root_store_proto_full_gen
+genrule {
+    name: "cronet_aml_net_cert_root_store_proto_full_gen_headers",
+    srcs: [
+        "net/cert/root_store.proto",
+    ],
+    tools: [
+        "aprotoc",
+    ],
+    cmd: "$(location tools/protoc_wrapper/protoc_wrapper.py) root_store.proto " +
+         "--protoc " +
+         "$(location aprotoc) " +
+         "--proto-in-dir " +
+         "`dirname $(location net/cert/root_store.proto)` " +
+         "--cc-out-dir " +
+         "clang_x64/gen/net/cert/root_store_proto_full/ " +
+         "--py-out-dir " +
+         "$(genDir)/clang_x64/pyproto/net/cert/root_store_proto_full/",
+    out: [
         "net/cert/root_store_proto_full/root_store.pb.h",
     ],
     tool_files: [
@@ -2183,6 +2213,12 @@
     static_libs: [
         "cronet_aml_third_party_protobuf_protobuf_lite",
     ],
+    generated_headers: [
+        "cronet_aml_net_isolation_info_proto_gen_headers",
+    ],
+    export_generated_headers: [
+        "cronet_aml_net_isolation_info_proto_gen_headers",
+    ],
     defaults: [
         "cronet_aml_defaults",
     ],
@@ -2238,8 +2274,32 @@
          "$(genDir)/pyproto/net/base",
     out: [
         "net/base/isolation_info.pb.cc",
+    ],
+    tool_files: [
+        "tools/protoc_wrapper/protoc_wrapper.py",
+    ],
+}
+
+// GN: //net:isolation_info_proto_gen
+genrule {
+    name: "cronet_aml_net_isolation_info_proto_gen_headers",
+    srcs: [
+        "net/base/isolation_info.proto",
+    ],
+    tools: [
+        "aprotoc",
+    ],
+    cmd: "$(location tools/protoc_wrapper/protoc_wrapper.py) isolation_info.proto " +
+         "--protoc " +
+         "$(location aprotoc) " +
+         "--proto-in-dir " +
+         "`dirname $(location net/base/isolation_info.proto)` " +
+         "--cc-out-dir " +
+         "$(genDir)/net/base " +
+         "--py-out-dir " +
+         "$(genDir)/pyproto/net/base",
+    out: [
         "net/base/isolation_info.pb.h",
-        "pyproto/net/base/isolation_info_pb2.py",
     ],
     tool_files: [
         "tools/protoc_wrapper/protoc_wrapper.py",
@@ -2963,6 +3023,12 @@
     static_libs: [
         "cronet_aml_third_party_protobuf_protobuf_lite",
     ],
+    generated_headers: [
+        "cronet_aml_net_net_nqe_proto_gen_headers",
+    ],
+    export_generated_headers: [
+        "cronet_aml_net_net_nqe_proto_gen_headers",
+    ],
     defaults: [
         "cronet_aml_defaults",
     ],
@@ -3025,8 +3091,38 @@
          "$(genDir)/pyproto/net/nqe/proto",
     out: [
         "net/nqe/proto/network_id_proto.pb.cc",
+    ],
+    tool_files: [
+        "tools/protoc_wrapper/protoc_wrapper.py",
+    ],
+}
+
+// GN: //net:net_nqe_proto_gen
+genrule {
+    name: "cronet_aml_net_net_nqe_proto_gen_headers",
+    srcs: [
+        "net/base/net_export.h",
+        "net/nqe/proto/network_id_proto.proto",
+    ],
+    tools: [
+        "aprotoc",
+    ],
+    cmd: "$(location tools/protoc_wrapper/protoc_wrapper.py) network_id_proto.proto " +
+         "--protoc " +
+         "$(location aprotoc) " +
+         "--proto-in-dir " +
+         "`dirname $(location net/nqe/proto/network_id_proto.proto)` " +
+         "--cc-out-dir " +
+         "$(genDir)/net/nqe/proto " +
+         "--cc-options " +
+         "dllexport_decl=NET_EXPORT_PRIVATE: " +
+         " " +
+         "--include " +
+         "$(location net/base/net_export.h) " +
+         "--py-out-dir " +
+         "$(genDir)/pyproto/net/nqe/proto",
+    out: [
         "net/nqe/proto/network_id_proto.pb.h",
-        "pyproto/net/nqe/proto/network_id_proto_pb2.py",
     ],
     tool_files: [
         "tools/protoc_wrapper/protoc_wrapper.py",
@@ -3184,6 +3280,12 @@
         "cronet_aml_base_base",
         "cronet_aml_third_party_protobuf_protobuf_lite",
     ],
+    generated_headers: [
+        "cronet_aml_net_third_party_quiche_net_quic_proto_gen_headers",
+    ],
+    export_generated_headers: [
+        "cronet_aml_net_third_party_quiche_net_quic_proto_gen_headers",
+    ],
     defaults: [
         "cronet_aml_defaults",
     ],
@@ -3252,14 +3354,46 @@
          "$(genDir)/pyproto/net/third_party/quiche/src",
     out: [
         "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.cc",
-        "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.h",
         "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.cc",
-        "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.h",
         "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.pb.cc",
+    ],
+    tool_files: [
+        "tools/protoc_wrapper/protoc_wrapper.py",
+    ],
+}
+
+// GN: //net/third_party/quiche:net_quic_proto_gen
+genrule {
+    name: "cronet_aml_net_third_party_quiche_net_quic_proto_gen_headers",
+    srcs: [
+        "base/component_export.h",
+        "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.proto",
+        "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.proto",
+        "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.proto",
+    ],
+    tools: [
+        "aprotoc",
+    ],
+    cmd: "$(location tools/protoc_wrapper/protoc_wrapper.py) quiche/quic/core/proto/cached_network_parameters.proto " +
+         "quiche/quic/core/proto/crypto_server_config.proto " +
+         "quiche/quic/core/proto/source_address_token.proto " +
+         "--protoc " +
+         "$(location aprotoc) " +
+         "--proto-in-dir " +
+         "`dirname $(location net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.proto)`/../../../../ " +
+         "--cc-out-dir " +
+         "$(genDir)/net/third_party/quiche/src " +
+         "--cc-options " +
+         "dllexport_decl=COMPONENT_EXPORT(QUICHE): " +
+         " " +
+         "--include " +
+         "$(location base/component_export.h) " +
+         "--py-out-dir " +
+         "$(genDir)/pyproto/net/third_party/quiche/src",
+    out: [
+        "net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters.pb.h",
+        "net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config.pb.h",
         "net/third_party/quiche/src/quiche/quic/core/proto/source_address_token.pb.h",
-        "pyproto/net/third_party/quiche/src/quiche/quic/core/proto/cached_network_parameters_pb2.py",
-        "pyproto/net/third_party/quiche/src/quiche/quic/core/proto/crypto_server_config_pb2.py",
-        "pyproto/net/third_party/quiche/src/quiche/quic/core/proto/source_address_token_pb2.py",
     ],
     tool_files: [
         "tools/protoc_wrapper/protoc_wrapper.py",
@@ -3279,6 +3413,12 @@
     static_libs: [
         "cronet_aml_third_party_protobuf_protobuf_lite",
     ],
+    generated_headers: [
+        "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen_headers",
+    ],
+    export_generated_headers: [
+        "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen_headers",
+    ],
     defaults: [
         "cronet_aml_defaults",
     ],
@@ -3341,8 +3481,38 @@
          "$(genDir)/pyproto/net/third_party/quiche/src/quiche/quic/test_tools",
     out: [
         "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.pb.cc",
+    ],
+    tool_files: [
+        "tools/protoc_wrapper/protoc_wrapper.py",
+    ],
+}
+
+// GN: //net/third_party/quiche:net_quic_test_tools_proto_gen
+genrule {
+    name: "cronet_aml_net_third_party_quiche_net_quic_test_tools_proto_gen_headers",
+    srcs: [
+        "net/base/net_export.h",
+        "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.proto",
+    ],
+    tools: [
+        "aprotoc",
+    ],
+    cmd: "$(location tools/protoc_wrapper/protoc_wrapper.py) send_algorithm_test_result.proto " +
+         "--protoc " +
+         "$(location aprotoc) " +
+         "--proto-in-dir " +
+         "`dirname $(location net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.proto)` " +
+         "--cc-out-dir " +
+         "$(genDir)/net/third_party/quiche/src/quiche/quic/test_tools " +
+         "--cc-options " +
+         "dllexport_decl=NET_EXPORT_PRIVATE: " +
+         " " +
+         "--include " +
+         "$(location net/base/net_export.h) " +
+         "--py-out-dir " +
+         "$(genDir)/pyproto/net/third_party/quiche/src/quiche/quic/test_tools",
+    out: [
         "net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result.pb.h",
-        "pyproto/net/third_party/quiche/src/quiche/quic/test_tools/send_algorithm_test_result_pb2.py",
     ],
     tool_files: [
         "tools/protoc_wrapper/protoc_wrapper.py",
diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp
index be9c3ba..8a33036 100755
--- a/tools/gn2bp/gen_android_bp
+++ b/tools/gn2bp/gen_android_bp
@@ -32,6 +32,7 @@
 import os
 import re
 import sys
+import copy
 
 import gn_utils
 
@@ -937,6 +938,15 @@
   elif target.script == "//tools/grit/stamp_grit_sources.py":
     # stamp_grit_sources.py is not executable
     module.cmd = "python " + module.cmd
+  elif target.script == "//tools/protoc_wrapper/protoc_wrapper.py":
+    # Split module to source module and header module.
+    # Source module has the .cc files and header module has the .h files in the out.
+    header_module = copy.deepcopy(module)
+    header_module.name += "_headers"
+    header_module.out = [file for file in header_module.out if os.path.splitext(file)[1] == '.h']
+    module.out = [file for file in module.out if os.path.splitext(file)[1] == '.cc']
+    module.genrule_headers.add(header_module.name)
+    blueprint.add_module(header_module)
 
   blueprint.add_module(module)
   return module