tp: tidy up amalgamated SQL header generation

This CL changes the SQL amalgamation system to generate a header
directly which can be depended upon instead of requiring manual
rule.

We do this in an almost identical r way to cc_proto_descriptor
generation where we have a Bazel macro which does both the genrule and
defines the cc_library.

Bug: 255535171
Change-Id: I103ce8953a685c20f9b5a1c6d226d8f42f94c425
diff --git a/BUILD b/BUILD
index c835ea7..8b80788 100644
--- a/BUILD
+++ b/BUILD
@@ -18,6 +18,7 @@
 load(
     "@perfetto//bazel:rules.bzl",
     "perfetto_build_config_cc_library",
+    "perfetto_cc_amalgamated_sql",
     "perfetto_cc_binary",
     "perfetto_filegroup",
     "perfetto_genrule",
@@ -1405,9 +1406,9 @@
     ],
 )
 
-perfetto_genrule(
+perfetto_cc_amalgamated_sql(
     name = "src_trace_processor_metrics_sql_gen_amalgamated_sql_metrics",
-    srcs = [
+    deps = [
         ":src_trace_processor_metrics_sql_android_android",
         ":src_trace_processor_metrics_sql_chrome_chrome",
         ":src_trace_processor_metrics_sql_common_common",
@@ -1418,10 +1419,8 @@
     outs = [
         "src/trace_processor/metrics/sql/amalgamated_sql_metrics.h",
     ],
-    cmd = "$(location gen_amalgamated_sql_py) --namespace=sql_metrics --root-dir=src/trace_processor/metrics/sql --cpp-out=$@ $(SRCS)",
-    exec_tools = [
-        ":gen_amalgamated_sql_py",
-    ],
+    root_dir = "src/trace_processor/metrics/sql",
+    namespace = "sql_metrics",
 )
 
 # GN target: //src/trace_processor/metrics/sql:misc_sql
@@ -1556,19 +1555,17 @@
     ],
 )
 
-perfetto_genrule(
+perfetto_cc_amalgamated_sql(
     name = "src_trace_processor_stdlib_gen_amalgamated_stdlib",
-    srcs = [
+    deps = [
         ":src_trace_processor_stdlib_android_android",
         ":src_trace_processor_stdlib_experimental_experimental",
     ],
     outs = [
         "src/trace_processor/stdlib/amalgamated_stdlib.h",
     ],
-    cmd = "$(location gen_amalgamated_sql_py) --namespace=stdlib --root-dir=src/trace_processor/stdlib --cpp-out=$@ $(SRCS)",
-    exec_tools = [
-        ":gen_amalgamated_sql_py",
-    ],
+    root_dir = "src/trace_processor/stdlib",
+    namespace = "stdlib",
 )
 
 # GN target: //src/trace_processor/stdlib:stdlib
@@ -4424,14 +4421,12 @@
                ":src_trace_processor_importers_gen_cc_track_event_descriptor",
                ":src_trace_processor_metrics_gen_cc_all_chrome_metrics_descriptor",
                ":src_trace_processor_metrics_gen_cc_metrics_descriptor",
+               ":src_trace_processor_metrics_sql_gen_amalgamated_sql_metrics",
+               ":src_trace_processor_stdlib_gen_amalgamated_stdlib",
            ] + PERFETTO_CONFIG.deps.jsoncpp +
            PERFETTO_CONFIG.deps.sqlite +
            PERFETTO_CONFIG.deps.sqlite_ext_percentile +
-           PERFETTO_CONFIG.deps.zlib + [
-        ":cc_amalgamated_sql_metrics",
-    ] + [
-        ":cc_amalgamated_stdlib",
-    ] +
+           PERFETTO_CONFIG.deps.zlib +
            PERFETTO_CONFIG.deps.demangle_wrapper,
     linkstatic = True,
 )
@@ -4547,16 +4542,14 @@
                ":src_trace_processor_importers_gen_cc_track_event_descriptor",
                ":src_trace_processor_metrics_gen_cc_all_chrome_metrics_descriptor",
                ":src_trace_processor_metrics_gen_cc_metrics_descriptor",
+               ":src_trace_processor_metrics_sql_gen_amalgamated_sql_metrics",
+               ":src_trace_processor_stdlib_gen_amalgamated_stdlib",
            ] + PERFETTO_CONFIG.deps.jsoncpp +
            PERFETTO_CONFIG.deps.linenoise +
            PERFETTO_CONFIG.deps.protobuf_full +
            PERFETTO_CONFIG.deps.sqlite +
            PERFETTO_CONFIG.deps.sqlite_ext_percentile +
