perfetto: fix building with bazel

Change-Id: Ifc369e4a0da6ff12ff17ac0e219c91b5094f86a0
diff --git a/Android.bp b/Android.bp
index b740f3d..e615e26 100644
--- a/Android.bp
+++ b/Android.bp
@@ -20,12 +20,12 @@
     "src/trace_processor/metrics/android/android_mem.sql",
     "src/trace_processor/metrics/android/android_mem_lmk.sql",
   ],
-  cmd: "$(location tools/gen_merged_sql_metrics) --cpp_out=$(out) $(in)",
+  cmd: "$(location tools/gen_merged_sql_metrics.py) --cpp_out=$(out) $(in)",
   out: [
     "src/trace_processor/metrics/sql_metrics.h",
   ],
   tool_files: [
-    "tools/gen_merged_sql_metrics",
+    "tools/gen_merged_sql_metrics.py",
   ],
 }
 
diff --git a/BUILD b/BUILD
index 7fe1cb5..2bb904f 100644
--- a/BUILD
+++ b/BUILD
@@ -27,10 +27,10 @@
         "src/trace_processor/metrics/android/android_mem.sql",
         "src/trace_processor/metrics/android/android_mem_lmk.sql",
     ],
-    cmd = "$(location gen_merged_sql_metrics_py) --cpp_out=$@ $SRCS",
     outs = [
         "src/trace_processor/metrics/sql_metrics.h",
     ],
+    cmd = "$(location gen_merged_sql_metrics_py) --cpp_out=$@ $SRCS",
     tools = [
         "gen_merged_sql_metrics_py",
     ],
@@ -189,6 +189,7 @@
         "src/trace_processor/json_trace_utils.h",
         "src/trace_processor/metrics/metrics.cc",
         "src/trace_processor/metrics/metrics.h",
+        "src/trace_processor/metrics/sql_metrics.h",
         "src/trace_processor/null_term_string_view.h",
         "src/trace_processor/process_table.cc",
         "src/trace_processor/process_table.h",
@@ -437,6 +438,7 @@
         "src/trace_processor/json_trace_utils.h",
         "src/trace_processor/metrics/metrics.cc",
         "src/trace_processor/metrics/metrics.h",
+        "src/trace_processor/metrics/sql_metrics.h",
         "src/trace_processor/null_term_string_view.h",
         "src/trace_processor/process_table.cc",
         "src/trace_processor/process_table.h",
@@ -641,6 +643,7 @@
         "src/trace_processor/json_trace_utils.h",
         "src/trace_processor/metrics/metrics.cc",
         "src/trace_processor/metrics/metrics.h",
+        "src/trace_processor/metrics/sql_metrics.h",
         "src/trace_processor/null_term_string_view.h",
         "src/trace_processor/process_table.cc",
         "src/trace_processor/process_table.h",
@@ -779,6 +782,7 @@
 py_binary(
     name = "gen_merged_sql_metrics_py"
     srcs = [
-      "tools/gen_merged_sql_metrics"
+        "tools/gen_merged_sql_metrics.py"
     ]
+    main = "tools/gen_merged_sql_metrics.py"
 )
diff --git a/BUILD.extras b/BUILD.extras
index 1139c44..c52ae05 100644
--- a/BUILD.extras
+++ b/BUILD.extras
@@ -15,6 +15,7 @@
 py_binary(
     name = "gen_merged_sql_metrics_py"
     srcs = [
-      "tools/gen_merged_sql_metrics"
+        "tools/gen_merged_sql_metrics.py"
     ]
+    main = "tools/gen_merged_sql_metrics.py"
 )