-           PERFETTO_CONFIG.deps.zlib + [
-        ":cc_amalgamated_sql_metrics",
-    ] + [
-        ":cc_amalgamated_stdlib",
-    ] +
+           PERFETTO_CONFIG.deps.zlib +
            PERFETTO_CONFIG.deps.demangle_wrapper,
 )
 
@@ -4734,15 +4727,13 @@
                ":src_trace_processor_importers_gen_cc_track_event_descriptor",
                ":src_trace_processor_metrics_gen_cc_all_chrome_metrics_descriptor",
                ":src_trace_processor_metrics_gen_cc_metrics_descriptor",
+               ":src_trace_processor_metrics_sql_gen_amalgamated_sql_metrics",
+               ":src_trace_processor_stdlib_gen_amalgamated_stdlib",
                ":src_traceconv_gen_cc_trace_descriptor",
            ] + PERFETTO_CONFIG.deps.jsoncpp +
            PERFETTO_CONFIG.deps.sqlite +
            PERFETTO_CONFIG.deps.sqlite_ext_percentile +
-           PERFETTO_CONFIG.deps.zlib + [
-        ":cc_amalgamated_sql_metrics",
-    ] + [
-        ":cc_amalgamated_stdlib",
-    ] +
+           PERFETTO_CONFIG.deps.zlib +
            PERFETTO_CONFIG.deps.demangle_wrapper,
 )
 
@@ -4788,16 +4779,6 @@
     includes = [build_config_dir_],
 )
 