diff --git a/src/trace_processor/metrics/BUILD.gn b/src/trace_processor/metrics/BUILD.gn
index fdd5f1b..1f0fdbf 100644
--- a/src/trace_processor/metrics/BUILD.gn
+++ b/src/trace_processor/metrics/BUILD.gn
@@ -24,7 +24,7 @@
 }
 
 action("gen_merged_sql_metrics") {
-  script = "../../../tools/gen_merged_sql_metrics"
+  script = "../../../tools/gen_merged_sql_metrics.py"
   generated_header = "${target_gen_dir}/sql_metrics.h"
   args = rebase_path(sql_files, root_build_dir) + [
            "--cpp_out",
diff --git a/tools/gen_android_bp b/tools/gen_android_bp
index b6b5eda..f2719fe 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -519,9 +519,13 @@
         'gen_merged_sql_metrics',
     )
     module.tool_files = [
-        'tools/gen_merged_sql_metrics',
+        'tools/gen_merged_sql_metrics.py',
     ]
-    module.cmd = '$(location tools/gen_merged_sql_metrics) --cpp_out=$(out) $(in)'
+    module.cmd = ' '.join([
+        '$(location tools/gen_merged_sql_metrics.py)',
+        '--cpp_out=$(out)',
+        '$(in)',
+    ])
     module.out = set(
         src[src.index('gen/') + len('gen/'):]
         for src in target_desc.get('outputs', [])
diff --git a/tools/gen_build b/tools/gen_build
index ade417f..79646b7 100755
--- a/tools/gen_build
+++ b/tools/gen_build
@@ -277,33 +277,6 @@
     else:
       self.line('{} = {},'.format(key, value), indent=1)
 
-  def rule(self, type, name, visibility=None, srcs=None, hdrs=None, deps=None, is_pbzero=False, **kwargs):
-    self.line('{}('.format(type))
-    self.variable('name', name)
-    if srcs:
-      self.variable('srcs', srcs)
-    if hdrs:
-      self.variable('hdrs', hdrs)
-
-    if type == 'proto_library' and not is_pbzero:
-      if srcs:
-        self.variable('has_services', 1)
-      self.variable('cc_api_version', 2)
-      if srcs:
-        self.variable('cc_generic_services', 1)
-
-    for key, value in kwargs.iteritems():
-      self.variable(key, value)
-
-    # Keep visibility and deps last.
-    if visibility:
-      self.variable('visibility', visibility)
-
-    if type != 'filegroup':
-      self.variable('deps', deps)
-
-    self.line(')')
-
   def header(self):
     self.output.write(header)
 
@@ -311,7 +284,7 @@
 class Target(object):
   """In-memory representation of a BUILD target."""
 
-  def __init__(self, type, name, gn_name=None, **kwargs):
+  def __init__(self, type, name, gn_name=None):
     assert type in ('cc_binary', 'cc_library', 'cc_proto_library',
                     'proto_library', 'filegroup', 'alias',
                     'pbzero_cc_proto_library', 'genrule', )
@@ -322,13 +295,41 @@
     self.deps = set()
     self.visibility = set()
     self.gn_name = gn_name
-    self.args = kwargs
+    self.is_pbzero = False
+    self.src_proto_library = None
+    self.outs = set()
+    self.cmd = None
+    self.tools = set()
 
   def write(self, writer):
     if self.gn_name:
       writer.comment('GN target: {}'.format(self.gn_name))
-    writer.rule(self.type, self.name, visibility=self.visibility,
-                srcs=self.srcs, hdrs=self.hdrs, deps=self.deps, **self.args)
+
+    writer.line('{}('.format(self.type))
+    writer.variable('name', self.name)
+    writer.variable('srcs', self.srcs)
+    writer.variable('hdrs', self.hdrs)
+
+    if self.type == 'proto_library' and not self.is_pbzero:
+      if self.srcs:
+        writer.variable('has_services', 1)
+      writer.variable('cc_api_version', 2)
+      if self.srcs:
+        writer.variable('cc_generic_services', 1)
+
+    writer.variable('src_proto_library', self.src_proto_library)
+
+    writer.variable('outs', self.outs)
+    writer.variable('cmd', self.cmd)
+    writer.variable('tools', self.tools)
+
+    # Keep visibility and deps last.
+    writer.variable('visibility', self.visibility)
+
+    if type != 'filegroup':
+      writer.variable('deps', self.deps)
+
+    writer.line(')')
 
 
 class Build(object):
@@ -463,6 +464,9 @@
       if "gen_merged_sql_metrics" in dep_name:
         dep_target = self.create_merged_sql_metrics_target(dep_name)
         target.deps.add(Label("//third_party/perfetto:" + dep_target.name))
+
+        if target.type == 'cc_library' or target.type == 'cc_binary':
+          target.srcs.update(dep_target.outs)
       elif args[0].endswith('/protoc'):
         (proto_target, cc_target) = self.create_proto_target(dep_name)
         if target.type == 'proto_library':
@@ -495,15 +499,15 @@
       'genrule',
       'gen_merged_sql_metrics',
       gn_name=gn_target_name_no_toolchain,
-      outs=set(
-        Label(src[src.index('gen/') + len('gen/'):])
-        for src in target_desc.get('outputs', [])
-      ),
-      cmd = '$(location gen_merged_sql_metrics_py) --cpp_out=$@ $SRCS',
-      tools=[
-        'gen_merged_sql_metrics_py',
-      ],
     )
+    target.outs.update(
+      Label(src[src.index('gen/') + len('gen/'):])
+      for src in target_desc.get('outputs', [])
+    )
+    target.cmd = '$(location gen_merged_sql_metrics_py) --cpp_out=$@ $SRCS'
+    target.tools.update([
+      'gen_merged_sql_metrics_py',
+    ])
     target.srcs.update(
       Label(label_to_path(src))
       for src in target_desc.get('inputs', [])
@@ -516,7 +520,6 @@
     target_desc = self.desc[gn_target_name]
     args = target_desc['args']
 
-    is_pbzero = any("pbzero" in arg for arg in args)
     gn_target_name_no_toolchain = label_without_toolchain(gn_target_name)
     stripped_path = gn_target_name_no_toolchain.replace("protos/perfetto/", "")
     pretty_target_name = label_to_target_name_with_path(stripped_path)
@@ -526,21 +529,21 @@
     proto_target = Target(
       'proto_library',
       pretty_target_name,
-      gn_name=gn_target_name_no_toolchain,
-      is_pbzero=is_pbzero
+      gn_name=gn_target_name_no_toolchain
     )
+    proto_target.is_pbzero = any("pbzero" in arg for arg in args)
     proto_target.srcs.update([
       Label(label_to_path(src).replace('protos/', ''))
       for src in target_desc.get('sources', [])
     ])
-    if not is_pbzero:
+    if not proto_target.is_pbzero:
       proto_target.visibility.add("//visibility:public")
     self.proto_build.add_target(proto_target)
 
     for dep_name in self.resolve_dependencies(gn_target_name):
       self.apply_module_dependency(proto_target, dep_name)
 
-    if is_pbzero:
+    if proto_target.is_pbzero:
       # Remove all the protozero srcs from the proto_library.
       proto_target.srcs.difference_update(
           [src for src in proto_target.srcs if not src.label.endswith('.proto')])
@@ -548,21 +551,21 @@
       # Remove all the non-proto deps from the proto_library and add to the cc
       # library.
       cc_deps = [
-          dep for dep in proto_target.deps
-          if not dep.label.startswith('//third_party/perfetto/protos')
+        dep for dep in proto_target.deps
+        if not dep.label.startswith('//third_party/perfetto/protos')
       ]
       proto_target.deps.difference_update(cc_deps)
 
       cc_target_name = proto_target.name + "_cc_proto"
-      cc_target = Target('pbzero_cc_proto_library',
-                        cc_target_name, gn_name=gn_target_name_no_toolchain)
+      cc_target = Target('pbzero_cc_proto_library', cc_target_name,
+                         gn_name=gn_target_name_no_toolchain)
 
       cc_target.deps.add(Label('//third_party/perfetto:libprotozero'))
       cc_target.deps.update(cc_deps)
 
       # Add the proto_library to the cc_target.
-      cc_target.args['src_proto_library'] = "//third_party/perfetto/protos:" + \
-          proto_target.name
+      cc_target.src_proto_library = \
+          "//third_party/perfetto/protos:" + proto_target.name
 
       self.proto_build.add_target(cc_target)
     else:
diff --git a/tools/gen_merged_sql_metrics b/tools/gen_merged_sql_metrics.py
similarity index 98%
rename from tools/gen_merged_sql_metrics
rename to tools/gen_merged_sql_metrics.py
index 75745f8..071423c 100755
--- a/tools/gen_merged_sql_metrics
+++ b/tools/gen_merged_sql_metrics.py
@@ -41,6 +41,8 @@
  * AUTOGENERATED BY tools/gen_merged_sql_metrics - DO NOT EDIT
  *******************************************************************************
  */
+
+ #include <string.h>
 '''
 
 NAMESPACE_BEGIN = '''