-perfetto_cc_library(
-    name = "cc_amalgamated_sql_metrics",
-    hdrs = ["src/trace_processor/metrics/sql/amalgamated_sql_metrics.h"],
-)
-
-perfetto_cc_library(
-    name = "cc_amalgamated_stdlib",
-    hdrs = ["src/trace_processor/stdlib/amalgamated_stdlib.h"],
-)
-
 perfetto_py_binary(
     name = "gen_amalgamated_sql_py",
     srcs = [
diff --git a/BUILD.extras b/BUILD.extras
index 5a11740..251568e 100644
--- a/BUILD.extras
+++ b/BUILD.extras
@@ -8,16 +8,6 @@
     includes = [build_config_dir_],
 )
 
-perfetto_cc_library(
-    name = "cc_amalgamated_sql_metrics",
-    hdrs = ["src/trace_processor/metrics/sql/amalgamated_sql_metrics.h"],
-)
-
-perfetto_cc_library(
-    name = "cc_amalgamated_stdlib",
-    hdrs = ["src/trace_processor/stdlib/amalgamated_stdlib.h"],
-)
-
 perfetto_py_binary(
     name = "gen_amalgamated_sql_py",
     srcs = [
diff --git a/bazel/rules.bzl b/bazel/rules.bzl
index b699471..85cfed6 100644
--- a/bazel/rules.bzl
+++ b/bazel/rules.bzl
@@ -280,6 +280,34 @@
         **kwargs
     )
 
+def perfetto_cc_amalgamated_sql(name, deps, outs, root_dir, namespace,
+                                **kwargs):
+    cmd = [
+        "$(location gen_amalgamated_sql_py)",
+        "--namespace",
+        namespace,
+        "--root-dir",
+        root_dir,
+        "--cpp-out=$@",
+        "$(SRCS)",
+    ]
+
+    perfetto_genrule(
+        name = name + "_gen",
+        cmd = " ".join(cmd),
+        exec_tools = [
+            ":gen_amalgamated_sql_py",
+        ],
+        srcs = deps,
+        outs = outs,
+    )
+
+    perfetto_cc_library(
+        name = name,
+        hdrs = [":" + name + "_gen"],
+        **kwargs,
+    )
+
 # +----------------------------------------------------------------------------+
 # | Misc utility functions                                                     |
 # +----------------------------------------------------------------------------+
diff --git a/tools/gen_bazel b/tools/gen_bazel
index 719ad07..4f3655b 100755
--- a/tools/gen_bazel
+++ b/tools/gen_bazel
@@ -111,44 +111,26 @@
     '//gn:zlib': ['PERFETTO_CONFIG.deps.zlib'],
     '//gn:llvm_demangle': ['PERFETTO_CONFIG.deps.llvm_demangle'],
     '//src/trace_processor:demangle': ['PERFETTO_CONFIG.deps.demangle_wrapper'],
-    '//src/trace_processor/metrics/sql:gen_amalgamated_sql_metrics': [[
-        ':cc_amalgamated_sql_metrics'
-    ]],
-    '//src/trace_processor/stdlib:gen_amalgamated_stdlib': [[
-        ':cc_amalgamated_stdlib'
-    ]],
     gn_utils.GEN_VERSION_TARGET: ['PERFETTO_CONFIG.deps.version_header'],
 }
 
 
-def gen_amalgamated_sql(target):
-  label = BazelLabel(get_bazel_label_name(target.name), 'perfetto_genrule')
+def gen_cc_amalgamated_sql(target):
+  label = BazelLabel(
+      get_bazel_label_name(target.name), 'perfetto_cc_amalgamated_sql')
 
   def find_arg(name):
     for i, arg in enumerate(target.args):
       if arg.startswith(f'--{name}'):
         return target.args[i + 1]
 
-  namespace = find_arg('namespace')
-  root_dir = gn_utils.label_to_path(find_arg('root-dir'))
+  label.namespace = find_arg('namespace')
+  label.root_dir = gn_utils.label_to_path(find_arg('root-dir'))
 
-  label.srcs += sorted(
+  label.deps += sorted(
       ':' + get_bazel_label_name(x) for x in target.source_set_deps)
   label.outs += target.outputs
-  label.cmd = (r'$(location gen_amalgamated_sql_py) '
-               f'--namespace={namespace} --root-dir={root_dir} '
-               r'--cpp-out=$@ $(SRCS)')
-  label.exec_tools += [':gen_amalgamated_sql_py']
-  return [label]
 
-
-def gen_version_header(target):
-  label = BazelLabel(get_bazel_label_name(target.name), 'perfetto_genrule')
-  label.srcs += [gn_utils.label_to_path(x) for x in sorted(target.inputs)]
-  label.outs += target.outputs
-  label.cmd = r'$(location gen_version_header_py)'
-  label.cmd += r' --cpp_out=$@ --changelog=$(location CHANGELOG)'
-  label.exec_tools += [':gen_version_header_py']
   return [label]
 
 
@@ -166,6 +148,16 @@
   return [label]
 
 
+def gen_version_header(target):
+  label = BazelLabel(get_bazel_label_name(target.name), 'perfetto_genrule')
+  label.srcs += [gn_utils.label_to_path(x) for x in sorted(target.inputs)]
+  label.outs += target.outputs
+  label.cmd = r'$(location gen_version_header_py)'
+  label.cmd += r' --cpp_out=$@ --changelog=$(location CHANGELOG)'
+  label.exec_tools += [':gen_version_header_py']
+  return [label]
+
+
 custom_actions = {
     gn_utils.GEN_VERSION_TARGET: gen_version_header,
 }
@@ -412,7 +404,7 @@
     if gn_target.name in custom_actions:
       return custom_actions[gn_target.name](gn_target)
     if gn_target.custom_action_type == 'sql_amalgamation':
-      return gen_amalgamated_sql(gn_target)
+      return gen_cc_amalgamated_sql(gn_target)
     if gn_target.custom_action_type == 'cc_proto_descriptor':
       return gen_cc_metrics_descriptor(gn_target)
     return []
@@ -521,6 +513,7 @@
 load(
     "@perfetto//bazel:rules.bzl",
     "perfetto_build_config_cc_library",
+    "perfetto_cc_amalgamated_sql",
     "perfetto_cc_binary",
     "perfetto_filegroup",
     "perfetto_genrule",