tools/gen_bazel: Standalone Bazel build

Updates the gen_bazel generator and generates
a BUILD file that allows to build traced, traced_probes
perfetto and trace_processor both on Linux and Mac.
This also allows easy integration with google internal builds.
The major differences of the new generator are:
1. Uses the new way of dealing with protobuf libraries
   (proto_library -> cc_proto_library -> executable target
   see go/new-proto-library)
2. Instead of repeating all the source files in each target
   it creates Bazel filegroup(s) out of GN source_set(s).
   While doing so it takes care of propagating up flags and
   dependencies. This is because Bazel filegroup(s),
   conversely to GN source_set(s), are pure bags of sources.

Still missing:
 - cflags / ldflags propagation into Bazel.
 - Android toolchain (perhaps will never happen)

This will require a matching change to Google internal
sources.

Test: bazel build //:all
Change-Id: Ic1c725bd83e2a5e92eebb5c5b34728cf6d5983e6
diff --git a/.gitignore b/.gitignore
index ba585d6..821445d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@
 *.iml
 *.pyc
 *.swp
+/bazel-*
 /out*
 TAGS
 /node_modules/
diff --git a/BUILD b/BUILD
index 5177498..3a4f469 100644
--- a/BUILD
+++ b/BUILD
@@ -1,3 +1,4 @@
+
 # Copyright (C) 2019 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,1230 +15,2212 @@
 #
 # This file is automatically generated by tools/gen_bazel. Do not edit.
 
-package(default_visibility = ["//visibility:public"])
+load("@perfetto_cfg//:perfetto_cfg.bzl", "PERFETTO_CONFIG")
+load(
+    "@perfetto//bazel:rules.bzl",
+    "perfetto_cc_binary",
+    "perfetto_cc_ipc_library",
+    "perfetto_cc_library",
+    "perfetto_cc_proto_library",
+    "perfetto_cc_protozero_library",
+    "perfetto_proto_library",
+    "perfetto_py_binary",
+)
 
+package(default_visibility = ["//visibility:private"])
 licenses(["notice"])  # Apache 2.0
+exports_files(["NOTICE"])
 
-exports_files(["LICENSE"])
+# ##############################################################################
+# Internal targets
+# ##############################################################################
 
-# GN target: //src/trace_processor/metrics:gen_merged_sql_metrics
-genrule(
-    name = "gen_merged_sql_metrics",
+# GN target: //src/ipc/protoc_plugin:ipc_plugin
+perfetto_cc_binary(
+    name = "ipc_plugin",
     srcs = [
-        "src/trace_processor/metrics/android/android_batt.sql",
-        "src/trace_processor/metrics/android/android_cpu.sql",
-        "src/trace_processor/metrics/android/android_cpu_agg.sql",
-        "src/trace_processor/metrics/android/android_ion.sql",
-        "src/trace_processor/metrics/android/android_lmk.sql",
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":src_base_base",
+        "src/ipc/protoc_plugin/ipc_plugin.cc",
+    ],
+    deps = [
+    ]
+    + PERFETTO_CONFIG.deps.protoc_lib,
+)
+
+# GN target: //src/ipc:perfetto_ipc
+perfetto_cc_library(
+    name = "perfetto_ipc",
+    srcs = [
+        ":src_base_base",
+        ":src_base_unix_socket",
+        ":src_ipc_ipc",
+    ],
+    hdrs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_ipc_ipc",
+    ],
+    deps = [
+        ":protos_perfetto_ipc_wire_protocol",
+    ]
+    + PERFETTO_CONFIG.deps.protobuf_lite,
+)
+
+# GN target: //src/protozero/protoc_plugin:protozero_plugin
+perfetto_cc_binary(
+    name = "protozero_plugin",
+    srcs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":src_base_base",
+        "src/protozero/protoc_plugin/protozero_plugin.cc",
+    ],
+    deps = [
+    ]
+    + PERFETTO_CONFIG.deps.protoc_lib,
+)
+
+# GN target: //src/protozero:libprotozero
+perfetto_cc_library(
+    name = "libprotozero",
+    srcs = [
+        ":src_protozero_protozero",
+    ],
+    hdrs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_protozero_protozero",
+    ],
+)
+
+# GN target: //:libperfetto
+perfetto_cc_library(
+    name = "libperfetto",
+    srcs = [
+        ":src_android_internal_headers",
+        ":src_android_internal_lazy_library_loader",
+        ":src_base_base",
+        ":src_base_unix_socket",
+        ":src_ipc_ipc",
+        ":src_protozero_protozero",
+        ":src_traced_probes_android_log_android_log",
+        ":src_traced_probes_data_source",
+        ":src_traced_probes_filesystem_filesystem",
+        ":src_traced_probes_ftrace_format_parser",
+        ":src_traced_probes_ftrace_ftrace",
+        ":src_traced_probes_metatrace_metatrace",
+        ":src_traced_probes_packages_list_packages_list",
+        ":src_traced_probes_power_power",
+        ":src_traced_probes_probes",
+        ":src_traced_probes_probes_src",
+        ":src_traced_probes_ps_ps",
+        ":src_traced_probes_sys_stats_sys_stats",
+        ":src_traced_service_service",
+        ":src_tracing_common",
+        ":src_tracing_consumer_api_deprecated",
+        ":src_tracing_ipc",
+        ":src_tracing_tracing",
+    ],
+    hdrs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_ipc_ipc",
+        ":include_perfetto_ext_traced_sys_stats_counters",
+        ":include_perfetto_ext_traced_traced",
+        ":include_perfetto_ext_tracing_core_core",
+        ":include_perfetto_ext_tracing_ipc_ipc",
+        ":include_perfetto_protozero_protozero",
+        ":include_perfetto_public_public",
+        ":include_perfetto_tracing_core_core",
+        ":include_perfetto_tracing_tracing",
+    ],
+    deps = [
+        ":protos_perfetto_common_lite",
+        ":protos_perfetto_common_zero",
+        ":protos_perfetto_config_android_lite",
+        ":protos_perfetto_config_android_zero",
+        ":protos_perfetto_config_ftrace_lite",
+        ":protos_perfetto_config_ftrace_zero",
+        ":protos_perfetto_config_gpu_lite",
+        ":protos_perfetto_config_gpu_zero",
+        ":protos_perfetto_config_inode_file_lite",
+        ":protos_perfetto_config_inode_file_zero",
+        ":protos_perfetto_config_lite",
+        ":protos_perfetto_config_power_lite",
+        ":protos_perfetto_config_power_zero",
+        ":protos_perfetto_config_process_stats_lite",
+        ":protos_perfetto_config_process_stats_zero",
+        ":protos_perfetto_config_profiling_lite",
+        ":protos_perfetto_config_profiling_zero",
+        ":protos_perfetto_config_sys_stats_lite",
+        ":protos_perfetto_config_sys_stats_zero",
+        ":protos_perfetto_config_zero",
+        ":protos_perfetto_ipc_ipc",
+        ":protos_perfetto_ipc_wire_protocol",
+        ":protos_perfetto_trace_android_zero",
+        ":protos_perfetto_trace_appended_data_zero",
+        ":protos_perfetto_trace_chrome_zero",
+        ":protos_perfetto_trace_filesystem_zero",
+        ":protos_perfetto_trace_ftrace_zero",
+        ":protos_perfetto_trace_gpu_zero",
+        ":protos_perfetto_trace_interned_data_zero",
+        ":protos_perfetto_trace_minimal_lite",
+        ":protos_perfetto_trace_minimal_zero",
+        ":protos_perfetto_trace_non_minimal_zero",
+        ":protos_perfetto_trace_perfetto_zero",
+        ":protos_perfetto_trace_power_zero",
+        ":protos_perfetto_trace_profiling_zero",
+        ":protos_perfetto_trace_ps_zero",
+        ":protos_perfetto_trace_sys_stats_zero",
+        ":protos_perfetto_trace_track_event_zero",
+        ":protos_perfetto_trace_trusted_lite",
+    ]
+    + PERFETTO_CONFIG.deps.protobuf_lite,
+)
+
+# GN target: //include/perfetto/base:base
+filegroup(
+    name = "include_perfetto_base_base",
+    srcs = [
+        "include/perfetto/base/build_config.h",
+        "include/perfetto/base/compiler.h",
+        "include/perfetto/base/copyable_ptr.h",
+        "include/perfetto/base/export.h",
+        "include/perfetto/base/logging.h",
+        "include/perfetto/base/task_runner.h",
+        "include/perfetto/base/time.h",
+    ],
+)
+
+# GN target: //include/perfetto/ext/base:base
+filegroup(
+    name = "include_perfetto_ext_base_base",
+    srcs = [
+        "include/perfetto/ext/base/circular_queue.h",
+        "include/perfetto/ext/base/container_annotations.h",
+        "include/perfetto/ext/base/event_fd.h",
+        "include/perfetto/ext/base/file_utils.h",
+        "include/perfetto/ext/base/hash.h",
+        "include/perfetto/ext/base/lookup_set.h",
+        "include/perfetto/ext/base/metatrace.h",
+        "include/perfetto/ext/base/metatrace_events.h",
+        "include/perfetto/ext/base/no_destructor.h",
+        "include/perfetto/ext/base/optional.h",
+        "include/perfetto/ext/base/paged_memory.h",
+        "include/perfetto/ext/base/pipe.h",
+        "include/perfetto/ext/base/proc_utils.h",
+        "include/perfetto/ext/base/scoped_file.h",
+        "include/perfetto/ext/base/small_set.h",
+        "include/perfetto/ext/base/string_splitter.h",
+        "include/perfetto/ext/base/string_utils.h",
+        "include/perfetto/ext/base/string_view.h",
+        "include/perfetto/ext/base/string_writer.h",
+        "include/perfetto/ext/base/temp_file.h",
+        "include/perfetto/ext/base/thread_annotations.h",
+        "include/perfetto/ext/base/thread_checker.h",
+        "include/perfetto/ext/base/thread_task_runner.h",
+        "include/perfetto/ext/base/thread_utils.h",
+        "include/perfetto/ext/base/unix_socket.h",
+        "include/perfetto/ext/base/unix_task_runner.h",
+        "include/perfetto/ext/base/utils.h",
+        "include/perfetto/ext/base/uuid.h",
+        "include/perfetto/ext/base/waitable_event.h",
+        "include/perfetto/ext/base/watchdog.h",
+        "include/perfetto/ext/base/watchdog_noop.h",
+        "include/perfetto/ext/base/watchdog_posix.h",
+        "include/perfetto/ext/base/weak_ptr.h",
+    ],
+)
+
+# GN target: //include/perfetto/ext/ipc:ipc
+filegroup(
+    name = "include_perfetto_ext_ipc_ipc",
+    srcs = [
+        "include/perfetto/ext/ipc/async_result.h",
+        "include/perfetto/ext/ipc/basic_types.h",
+        "include/perfetto/ext/ipc/client.h",
+        "include/perfetto/ext/ipc/client_info.h",
+        "include/perfetto/ext/ipc/codegen_helpers.h",
+        "include/perfetto/ext/ipc/deferred.h",
+        "include/perfetto/ext/ipc/host.h",
+        "include/perfetto/ext/ipc/service.h",
+        "include/perfetto/ext/ipc/service_descriptor.h",
+        "include/perfetto/ext/ipc/service_proxy.h",
+    ],
+)
+
+# GN target: //include/perfetto/ext/traced:sys_stats_counters
+filegroup(
+    name = "include_perfetto_ext_traced_sys_stats_counters",
+    srcs = [
+        "include/perfetto/ext/traced/sys_stats_counters.h",
+    ],
+)
+
+# GN target: //include/perfetto/ext/traced:traced
+filegroup(
+    name = "include_perfetto_ext_traced_traced",
+    srcs = [
+        "include/perfetto/ext/traced/data_source_types.h",
+        "include/perfetto/ext/traced/traced.h",
+    ],
+)
+
+# GN target: //include/perfetto/ext/tracing/core:core
+filegroup(
+    name = "include_perfetto_ext_tracing_core_core",
+    srcs = [
+        "include/perfetto/ext/tracing/core/basic_types.h",
+        "include/perfetto/ext/tracing/core/buffer_exhausted_policy.h",
+        "include/perfetto/ext/tracing/core/commit_data_request.h",
+        "include/perfetto/ext/tracing/core/consumer.h",
+        "include/perfetto/ext/tracing/core/observable_events.h",
+        "include/perfetto/ext/tracing/core/producer.h",
+        "include/perfetto/ext/tracing/core/shared_memory.h",
+        "include/perfetto/ext/tracing/core/shared_memory_abi.h",
+        "include/perfetto/ext/tracing/core/shared_memory_arbiter.h",
+        "include/perfetto/ext/tracing/core/slice.h",
+        "include/perfetto/ext/tracing/core/sliced_protobuf_input_stream.h",
+        "include/perfetto/ext/tracing/core/startup_trace_writer.h",
+        "include/perfetto/ext/tracing/core/startup_trace_writer_registry.h",
+        "include/perfetto/ext/tracing/core/trace_packet.h",
+        "include/perfetto/ext/tracing/core/trace_stats.h",
+        "include/perfetto/ext/tracing/core/trace_writer.h",
+        "include/perfetto/ext/tracing/core/tracing_service.h",
+    ],
+)
+
+# GN target: //include/perfetto/ext/tracing/ipc:ipc
+filegroup(
+    name = "include_perfetto_ext_tracing_ipc_ipc",
+    srcs = [
+        "include/perfetto/ext/tracing/ipc/consumer_ipc_client.h",
+        "include/perfetto/ext/tracing/ipc/default_socket.h",
+        "include/perfetto/ext/tracing/ipc/producer_ipc_client.h",
+        "include/perfetto/ext/tracing/ipc/service_ipc_host.h",
+    ],
+)
+
+# GN target: //include/perfetto/protozero:protozero
+filegroup(
+    name = "include_perfetto_protozero_protozero",
+    srcs = [
+        "include/perfetto/protozero/contiguous_memory_range.h",
+        "include/perfetto/protozero/field.h",
+        "include/perfetto/protozero/message.h",
+        "include/perfetto/protozero/message_handle.h",
+        "include/perfetto/protozero/packed_repeated_fields.h",
+        "include/perfetto/protozero/proto_decoder.h",
+        "include/perfetto/protozero/proto_utils.h",
+        "include/perfetto/protozero/scattered_heap_buffer.h",
+        "include/perfetto/protozero/scattered_stream_null_delegate.h",
+        "include/perfetto/protozero/scattered_stream_writer.h",
+    ],
+)
+
+# GN target: //include/perfetto/public:public
+filegroup(
+    name = "include_perfetto_public_public",
+    srcs = [
+        "include/perfetto/public/consumer_api.h",
+    ],
+)
+
+# GN target: //include/perfetto/trace_processor:trace_processor
+filegroup(
+    name = "include_perfetto_trace_processor_trace_processor",
+    srcs = [
+        "include/perfetto/trace_processor/basic_types.h",
+        "include/perfetto/trace_processor/status.h",
+        "include/perfetto/trace_processor/trace_processor.h",
+    ],
+)
+
+# GN target: //include/perfetto/tracing/core:core
+filegroup(
+    name = "include_perfetto_tracing_core_core",
+    srcs = [
+        "include/perfetto/tracing/core/chrome_config.h",
+        "include/perfetto/tracing/core/data_source_config.h",
+        "include/perfetto/tracing/core/data_source_descriptor.h",
+        "include/perfetto/tracing/core/test_config.h",
+        "include/perfetto/tracing/core/trace_config.h",
+        "include/perfetto/tracing/core/tracing_service_state.h",
+    ],
+)
+
+# GN target: //include/perfetto/tracing:tracing
+filegroup(
+    name = "include_perfetto_tracing_tracing",
+    srcs = [
+        "include/perfetto/tracing/data_source.h",
+        "include/perfetto/tracing/internal/basic_types.h",
+        "include/perfetto/tracing/internal/data_source_internal.h",
+        "include/perfetto/tracing/internal/tracing_muxer.h",
+        "include/perfetto/tracing/internal/tracing_tls.h",
+        "include/perfetto/tracing/locked_handle.h",
+        "include/perfetto/tracing/platform.h",
+        "include/perfetto/tracing/trace_writer_base.h",
+        "include/perfetto/tracing/tracing.h",
+        "include/perfetto/tracing/tracing_backend.h",
+    ],
+)
+
+# GN target: //src/android_internal:headers
+filegroup(
+    name = "src_android_internal_headers",
+    srcs = [
+        "src/android_internal/atrace_hal.h",
+        "src/android_internal/dropbox_service.h",
+        "src/android_internal/health_hal.h",
+        "src/android_internal/incident_service.h",
+        "src/android_internal/power_stats_hal.h",
+    ],
+)
+
+# GN target: //src/android_internal:lazy_library_loader
+filegroup(
+    name = "src_android_internal_lazy_library_loader",
+    srcs = [
+        "src/android_internal/lazy_library_loader.cc",
+        "src/android_internal/lazy_library_loader.h",
+    ],
+)
+
+# GN target: //src/base:base
+filegroup(
+    name = "src_base_base",
+    srcs = [
+        "src/base/event_fd.cc",
+        "src/base/file_utils.cc",
+        "src/base/metatrace.cc",
+        "src/base/paged_memory.cc",
+        "src/base/pipe.cc",
+        "src/base/string_splitter.cc",
+        "src/base/string_utils.cc",
+        "src/base/string_view.cc",
+        "src/base/temp_file.cc",
+        "src/base/thread_checker.cc",
+        "src/base/thread_task_runner.cc",
+        "src/base/time.cc",
+        "src/base/unix_task_runner.cc",
+        "src/base/uuid.cc",
+        "src/base/virtual_destructors.cc",
+        "src/base/waitable_event.cc",
+        "src/base/watchdog_posix.cc",
+    ],
+)
+
+# GN target: //src/base:unix_socket
+filegroup(
+    name = "src_base_unix_socket",
+    srcs = [
+        "src/base/unix_socket.cc",
+    ],
+)
+
+# GN target: //src/ipc:ipc
+filegroup(
+    name = "src_ipc_ipc",
+    srcs = [
+        "src/ipc/buffered_frame_deserializer.cc",
+        "src/ipc/buffered_frame_deserializer.h",
+        "src/ipc/client_impl.cc",
+        "src/ipc/client_impl.h",
+        "src/ipc/deferred.cc",
+        "src/ipc/host_impl.cc",
+        "src/ipc/host_impl.h",
+        "src/ipc/service_proxy.cc",
+        "src/ipc/virtual_destructors.cc",
+    ],
+)
+
+# GN target: //src/perfetto_cmd:perfetto_cmd
+filegroup(
+    name = "src_perfetto_cmd_perfetto_cmd",
+    srcs = [
+        "src/perfetto_cmd/config.cc",
+        "src/perfetto_cmd/config.h",
+        "src/perfetto_cmd/packet_writer.cc",
+        "src/perfetto_cmd/packet_writer.h",
+        "src/perfetto_cmd/pbtxt_to_pb.cc",
+        "src/perfetto_cmd/pbtxt_to_pb.h",
+        "src/perfetto_cmd/perfetto_cmd.cc",
+        "src/perfetto_cmd/perfetto_cmd.h",
+        "src/perfetto_cmd/perfetto_config.descriptor.h",
+        "src/perfetto_cmd/rate_limiter.cc",
+        "src/perfetto_cmd/rate_limiter.h",
+    ],
+)
+
+# GN target: //src/perfetto_cmd:trigger_producer
+filegroup(
+    name = "src_perfetto_cmd_trigger_producer",
+    srcs = [
+        "src/perfetto_cmd/trigger_producer.cc",
+        "src/perfetto_cmd/trigger_producer.h",
+    ],
+)
+
+# GN target: //src/protozero:protozero
+filegroup(
+    name = "src_protozero_protozero",
+    srcs = [
+        "src/protozero/message.cc",
+        "src/protozero/message_handle.cc",
+        "src/protozero/proto_decoder.cc",
+        "src/protozero/scattered_heap_buffer.cc",
+        "src/protozero/scattered_stream_null_delegate.cc",
+        "src/protozero/scattered_stream_writer.cc",
+    ],
+)
+
+# GN target: //src/trace_processor/db:lib
+filegroup(
+    name = "src_trace_processor_db_lib",
+    srcs = [
+        "src/trace_processor/db/bit_vector.cc",
+        "src/trace_processor/db/bit_vector.h",
+        "src/trace_processor/db/column.cc",
+        "src/trace_processor/db/column.h",
+        "src/trace_processor/db/row_map.cc",
+        "src/trace_processor/db/row_map.h",
+        "src/trace_processor/db/sparse_vector.h",
+        "src/trace_processor/db/table.cc",
+        "src/trace_processor/db/table.h",
+        "src/trace_processor/db/typed_column.h",
+    ],
+)
+
+genrule(
+    name = "src_trace_processor_metrics_gen_merged_sql_metrics",
+    srcs = [
         "src/trace_processor/metrics/android/android_mem.sql",
-        "src/trace_processor/metrics/android/android_mem_unagg.sql",
-        "src/trace_processor/metrics/android/android_package_list.sql",
         "src/trace_processor/metrics/android/android_powrails.sql",
-        "src/trace_processor/metrics/android/android_process_growth.sql",
-        "src/trace_processor/metrics/android/android_startup.sql",
-        "src/trace_processor/metrics/android/android_startup_cpu.sql",
         "src/trace_processor/metrics/android/android_startup_launches.sql",
-        "src/trace_processor/metrics/android/android_task_state.sql",
-        "src/trace_processor/metrics/android/heap_profile_callsite_stats.sql",
+        "src/trace_processor/metrics/android/android_cpu_agg.sql",
+        "src/trace_processor/metrics/android/upid_span_view.sql",
+        "src/trace_processor/metrics/android/android_mem_unagg.sql",
+        "src/trace_processor/metrics/android/android_process_growth.sql",
         "src/trace_processor/metrics/android/mem_stats_priority_breakdown.sql",
-        "src/trace_processor/metrics/android/process_mem.sql",
+        "src/trace_processor/metrics/android/android_batt.sql",
+        "src/trace_processor/metrics/android/android_startup.sql",
+        "src/trace_processor/metrics/trace_metadata.sql",
+        "src/trace_processor/metrics/android/android_ion.sql",
+        "src/trace_processor/metrics/android/android_startup_cpu.sql",
+        "src/trace_processor/metrics/android/android_package_list.sql",
+        "src/trace_processor/metrics/android/android_cpu.sql",
         "src/trace_processor/metrics/android/process_unagg_mem_view.sql",
         "src/trace_processor/metrics/android/span_view_stats.sql",
-        "src/trace_processor/metrics/android/upid_span_view.sql",
-        "src/trace_processor/metrics/trace_metadata.sql",
+        "src/trace_processor/metrics/android/heap_profile_callsite_stats.sql",
+        "src/trace_processor/metrics/android/android_task_state.sql",
+        "src/trace_processor/metrics/android/process_mem.sql",
+        "src/trace_processor/metrics/android/android_lmk.sql",
     ],
     outs = [
         "src/trace_processor/metrics/sql_metrics.h",
     ],
     cmd = "$(location gen_merged_sql_metrics_py) --cpp_out=$@ $(SRCS)",
     tools = [
-        "gen_merged_sql_metrics_py",
+        ":gen_merged_sql_metrics_py",
+    ],
+)
+
+# GN target: //src/trace_processor/metrics:lib
+filegroup(
+    name = "src_trace_processor_metrics_lib",
+    srcs = [
+        "src/trace_processor/metrics/descriptors.cc",
+        "src/trace_processor/metrics/descriptors.h",
+        "src/trace_processor/metrics/metrics.cc",
+        "src/trace_processor/metrics/metrics.descriptor.h",
+        "src/trace_processor/metrics/metrics.h",
+    ],
+)
+
+# GN target: //src/trace_processor/sqlite:sqlite
+filegroup(
+    name = "src_trace_processor_sqlite_sqlite",
+    srcs = [
+        "src/trace_processor/sqlite/db_sqlite_table.cc",
+        "src/trace_processor/sqlite/db_sqlite_table.h",
+        "src/trace_processor/sqlite/query_constraints.cc",
+        "src/trace_processor/sqlite/query_constraints.h",
+        "src/trace_processor/sqlite/scoped_db.h",
+        "src/trace_processor/sqlite/sqlite3_str_split.cc",
+        "src/trace_processor/sqlite/sqlite3_str_split.h",
+        "src/trace_processor/sqlite/sqlite_table.cc",
+        "src/trace_processor/sqlite/sqlite_table.h",
+        "src/trace_processor/sqlite/sqlite_utils.h",
+    ],
+)
+
+# GN target: //src/trace_processor/tables:tables
+filegroup(
+    name = "src_trace_processor_tables_tables",
+    srcs = [
+        "src/trace_processor/tables/macros.h",
+        "src/trace_processor/tables/macros_internal.h",
+        "src/trace_processor/tables/profiler_tables.h",
+        "src/trace_processor/tables/slice_tables.h",
+        "src/trace_processor/tables/track_tables.h",
+    ],
+)
+
+# GN target: //src/trace_processor:common
+filegroup(
+    name = "src_trace_processor_common",
+    srcs = [
+        "src/trace_processor/null_term_string_view.h",
+        "src/trace_processor/string_pool.cc",
+        "src/trace_processor/string_pool.h",
+    ],
+)
+
+# GN target: //src/trace_processor:lib
+filegroup(
+    name = "src_trace_processor_lib",
+    srcs = [
+        "src/trace_processor/android_logs_table.cc",
+        "src/trace_processor/android_logs_table.h",
+        "src/trace_processor/args_table.cc",
+        "src/trace_processor/args_table.h",
+        "src/trace_processor/args_tracker.cc",
+        "src/trace_processor/args_tracker.h",
+        "src/trace_processor/chunked_trace_reader.h",
+        "src/trace_processor/clock_tracker.cc",
+        "src/trace_processor/clock_tracker.h",
+        "src/trace_processor/counter_definitions_table.cc",
+        "src/trace_processor/counter_definitions_table.h",
+        "src/trace_processor/counter_values_table.cc",
+        "src/trace_processor/counter_values_table.h",
+        "src/trace_processor/cpu_profile_stack_sample_table.cc",
+        "src/trace_processor/cpu_profile_stack_sample_table.h",
+        "src/trace_processor/event_tracker.cc",
+        "src/trace_processor/event_tracker.h",
+        "src/trace_processor/export_json.cc",
+        "src/trace_processor/export_json.h",
+        "src/trace_processor/filtered_row_index.cc",
+        "src/trace_processor/filtered_row_index.h",
+        "src/trace_processor/forwarding_trace_parser.cc",
+        "src/trace_processor/forwarding_trace_parser.h",
+        "src/trace_processor/ftrace_descriptors.cc",
+        "src/trace_processor/ftrace_descriptors.h",
+        "src/trace_processor/ftrace_utils.cc",
+        "src/trace_processor/ftrace_utils.h",
+        "src/trace_processor/fuchsia_provider_view.cc",
+        "src/trace_processor/fuchsia_provider_view.h",
+        "src/trace_processor/fuchsia_trace_parser.cc",
+        "src/trace_processor/fuchsia_trace_parser.h",
+        "src/trace_processor/fuchsia_trace_tokenizer.cc",
+        "src/trace_processor/fuchsia_trace_tokenizer.h",
+        "src/trace_processor/fuchsia_trace_utils.cc",
+        "src/trace_processor/fuchsia_trace_utils.h",
+        "src/trace_processor/graphics_frame_event_parser.cc",
+        "src/trace_processor/graphics_frame_event_parser.h",
+        "src/trace_processor/gzip_trace_parser.cc",
+        "src/trace_processor/gzip_trace_parser.h",
+        "src/trace_processor/heap_profile_allocation_table.cc",
+        "src/trace_processor/heap_profile_allocation_table.h",
+        "src/trace_processor/heap_profile_tracker.cc",
+        "src/trace_processor/heap_profile_tracker.h",
+        "src/trace_processor/instants_table.cc",
+        "src/trace_processor/instants_table.h",
+        "src/trace_processor/json_trace_parser.cc",
+        "src/trace_processor/json_trace_parser.h",
+        "src/trace_processor/json_trace_tokenizer.cc",
+        "src/trace_processor/json_trace_tokenizer.h",
+        "src/trace_processor/json_trace_utils.cc",
+        "src/trace_processor/json_trace_utils.h",
+        "src/trace_processor/metadata.h",
+        "src/trace_processor/metadata_table.cc",
+        "src/trace_processor/metadata_table.h",
+        "src/trace_processor/process_table.cc",
+        "src/trace_processor/process_table.h",
+        "src/trace_processor/process_tracker.cc",
+        "src/trace_processor/process_tracker.h",
+        "src/trace_processor/proto_incremental_state.h",
+        "src/trace_processor/proto_trace_parser.cc",
+        "src/trace_processor/proto_trace_parser.h",
+        "src/trace_processor/proto_trace_tokenizer.cc",
+        "src/trace_processor/proto_trace_tokenizer.h",
+        "src/trace_processor/raw_table.cc",
+        "src/trace_processor/raw_table.h",
+        "src/trace_processor/row_iterators.cc",
+        "src/trace_processor/row_iterators.h",
+        "src/trace_processor/sched_slice_table.cc",
+        "src/trace_processor/sched_slice_table.h",
+        "src/trace_processor/slice_table.cc",
+        "src/trace_processor/slice_table.h",
+        "src/trace_processor/slice_tracker.cc",
+        "src/trace_processor/slice_tracker.h",
+        "src/trace_processor/span_join_operator_table.cc",
+        "src/trace_processor/span_join_operator_table.h",
+        "src/trace_processor/sql_stats_table.cc",
+        "src/trace_processor/sql_stats_table.h",
+        "src/trace_processor/stack_profile_callsite_table.cc",
+        "src/trace_processor/stack_profile_callsite_table.h",
+        "src/trace_processor/stack_profile_frame_table.cc",
+        "src/trace_processor/stack_profile_frame_table.h",
+        "src/trace_processor/stack_profile_mapping_table.cc",
+        "src/trace_processor/stack_profile_mapping_table.h",
+        "src/trace_processor/stack_profile_tracker.cc",
+        "src/trace_processor/stack_profile_tracker.h",
+        "src/trace_processor/stats.h",
+        "src/trace_processor/stats_table.cc",
+        "src/trace_processor/stats_table.h",
+        "src/trace_processor/storage_columns.cc",
+        "src/trace_processor/storage_columns.h",
+        "src/trace_processor/storage_schema.cc",
+        "src/trace_processor/storage_schema.h",
+        "src/trace_processor/storage_table.cc",
+        "src/trace_processor/storage_table.h",
+        "src/trace_processor/syscall_tracker.cc",
+        "src/trace_processor/syscall_tracker.h",
+        "src/trace_processor/syscalls_aarch32.h",
+        "src/trace_processor/syscalls_aarch64.h",
+        "src/trace_processor/syscalls_armeabi.h",
+        "src/trace_processor/syscalls_x86_64.h",
+        "src/trace_processor/systrace_parser.cc",
+        "src/trace_processor/systrace_parser.h",
+        "src/trace_processor/systrace_trace_parser.cc",
+        "src/trace_processor/systrace_trace_parser.h",
+        "src/trace_processor/thread_table.cc",
+        "src/trace_processor/thread_table.h",
+        "src/trace_processor/trace_blob_view.h",
+        "src/trace_processor/trace_parser.h",
+        "src/trace_processor/trace_processor.cc",
+        "src/trace_processor/trace_processor_context.cc",
+        "src/trace_processor/trace_processor_context.h",
+        "src/trace_processor/trace_processor_impl.cc",
+        "src/trace_processor/trace_processor_impl.h",
+        "src/trace_processor/trace_sorter.cc",
+        "src/trace_processor/trace_sorter.h",
+        "src/trace_processor/trace_storage.cc",
+        "src/trace_processor/trace_storage.h",
+        "src/trace_processor/variadic.h",
+        "src/trace_processor/virtual_destructors.cc",
+        "src/trace_processor/virtual_track_tracker.cc",
+        "src/trace_processor/virtual_track_tracker.h",
+        "src/trace_processor/window_operator_table.cc",
+        "src/trace_processor/window_operator_table.h",
+    ],
+)
+
+# GN target: //src/traced/probes/android_log:android_log
+filegroup(
+    name = "src_traced_probes_android_log_android_log",
+    srcs = [
+        "src/traced/probes/android_log/android_log_data_source.cc",
+        "src/traced/probes/android_log/android_log_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes/filesystem:filesystem
+filegroup(
+    name = "src_traced_probes_filesystem_filesystem",
+    srcs = [
+        "src/traced/probes/filesystem/file_scanner.cc",
+        "src/traced/probes/filesystem/file_scanner.h",
+        "src/traced/probes/filesystem/fs_mount.cc",
+        "src/traced/probes/filesystem/fs_mount.h",
+        "src/traced/probes/filesystem/inode_file_data_source.cc",
+        "src/traced/probes/filesystem/inode_file_data_source.h",
+        "src/traced/probes/filesystem/lru_inode_cache.cc",
+        "src/traced/probes/filesystem/lru_inode_cache.h",
+        "src/traced/probes/filesystem/prefix_finder.cc",
+        "src/traced/probes/filesystem/prefix_finder.h",
+        "src/traced/probes/filesystem/range_tree.cc",
+        "src/traced/probes/filesystem/range_tree.h",
+    ],
+)
+
+# GN target: //src/traced/probes/ftrace:format_parser
+filegroup(
+    name = "src_traced_probes_ftrace_format_parser",
+    srcs = [
+        "src/traced/probes/ftrace/format_parser.cc",
+        "src/traced/probes/ftrace/format_parser.h",
+    ],
+)
+
+# GN target: //src/traced/probes/ftrace:ftrace
+filegroup(
+    name = "src_traced_probes_ftrace_ftrace",
+    srcs = [
+        "src/traced/probes/ftrace/atrace_hal_wrapper.cc",
+        "src/traced/probes/ftrace/atrace_hal_wrapper.h",
+        "src/traced/probes/ftrace/atrace_wrapper.cc",
+        "src/traced/probes/ftrace/atrace_wrapper.h",
+        "src/traced/probes/ftrace/cpu_reader.cc",
+        "src/traced/probes/ftrace/cpu_reader.h",
+        "src/traced/probes/ftrace/cpu_stats_parser.cc",
+        "src/traced/probes/ftrace/cpu_stats_parser.h",
+        "src/traced/probes/ftrace/event_info.cc",
+        "src/traced/probes/ftrace/event_info.h",
+        "src/traced/probes/ftrace/event_info_constants.cc",
+        "src/traced/probes/ftrace/event_info_constants.h",
+        "src/traced/probes/ftrace/ftrace_config.cc",
+        "src/traced/probes/ftrace/ftrace_config.h",
+        "src/traced/probes/ftrace/ftrace_config_muxer.cc",
+        "src/traced/probes/ftrace/ftrace_config_muxer.h",
+        "src/traced/probes/ftrace/ftrace_config_utils.cc",
+        "src/traced/probes/ftrace/ftrace_config_utils.h",
+        "src/traced/probes/ftrace/ftrace_controller.cc",
+        "src/traced/probes/ftrace/ftrace_controller.h",
+        "src/traced/probes/ftrace/ftrace_data_source.cc",
+        "src/traced/probes/ftrace/ftrace_data_source.h",
+        "src/traced/probes/ftrace/ftrace_metadata.cc",
+        "src/traced/probes/ftrace/ftrace_metadata.h",
+        "src/traced/probes/ftrace/ftrace_procfs.cc",
+        "src/traced/probes/ftrace/ftrace_procfs.h",
+        "src/traced/probes/ftrace/ftrace_stats.cc",
+        "src/traced/probes/ftrace/ftrace_stats.h",
+        "src/traced/probes/ftrace/proto_translation_table.cc",
+        "src/traced/probes/ftrace/proto_translation_table.h",
+    ],
+)
+
+# GN target: //src/traced/probes/metatrace:metatrace
+filegroup(
+    name = "src_traced_probes_metatrace_metatrace",
+    srcs = [
+        "src/traced/probes/metatrace/metatrace_data_source.cc",
+        "src/traced/probes/metatrace/metatrace_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes/packages_list:packages_list
+filegroup(
+    name = "src_traced_probes_packages_list_packages_list",
+    srcs = [
+        "src/traced/probes/packages_list/packages_list_data_source.cc",
+        "src/traced/probes/packages_list/packages_list_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes/power:power
+filegroup(
+    name = "src_traced_probes_power_power",
+    srcs = [
+        "src/traced/probes/power/android_power_data_source.cc",
+        "src/traced/probes/power/android_power_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes/ps:ps
+filegroup(
+    name = "src_traced_probes_ps_ps",
+    srcs = [
+        "src/traced/probes/ps/process_stats_data_source.cc",
+        "src/traced/probes/ps/process_stats_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes/sys_stats:sys_stats
+filegroup(
+    name = "src_traced_probes_sys_stats_sys_stats",
+    srcs = [
+        "src/traced/probes/sys_stats/sys_stats_data_source.cc",
+        "src/traced/probes/sys_stats/sys_stats_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes:data_source
+filegroup(
+    name = "src_traced_probes_data_source",
+    srcs = [
+        "src/traced/probes/probes_data_source.cc",
+        "src/traced/probes/probes_data_source.h",
+    ],
+)
+
+# GN target: //src/traced/probes:probes
+filegroup(
+    name = "src_traced_probes_probes",
+    srcs = [
+        "src/traced/probes/probes.cc",
+    ],
+)
+
+# GN target: //src/traced/probes:probes_src
+filegroup(
+    name = "src_traced_probes_probes_src",
+    srcs = [
+        "src/traced/probes/probes_producer.cc",
+        "src/traced/probes/probes_producer.h",
+    ],
+)
+
+# GN target: //src/traced/service:service
+filegroup(
+    name = "src_traced_service_service",
+    srcs = [
+        "src/traced/service/builtin_producer.cc",
+        "src/traced/service/builtin_producer.h",
+        "src/traced/service/service.cc",
+    ],
+)
+
+# GN target: //src/tracing:common
+filegroup(
+    name = "src_tracing_common",
+    srcs = [
+        "src/tracing/trace_writer_base.cc",
+    ],
+)
+
+# GN target: //src/tracing:consumer_api_deprecated
+filegroup(
+    name = "src_tracing_consumer_api_deprecated",
+    srcs = [
+        "src/tracing/api_impl/consumer_api.cc",
+    ],
+)
+
+# GN target: //src/tracing:ipc
+filegroup(
+    name = "src_tracing_ipc",
+    srcs = [
+        "src/tracing/ipc/consumer/consumer_ipc_client_impl.cc",
+        "src/tracing/ipc/consumer/consumer_ipc_client_impl.h",
+        "src/tracing/ipc/default_socket.cc",
+        "src/tracing/ipc/posix_shared_memory.cc",
+        "src/tracing/ipc/posix_shared_memory.h",
+        "src/tracing/ipc/producer/producer_ipc_client_impl.cc",
+        "src/tracing/ipc/producer/producer_ipc_client_impl.h",
+        "src/tracing/ipc/service/consumer_ipc_service.cc",
+        "src/tracing/ipc/service/consumer_ipc_service.h",
+        "src/tracing/ipc/service/producer_ipc_service.cc",
+        "src/tracing/ipc/service/producer_ipc_service.h",
+        "src/tracing/ipc/service/service_ipc_host_impl.cc",
+        "src/tracing/ipc/service/service_ipc_host_impl.h",
+    ],
+)
+
+# GN target: //src/tracing:tracing
+filegroup(
+    name = "src_tracing_tracing",
+    srcs = [
+        "src/tracing/core/chrome_config.cc",
+        "src/tracing/core/commit_data_request.cc",
+        "src/tracing/core/data_source_config.cc",
+        "src/tracing/core/data_source_descriptor.cc",
+        "src/tracing/core/id_allocator.cc",
+        "src/tracing/core/id_allocator.h",
+        "src/tracing/core/metatrace_writer.cc",
+        "src/tracing/core/metatrace_writer.h",
+        "src/tracing/core/null_trace_writer.cc",
+        "src/tracing/core/null_trace_writer.h",
+        "src/tracing/core/observable_events.cc",
+        "src/tracing/core/packet_stream_validator.cc",
+        "src/tracing/core/packet_stream_validator.h",
+        "src/tracing/core/patch_list.h",
+        "src/tracing/core/shared_memory_abi.cc",
+        "src/tracing/core/shared_memory_arbiter_impl.cc",
+        "src/tracing/core/shared_memory_arbiter_impl.h",
+        "src/tracing/core/sliced_protobuf_input_stream.cc",
+        "src/tracing/core/startup_trace_writer.cc",
+        "src/tracing/core/startup_trace_writer_registry.cc",
+        "src/tracing/core/test_config.cc",
+        "src/tracing/core/trace_buffer.cc",
+        "src/tracing/core/trace_buffer.h",
+        "src/tracing/core/trace_config.cc",
+        "src/tracing/core/trace_packet.cc",
+        "src/tracing/core/trace_stats.cc",
+        "src/tracing/core/trace_writer_impl.cc",
+        "src/tracing/core/trace_writer_impl.h",
+        "src/tracing/core/tracing_service_impl.cc",
+        "src/tracing/core/tracing_service_impl.h",
+        "src/tracing/core/tracing_service_state.cc",
+        "src/tracing/core/virtual_destructors.cc",
+    ],
+)
+
+# GN target: //tools/trace_to_text:pprofbuilder
+filegroup(
+    name = "tools_trace_to_text_pprofbuilder",
+    srcs = [
+        "tools/trace_to_text/pprof_builder.cc",
+        "tools/trace_to_text/pprof_builder.h",
+    ],
+)
+
+# GN target: //tools/trace_to_text:symbolizer
+filegroup(
+    name = "tools_trace_to_text_symbolizer",
+    srcs = [
+        "tools/trace_to_text/symbolizer.cc",
+        "tools/trace_to_text/symbolizer.h",
+        "tools/trace_to_text/trace_symbol_table.cc",
+        "tools/trace_to_text/trace_symbol_table.h",
+    ],
+)
+
+# GN target: //tools/trace_to_text:utils
+filegroup(
+    name = "tools_trace_to_text_utils",
+    srcs = [
+        "tools/trace_to_text/profile_visitor.cc",
+        "tools/trace_to_text/profile_visitor.h",
+        "tools/trace_to_text/utils.cc",
+        "tools/trace_to_text/utils.h",
+    ],
+)
+
+
+# ##############################################################################
+# Proto libraries
+# ##############################################################################
+
+# GN target: //protos/perfetto/trace_processor:metrics_impl_zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_processor_metrics_impl_zero",
+    deps = [
+        ":protos_perfetto_trace_processor_metrics_impl_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/filesystem:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_filesystem_lite",
+    deps = [
+        ":protos_perfetto_trace_filesystem_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/power:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_power_lite",
+    deps = [
+        ":protos_perfetto_trace_power_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/track_event:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_track_event_lite",
+    deps = [
+        ":protos_perfetto_trace_track_event_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/process_stats:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_process_stats_zero",
+    deps = [
+        ":protos_perfetto_config_process_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/perfetto:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_perfetto_zero",
+    deps = [
+        ":protos_perfetto_trace_perfetto_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/power:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_power_zero",
+    deps = [
+        ":protos_perfetto_config_power_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/sys_stats:lite
+perfetto_proto_library(
+    name = "protos_perfetto_config_sys_stats_protos",
+    srcs = [
+        "protos/perfetto/config/sys_stats/sys_stats_config.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/metrics:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_metrics_lite",
+    deps = [
+        ":protos_perfetto_metrics_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/sys_stats:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_sys_stats_lite",
+    deps = [
+        ":protos_perfetto_config_sys_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/metrics:lite
+perfetto_proto_library(
+    name = "protos_perfetto_metrics_protos",
+    srcs = [
+        "protos/perfetto/metrics/metrics.proto",
+    ],
+    deps = [
+        ":protos_perfetto_metrics_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/android:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_android_lite",
+    deps = [
+        ":protos_perfetto_config_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/interned_data:zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_interned_data_protos",
+    srcs = [
+        "protos/perfetto/trace/interned_data/interned_data.proto",
+    ],
+    deps = [
+        ":protos_perfetto_trace_profiling_protos",
+        ":protos_perfetto_trace_track_event_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:minimal_lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_minimal_lite",
+    deps = [
+        ":protos_perfetto_trace_minimal_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:non_minimal_zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_non_minimal_zero",
+    deps = [
+        ":protos_perfetto_trace_non_minimal_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/metrics/android:zero
+perfetto_proto_library(
+    name = "protos_perfetto_metrics_android_protos",
+    srcs = [
+        "protos/perfetto/metrics/android/batt_metric.proto",
+        "protos/perfetto/metrics/android/cpu_metric.proto",
+        "protos/perfetto/metrics/android/heap_profile_callsite_stats.proto",
+        "protos/perfetto/metrics/android/ion_metric.proto",
+        "protos/perfetto/metrics/android/lmk_metric.proto",
+        "protos/perfetto/metrics/android/mem_metric.proto",
+        "protos/perfetto/metrics/android/mem_unagg_metric.proto",
+        "protos/perfetto/metrics/android/package_list.proto",
+        "protos/perfetto/metrics/android/powrails_metric.proto",
+        "protos/perfetto/metrics/android/process_growth.proto",
+        "protos/perfetto/metrics/android/startup_metric.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/inode_file:zero
+perfetto_proto_library(
+    name = "protos_perfetto_config_inode_file_protos",
+    srcs = [
+        "protos/perfetto/config/inode_file/inode_file_config.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/gpu:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_gpu_zero",
+    deps = [
+        ":protos_perfetto_config_gpu_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/chrome:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_chrome_zero",
+    deps = [
+        ":protos_perfetto_trace_chrome_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/common:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_common_zero",
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/android:lite
+perfetto_proto_library(
+    name = "protos_perfetto_config_android_protos",
+    srcs = [
+        "protos/perfetto/config/android/android_log_config.proto",
+        "protos/perfetto/config/android/packages_list_config.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/power:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_power_lite",
+    deps = [
+        ":protos_perfetto_config_power_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/android:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_android_zero",
+    deps = [
+        ":protos_perfetto_trace_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/profiling:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_profiling_zero",
+    deps = [
+        ":protos_perfetto_config_profiling_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/metrics/android:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_metrics_android_lite",
+    deps = [
+        ":protos_perfetto_metrics_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/appended_data:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_appended_data_lite",
+    deps = [
+        ":protos_perfetto_trace_appended_data_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/power:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_power_zero",
+    deps = [
+        ":protos_perfetto_trace_power_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/gpu:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_gpu_zero",
+    deps = [
+        ":protos_perfetto_trace_gpu_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/sys_stats:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_sys_stats_protos",
+    srcs = [
+        "protos/perfetto/trace/sys_stats/sys_stats.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/gpu:lite
+perfetto_proto_library(
+    name = "protos_perfetto_config_gpu_protos",
+    srcs = [
+        "protos/perfetto/config/gpu/gpu_counter_config.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/common:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_common_lite",
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/ftrace:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_ftrace_lite",
+    deps = [
+        ":protos_perfetto_trace_ftrace_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/filesystem:zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_filesystem_protos",
+    srcs = [
+        "protos/perfetto/trace/filesystem/inode_file_map.proto",
+    ],
+)
+
+# GN target: //protos/third_party/pprof:lite
+perfetto_proto_library(
+    name = "protos_third_party_pprof_protos",
+    srcs = [
+        "protos/third_party/pprof/profile.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/process_stats:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_process_stats_lite",
+    deps = [
+        ":protos_perfetto_config_process_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/appended_data:zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_appended_data_protos",
+    srcs = [
+        "protos/perfetto/trace/appended_data/appended_data.proto",
+    ],
+    deps = [
+        ":protos_perfetto_trace_profiling_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_lite",
+    deps = [
+        ":protos_perfetto_config_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/ftrace:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_ftrace_zero",
+    deps = [
+        ":protos_perfetto_trace_ftrace_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/profiling:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_profiling_zero",
+    deps = [
+        ":protos_perfetto_trace_profiling_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/ipc:ipc
+perfetto_cc_ipc_library(
+    name = "protos_perfetto_ipc_ipc",
+    deps = [
+        ":protos_perfetto_ipc_ipc_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/android:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_android_zero",
+    deps = [
+        ":protos_perfetto_config_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/gpu:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_gpu_lite",
+    deps = [
+        ":protos_perfetto_trace_gpu_protos",
+    ],
+)
+
+# GN target: //src/perfetto_cmd:protos
+perfetto_cc_proto_library(
+    name = "src_perfetto_cmd_protos",
+    deps = [
+        ":src_perfetto_cmd_protos_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/power:zero
+perfetto_proto_library(
+    name = "protos_perfetto_config_power_protos",
+    srcs = [
+        "protos/perfetto/config/power/android_power_config.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/chrome:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_chrome_lite",
+    deps = [
+        ":protos_perfetto_trace_chrome_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:minimal_zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_minimal_protos",
+    srcs = [
+        "protos/perfetto/trace/clock_snapshot.proto",
+        "protos/perfetto/trace/system_info.proto",
+        "protos/perfetto/trace/trigger.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+        ":protos_perfetto_config_android_protos",
+        ":protos_perfetto_config_ftrace_protos",
+        ":protos_perfetto_config_gpu_protos",
+        ":protos_perfetto_config_inode_file_protos",
+        ":protos_perfetto_config_power_protos",
+        ":protos_perfetto_config_process_stats_protos",
+        ":protos_perfetto_config_profiling_protos",
+        ":protos_perfetto_config_protos",
+        ":protos_perfetto_config_sys_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/perfetto:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_perfetto_lite",
+    deps = [
+        ":protos_perfetto_trace_perfetto_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:non_minimal_lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_non_minimal_lite",
+    deps = [
+        ":protos_perfetto_trace_non_minimal_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/gpu:zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_gpu_protos",
+    srcs = [
+        "protos/perfetto/trace/gpu/gpu_counter_event.proto",
+        "protos/perfetto/trace/gpu/gpu_render_stage_event.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/track_event:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_track_event_protos",
+    srcs = [
+        "protos/perfetto/trace/track_event/debug_annotation.proto",
+        "protos/perfetto/trace/track_event/log_message.proto",
+        "protos/perfetto/trace/track_event/process_descriptor.proto",
+        "protos/perfetto/trace/track_event/source_location.proto",
+        "protos/perfetto/trace/track_event/task_execution.proto",
+        "protos/perfetto/trace/track_event/thread_descriptor.proto",
+        "protos/perfetto/trace/track_event/track_descriptor.proto",
+        "protos/perfetto/trace/track_event/track_event.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/ipc:ipc
+perfetto_proto_library(
+    name = "protos_perfetto_ipc_ipc_protos",
+    srcs = [
+        "protos/perfetto/ipc/consumer_port.proto",
+        "protos/perfetto/ipc/producer_port.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+        ":protos_perfetto_config_android_protos",
+        ":protos_perfetto_config_ftrace_protos",
+        ":protos_perfetto_config_gpu_protos",
+        ":protos_perfetto_config_inode_file_protos",
+        ":protos_perfetto_config_power_protos",
+        ":protos_perfetto_config_process_stats_protos",
+        ":protos_perfetto_config_profiling_protos",
+        ":protos_perfetto_config_protos",
+        ":protos_perfetto_config_sys_stats_protos",
+        ":protos_perfetto_ipc_wire_protocol_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/metrics:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_metrics_zero",
+    deps = [
+        ":protos_perfetto_metrics_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/sys_stats:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_sys_stats_zero",
+    deps = [
+        ":protos_perfetto_trace_sys_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/gpu:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_gpu_lite",
+    deps = [
+        ":protos_perfetto_config_gpu_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/chrome:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_chrome_protos",
+    srcs = [
+        "protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto",
+        "protos/perfetto/trace/chrome/chrome_metadata.proto",
+        "protos/perfetto/trace/chrome/chrome_trace_event.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/ftrace:lite
+perfetto_proto_library(
+    name = "protos_perfetto_config_ftrace_protos",
+    srcs = [
+        "protos/perfetto/config/ftrace/ftrace_config.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/ftrace:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_ftrace_lite",
+    deps = [
+        ":protos_perfetto_config_ftrace_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/sys_stats:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_sys_stats_lite",
+    deps = [
+        ":protos_perfetto_trace_sys_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/ipc:wire_protocol
+perfetto_proto_library(
+    name = "protos_perfetto_ipc_wire_protocol_protos",
+    srcs = [
+        "protos/perfetto/ipc/wire_protocol.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/sys_stats:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_sys_stats_zero",
+    deps = [
+        ":protos_perfetto_config_sys_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/inode_file:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_inode_file_lite",
+    deps = [
+        ":protos_perfetto_config_inode_file_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/ps:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_ps_zero",
+    deps = [
+        ":protos_perfetto_trace_ps_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace_processor:metrics_impl_zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_processor_metrics_impl_protos",
+    srcs = [
+        "protos/perfetto/trace_processor/metrics_impl.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/interned_data:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_interned_data_zero",
+    deps = [
+        ":protos_perfetto_trace_interned_data_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/interned_data:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_interned_data_lite",
+    deps = [
+        ":protos_perfetto_trace_interned_data_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/ftrace:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_ftrace_protos",
+    srcs = [
+        "protos/perfetto/trace/ftrace/binder.proto",
+        "protos/perfetto/trace/ftrace/block.proto",
+        "protos/perfetto/trace/ftrace/cgroup.proto",
+        "protos/perfetto/trace/ftrace/clk.proto",
+        "protos/perfetto/trace/ftrace/compaction.proto",
+        "protos/perfetto/trace/ftrace/ext4.proto",
+        "protos/perfetto/trace/ftrace/f2fs.proto",
+        "protos/perfetto/trace/ftrace/fence.proto",
+        "protos/perfetto/trace/ftrace/filemap.proto",
+        "protos/perfetto/trace/ftrace/ftrace.proto",
+        "protos/perfetto/trace/ftrace/ftrace_event.proto",
+        "protos/perfetto/trace/ftrace/ftrace_event_bundle.proto",
+        "protos/perfetto/trace/ftrace/ftrace_stats.proto",
+        "protos/perfetto/trace/ftrace/generic.proto",
+        "protos/perfetto/trace/ftrace/i2c.proto",
+        "protos/perfetto/trace/ftrace/ipi.proto",
+        "protos/perfetto/trace/ftrace/irq.proto",
+        "protos/perfetto/trace/ftrace/kmem.proto",
+        "protos/perfetto/trace/ftrace/lowmemorykiller.proto",
+        "protos/perfetto/trace/ftrace/mdss.proto",
+        "protos/perfetto/trace/ftrace/mm_event.proto",
+        "protos/perfetto/trace/ftrace/oom.proto",
+        "protos/perfetto/trace/ftrace/power.proto",
+        "protos/perfetto/trace/ftrace/raw_syscalls.proto",
+        "protos/perfetto/trace/ftrace/regulator.proto",
+        "protos/perfetto/trace/ftrace/sched.proto",
+        "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/sync.proto",
+        "protos/perfetto/trace/ftrace/systrace.proto",
+        "protos/perfetto/trace/ftrace/task.proto",
+        "protos/perfetto/trace/ftrace/test_bundle_wrapper.proto",
+        "protos/perfetto/trace/ftrace/vmscan.proto",
+        "protos/perfetto/trace/ftrace/workqueue.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/perfetto:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_perfetto_protos",
+    srcs = [
+        "protos/perfetto/trace/perfetto/perfetto_metatrace.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/common:zero
+perfetto_proto_library(
+    name = "protos_perfetto_common_protos",
+    srcs = [
+        "protos/perfetto/common/android_log_constants.proto",
+        "protos/perfetto/common/commit_data_request.proto",
+        "protos/perfetto/common/data_source_descriptor.proto",
+        "protos/perfetto/common/descriptor.proto",
+        "protos/perfetto/common/gpu_counter_descriptor.proto",
+        "protos/perfetto/common/observable_events.proto",
+        "protos/perfetto/common/sys_stats_counters.proto",
+        "protos/perfetto/common/trace_stats.proto",
+        "protos/perfetto/common/tracing_service_state.proto",
+        "protos/perfetto/common/track_event_descriptor.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/profiling:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_profiling_lite",
+    deps = [
+        ":protos_perfetto_trace_profiling_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:trusted_lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_trusted_lite",
+    deps = [
+        ":protos_perfetto_trace_trusted_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/ps:zero
+perfetto_proto_library(
+    name = "protos_perfetto_trace_ps_protos",
+    srcs = [
+        "protos/perfetto/trace/ps/process_stats.proto",
+        "protos/perfetto/trace/ps/process_tree.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:minimal_zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_minimal_zero",
+    deps = [
+        ":protos_perfetto_trace_minimal_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/filesystem:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_filesystem_zero",
+    deps = [
+        ":protos_perfetto_trace_filesystem_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/profiling:zero
+perfetto_proto_library(
+    name = "protos_perfetto_config_profiling_protos",
+    srcs = [
+        "protos/perfetto/config/profiling/heapprofd_config.proto",
+        "protos/perfetto/config/profiling/java_hprof_config.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/metrics/android:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_metrics_android_zero",
+    deps = [
+        ":protos_perfetto_metrics_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/power:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_power_protos",
+    srcs = [
+        "protos/perfetto/trace/power/battery_counters.proto",
+        "protos/perfetto/trace/power/power_rails.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/ipc:wire_protocol
+perfetto_cc_proto_library(
+    name = "protos_perfetto_ipc_wire_protocol",
+    deps = [
+        ":protos_perfetto_ipc_wire_protocol_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/android:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_android_protos",
+    srcs = [
+        "protos/perfetto/trace/android/android_log.proto",
+        "protos/perfetto/trace/android/graphics_frame_event.proto",
+        "protos/perfetto/trace/android/packages_list.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+    ],
+)
+
+# GN target: //src/perfetto_cmd:protos
+perfetto_proto_library(
+    name = "src_perfetto_cmd_protos_protos",
+    srcs = [
+        "src/perfetto_cmd/perfetto_cmd_state.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config:zero
+perfetto_proto_library(
+    name = "protos_perfetto_config_protos",
+    srcs = [
+        "protos/perfetto/config/chrome/chrome_config.proto",
+        "protos/perfetto/config/data_source_config.proto",
+        "protos/perfetto/config/test_config.proto",
+        "protos/perfetto/config/trace_config.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+        ":protos_perfetto_config_android_protos",
+        ":protos_perfetto_config_ftrace_protos",
+        ":protos_perfetto_config_gpu_protos",
+        ":protos_perfetto_config_inode_file_protos",
+        ":protos_perfetto_config_power_protos",
+        ":protos_perfetto_config_process_stats_protos",
+        ":protos_perfetto_config_profiling_protos",
+        ":protos_perfetto_config_sys_stats_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/profiling:lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_profiling_protos",
+    srcs = [
+        "protos/perfetto/trace/profiling/heap_graph.proto",
+        "protos/perfetto/trace/profiling/profile_common.proto",
+        "protos/perfetto/trace/profiling/profile_packet.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:trusted_lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_trusted_protos",
+    srcs = [
+        "protos/perfetto/trace/trusted_packet.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+        ":protos_perfetto_config_android_protos",
+        ":protos_perfetto_config_ftrace_protos",
+        ":protos_perfetto_config_gpu_protos",
+        ":protos_perfetto_config_inode_file_protos",
+        ":protos_perfetto_config_power_protos",
+        ":protos_perfetto_config_process_stats_protos",
+        ":protos_perfetto_config_profiling_protos",
+        ":protos_perfetto_config_protos",
+        ":protos_perfetto_config_sys_stats_protos",
+        ":protos_perfetto_trace_minimal_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/appended_data:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_appended_data_zero",
+    deps = [
+        ":protos_perfetto_trace_appended_data_protos",
+    ],
+)
+
+# GN target: //protos/third_party/pprof:lite
+perfetto_cc_proto_library(
+    name = "protos_third_party_pprof_lite",
+    deps = [
+        ":protos_third_party_pprof_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/ftrace:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_ftrace_zero",
+    deps = [
+        ":protos_perfetto_config_ftrace_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/android:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_android_lite",
+    deps = [
+        ":protos_perfetto_trace_android_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/profiling:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_config_profiling_lite",
+    deps = [
+        ":protos_perfetto_config_profiling_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_zero",
+    deps = [
+        ":protos_perfetto_config_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/ps:lite
+perfetto_cc_proto_library(
+    name = "protos_perfetto_trace_ps_lite",
+    deps = [
+        ":protos_perfetto_trace_ps_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace/track_event:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_trace_track_event_zero",
+    deps = [
+        ":protos_perfetto_trace_track_event_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/config/process_stats:zero
+perfetto_proto_library(
+    name = "protos_perfetto_config_process_stats_protos",
+    srcs = [
+        "protos/perfetto/config/process_stats/process_stats_config.proto",
+    ],
+)
+
+# GN target: //protos/perfetto/config/inode_file:zero
+perfetto_cc_protozero_library(
+    name = "protos_perfetto_config_inode_file_zero",
+    deps = [
+        ":protos_perfetto_config_inode_file_protos",
+    ],
+)
+
+# GN target: //protos/perfetto/trace:non_minimal_lite
+perfetto_proto_library(
+    name = "protos_perfetto_trace_non_minimal_protos",
+    srcs = [
+        "protos/perfetto/trace/test_event.proto",
+        "protos/perfetto/trace/trace.proto",
+        "protos/perfetto/trace/trace_packet.proto",
+        "protos/perfetto/trace/trace_packet_defaults.proto",
+    ],
+    deps = [
+        ":protos_perfetto_common_protos",
+        ":protos_perfetto_config_android_protos",
+        ":protos_perfetto_config_ftrace_protos",
+        ":protos_perfetto_config_gpu_protos",
+        ":protos_perfetto_config_inode_file_protos",
+        ":protos_perfetto_config_power_protos",
+        ":protos_perfetto_config_process_stats_protos",
+        ":protos_perfetto_config_profiling_protos",
+        ":protos_perfetto_config_protos",
+        ":protos_perfetto_config_sys_stats_protos",
+        ":protos_perfetto_trace_android_protos",
+        ":protos_perfetto_trace_appended_data_protos",
+        ":protos_perfetto_trace_chrome_protos",
+        ":protos_perfetto_trace_filesystem_protos",
+        ":protos_perfetto_trace_ftrace_protos",
+        ":protos_perfetto_trace_gpu_protos",
+        ":protos_perfetto_trace_interned_data_protos",
+        ":protos_perfetto_trace_minimal_protos",
+        ":protos_perfetto_trace_perfetto_protos",
+        ":protos_perfetto_trace_power_protos",
+        ":protos_perfetto_trace_profiling_protos",
+        ":protos_perfetto_trace_ps_protos",
+        ":protos_perfetto_trace_sys_stats_protos",
+        ":protos_perfetto_trace_track_event_protos",
+    ],
+)
+
+
+# ##############################################################################
+# Public targets
+# ##############################################################################
+
+# GN target: //src/perfetto_cmd:perfetto
+perfetto_cc_binary(
+    name = "perfetto",
+    srcs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_ipc_ipc",
+        ":include_perfetto_ext_traced_traced",
+        ":include_perfetto_ext_tracing_core_core",
+        ":include_perfetto_ext_tracing_ipc_ipc",
+        ":include_perfetto_protozero_protozero",
+        ":include_perfetto_tracing_core_core",
+        ":include_perfetto_tracing_tracing",
+        ":src_android_internal_headers",
+        ":src_android_internal_lazy_library_loader",
+        ":src_base_base",
+        ":src_base_unix_socket",
+        ":src_ipc_ipc",
+        ":src_perfetto_cmd_perfetto_cmd",
+        ":src_perfetto_cmd_trigger_producer",
+        ":src_protozero_protozero",
+        ":src_tracing_common",
+        ":src_tracing_ipc",
+        ":src_tracing_tracing",
+        "src/perfetto_cmd/main.cc",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":protos_perfetto_common_lite",
+        ":protos_perfetto_common_zero",
+        ":protos_perfetto_config_android_lite",
+        ":protos_perfetto_config_android_zero",
+        ":protos_perfetto_config_ftrace_lite",
+        ":protos_perfetto_config_ftrace_zero",
+        ":protos_perfetto_config_gpu_lite",
+        ":protos_perfetto_config_gpu_zero",
+        ":protos_perfetto_config_inode_file_lite",
+        ":protos_perfetto_config_inode_file_zero",
+        ":protos_perfetto_config_lite",
+        ":protos_perfetto_config_power_lite",
+        ":protos_perfetto_config_power_zero",
+        ":protos_perfetto_config_process_stats_lite",
+        ":protos_perfetto_config_process_stats_zero",
+        ":protos_perfetto_config_profiling_lite",
+        ":protos_perfetto_config_profiling_zero",
+        ":protos_perfetto_config_sys_stats_lite",
+        ":protos_perfetto_config_sys_stats_zero",
+        ":protos_perfetto_config_zero",
+        ":protos_perfetto_ipc_ipc",
+        ":protos_perfetto_ipc_wire_protocol",
+        ":protos_perfetto_trace_android_zero",
+        ":protos_perfetto_trace_appended_data_zero",
+        ":protos_perfetto_trace_chrome_zero",
+        ":protos_perfetto_trace_filesystem_zero",
+        ":protos_perfetto_trace_ftrace_zero",
+        ":protos_perfetto_trace_gpu_zero",
+        ":protos_perfetto_trace_interned_data_zero",
+        ":protos_perfetto_trace_minimal_lite",
+        ":protos_perfetto_trace_minimal_zero",
+        ":protos_perfetto_trace_non_minimal_zero",
+        ":protos_perfetto_trace_perfetto_zero",
+        ":protos_perfetto_trace_power_zero",
+        ":protos_perfetto_trace_profiling_zero",
+        ":protos_perfetto_trace_ps_zero",
+        ":protos_perfetto_trace_sys_stats_zero",
+        ":protos_perfetto_trace_track_event_zero",
+        ":protos_perfetto_trace_trusted_lite",
+        ":src_perfetto_cmd_protos",
+    ]
+    + PERFETTO_CONFIG.deps.zlib
+    + PERFETTO_CONFIG.deps.protobuf_lite,
+)
+
+# GN target: //src/trace_processor:trace_processor
+perfetto_cc_library(
+    name = "trace_processor",
+    srcs = [
+        ":src_base_base",
+        ":src_protozero_protozero",
+        ":src_trace_processor_common",
+        ":src_trace_processor_db_lib",
+        ":src_trace_processor_lib",
+        ":src_trace_processor_metrics_lib",
+        ":src_trace_processor_sqlite_sqlite",
+        ":src_trace_processor_tables_tables",
+    ],
+    hdrs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_traced_sys_stats_counters",
+        ":include_perfetto_protozero_protozero",
+        ":include_perfetto_trace_processor_trace_processor",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":protos_perfetto_common_zero",
+        ":protos_perfetto_config_android_zero",
+        ":protos_perfetto_config_ftrace_zero",
+        ":protos_perfetto_config_gpu_zero",
+        ":protos_perfetto_config_inode_file_zero",
+        ":protos_perfetto_config_power_zero",
+        ":protos_perfetto_config_process_stats_zero",
+        ":protos_perfetto_config_profiling_zero",
+        ":protos_perfetto_config_sys_stats_zero",
+        ":protos_perfetto_config_zero",
+        ":protos_perfetto_metrics_android_zero",
+        ":protos_perfetto_metrics_zero",
+        ":protos_perfetto_trace_android_zero",
+        ":protos_perfetto_trace_appended_data_zero",
+        ":protos_perfetto_trace_chrome_zero",
+        ":protos_perfetto_trace_filesystem_zero",
+        ":protos_perfetto_trace_ftrace_zero",
+        ":protos_perfetto_trace_gpu_zero",
+        ":protos_perfetto_trace_interned_data_zero",
+        ":protos_perfetto_trace_minimal_zero",
+        ":protos_perfetto_trace_non_minimal_zero",
+        ":protos_perfetto_trace_perfetto_zero",
+        ":protos_perfetto_trace_power_zero",
+        ":protos_perfetto_trace_processor_metrics_impl_zero",
+        ":protos_perfetto_trace_profiling_zero",
+        ":protos_perfetto_trace_ps_zero",
+        ":protos_perfetto_trace_sys_stats_zero",
+        ":protos_perfetto_trace_track_event_zero",
+    ]
+    + PERFETTO_CONFIG.deps.jsoncpp
+    + PERFETTO_CONFIG.deps.zlib
+    + PERFETTO_CONFIG.deps.sqlite
+    + PERFETTO_CONFIG.deps.sqlite_ext_percentile
+    + [ ":cc_merged_sql_metrics" ],
+)
+
+# GN target: //src/trace_processor:trace_processor_shell
+perfetto_cc_binary(
+    name = "trace_processor_shell",
+    srcs = [
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_traced_sys_stats_counters",
+        ":include_perfetto_protozero_protozero",
+        ":include_perfetto_trace_processor_trace_processor",
+        ":src_base_base",
+        ":src_protozero_protozero",
+        ":src_trace_processor_common",
+        ":src_trace_processor_db_lib",
+        ":src_trace_processor_lib",
+        ":src_trace_processor_metrics_lib",
+        ":src_trace_processor_sqlite_sqlite",
+        ":src_trace_processor_tables_tables",
+        "src/trace_processor/proto_to_json.cc",
+        "src/trace_processor/proto_to_json.h",
+        "src/trace_processor/trace_processor_shell.cc",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":protos_perfetto_common_zero",
+        ":protos_perfetto_config_android_zero",
+        ":protos_perfetto_config_ftrace_zero",
+        ":protos_perfetto_config_gpu_zero",
+        ":protos_perfetto_config_inode_file_zero",
+        ":protos_perfetto_config_power_zero",
+        ":protos_perfetto_config_process_stats_zero",
+        ":protos_perfetto_config_profiling_zero",
+        ":protos_perfetto_config_sys_stats_zero",
+        ":protos_perfetto_config_zero",
+        ":protos_perfetto_metrics_android_zero",
+        ":protos_perfetto_metrics_zero",
+        ":protos_perfetto_trace_android_zero",
+        ":protos_perfetto_trace_appended_data_zero",
+        ":protos_perfetto_trace_chrome_zero",
+        ":protos_perfetto_trace_filesystem_zero",
+        ":protos_perfetto_trace_ftrace_zero",
+        ":protos_perfetto_trace_gpu_zero",
+        ":protos_perfetto_trace_interned_data_zero",
+        ":protos_perfetto_trace_minimal_zero",
+        ":protos_perfetto_trace_non_minimal_zero",
+        ":protos_perfetto_trace_perfetto_zero",
+        ":protos_perfetto_trace_power_zero",
+        ":protos_perfetto_trace_processor_metrics_impl_zero",
+        ":protos_perfetto_trace_profiling_zero",
+        ":protos_perfetto_trace_ps_zero",
+        ":protos_perfetto_trace_sys_stats_zero",
+        ":protos_perfetto_trace_track_event_zero",
+    ]
+    + PERFETTO_CONFIG.deps.protoc_lib
+    + PERFETTO_CONFIG.deps.linenoise
+    + PERFETTO_CONFIG.deps.jsoncpp
+    + PERFETTO_CONFIG.deps.zlib
+    + PERFETTO_CONFIG.deps.sqlite
+    + PERFETTO_CONFIG.deps.sqlite_ext_percentile
+    + [ ":cc_merged_sql_metrics" ],
+)
+
+# GN target: //src/traced/probes:traced_probes
+perfetto_cc_binary(
+    name = "traced_probes",
+    srcs = [
+        ":include_perfetto_ext_traced_traced",
+        "src/traced/probes/main.cc",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":libperfetto",
+    ],
+)
+
+# GN target: //src/traced/service:traced
+perfetto_cc_binary(
+    name = "traced",
+    srcs = [
+        ":include_perfetto_ext_traced_traced",
+        "src/traced/service/main.cc",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":libperfetto",
     ],
 )
 
 # GN target: //tools/trace_to_text:libpprofbuilder
-cc_library(
+perfetto_cc_library(
     name = "libpprofbuilder",
     srcs = [
-        "src/base/event_fd.cc",
-        "src/base/file_utils.cc",
-        "src/base/metatrace.cc",
-        "src/base/paged_memory.cc",
-        "src/base/pipe.cc",
-        "src/base/string_splitter.cc",
-        "src/base/string_utils.cc",
-        "src/base/string_view.cc",
-        "src/base/temp_file.cc",
-        "src/base/thread_checker.cc",
-        "src/base/thread_task_runner.cc",
-        "src/base/time.cc",
-        "src/base/unix_task_runner.cc",
-        "src/base/uuid.cc",
-        "src/base/virtual_destructors.cc",
-        "src/base/waitable_event.cc",
-        "src/base/watchdog_posix.cc",
-        "src/protozero/message.cc",
-        "src/protozero/message_handle.cc",
-        "src/protozero/proto_decoder.cc",
-        "src/protozero/scattered_heap_buffer.cc",
-        "src/protozero/scattered_stream_null_delegate.cc",
-        "src/protozero/scattered_stream_writer.cc",
-        "tools/trace_to_text/pprof_builder.cc",
-        "tools/trace_to_text/profile_visitor.cc",
-        "tools/trace_to_text/profile_visitor.h",
-        "tools/trace_to_text/symbolizer.cc",
-        "tools/trace_to_text/trace_symbol_table.cc",
-        "tools/trace_to_text/trace_symbol_table.h",
-        "tools/trace_to_text/utils.cc",
-        "tools/trace_to_text/utils.h",
+        ":src_base_base",
+        ":tools_trace_to_text_pprofbuilder",
+        ":tools_trace_to_text_symbolizer",
+        ":tools_trace_to_text_utils",
     ],
     hdrs = [
-        "include/perfetto/base/build_config.h",
-        "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
-        "include/perfetto/base/compiler.h",
-        "include/perfetto/base/copyable_ptr.h",
-        "include/perfetto/base/export.h",
-        "include/perfetto/base/logging.h",
-        "include/perfetto/base/task_runner.h",
-        "include/perfetto/base/time.h",
-        "include/perfetto/ext/base/circular_queue.h",
-        "include/perfetto/ext/base/container_annotations.h",
-        "include/perfetto/ext/base/event_fd.h",
-        "include/perfetto/ext/base/file_utils.h",
-        "include/perfetto/ext/base/hash.h",
-        "include/perfetto/ext/base/lookup_set.h",
-        "include/perfetto/ext/base/metatrace.h",
-        "include/perfetto/ext/base/metatrace_events.h",
-        "include/perfetto/ext/base/no_destructor.h",
-        "include/perfetto/ext/base/optional.h",
-        "include/perfetto/ext/base/paged_memory.h",
-        "include/perfetto/ext/base/pipe.h",
-        "include/perfetto/ext/base/proc_utils.h",
-        "include/perfetto/ext/base/scoped_file.h",
-        "include/perfetto/ext/base/small_set.h",
-        "include/perfetto/ext/base/string_splitter.h",
-        "include/perfetto/ext/base/string_utils.h",
-        "include/perfetto/ext/base/string_view.h",
-        "include/perfetto/ext/base/string_writer.h",
-        "include/perfetto/ext/base/temp_file.h",
-        "include/perfetto/ext/base/thread_annotations.h",
-        "include/perfetto/ext/base/thread_checker.h",
-        "include/perfetto/ext/base/thread_task_runner.h",
-        "include/perfetto/ext/base/thread_utils.h",
-        "include/perfetto/ext/base/unix_socket.h",
-        "include/perfetto/ext/base/unix_task_runner.h",
-        "include/perfetto/ext/base/utils.h",
-        "include/perfetto/ext/base/uuid.h",
-        "include/perfetto/ext/base/waitable_event.h",
-        "include/perfetto/ext/base/watchdog.h",
-        "include/perfetto/ext/base/watchdog_noop.h",
-        "include/perfetto/ext/base/watchdog_posix.h",
-        "include/perfetto/ext/base/weak_ptr.h",
-        "include/perfetto/ext/traced/sys_stats_counters.h",
-        "include/perfetto/protozero/contiguous_memory_range.h",
-        "include/perfetto/protozero/field.h",
-        "include/perfetto/protozero/message.h",
-        "include/perfetto/protozero/message_handle.h",
-        "include/perfetto/protozero/packed_repeated_fields.h",
-        "include/perfetto/protozero/proto_decoder.h",
-        "include/perfetto/protozero/proto_utils.h",
-        "include/perfetto/protozero/scattered_heap_buffer.h",
-        "include/perfetto/protozero/scattered_stream_null_delegate.h",
-        "include/perfetto/protozero/scattered_stream_writer.h",
-        "tools/trace_to_text/pprof_builder.h",
-        "tools/trace_to_text/symbolizer.h",
+        ":include_perfetto_base_base",
+        ":include_perfetto_ext_base_base",
+        ":include_perfetto_ext_traced_sys_stats_counters",
+        ":include_perfetto_protozero_protozero",
+    ],
+    visibility = [
+        "//visibility:public",
     ],
     deps = [
-        "//third_party/perfetto/protos:common_cc_proto",
-        "//third_party/perfetto/protos:common_zero_cc_proto",
-        "//third_party/perfetto/protos:config_android_cc_proto",
-        "//third_party/perfetto/protos:config_android_zero_cc_proto",
-        "//third_party/perfetto/protos:config_cc_proto",
-        "//third_party/perfetto/protos:config_ftrace_cc_proto",
-        "//third_party/perfetto/protos:config_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:config_gpu_cc_proto",
-        "//third_party/perfetto/protos:config_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:config_inode_file_cc_proto",
-        "//third_party/perfetto/protos:config_inode_file_zero_cc_proto",
-        "//third_party/perfetto/protos:config_power_cc_proto",
-        "//third_party/perfetto/protos:config_power_zero_cc_proto",
-        "//third_party/perfetto/protos:config_process_stats_cc_proto",
-        "//third_party/perfetto/protos:config_process_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_profiling_cc_proto",
-        "//third_party/perfetto/protos:config_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:config_sys_stats_cc_proto",
-        "//third_party/perfetto/protos:config_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_zero_cc_proto",
-        "//third_party/perfetto/protos:protos_third_party_pprof_cc_proto",
-        "//third_party/perfetto/protos:trace_android_cc_proto",
-        "//third_party/perfetto/protos:trace_android_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_appended_data_cc_proto",
-        "//third_party/perfetto/protos:trace_appended_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_chrome_cc_proto",
-        "//third_party/perfetto/protos:trace_chrome_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_filesystem_cc_proto",
-        "//third_party/perfetto/protos:trace_filesystem_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ftrace_cc_proto",
-        "//third_party/perfetto/protos:trace_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_gpu_cc_proto",
-        "//third_party/perfetto/protos:trace_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_interned_data_cc_proto",
-        "//third_party/perfetto/protos:trace_interned_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_minimal_cc_proto",
-        "//third_party/perfetto/protos:trace_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_non_minimal_cc_proto",
-        "//third_party/perfetto/protos:trace_non_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_perfetto_cc_proto",
-        "//third_party/perfetto/protos:trace_perfetto_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_power_cc_proto",
-        "//third_party/perfetto/protos:trace_power_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_profiling_cc_proto",
-        "//third_party/perfetto/protos:trace_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ps_cc_proto",
-        "//third_party/perfetto/protos:trace_ps_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_sys_stats_cc_proto",
-        "//third_party/perfetto/protos:trace_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_track_event_cc_proto",
-        "//third_party/perfetto/protos:trace_track_event_zero_cc_proto",
+        ":protos_perfetto_common_lite",
+        ":protos_perfetto_common_zero",
+        ":protos_perfetto_config_android_lite",
+        ":protos_perfetto_config_android_zero",
+        ":protos_perfetto_config_ftrace_lite",
+        ":protos_perfetto_config_ftrace_zero",
+        ":protos_perfetto_config_gpu_lite",
+        ":protos_perfetto_config_gpu_zero",
+        ":protos_perfetto_config_inode_file_lite",
+        ":protos_perfetto_config_inode_file_zero",
+        ":protos_perfetto_config_lite",
+        ":protos_perfetto_config_power_lite",
+        ":protos_perfetto_config_power_zero",
+        ":protos_perfetto_config_process_stats_lite",
+        ":protos_perfetto_config_process_stats_zero",
+        ":protos_perfetto_config_profiling_lite",
+        ":protos_perfetto_config_profiling_zero",
+        ":protos_perfetto_config_sys_stats_lite",
+        ":protos_perfetto_config_sys_stats_zero",
+        ":protos_perfetto_config_zero",
+        ":protos_perfetto_trace_android_lite",
+        ":protos_perfetto_trace_android_zero",
+        ":protos_perfetto_trace_appended_data_lite",
+        ":protos_perfetto_trace_appended_data_zero",
+        ":protos_perfetto_trace_chrome_lite",
+        ":protos_perfetto_trace_chrome_zero",
+        ":protos_perfetto_trace_filesystem_lite",
+        ":protos_perfetto_trace_filesystem_zero",
+        ":protos_perfetto_trace_ftrace_lite",
+        ":protos_perfetto_trace_ftrace_zero",
+        ":protos_perfetto_trace_gpu_lite",
+        ":protos_perfetto_trace_gpu_zero",
+        ":protos_perfetto_trace_interned_data_lite",
+        ":protos_perfetto_trace_interned_data_zero",
+        ":protos_perfetto_trace_minimal_lite",
+        ":protos_perfetto_trace_minimal_zero",
+        ":protos_perfetto_trace_non_minimal_lite",
+        ":protos_perfetto_trace_non_minimal_zero",
+        ":protos_perfetto_trace_perfetto_lite",
+        ":protos_perfetto_trace_perfetto_zero",
+        ":protos_perfetto_trace_power_lite",
+        ":protos_perfetto_trace_power_zero",
+        ":protos_perfetto_trace_profiling_lite",
+        ":protos_perfetto_trace_profiling_zero",
+        ":protos_perfetto_trace_ps_lite",
+        ":protos_perfetto_trace_ps_zero",
+        ":protos_perfetto_trace_sys_stats_lite",
+        ":protos_perfetto_trace_sys_stats_zero",
+        ":protos_perfetto_trace_track_event_lite",
+        ":protos_perfetto_trace_track_event_zero",
+        ":protos_third_party_pprof_lite",
     ],
 )
 
-# GN target: //src/protozero:libprotozero
+# Content from BUILD.extras
+
+build_config_dir_ = "include/perfetto/base/build_configs/bazel"
+
+# Deliberately NOT a perfetto_cc_library, to avoid cyclic deps.
+# This is pulled as a default dep by all targets.
 cc_library(
-    name = "libprotozero",
-    srcs = [
-        "src/protozero/message.cc",
-        "src/protozero/message_handle.cc",
-        "src/protozero/proto_decoder.cc",
-        "src/protozero/scattered_heap_buffer.cc",
-        "src/protozero/scattered_stream_null_delegate.cc",
-        "src/protozero/scattered_stream_writer.cc",
-    ],
-    hdrs = [
-        "include/perfetto/base/build_config.h",
-        "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
-        "include/perfetto/base/compiler.h",
-        "include/perfetto/base/copyable_ptr.h",
-        "include/perfetto/base/export.h",
-        "include/perfetto/base/logging.h",
-        "include/perfetto/base/task_runner.h",
-        "include/perfetto/base/time.h",
-        "include/perfetto/ext/base/circular_queue.h",
-        "include/perfetto/ext/base/container_annotations.h",
-        "include/perfetto/ext/base/event_fd.h",
-        "include/perfetto/ext/base/file_utils.h",
-        "include/perfetto/ext/base/hash.h",
-        "include/perfetto/ext/base/lookup_set.h",
-        "include/perfetto/ext/base/metatrace.h",
-        "include/perfetto/ext/base/metatrace_events.h",
-        "include/perfetto/ext/base/no_destructor.h",
-        "include/perfetto/ext/base/optional.h",
-        "include/perfetto/ext/base/paged_memory.h",
-        "include/perfetto/ext/base/pipe.h",
-        "include/perfetto/ext/base/proc_utils.h",
-        "include/perfetto/ext/base/scoped_file.h",
-        "include/perfetto/ext/base/small_set.h",
-        "include/perfetto/ext/base/string_splitter.h",
-        "include/perfetto/ext/base/string_utils.h",
-        "include/perfetto/ext/base/string_view.h",
-        "include/perfetto/ext/base/string_writer.h",
-        "include/perfetto/ext/base/temp_file.h",
-        "include/perfetto/ext/base/thread_annotations.h",
-        "include/perfetto/ext/base/thread_checker.h",
-        "include/perfetto/ext/base/thread_task_runner.h",
-        "include/perfetto/ext/base/thread_utils.h",
-        "include/perfetto/ext/base/unix_socket.h",
-        "include/perfetto/ext/base/unix_task_runner.h",
-        "include/perfetto/ext/base/utils.h",
-        "include/perfetto/ext/base/uuid.h",
-        "include/perfetto/ext/base/waitable_event.h",
-        "include/perfetto/ext/base/watchdog.h",
-        "include/perfetto/ext/base/watchdog_noop.h",
-        "include/perfetto/ext/base/watchdog_posix.h",
-        "include/perfetto/ext/base/weak_ptr.h",
-        "include/perfetto/protozero/contiguous_memory_range.h",
-        "include/perfetto/protozero/field.h",
-        "include/perfetto/protozero/message.h",
-        "include/perfetto/protozero/message_handle.h",
-        "include/perfetto/protozero/packed_repeated_fields.h",
-        "include/perfetto/protozero/proto_decoder.h",
-        "include/perfetto/protozero/proto_utils.h",
-        "include/perfetto/protozero/scattered_heap_buffer.h",
-        "include/perfetto/protozero/scattered_stream_null_delegate.h",
-        "include/perfetto/protozero/scattered_stream_writer.h",
-    ],
+    name = "build_config_hdr",
+    hdrs = [build_config_dir_ + "/perfetto_build_flags.h"],
+    includes = [build_config_dir_],
 )
 
-# GN target: //src/protozero/protoc_plugin:protozero_plugin
-cc_binary(
-    name = "src_protozero_protoc_plugin_protozero_plugin",
-    srcs = [
-        "include/perfetto/base/build_config.h",
-        "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
-        "include/perfetto/base/compiler.h",
-        "include/perfetto/base/copyable_ptr.h",
-        "include/perfetto/base/export.h",
-        "include/perfetto/base/logging.h",
-        "include/perfetto/base/task_runner.h",
-        "include/perfetto/base/time.h",
-        "include/perfetto/ext/base/circular_queue.h",
-        "include/perfetto/ext/base/container_annotations.h",
-        "include/perfetto/ext/base/event_fd.h",
-        "include/perfetto/ext/base/file_utils.h",
-        "include/perfetto/ext/base/hash.h",
-        "include/perfetto/ext/base/lookup_set.h",
-        "include/perfetto/ext/base/metatrace.h",
-        "include/perfetto/ext/base/metatrace_events.h",
-        "include/perfetto/ext/base/no_destructor.h",
-        "include/perfetto/ext/base/optional.h",
-        "include/perfetto/ext/base/paged_memory.h",
-        "include/perfetto/ext/base/pipe.h",
-        "include/perfetto/ext/base/proc_utils.h",
-        "include/perfetto/ext/base/scoped_file.h",
-        "include/perfetto/ext/base/small_set.h",
-        "include/perfetto/ext/base/string_splitter.h",
-        "include/perfetto/ext/base/string_utils.h",
-        "include/perfetto/ext/base/string_view.h",
-        "include/perfetto/ext/base/string_writer.h",
-        "include/perfetto/ext/base/temp_file.h",
-        "include/perfetto/ext/base/thread_annotations.h",
-        "include/perfetto/ext/base/thread_checker.h",
-        "include/perfetto/ext/base/thread_task_runner.h",
-        "include/perfetto/ext/base/thread_utils.h",
-        "include/perfetto/ext/base/unix_socket.h",
-        "include/perfetto/ext/base/unix_task_runner.h",
-        "include/perfetto/ext/base/utils.h",
-        "include/perfetto/ext/base/uuid.h",
-        "include/perfetto/ext/base/waitable_event.h",
-        "include/perfetto/ext/base/watchdog.h",
-        "include/perfetto/ext/base/watchdog_noop.h",
-        "include/perfetto/ext/base/watchdog_posix.h",
-        "include/perfetto/ext/base/weak_ptr.h",
-        "src/base/event_fd.cc",
-        "src/base/file_utils.cc",
-        "src/base/metatrace.cc",
-        "src/base/paged_memory.cc",
-        "src/base/pipe.cc",
-        "src/base/string_splitter.cc",
-        "src/base/string_utils.cc",
-        "src/base/string_view.cc",
-        "src/base/temp_file.cc",
-        "src/base/thread_checker.cc",
-        "src/base/thread_task_runner.cc",
-        "src/base/time.cc",
-        "src/base/unix_task_runner.cc",
-        "src/base/uuid.cc",
-        "src/base/virtual_destructors.cc",
-        "src/base/waitable_event.cc",
-        "src/base/watchdog_posix.cc",
-        "src/protozero/protoc_plugin/protozero_plugin.cc",
-    ],
-    deps = [
-        "//third_party/protobuf:libprotoc_legacy",
-        "//third_party/protobuf:protobuf_legacy",
-    ],
+perfetto_cc_library(
+    name = "cc_merged_sql_metrics",
+    hdrs = ["src/trace_processor/metrics/sql_metrics.h"],
 )
 
-# GN target: //src/trace_processor:trace_processor
-cc_library(
-    name = "trace_processor",
-    srcs = [
-        "src/base/event_fd.cc",
-        "src/base/file_utils.cc",
-        "src/base/metatrace.cc",
-        "src/base/paged_memory.cc",
-        "src/base/pipe.cc",
-        "src/base/string_splitter.cc",
-        "src/base/string_utils.cc",
-        "src/base/string_view.cc",
-        "src/base/temp_file.cc",
-        "src/base/thread_checker.cc",
-        "src/base/thread_task_runner.cc",
-        "src/base/time.cc",
-        "src/base/unix_task_runner.cc",
-        "src/base/uuid.cc",
-        "src/base/virtual_destructors.cc",
-        "src/base/waitable_event.cc",
-        "src/base/watchdog_posix.cc",
-        "src/protozero/message.cc",
-        "src/protozero/message_handle.cc",
-        "src/protozero/proto_decoder.cc",
-        "src/protozero/scattered_heap_buffer.cc",
-        "src/protozero/scattered_stream_null_delegate.cc",
-        "src/protozero/scattered_stream_writer.cc",
-        "src/trace_processor/android_logs_table.cc",
-        "src/trace_processor/android_logs_table.h",
-        "src/trace_processor/args_table.cc",
-        "src/trace_processor/args_table.h",
-        "src/trace_processor/args_tracker.cc",
-        "src/trace_processor/args_tracker.h",
-        "src/trace_processor/chunked_trace_reader.h",
-        "src/trace_processor/clock_tracker.cc",
-        "src/trace_processor/clock_tracker.h",
-        "src/trace_processor/counter_definitions_table.cc",
-        "src/trace_processor/counter_definitions_table.h",
-        "src/trace_processor/counter_values_table.cc",
-        "src/trace_processor/counter_values_table.h",
-        "src/trace_processor/cpu_profile_stack_sample_table.cc",
-        "src/trace_processor/cpu_profile_stack_sample_table.h",
-        "src/trace_processor/db/bit_vector.cc",
-        "src/trace_processor/db/bit_vector.h",
-        "src/trace_processor/db/column.cc",
-        "src/trace_processor/db/column.h",
-        "src/trace_processor/db/row_map.cc",
-        "src/trace_processor/db/row_map.h",
-        "src/trace_processor/db/sparse_vector.h",
-        "src/trace_processor/db/table.cc",
-        "src/trace_processor/db/table.h",
-        "src/trace_processor/db/typed_column.h",
-        "src/trace_processor/event_tracker.cc",
-        "src/trace_processor/event_tracker.h",
-        "src/trace_processor/export_json.cc",
-        "src/trace_processor/export_json.h",
-        "src/trace_processor/filtered_row_index.cc",
-        "src/trace_processor/filtered_row_index.h",
-        "src/trace_processor/forwarding_trace_parser.cc",
-        "src/trace_processor/forwarding_trace_parser.h",
-        "src/trace_processor/ftrace_descriptors.cc",
-        "src/trace_processor/ftrace_descriptors.h",
-        "src/trace_processor/ftrace_utils.cc",
-        "src/trace_processor/ftrace_utils.h",
-        "src/trace_processor/fuchsia_provider_view.cc",
-        "src/trace_processor/fuchsia_provider_view.h",
-        "src/trace_processor/fuchsia_trace_parser.cc",
-        "src/trace_processor/fuchsia_trace_parser.h",
-        "src/trace_processor/fuchsia_trace_tokenizer.cc",
-        "src/trace_processor/fuchsia_trace_tokenizer.h",
-        "src/trace_processor/fuchsia_trace_utils.cc",
-        "src/trace_processor/fuchsia_trace_utils.h",
-        "src/trace_processor/graphics_frame_event_parser.cc",
-        "src/trace_processor/graphics_frame_event_parser.h",
-        "src/trace_processor/gzip_trace_parser.cc",
-        "src/trace_processor/gzip_trace_parser.h",
-        "src/trace_processor/heap_profile_allocation_table.cc",
-        "src/trace_processor/heap_profile_allocation_table.h",
-        "src/trace_processor/heap_profile_tracker.cc",
-        "src/trace_processor/heap_profile_tracker.h",
-        "src/trace_processor/instants_table.cc",
-        "src/trace_processor/instants_table.h",
-        "src/trace_processor/json_trace_parser.cc",
-        "src/trace_processor/json_trace_parser.h",
-        "src/trace_processor/json_trace_tokenizer.cc",
-        "src/trace_processor/json_trace_tokenizer.h",
-        "src/trace_processor/json_trace_utils.cc",
-        "src/trace_processor/json_trace_utils.h",
-        "src/trace_processor/metadata.h",
-        "src/trace_processor/metadata_table.cc",
-        "src/trace_processor/metadata_table.h",
-        "src/trace_processor/metrics/descriptors.cc",
-        "src/trace_processor/metrics/descriptors.h",
-        "src/trace_processor/metrics/metrics.cc",
-        "src/trace_processor/metrics/metrics.descriptor.h",
-        "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",
-        "src/trace_processor/process_tracker.cc",
-        "src/trace_processor/process_tracker.h",
-        "src/trace_processor/proto_incremental_state.h",
-        "src/trace_processor/proto_trace_parser.cc",
-        "src/trace_processor/proto_trace_parser.h",
-        "src/trace_processor/proto_trace_tokenizer.cc",
-        "src/trace_processor/proto_trace_tokenizer.h",
-        "src/trace_processor/raw_table.cc",
-        "src/trace_processor/raw_table.h",
-        "src/trace_processor/row_iterators.cc",
-        "src/trace_processor/row_iterators.h",
-        "src/trace_processor/sched_slice_table.cc",
-        "src/trace_processor/sched_slice_table.h",
-        "src/trace_processor/slice_table.cc",
-        "src/trace_processor/slice_table.h",
-        "src/trace_processor/slice_tracker.cc",
-        "src/trace_processor/slice_tracker.h",
-        "src/trace_processor/span_join_operator_table.cc",
-        "src/trace_processor/span_join_operator_table.h",
-        "src/trace_processor/sql_stats_table.cc",
-        "src/trace_processor/sql_stats_table.h",
-        "src/trace_processor/sqlite/db_sqlite_table.cc",
-        "src/trace_processor/sqlite/db_sqlite_table.h",
-        "src/trace_processor/sqlite/query_constraints.cc",
-        "src/trace_processor/sqlite/query_constraints.h",
-        "src/trace_processor/sqlite/scoped_db.h",
-        "src/trace_processor/sqlite/sqlite3_str_split.cc",
-        "src/trace_processor/sqlite/sqlite3_str_split.h",
-        "src/trace_processor/sqlite/sqlite_table.cc",
-        "src/trace_processor/sqlite/sqlite_table.h",
-        "src/trace_processor/sqlite/sqlite_utils.h",
-        "src/trace_processor/stack_profile_callsite_table.cc",
-        "src/trace_processor/stack_profile_callsite_table.h",
-        "src/trace_processor/stack_profile_frame_table.cc",
-        "src/trace_processor/stack_profile_frame_table.h",
-        "src/trace_processor/stack_profile_mapping_table.cc",
-        "src/trace_processor/stack_profile_mapping_table.h",
-        "src/trace_processor/stack_profile_tracker.cc",
-        "src/trace_processor/stack_profile_tracker.h",
-        "src/trace_processor/stats.h",
-        "src/trace_processor/stats_table.cc",
-        "src/trace_processor/stats_table.h",
-        "src/trace_processor/storage_columns.cc",
-        "src/trace_processor/storage_columns.h",
-        "src/trace_processor/storage_schema.cc",
-        "src/trace_processor/storage_schema.h",
-        "src/trace_processor/storage_table.cc",
-        "src/trace_processor/storage_table.h",
-        "src/trace_processor/string_pool.cc",
-        "src/trace_processor/string_pool.h",
-        "src/trace_processor/syscall_tracker.cc",
-        "src/trace_processor/syscall_tracker.h",
-        "src/trace_processor/syscalls_aarch32.h",
-        "src/trace_processor/syscalls_aarch64.h",
-        "src/trace_processor/syscalls_armeabi.h",
-        "src/trace_processor/syscalls_x86_64.h",
-        "src/trace_processor/systrace_parser.cc",
-        "src/trace_processor/systrace_parser.h",
-        "src/trace_processor/systrace_trace_parser.cc",
-        "src/trace_processor/systrace_trace_parser.h",
-        "src/trace_processor/tables/macros.h",
-        "src/trace_processor/tables/macros_internal.h",
-        "src/trace_processor/tables/slice_tables.h",
-        "src/trace_processor/tables/track_tables.h",
-        "src/trace_processor/thread_table.cc",
-        "src/trace_processor/thread_table.h",
-        "src/trace_processor/trace_blob_view.h",
-        "src/trace_processor/trace_parser.h",
-        "src/trace_processor/trace_processor.cc",
-        "src/trace_processor/trace_processor_context.cc",
-        "src/trace_processor/trace_processor_context.h",
-        "src/trace_processor/trace_processor_impl.cc",
-        "src/trace_processor/trace_processor_impl.h",
-        "src/trace_processor/trace_sorter.cc",
-        "src/trace_processor/trace_sorter.h",
-        "src/trace_processor/trace_storage.cc",
-        "src/trace_processor/trace_storage.h",
-        "src/trace_processor/variadic.h",
-        "src/trace_processor/virtual_destructors.cc",
-        "src/trace_processor/virtual_track_tracker.cc",
-        "src/trace_processor/virtual_track_tracker.h",
-        "src/trace_processor/window_operator_table.cc",
-        "src/trace_processor/window_operator_table.h",
-    ],
-    hdrs = [
-        "include/perfetto/base/build_config.h",
-        "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
-        "include/perfetto/base/compiler.h",
-        "include/perfetto/base/copyable_ptr.h",
-        "include/perfetto/base/export.h",
-        "include/perfetto/base/logging.h",
-        "include/perfetto/base/task_runner.h",
-        "include/perfetto/base/time.h",
-        "include/perfetto/ext/base/circular_queue.h",
-        "include/perfetto/ext/base/container_annotations.h",
-        "include/perfetto/ext/base/event_fd.h",
-        "include/perfetto/ext/base/file_utils.h",
-        "include/perfetto/ext/base/hash.h",
-        "include/perfetto/ext/base/lookup_set.h",
-        "include/perfetto/ext/base/metatrace.h",
-        "include/perfetto/ext/base/metatrace_events.h",
-        "include/perfetto/ext/base/no_destructor.h",
-        "include/perfetto/ext/base/optional.h",
-        "include/perfetto/ext/base/paged_memory.h",
-        "include/perfetto/ext/base/pipe.h",
-        "include/perfetto/ext/base/proc_utils.h",
-        "include/perfetto/ext/base/scoped_file.h",
-        "include/perfetto/ext/base/small_set.h",
-        "include/perfetto/ext/base/string_splitter.h",
-        "include/perfetto/ext/base/string_utils.h",
-        "include/perfetto/ext/base/string_view.h",
-        "include/perfetto/ext/base/string_writer.h",
-        "include/perfetto/ext/base/temp_file.h",
-        "include/perfetto/ext/base/thread_annotations.h",
-        "include/perfetto/ext/base/thread_checker.h",
-        "include/perfetto/ext/base/thread_task_runner.h",
-        "include/perfetto/ext/base/thread_utils.h",
-        "include/perfetto/ext/base/unix_socket.h",
-        "include/perfetto/ext/base/unix_task_runner.h",
-        "include/perfetto/ext/base/utils.h",
-        "include/perfetto/ext/base/uuid.h",
-        "include/perfetto/ext/base/waitable_event.h",
-        "include/perfetto/ext/base/watchdog.h",
-        "include/perfetto/ext/base/watchdog_noop.h",
-        "include/perfetto/ext/base/watchdog_posix.h",
-        "include/perfetto/ext/base/weak_ptr.h",
-        "include/perfetto/ext/traced/sys_stats_counters.h",
-        "include/perfetto/protozero/contiguous_memory_range.h",
-        "include/perfetto/protozero/field.h",
-        "include/perfetto/protozero/message.h",
-        "include/perfetto/protozero/message_handle.h",
-        "include/perfetto/protozero/packed_repeated_fields.h",
-        "include/perfetto/protozero/proto_decoder.h",
-        "include/perfetto/protozero/proto_utils.h",
-        "include/perfetto/protozero/scattered_heap_buffer.h",
-        "include/perfetto/protozero/scattered_stream_null_delegate.h",
-        "include/perfetto/protozero/scattered_stream_writer.h",
-        "include/perfetto/trace_processor/basic_types.h",
-        "include/perfetto/trace_processor/status.h",
-        "include/perfetto/trace_processor/trace_processor.h",
-    ],
-    deps = [
-        "//third_party/perfetto:gen_merged_sql_metrics",
-        "//third_party/perfetto/google:jsoncpp",
-        "//third_party/perfetto/protos:common_zero_cc_proto",
-        "//third_party/perfetto/protos:config_android_zero_cc_proto",
-        "//third_party/perfetto/protos:config_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:config_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:config_inode_file_zero_cc_proto",
-        "//third_party/perfetto/protos:config_power_zero_cc_proto",
-        "//third_party/perfetto/protos:config_process_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:config_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_zero_cc_proto",
-        "//third_party/perfetto/protos:metrics_android_zero_cc_proto",
-        "//third_party/perfetto/protos:metrics_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_android_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_appended_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_chrome_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_filesystem_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_interned_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_non_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_perfetto_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_power_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_processor_metrics_impl_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ps_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_track_event_zero_cc_proto",
-        "//third_party/sqlite",
-        "//third_party/sqlite:sqlite_ext_percentile",
-        "//third_party/zlib:zlibsystem",
-    ],
-)
-
-# GN target: //src/trace_processor:trace_processor_shell
-cc_binary(
-    name = "trace_processor_shell",
-    srcs = [
-        "include/perfetto/base/build_config.h",
-        "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
-        "include/perfetto/base/compiler.h",
-        "include/perfetto/base/copyable_ptr.h",
-        "include/perfetto/base/export.h",
-        "include/perfetto/base/logging.h",
-        "include/perfetto/base/task_runner.h",
-        "include/perfetto/base/time.h",
-        "include/perfetto/ext/base/circular_queue.h",
-        "include/perfetto/ext/base/container_annotations.h",
-        "include/perfetto/ext/base/event_fd.h",
-        "include/perfetto/ext/base/file_utils.h",
-        "include/perfetto/ext/base/hash.h",
-        "include/perfetto/ext/base/lookup_set.h",
-        "include/perfetto/ext/base/metatrace.h",
-        "include/perfetto/ext/base/metatrace_events.h",
-        "include/perfetto/ext/base/no_destructor.h",
-        "include/perfetto/ext/base/optional.h",
-        "include/perfetto/ext/base/paged_memory.h",
-        "include/perfetto/ext/base/pipe.h",
-        "include/perfetto/ext/base/proc_utils.h",
-        "include/perfetto/ext/base/scoped_file.h",
-        "include/perfetto/ext/base/small_set.h",
-        "include/perfetto/ext/base/string_splitter.h",
-        "include/perfetto/ext/base/string_utils.h",
-        "include/perfetto/ext/base/string_view.h",
-        "include/perfetto/ext/base/string_writer.h",
-        "include/perfetto/ext/base/temp_file.h",
-        "include/perfetto/ext/base/thread_annotations.h",
-        "include/perfetto/ext/base/thread_checker.h",
-        "include/perfetto/ext/base/thread_task_runner.h",
-        "include/perfetto/ext/base/thread_utils.h",
-        "include/perfetto/ext/base/unix_socket.h",
-        "include/perfetto/ext/base/unix_task_runner.h",
-        "include/perfetto/ext/base/utils.h",
-        "include/perfetto/ext/base/uuid.h",
-        "include/perfetto/ext/base/waitable_event.h",
-        "include/perfetto/ext/base/watchdog.h",
-        "include/perfetto/ext/base/watchdog_noop.h",
-        "include/perfetto/ext/base/watchdog_posix.h",
-        "include/perfetto/ext/base/weak_ptr.h",
-        "include/perfetto/ext/traced/sys_stats_counters.h",
-        "include/perfetto/protozero/contiguous_memory_range.h",
-        "include/perfetto/protozero/field.h",
-        "include/perfetto/protozero/message.h",
-        "include/perfetto/protozero/message_handle.h",
-        "include/perfetto/protozero/packed_repeated_fields.h",
-        "include/perfetto/protozero/proto_decoder.h",
-        "include/perfetto/protozero/proto_utils.h",
-        "include/perfetto/protozero/scattered_heap_buffer.h",
-        "include/perfetto/protozero/scattered_stream_null_delegate.h",
-        "include/perfetto/protozero/scattered_stream_writer.h",
-        "include/perfetto/trace_processor/basic_types.h",
-        "include/perfetto/trace_processor/status.h",
-        "include/perfetto/trace_processor/trace_processor.h",
-        "src/base/event_fd.cc",
-        "src/base/file_utils.cc",
-        "src/base/metatrace.cc",
-        "src/base/paged_memory.cc",
-        "src/base/pipe.cc",
-        "src/base/string_splitter.cc",
-        "src/base/string_utils.cc",
-        "src/base/string_view.cc",
-        "src/base/temp_file.cc",
-        "src/base/thread_checker.cc",
-        "src/base/thread_task_runner.cc",
-        "src/base/time.cc",
-        "src/base/unix_task_runner.cc",
-        "src/base/uuid.cc",
-        "src/base/virtual_destructors.cc",
-        "src/base/waitable_event.cc",
-        "src/base/watchdog_posix.cc",
-        "src/protozero/message.cc",
-        "src/protozero/message_handle.cc",
-        "src/protozero/proto_decoder.cc",
-        "src/protozero/scattered_heap_buffer.cc",
-        "src/protozero/scattered_stream_null_delegate.cc",
-        "src/protozero/scattered_stream_writer.cc",
-        "src/trace_processor/android_logs_table.cc",
-        "src/trace_processor/android_logs_table.h",
-        "src/trace_processor/args_table.cc",
-        "src/trace_processor/args_table.h",
-        "src/trace_processor/args_tracker.cc",
-        "src/trace_processor/args_tracker.h",
-        "src/trace_processor/chunked_trace_reader.h",
-        "src/trace_processor/clock_tracker.cc",
-        "src/trace_processor/clock_tracker.h",
-        "src/trace_processor/counter_definitions_table.cc",
-        "src/trace_processor/counter_definitions_table.h",
-        "src/trace_processor/counter_values_table.cc",
-        "src/trace_processor/counter_values_table.h",
-        "src/trace_processor/cpu_profile_stack_sample_table.cc",
-        "src/trace_processor/cpu_profile_stack_sample_table.h",
-        "src/trace_processor/db/bit_vector.cc",
-        "src/trace_processor/db/bit_vector.h",
-        "src/trace_processor/db/column.cc",
-        "src/trace_processor/db/column.h",
-        "src/trace_processor/db/row_map.cc",
-        "src/trace_processor/db/row_map.h",
-        "src/trace_processor/db/sparse_vector.h",
-        "src/trace_processor/db/table.cc",
-        "src/trace_processor/db/table.h",
-        "src/trace_processor/db/typed_column.h",
-        "src/trace_processor/event_tracker.cc",
-        "src/trace_processor/event_tracker.h",
-        "src/trace_processor/export_json.cc",
-        "src/trace_processor/export_json.h",
-        "src/trace_processor/filtered_row_index.cc",
-        "src/trace_processor/filtered_row_index.h",
-        "src/trace_processor/forwarding_trace_parser.cc",
-        "src/trace_processor/forwarding_trace_parser.h",
-        "src/trace_processor/ftrace_descriptors.cc",
-        "src/trace_processor/ftrace_descriptors.h",
-        "src/trace_processor/ftrace_utils.cc",
-        "src/trace_processor/ftrace_utils.h",
-        "src/trace_processor/fuchsia_provider_view.cc",
-        "src/trace_processor/fuchsia_provider_view.h",
-        "src/trace_processor/fuchsia_trace_parser.cc",
-        "src/trace_processor/fuchsia_trace_parser.h",
-        "src/trace_processor/fuchsia_trace_tokenizer.cc",
-        "src/trace_processor/fuchsia_trace_tokenizer.h",
-        "src/trace_processor/fuchsia_trace_utils.cc",
-        "src/trace_processor/fuchsia_trace_utils.h",
-        "src/trace_processor/graphics_frame_event_parser.cc",
-        "src/trace_processor/graphics_frame_event_parser.h",
-        "src/trace_processor/gzip_trace_parser.cc",
-        "src/trace_processor/gzip_trace_parser.h",
-        "src/trace_processor/heap_profile_allocation_table.cc",
-        "src/trace_processor/heap_profile_allocation_table.h",
-        "src/trace_processor/heap_profile_tracker.cc",
-        "src/trace_processor/heap_profile_tracker.h",
-        "src/trace_processor/instants_table.cc",
-        "src/trace_processor/instants_table.h",
-        "src/trace_processor/json_trace_parser.cc",
-        "src/trace_processor/json_trace_parser.h",
-        "src/trace_processor/json_trace_tokenizer.cc",
-        "src/trace_processor/json_trace_tokenizer.h",
-        "src/trace_processor/json_trace_utils.cc",
-        "src/trace_processor/json_trace_utils.h",
-        "src/trace_processor/metadata.h",
-        "src/trace_processor/metadata_table.cc",
-        "src/trace_processor/metadata_table.h",
-        "src/trace_processor/metrics/descriptors.cc",
-        "src/trace_processor/metrics/descriptors.h",
-        "src/trace_processor/metrics/metrics.cc",
-        "src/trace_processor/metrics/metrics.descriptor.h",
-        "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",
-        "src/trace_processor/process_tracker.cc",
-        "src/trace_processor/process_tracker.h",
-        "src/trace_processor/proto_incremental_state.h",
-        "src/trace_processor/proto_to_json.cc",
-        "src/trace_processor/proto_to_json.h",
-        "src/trace_processor/proto_trace_parser.cc",
-        "src/trace_processor/proto_trace_parser.h",
-        "src/trace_processor/proto_trace_tokenizer.cc",
-        "src/trace_processor/proto_trace_tokenizer.h",
-        "src/trace_processor/raw_table.cc",
-        "src/trace_processor/raw_table.h",
-        "src/trace_processor/row_iterators.cc",
-        "src/trace_processor/row_iterators.h",
-        "src/trace_processor/sched_slice_table.cc",
-        "src/trace_processor/sched_slice_table.h",
-        "src/trace_processor/slice_table.cc",
-        "src/trace_processor/slice_table.h",
-        "src/trace_processor/slice_tracker.cc",
-        "src/trace_processor/slice_tracker.h",
-        "src/trace_processor/span_join_operator_table.cc",
-        "src/trace_processor/span_join_operator_table.h",
-        "src/trace_processor/sql_stats_table.cc",
-        "src/trace_processor/sql_stats_table.h",
-        "src/trace_processor/sqlite/db_sqlite_table.cc",
-        "src/trace_processor/sqlite/db_sqlite_table.h",
-        "src/trace_processor/sqlite/query_constraints.cc",
-        "src/trace_processor/sqlite/query_constraints.h",
-        "src/trace_processor/sqlite/scoped_db.h",
-        "src/trace_processor/sqlite/sqlite3_str_split.cc",
-        "src/trace_processor/sqlite/sqlite3_str_split.h",
-        "src/trace_processor/sqlite/sqlite_table.cc",
-        "src/trace_processor/sqlite/sqlite_table.h",
-        "src/trace_processor/sqlite/sqlite_utils.h",
-        "src/trace_processor/stack_profile_callsite_table.cc",
-        "src/trace_processor/stack_profile_callsite_table.h",
-        "src/trace_processor/stack_profile_frame_table.cc",
-        "src/trace_processor/stack_profile_frame_table.h",
-        "src/trace_processor/stack_profile_mapping_table.cc",
-        "src/trace_processor/stack_profile_mapping_table.h",
-        "src/trace_processor/stack_profile_tracker.cc",
-        "src/trace_processor/stack_profile_tracker.h",
-        "src/trace_processor/stats.h",
-        "src/trace_processor/stats_table.cc",
-        "src/trace_processor/stats_table.h",
-        "src/trace_processor/storage_columns.cc",
-        "src/trace_processor/storage_columns.h",
-        "src/trace_processor/storage_schema.cc",
-        "src/trace_processor/storage_schema.h",
-        "src/trace_processor/storage_table.cc",
-        "src/trace_processor/storage_table.h",
-        "src/trace_processor/string_pool.cc",
-        "src/trace_processor/string_pool.h",
-        "src/trace_processor/syscall_tracker.cc",
-        "src/trace_processor/syscall_tracker.h",
-        "src/trace_processor/syscalls_aarch32.h",
-        "src/trace_processor/syscalls_aarch64.h",
-        "src/trace_processor/syscalls_armeabi.h",
-        "src/trace_processor/syscalls_x86_64.h",
-        "src/trace_processor/systrace_parser.cc",
-        "src/trace_processor/systrace_parser.h",
-        "src/trace_processor/systrace_trace_parser.cc",
-        "src/trace_processor/systrace_trace_parser.h",
-        "src/trace_processor/tables/macros.h",
-        "src/trace_processor/tables/macros_internal.h",
-        "src/trace_processor/tables/slice_tables.h",
-        "src/trace_processor/tables/track_tables.h",
-        "src/trace_processor/thread_table.cc",
-        "src/trace_processor/thread_table.h",
-        "src/trace_processor/trace_blob_view.h",
-        "src/trace_processor/trace_parser.h",
-        "src/trace_processor/trace_processor.cc",
-        "src/trace_processor/trace_processor_context.cc",
-        "src/trace_processor/trace_processor_context.h",
-        "src/trace_processor/trace_processor_impl.cc",
-        "src/trace_processor/trace_processor_impl.h",
-        "src/trace_processor/trace_processor_shell.cc",
-        "src/trace_processor/trace_sorter.cc",
-        "src/trace_processor/trace_sorter.h",
-        "src/trace_processor/trace_storage.cc",
-        "src/trace_processor/trace_storage.h",
-        "src/trace_processor/variadic.h",
-        "src/trace_processor/virtual_destructors.cc",
-        "src/trace_processor/virtual_track_tracker.cc",
-        "src/trace_processor/virtual_track_tracker.h",
-        "src/trace_processor/window_operator_table.cc",
-        "src/trace_processor/window_operator_table.h",
-    ],
-    deps = [
-        "//third_party/perfetto:gen_merged_sql_metrics",
-        "//third_party/perfetto/google:jsoncpp",
-        "//third_party/perfetto/google:linenoise",
-        "//third_party/perfetto/protos:common_zero_cc_proto",
-        "//third_party/perfetto/protos:config_android_zero_cc_proto",
-        "//third_party/perfetto/protos:config_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:config_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:config_inode_file_zero_cc_proto",
-        "//third_party/perfetto/protos:config_power_zero_cc_proto",
-        "//third_party/perfetto/protos:config_process_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:config_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_zero_cc_proto",
-        "//third_party/perfetto/protos:metrics_android_zero_cc_proto",
-        "//third_party/perfetto/protos:metrics_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_android_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_appended_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_chrome_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_filesystem_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_interned_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_non_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_perfetto_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_power_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_processor_metrics_impl_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ps_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_track_event_zero_cc_proto",
-        "//third_party/protobuf:libprotoc_legacy",
-        "//third_party/protobuf:protobuf_legacy",
-        "//third_party/sqlite",
-        "//third_party/sqlite:sqlite_ext_percentile",
-        "//third_party/zlib:zlibsystem",
-    ],
-)
-
-# GN target: //tools/trace_to_text:trace_to_text
-cc_binary(
-    name = "trace_to_text",
-    srcs = [
-        "include/perfetto/base/build_config.h",
-        "include/perfetto/base/build_configs/bazel/perfetto_build_flags.h",
-        "include/perfetto/base/compiler.h",
-        "include/perfetto/base/copyable_ptr.h",
-        "include/perfetto/base/export.h",
-        "include/perfetto/base/logging.h",
-        "include/perfetto/base/task_runner.h",
-        "include/perfetto/base/time.h",
-        "include/perfetto/ext/base/circular_queue.h",
-        "include/perfetto/ext/base/container_annotations.h",
-        "include/perfetto/ext/base/event_fd.h",
-        "include/perfetto/ext/base/file_utils.h",
-        "include/perfetto/ext/base/hash.h",
-        "include/perfetto/ext/base/lookup_set.h",
-        "include/perfetto/ext/base/metatrace.h",
-        "include/perfetto/ext/base/metatrace_events.h",
-        "include/perfetto/ext/base/no_destructor.h",
-        "include/perfetto/ext/base/optional.h",
-        "include/perfetto/ext/base/paged_memory.h",
-        "include/perfetto/ext/base/pipe.h",
-        "include/perfetto/ext/base/proc_utils.h",
-        "include/perfetto/ext/base/scoped_file.h",
-        "include/perfetto/ext/base/small_set.h",
-        "include/perfetto/ext/base/string_splitter.h",
-        "include/perfetto/ext/base/string_utils.h",
-        "include/perfetto/ext/base/string_view.h",
-        "include/perfetto/ext/base/string_writer.h",
-        "include/perfetto/ext/base/temp_file.h",
-        "include/perfetto/ext/base/thread_annotations.h",
-        "include/perfetto/ext/base/thread_checker.h",
-        "include/perfetto/ext/base/thread_task_runner.h",
-        "include/perfetto/ext/base/thread_utils.h",
-        "include/perfetto/ext/base/unix_socket.h",
-        "include/perfetto/ext/base/unix_task_runner.h",
-        "include/perfetto/ext/base/utils.h",
-        "include/perfetto/ext/base/uuid.h",
-        "include/perfetto/ext/base/waitable_event.h",
-        "include/perfetto/ext/base/watchdog.h",
-        "include/perfetto/ext/base/watchdog_noop.h",
-        "include/perfetto/ext/base/watchdog_posix.h",
-        "include/perfetto/ext/base/weak_ptr.h",
-        "include/perfetto/ext/traced/sys_stats_counters.h",
-        "include/perfetto/protozero/contiguous_memory_range.h",
-        "include/perfetto/protozero/field.h",
-        "include/perfetto/protozero/message.h",
-        "include/perfetto/protozero/message_handle.h",
-        "include/perfetto/protozero/packed_repeated_fields.h",
-        "include/perfetto/protozero/proto_decoder.h",
-        "include/perfetto/protozero/proto_utils.h",
-        "include/perfetto/protozero/scattered_heap_buffer.h",
-        "include/perfetto/protozero/scattered_stream_null_delegate.h",
-        "include/perfetto/protozero/scattered_stream_writer.h",
-        "include/perfetto/trace_processor/basic_types.h",
-        "include/perfetto/trace_processor/status.h",
-        "include/perfetto/trace_processor/trace_processor.h",
-        "src/base/event_fd.cc",
-        "src/base/file_utils.cc",
-        "src/base/metatrace.cc",
-        "src/base/paged_memory.cc",
-        "src/base/pipe.cc",
-        "src/base/string_splitter.cc",
-        "src/base/string_utils.cc",
-        "src/base/string_view.cc",
-        "src/base/temp_file.cc",
-        "src/base/thread_checker.cc",
-        "src/base/thread_task_runner.cc",
-        "src/base/time.cc",
-        "src/base/unix_task_runner.cc",
-        "src/base/uuid.cc",
-        "src/base/virtual_destructors.cc",
-        "src/base/waitable_event.cc",
-        "src/base/watchdog_posix.cc",
-        "src/protozero/message.cc",
-        "src/protozero/message_handle.cc",
-        "src/protozero/proto_decoder.cc",
-        "src/protozero/scattered_heap_buffer.cc",
-        "src/protozero/scattered_stream_null_delegate.cc",
-        "src/protozero/scattered_stream_writer.cc",
-        "src/trace_processor/android_logs_table.cc",
-        "src/trace_processor/android_logs_table.h",
-        "src/trace_processor/args_table.cc",
-        "src/trace_processor/args_table.h",
-        "src/trace_processor/args_tracker.cc",
-        "src/trace_processor/args_tracker.h",
-        "src/trace_processor/chunked_trace_reader.h",
-        "src/trace_processor/clock_tracker.cc",
-        "src/trace_processor/clock_tracker.h",
-        "src/trace_processor/counter_definitions_table.cc",
-        "src/trace_processor/counter_definitions_table.h",
-        "src/trace_processor/counter_values_table.cc",
-        "src/trace_processor/counter_values_table.h",
-        "src/trace_processor/cpu_profile_stack_sample_table.cc",
-        "src/trace_processor/cpu_profile_stack_sample_table.h",
-        "src/trace_processor/db/bit_vector.cc",
-        "src/trace_processor/db/bit_vector.h",
-        "src/trace_processor/db/column.cc",
-        "src/trace_processor/db/column.h",
-        "src/trace_processor/db/row_map.cc",
-        "src/trace_processor/db/row_map.h",
-        "src/trace_processor/db/sparse_vector.h",
-        "src/trace_processor/db/table.cc",
-        "src/trace_processor/db/table.h",
-        "src/trace_processor/db/typed_column.h",
-        "src/trace_processor/event_tracker.cc",
-        "src/trace_processor/event_tracker.h",
-        "src/trace_processor/export_json.cc",
-        "src/trace_processor/export_json.h",
-        "src/trace_processor/filtered_row_index.cc",
-        "src/trace_processor/filtered_row_index.h",
-        "src/trace_processor/forwarding_trace_parser.cc",
-        "src/trace_processor/forwarding_trace_parser.h",
-        "src/trace_processor/ftrace_descriptors.cc",
-        "src/trace_processor/ftrace_descriptors.h",
-        "src/trace_processor/ftrace_utils.cc",
-        "src/trace_processor/ftrace_utils.h",
-        "src/trace_processor/fuchsia_provider_view.cc",
-        "src/trace_processor/fuchsia_provider_view.h",
-        "src/trace_processor/fuchsia_trace_parser.cc",
-        "src/trace_processor/fuchsia_trace_parser.h",
-        "src/trace_processor/fuchsia_trace_tokenizer.cc",
-        "src/trace_processor/fuchsia_trace_tokenizer.h",
-        "src/trace_processor/fuchsia_trace_utils.cc",
-        "src/trace_processor/fuchsia_trace_utils.h",
-        "src/trace_processor/graphics_frame_event_parser.cc",
-        "src/trace_processor/graphics_frame_event_parser.h",
-        "src/trace_processor/gzip_trace_parser.cc",
-        "src/trace_processor/gzip_trace_parser.h",
-        "src/trace_processor/heap_profile_allocation_table.cc",
-        "src/trace_processor/heap_profile_allocation_table.h",
-        "src/trace_processor/heap_profile_tracker.cc",
-        "src/trace_processor/heap_profile_tracker.h",
-        "src/trace_processor/instants_table.cc",
-        "src/trace_processor/instants_table.h",
-        "src/trace_processor/json_trace_parser.cc",
-        "src/trace_processor/json_trace_parser.h",
-        "src/trace_processor/json_trace_tokenizer.cc",
-        "src/trace_processor/json_trace_tokenizer.h",
-        "src/trace_processor/json_trace_utils.cc",
-        "src/trace_processor/json_trace_utils.h",
-        "src/trace_processor/metadata.h",
-        "src/trace_processor/metadata_table.cc",
-        "src/trace_processor/metadata_table.h",
-        "src/trace_processor/metrics/descriptors.cc",
-        "src/trace_processor/metrics/descriptors.h",
-        "src/trace_processor/metrics/metrics.cc",
-        "src/trace_processor/metrics/metrics.descriptor.h",
-        "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",
-        "src/trace_processor/process_tracker.cc",
-        "src/trace_processor/process_tracker.h",
-        "src/trace_processor/proto_incremental_state.h",
-        "src/trace_processor/proto_trace_parser.cc",
-        "src/trace_processor/proto_trace_parser.h",
-        "src/trace_processor/proto_trace_tokenizer.cc",
-        "src/trace_processor/proto_trace_tokenizer.h",
-        "src/trace_processor/raw_table.cc",
-        "src/trace_processor/raw_table.h",
-        "src/trace_processor/row_iterators.cc",
-        "src/trace_processor/row_iterators.h",
-        "src/trace_processor/sched_slice_table.cc",
-        "src/trace_processor/sched_slice_table.h",
-        "src/trace_processor/slice_table.cc",
-        "src/trace_processor/slice_table.h",
-        "src/trace_processor/slice_tracker.cc",
-        "src/trace_processor/slice_tracker.h",
-        "src/trace_processor/span_join_operator_table.cc",
-        "src/trace_processor/span_join_operator_table.h",
-        "src/trace_processor/sql_stats_table.cc",
-        "src/trace_processor/sql_stats_table.h",
-        "src/trace_processor/sqlite/db_sqlite_table.cc",
-        "src/trace_processor/sqlite/db_sqlite_table.h",
-        "src/trace_processor/sqlite/query_constraints.cc",
-        "src/trace_processor/sqlite/query_constraints.h",
-        "src/trace_processor/sqlite/scoped_db.h",
-        "src/trace_processor/sqlite/sqlite3_str_split.cc",
-        "src/trace_processor/sqlite/sqlite3_str_split.h",
-        "src/trace_processor/sqlite/sqlite_table.cc",
-        "src/trace_processor/sqlite/sqlite_table.h",
-        "src/trace_processor/sqlite/sqlite_utils.h",
-        "src/trace_processor/stack_profile_callsite_table.cc",
-        "src/trace_processor/stack_profile_callsite_table.h",
-        "src/trace_processor/stack_profile_frame_table.cc",
-        "src/trace_processor/stack_profile_frame_table.h",
-        "src/trace_processor/stack_profile_mapping_table.cc",
-        "src/trace_processor/stack_profile_mapping_table.h",
-        "src/trace_processor/stack_profile_tracker.cc",
-        "src/trace_processor/stack_profile_tracker.h",
-        "src/trace_processor/stats.h",
-        "src/trace_processor/stats_table.cc",
-        "src/trace_processor/stats_table.h",
-        "src/trace_processor/storage_columns.cc",
-        "src/trace_processor/storage_columns.h",
-        "src/trace_processor/storage_schema.cc",
-        "src/trace_processor/storage_schema.h",
-        "src/trace_processor/storage_table.cc",
-        "src/trace_processor/storage_table.h",
-        "src/trace_processor/string_pool.cc",
-        "src/trace_processor/string_pool.h",
-        "src/trace_processor/syscall_tracker.cc",
-        "src/trace_processor/syscall_tracker.h",
-        "src/trace_processor/syscalls_aarch32.h",
-        "src/trace_processor/syscalls_aarch64.h",
-        "src/trace_processor/syscalls_armeabi.h",
-        "src/trace_processor/syscalls_x86_64.h",
-        "src/trace_processor/systrace_parser.cc",
-        "src/trace_processor/systrace_parser.h",
-        "src/trace_processor/systrace_trace_parser.cc",
-        "src/trace_processor/systrace_trace_parser.h",
-        "src/trace_processor/tables/macros.h",
-        "src/trace_processor/tables/macros_internal.h",
-        "src/trace_processor/tables/slice_tables.h",
-        "src/trace_processor/tables/track_tables.h",
-        "src/trace_processor/thread_table.cc",
-        "src/trace_processor/thread_table.h",
-        "src/trace_processor/trace_blob_view.h",
-        "src/trace_processor/trace_parser.h",
-        "src/trace_processor/trace_processor.cc",
-        "src/trace_processor/trace_processor_context.cc",
-        "src/trace_processor/trace_processor_context.h",
-        "src/trace_processor/trace_processor_impl.cc",
-        "src/trace_processor/trace_processor_impl.h",
-        "src/trace_processor/trace_sorter.cc",
-        "src/trace_processor/trace_sorter.h",
-        "src/trace_processor/trace_storage.cc",
-        "src/trace_processor/trace_storage.h",
-        "src/trace_processor/variadic.h",
-        "src/trace_processor/virtual_destructors.cc",
-        "src/trace_processor/virtual_track_tracker.cc",
-        "src/trace_processor/virtual_track_tracker.h",
-        "src/trace_processor/window_operator_table.cc",
-        "src/trace_processor/window_operator_table.h",
-        "tools/trace_to_text/local_symbolizer.cc",
-        "tools/trace_to_text/local_symbolizer.h",
-        "tools/trace_to_text/main.cc",
-        "tools/trace_to_text/pprof_builder.cc",
-        "tools/trace_to_text/pprof_builder.h",
-        "tools/trace_to_text/profile_visitor.cc",
-        "tools/trace_to_text/profile_visitor.h",
-        "tools/trace_to_text/proto_full_utils.cc",
-        "tools/trace_to_text/proto_full_utils.h",
-        "tools/trace_to_text/symbolize_profile.cc",
-        "tools/trace_to_text/symbolize_profile.h",
-        "tools/trace_to_text/symbolizer.cc",
-        "tools/trace_to_text/symbolizer.h",
-        "tools/trace_to_text/trace_symbol_table.cc",
-        "tools/trace_to_text/trace_symbol_table.h",
-        "tools/trace_to_text/trace_to_profile.cc",
-        "tools/trace_to_text/trace_to_profile.h",
-        "tools/trace_to_text/trace_to_systrace.cc",
-        "tools/trace_to_text/trace_to_systrace.h",
-        "tools/trace_to_text/trace_to_text.cc",
-        "tools/trace_to_text/trace_to_text.h",
-        "tools/trace_to_text/utils.cc",
-        "tools/trace_to_text/utils.h",
-    ],
-    deps = [
-        "//third_party/perfetto:gen_merged_sql_metrics",
-        "//third_party/perfetto/google:jsoncpp",
-        "//third_party/perfetto/protos:common_cc_proto",
-        "//third_party/perfetto/protos:common_zero_cc_proto",
-        "//third_party/perfetto/protos:config_android_cc_proto",
-        "//third_party/perfetto/protos:config_android_zero_cc_proto",
-        "//third_party/perfetto/protos:config_cc_proto",
-        "//third_party/perfetto/protos:config_ftrace_cc_proto",
-        "//third_party/perfetto/protos:config_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:config_gpu_cc_proto",
-        "//third_party/perfetto/protos:config_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:config_inode_file_cc_proto",
-        "//third_party/perfetto/protos:config_inode_file_zero_cc_proto",
-        "//third_party/perfetto/protos:config_power_cc_proto",
-        "//third_party/perfetto/protos:config_power_zero_cc_proto",
-        "//third_party/perfetto/protos:config_process_stats_cc_proto",
-        "//third_party/perfetto/protos:config_process_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_profiling_cc_proto",
-        "//third_party/perfetto/protos:config_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:config_sys_stats_cc_proto",
-        "//third_party/perfetto/protos:config_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:config_zero_cc_proto",
-        "//third_party/perfetto/protos:metrics_android_zero_cc_proto",
-        "//third_party/perfetto/protos:metrics_zero_cc_proto",
-        "//third_party/perfetto/protos:protos_third_party_pprof_cc_proto",
-        "//third_party/perfetto/protos:trace_android_cc_proto",
-        "//third_party/perfetto/protos:trace_android_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_appended_data_cc_proto",
-        "//third_party/perfetto/protos:trace_appended_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_chrome_cc_proto",
-        "//third_party/perfetto/protos:trace_chrome_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_filesystem_cc_proto",
-        "//third_party/perfetto/protos:trace_filesystem_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ftrace_cc_proto",
-        "//third_party/perfetto/protos:trace_ftrace_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_gpu_cc_proto",
-        "//third_party/perfetto/protos:trace_gpu_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_interned_data_cc_proto",
-        "//third_party/perfetto/protos:trace_interned_data_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_minimal_cc_proto",
-        "//third_party/perfetto/protos:trace_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_non_minimal_cc_proto",
-        "//third_party/perfetto/protos:trace_non_minimal_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_perfetto_cc_proto",
-        "//third_party/perfetto/protos:trace_perfetto_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_power_cc_proto",
-        "//third_party/perfetto/protos:trace_power_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_processor_metrics_impl_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_profiling_cc_proto",
-        "//third_party/perfetto/protos:trace_profiling_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_ps_cc_proto",
-        "//third_party/perfetto/protos:trace_ps_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_sys_stats_cc_proto",
-        "//third_party/perfetto/protos:trace_sys_stats_zero_cc_proto",
-        "//third_party/perfetto/protos:trace_track_event_cc_proto",
-        "//third_party/perfetto/protos:trace_track_event_zero_cc_proto",
-        "//third_party/protobuf:libprotoc_legacy",
-        "//third_party/protobuf:protobuf_legacy",
-        "//third_party/sqlite",
-        "//third_party/sqlite:sqlite_ext_percentile",
-        "//third_party/zlib:zlibsystem",
-    ],
-)
-
-gensignature(
-    name = "trace_processor_sig",
-    srcs = [
-        ":trace_processor_shell",
-        ":trace_to_text",
-    ],
-    tags = [
-        "__TRACE_PROCESSOR_SIG_TAG1",
-        "__TRACE_PROCESSOR_SIG_TAG2",
-    ],
-)
-
-py_binary(
+perfetto_py_binary(
     name = "gen_merged_sql_metrics_py",
     srcs = [
         "tools/gen_merged_sql_metrics.py",
diff --git a/BUILD.extras b/BUILD.extras
index 8a76d28..3bfd20a 100644
--- a/BUILD.extras
+++ b/BUILD.extras
@@ -1,16 +1,19 @@
-gensignature(
-    name = "trace_processor_sig",
-    srcs = [
-        ":trace_processor_shell",
-        ":trace_to_text",
-    ],
-    tags = [
-        "__TRACE_PROCESSOR_SIG_TAG1",
-        "__TRACE_PROCESSOR_SIG_TAG2",
-    ],
+build_config_dir_ = "include/perfetto/base/build_configs/bazel"
+
+# Deliberately NOT a perfetto_cc_library, to avoid cyclic deps.
+# This is pulled as a default dep by all targets.
+cc_library(
+    name = "build_config_hdr",
+    hdrs = [build_config_dir_ + "/perfetto_build_flags.h"],
+    includes = [build_config_dir_],
 )
 
-py_binary(
+perfetto_cc_library(
+    name = "cc_merged_sql_metrics",
+    hdrs = ["src/trace_processor/metrics/sql_metrics.h"],
+)
+
+perfetto_py_binary(
     name = "gen_merged_sql_metrics_py",
     srcs = [
         "tools/gen_merged_sql_metrics.py",
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index b491a6e..2278b9a 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -22,7 +22,7 @@
   def long_line_sources(x): return input.FilterSourceFile(
       x, white_list=".*",
       black_list=['Android[.]bp', '.*[.]json$', '.*[.]sql$', '.*[.]out$',
-                  'test/trace_processor/index$', 'BUILD$', 'protos/BUILD$',
+                  'test/trace_processor/index$', '.*\bBUILD$', 'WORKSPACE',
                   '.*/Makefile$', '/perfetto_build_flags.h$'])
   results = []
   results += input.canned_checks.CheckDoNotSubmit(input, output)
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..a933c67
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,31 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file is used only in standalone builds. This file is ignored both in
+# embedder builds (i.e. when other projects pull perfetto under /third_party/
+# or similar) and in google internal builds.
+
+workspace(name = "perfetto")
+
+new_local_repository(
+    name = "perfetto_cfg",
+    path = "bazel/standalone",
+    build_file_content = ""
+)
+
+load("@perfetto//bazel:deps.bzl", "perfetto_deps")
+perfetto_deps()
+
+load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
+protobuf_deps()
diff --git a/bazel/BUILD b/bazel/BUILD
new file mode 100644
index 0000000..069748d
--- /dev/null
+++ b/bazel/BUILD
@@ -0,0 +1,19 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config_setting(
+    name = "os_osx",
+    values = {"cpu": "darwin"},
+    visibility = ["//visibility:public"],
+)
diff --git a/bazel/deps.bzl b/bazel/deps.bzl
new file mode 100644
index 0000000..6f19f3d
--- /dev/null
+++ b/bazel/deps.bzl
@@ -0,0 +1,88 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
+
+# This file must be kept in sync with tools/install-build-deps.
+
+def perfetto_deps():
+    # Note: this is more recent than the version of protobuf we use in the
+    # GN and Android builds. This is because older versions of protobuf don't
+    # support Bazel.
+    _add_repo_if_not_existing(
+        http_archive,
+        name = "com_google_protobuf",
+        strip_prefix = "protobuf-3.9.0",
+        url = "https://github.com/google/protobuf/archive/v3.9.0.tar.gz",
+        sha256 = "2ee9dcec820352671eb83e081295ba43f7a4157181dad549024d7070d079cf65",
+    )
+
+    _add_repo_if_not_existing(
+        http_archive,
+        name = "perfetto_dep_sqlite",
+        url = "https://storage.googleapis.com/perfetto/sqlite-amalgamation-3250300.zip",
+        sha256 = "2ad5379f3b665b60599492cc8a13ac480ea6d819f91b1ef32ed0e1ad152fafef",
+        strip_prefix = "sqlite-amalgamation-3250300",
+        build_file = "//bazel:sqlite.BUILD",
+    )
+
+    _add_repo_if_not_existing(
+        http_archive,
+        name = "perfetto_dep_sqlite_src",
+        url = "https://storage.googleapis.com/perfetto/sqlite-src-3250300.zip",
+        sha256 = "c7922bc840a799481050ee9a76e679462da131adba1814687f05aa5c93766421",
+        strip_prefix = "sqlite-src-3250300",
+        build_file = "//bazel:sqlite.BUILD",
+    )
+
+    _add_repo_if_not_existing(
+        new_git_repository,
+        name = "perfetto_dep_linenoise",
+        remote = "https://fuchsia.googlesource.com/third_party/linenoise.git",
+        commit = "c894b9e59f02203dbe4e2be657572cf88c4230c3",
+        build_file = "//bazel:linenoise.BUILD",
+        shallow_since = "1469784335 +0200",
+    )
+
+    _add_repo_if_not_existing(
+        new_git_repository,
+        name = "perfetto_dep_jsoncpp",
+        remote = "https://github.com/open-source-parsers/jsoncpp",
+        commit = "7165f6ac4c482e68475c9e1dac086f9e12fff0d0",  # v1.0.0
+        build_file = "//bazel:jsoncpp.BUILD",
+        shallow_since = "1416494758 -0600",
+    )
+
+    _add_repo_if_not_existing(
+        new_git_repository,
+        name = "perfetto_dep_zlib",
+        remote = "https://android.googlesource.com/platform/external/zlib.git",
+        commit = "dfa0646a03b4e1707469e04dc931b09774968fe6",
+        build_file = "//bazel:zlib.BUILD",
+        shallow_since = "1557160162 -0700",
+    )
+
+    # Without this protobuf.bzl fails. This seems a bug in protobuf_deps().
+    _add_repo_if_not_existing(
+        http_archive,
+        name = "bazel_skylib",
+        sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d",
+        strip_prefix = "bazel-skylib-2169ae1c374aab4a09aa90e65efe1a3aad4e279b",
+        url = "https://github.com/bazelbuild/bazel-skylib/archive/2169ae1c374aab4a09aa90e65efe1a3aad4e279b.tar.gz",
+    )
+
+def _add_repo_if_not_existing(repo_rule, name, **kwargs):
+    if name not in native.existing_rules():
+        repo_rule(name = name, **kwargs)
diff --git a/bazel/jsoncpp.BUILD b/bazel/jsoncpp.BUILD
new file mode 100644
index 0000000..8a33eb8
--- /dev/null
+++ b/bazel/jsoncpp.BUILD
@@ -0,0 +1,49 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cc_library(
+    name = "jsoncpp",
+    srcs = [
+        "src/lib_json/json_batchallocator.h",
+        "src/lib_json/json_internalarray.inl",
+        "src/lib_json/json_internalmap.inl",
+        "src/lib_json/json_reader.cpp",
+        "src/lib_json/json_tool.h",
+        "src/lib_json/json_value.cpp",
+        "src/lib_json/json_valueiterator.inl",
+        "src/lib_json/json_writer.cpp",
+    ],
+    hdrs = [
+        "include/json/assertions.h",
+        "include/json/autolink.h",
+        "include/json/config.h",
+        "include/json/features.h",
+        "include/json/forwards.h",
+        "include/json/json.h",
+        "include/json/reader.h",
+        "include/json/value.h",
+        "include/json/version.h",
+        "include/json/writer.h",
+    ],
+    copts = [
+        "-Isrc/lib_json",
+    ],
+    defines = [
+        "JSON_USE_EXCEPTION=0",
+    ],
+    includes = [
+        "include",
+    ],
+    visibility = ["//visibility:public"],
+)
diff --git a/bazel/linenoise.BUILD b/bazel/linenoise.BUILD
new file mode 100644
index 0000000..d2b6053
--- /dev/null
+++ b/bazel/linenoise.BUILD
@@ -0,0 +1,27 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cc_library(
+    name = "linenoise",
+    srcs = [
+        "linenoise.c",
+    ],
+    hdrs = [
+        "linenoise.h",
+    ],
+    includes = [
+        ".",
+    ],
+    visibility = ["//visibility:public"],
+)
diff --git a/bazel/proto_gen.bzl b/bazel/proto_gen.bzl
new file mode 100644
index 0000000..cf0d5ff
--- /dev/null
+++ b/bazel/proto_gen.bzl
@@ -0,0 +1,114 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file defines the proto_gen() rule that is used for generating protos
+# with custom plugins (ipc and protozero).
+
+def _proto_gen_impl(ctx):
+    proto_src = [
+        f
+        for dep in ctx.attr.deps
+        for f in dep[ProtoInfo].direct_sources
+    ]
+    includes = [
+        f
+        for dep in ctx.attr.deps
+        for f in dep[ProtoInfo].transitive_imports.to_list()
+    ]
+
+    proto_path = "."
+
+    out_dir = str(ctx.genfiles_dir.path)
+    strip_base_path = ""
+    if ctx.attr.root != "//":
+        # This path is hit in Google internal builds, where root is typically
+        # //third_party/perfetto.
+        proto_path = "."
+        strip_base_path = ctx.attr.root[2:] + "/"  # -> third_party/perfetto/
+    elif ctx.label.workspace_root:
+        # This path is hit when proto targets are built as @perfetto//:xxx
+        # instead of //:xxx. This happens in embedder builds. In this case,
+        # workspace_root == "external/perfetto" and we need to rebase the paths
+        # passed to protoc.
+        proto_path = ctx.label.workspace_root
+        out_dir += "/" + ctx.label.workspace_root
+        strip_base_path = ctx.label.workspace_root + "/"
+
+    out_files = []
+    suffix = ctx.attr.suffix
+    for src in proto_src:
+        base_path = src.path[:-len(".proto")]
+        if base_path.startswith(strip_base_path):
+            base_path = base_path[len(strip_base_path):]
+        out_files += [ctx.actions.declare_file(base_path + ".%s.h" % suffix)]
+        out_files += [ctx.actions.declare_file(base_path + ".%s.cc" % suffix)]
+
+    arguments = [
+        "--proto_path=" + proto_path,
+    ]
+    plugin_deps = []
+    if ctx.attr.plugin:
+        arguments += [
+            "--plugin=protoc-gen-plugin=" + ctx.executable.plugin.path,
+            "--plugin_out=wrapper_namespace=pbzero:" + out_dir,
+        ]
+        plugin_deps += [ctx.executable.plugin]
+    else:
+        arguments += [
+            "--cpp_out=" + out_dir,
+        ]
+
+    arguments += [src.path for src in proto_src]
+    ctx.actions.run(
+        inputs = proto_src + includes + plugin_deps,
+        tools = plugin_deps,
+        outputs = out_files,
+        executable = ctx.executable.protoc,
+        arguments = arguments,
+    )
+    return [
+        DefaultInfo(files = depset(out_files)),
+        OutputGroupInfo(
+            cc = depset([f for f in out_files if f.path.endswith(".cc")]),
+            h = depset([f for f in out_files if f.path.endswith(".h")]),
+        ),
+    ]
+
+proto_gen = rule(
+    attrs = {
+        "deps": attr.label_list(
+            mandatory = True,
+            allow_empty = False,
+            providers = [ProtoInfo],
+        ),
+        "plugin": attr.label(
+            executable = True,
+            mandatory = False,
+            cfg = "host",
+        ),
+        "suffix": attr.string(
+            mandatory = True,
+        ),
+        "protoc": attr.label(
+            executable = True,
+            cfg = "host",
+        ),
+        "root": attr.string(
+            mandatory = False,
+            default = "//",
+        ),
+    },
+    output_to_genfiles = True,
+    implementation = _proto_gen_impl,
+)
diff --git a/bazel/rules.bzl b/bazel/rules.bzl
new file mode 100644
index 0000000..0aca50e
--- /dev/null
+++ b/bazel/rules.bzl
@@ -0,0 +1,156 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load("@perfetto_cfg//:perfetto_cfg.bzl", "PERFETTO_CONFIG")
+load("@perfetto//bazel:proto_gen.bzl", "proto_gen")
+
+# +----------------------------------------------------------------------------+
+# | Base C++ rules.                                                            |
+# +----------------------------------------------------------------------------+
+
+def default_cc_args():
+    return {
+        "deps": [PERFETTO_CONFIG.root + ":build_config_hdr"],
+        "copts": [],
+        "includes": ["include"],
+        "linkopts": select({
+            "@perfetto//bazel:os_osx": [],
+            "//conditions:default": ["-ldl", "-lrt"],
+        }),
+    }
+
+def perfetto_cc_library(**kwargs):
+    args = _merge_dicts(default_cc_args(), kwargs)
+    if not _rule_override("cc_library", **args):
+        native.cc_library(**args)
+
+def perfetto_cc_binary(**kwargs):
+    args = _merge_dicts(default_cc_args(), kwargs)
+    if not _rule_override("cc_binary", **args):
+        native.cc_binary(**args)
+
+def perfetto_py_binary(**kwargs):
+    if not _rule_override("py_binary", **kwargs):
+        native.py_binary(**kwargs)
+
+# +----------------------------------------------------------------------------+
+# | Proto-related rules                                                        |
+# +----------------------------------------------------------------------------+
+
+def perfetto_proto_library(**kwargs):
+    if not _rule_override("proto_library", **kwargs):
+        native.proto_library(**kwargs)
+
+def perfetto_cc_proto_library(**kwargs):
+    if not _rule_override("cc_proto_library", **kwargs):
+        native.cc_proto_library(**kwargs)
+
+# Generates .pbzero.{cc,h} from .proto(s). We deliberately do NOT generate
+# conventional .pb.{cc,h} from here as protozero gen sources do not have any
+# dependency on libprotobuf.
+def perfetto_cc_protozero_library(name, deps, **kwargs):
+    if _rule_override(
+        "cc_protozero_library",
+        name = name,
+        deps = deps,
+        **kwargs
+    ):
+        return
+
+    proto_gen(
+        name = name + "_src",
+        deps = deps,
+        suffix = "pbzero",
+        plugin = PERFETTO_CONFIG.root + ":protozero_plugin",
+        protoc = PERFETTO_CONFIG.deps.protoc[0],
+        root = PERFETTO_CONFIG.root,
+    )
+
+    native.filegroup(
+        name = name + "_h",
+        srcs = [":" + name + "_src"],
+        output_group = "h",
+    )
+
+    perfetto_cc_library(
+        name = name,
+        srcs = [":" + name + "_src"],
+        hdrs = [":" + name + "_h"],
+        deps = [PERFETTO_CONFIG.root + ":libprotozero"],
+        **kwargs
+    )
+
+# Generates .ipc.{cc,h} and .pb.{cc.h} from .proto(s). The IPC sources depend
+# on .pb.h so we need to generate also the standard protobuf sources here.
+def perfetto_cc_ipc_library(name, deps, **kwargs):
+    if _rule_override("cc_ipc_library", name = name, deps = deps, **kwargs):
+        return
+
+    # Takes care of generating .pb.{cc,h}.
+    perfetto_cc_proto_library(name = name + "_pb", deps = deps)
+
+    # Generates .ipc.{cc,h}.
+    proto_gen(
+        name = name + "_src",
+        deps = deps,
+        suffix = "ipc",
+        plugin = PERFETTO_CONFIG.root + ":ipc_plugin",
+        protoc = PERFETTO_CONFIG.deps.protoc[0],
+        root = PERFETTO_CONFIG.root,
+    )
+
+    native.filegroup(
+        name = name + "_h",
+        srcs = [":" + name + "_src"],
+        output_group = "h",
+    )
+
+    perfetto_cc_library(
+        name = name,
+        srcs = [":" + name + "_src"],
+        hdrs = [":" + name + "_h"],
+        deps = [
+            ":" + name + "_pb",
+
+            # Generated .ipc.{cc,h} depend on this.
+            PERFETTO_CONFIG.root + ":perfetto_ipc",
+
+            # Generated .pb.{cc,h} depend on this.
+        ] + PERFETTO_CONFIG.deps.protobuf_lite,
+        **kwargs
+    )
+
+# +----------------------------------------------------------------------------+
+# | Misc utility functions                                                     |
+# +----------------------------------------------------------------------------+
+
+def _rule_override(rule_name, **kwargs):
+    overrides = getattr(PERFETTO_CONFIG, "rule_overrides", struct())
+    overridden_rule = getattr(overrides, rule_name, None)
+    if overridden_rule:
+        overridden_rule(**kwargs)
+        return True
+    return False
+
+def _merge_dicts(*args):
+    res = {}
+    for arg in args:
+        for k, v in arg.items():
+            if type(v) == "string":
+                res[k] = v
+            elif type(v) == "list" or type(v) == "select":
+                res[k] = res.get(k, []) + v
+            else:
+                fail("key type not supported: " + type(v))
+    return res
diff --git a/bazel/sqlite.BUILD b/bazel/sqlite.BUILD
new file mode 100644
index 0000000..75c3e9a
--- /dev/null
+++ b/bazel/sqlite.BUILD
@@ -0,0 +1,76 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This build file is used for both @perfetto_dep_sqlite and
+# @perfetto_dep_sqlite_src.
+
+# #############################
+# @perfetto_dep_sqlite section
+# #############################
+
+filegroup(
+    name = "headers",
+    srcs = [
+        "sqlite3.h",
+        "sqlite3ext.h",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+include_sqlite = [
+    ".",
+]
+
+sqlite_copts = [
+    "-DSQLITE_THREADSAFE=0",
+    "-DQLITE_DEFAULT_MEMSTATUS=0",
+    "-DSQLITE_LIKE_DOESNT_MATCH_BLOBS",
+    "-DSQLITE_OMIT_DEPRECATED",
+    "-DSQLITE_OMIT_SHARED_CACHE",
+    "-DHAVE_USLEEP",
+    "-DHAVE_UTIME",
+    "-DSQLITE_BYTEORDER=1234",
+    "-DSQLITE_DEFAULT_AUTOVACUUM=0",
+    "-DSQLITE_DEFAULT_MMAP_SIZE=0",
+    "-DSQLITE_CORE",
+    "-DSQLITE_TEMP_STORE=3",
+    "-DSQLITE_OMIT_LOAD_EXTENSION",
+    "-DSQLITE_OMIT_RANDOMNESS",
+]
+
+cc_library(
+    name = "sqlite",
+    srcs = [
+        "sqlite3.c",
+        "sqlite3.h",
+    ],
+    hdrs = [":headers"],
+    copts = sqlite_copts,
+    includes = include_sqlite,
+    visibility = ["//visibility:public"],
+)
+
+# ################################
+# @perfetto_dep_sqlite_src section
+# ################################
+
+cc_library(
+    name = "percentile_ext",
+    srcs = [
+        "ext/misc/percentile.c",
+    ],
+    copts = sqlite_copts,
+    includes = include_sqlite,
+    visibility = ["//visibility:public"],
+)
diff --git a/bazel/standalone/README.md b/bazel/standalone/README.md
new file mode 100644
index 0000000..6b549b3
--- /dev/null
+++ b/bazel/standalone/README.md
@@ -0,0 +1,25 @@
+# Perfetto standalone Bazel config
+
+This directory is only used in standalone builds.
+The WORKSPACE aliases this directory to @perfetto_cfg.
+
+Bazel-based embedders are supposed to:
+
+### 1. Have a (modified) copy of perfetto_cfg.bzl in their repo
+
+```
+myproject/
+  build/
+    perfetto_overrides/
+      perfetto_cfg.bzl
+```
+
+### 2. Have a repository rule that maps the directory to @perfetto_cfg
+
+E.g in myproject/WORKSPACE
+```
+local_repository(
+    name = "perfetto_cfg",
+    path = "build/perfetto_overrides",
+)
+```
diff --git a/bazel/standalone/perfetto_cfg.bzl b/bazel/standalone/perfetto_cfg.bzl
new file mode 100644
index 0000000..bcc71d7
--- /dev/null
+++ b/bazel/standalone/perfetto_cfg.bzl
@@ -0,0 +1,52 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+PERFETTO_CONFIG = struct(
+    # This is used to refer to deps within perfetto's BUILD files.
+    # In standalone and bazel-based embedders use '//', because perfetto has its
+    # own repository, and //xxx would be relative to @perfetto//xxx.
+    # In Google internal builds, instead, this is set to //third_party/perfetto,
+    # because perfetto doesn't have its own repository there.
+    root = "//",
+
+    # These variables map dependencies to perfetto third-party projects. This is
+    # to allow perfetto embedders (e.g. gapid) and google internal builds to
+    # override paths and target names to their own third_party.
+    deps = struct(
+        zlib = ["@perfetto_dep_zlib//:zlib"],
+        jsoncpp = ["@perfetto_dep_jsoncpp//:jsoncpp"],
+        linenoise = ["@perfetto_dep_linenoise//:linenoise"],
+        sqlite = ["@perfetto_dep_sqlite//:sqlite"],
+        sqlite_ext_percentile = ["@perfetto_dep_sqlite_src//:percentile_ext"],
+        protoc = ["@com_google_protobuf//:protoc"],
+        protoc_lib = ["@com_google_protobuf//:protoc_lib"],
+        protobuf_lite = ["@com_google_protobuf//:protobuf_lite"],
+        protobuf_full = ["@com_google_protobuf//:protobuf"],
+    ),
+
+    # This struct allows the embedder to customize copts and other args passed
+    # to rules like cc_binary. Prefixed rules (e.g. perfetto_cc_binary) will
+    # look into this struct before falling back on native.cc_binary().
+    # This field is completely optional, the embedder can omit the whole
+    # |rule_overrides| or invidivual keys. They are assigned to None here just
+    # for documentation purposes.
+    rule_overrides = struct(
+        cc_binary = None,
+        cc_library = None,
+        cc_proto_library = None,
+        java_proto_library = None,
+        proto_library = None,
+        py_binary = None,
+    ),
+)
diff --git a/bazel/zlib.BUILD b/bazel/zlib.BUILD
new file mode 100644
index 0000000..1557352
--- /dev/null
+++ b/bazel/zlib.BUILD
@@ -0,0 +1,54 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cc_library(
+    name = "zlib",
+    srcs = [
+        "src/adler32.c",
+        "src/compress.c",
+        "src/crc32.c",
+        "src/crc32.h",
+        "src/deflate.c",
+        "src/deflate.h",
+        "src/gzclose.c",
+        "src/gzguts.h",
+        "src/gzlib.c",
+        "src/gzread.c",
+        "src/gzwrite.c",
+        "src/infback.c",
+        "src/inffast.c",
+        "src/inffast.h",
+        "src/inffixed.h",
+        "src/inflate.c",
+        "src/inflate.h",
+        "src/inftrees.c",
+        "src/inftrees.h",
+        "src/trees.c",
+        "src/trees.h",
+        "src/uncompr.c",
+        "src/zconf.h",
+        "src/zlib.h",
+        "src/zutil.c",
+        "src/zutil.h",
+    ],
+    hdrs = [
+        "zlib.h",
+    ],
+    copts = [
+        "-DHAVE_HIDDEN",
+        "-Isrc",
+    ],
+    includes = ["zlib"],
+    visibility = ["//visibility:public"],
+)
diff --git a/protos/BUILD b/protos/BUILD
deleted file mode 100644
index 25b1514..0000000
--- a/protos/BUILD
+++ /dev/null
@@ -1,1920 +0,0 @@
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# This file is automatically generated by tools/gen_bazel. Do not edit.
-
-load("//tools/build_defs/proto/cpp:cc_proto_library.bzl", "cc_proto_library")
-load("//tools/build_defs/proto:descriptor_set.bzl", "transitive_descriptor_set")
-load("//third_party/perfetto/google:build_defs.bzl", "pbzero_cc_proto_library")
-
-package(default_visibility = ["//third_party/perfetto:__subpackages__"])
-
-licenses(["notice"])  # Apache 2.0
-
-exports_files(["LICENSE"])
-
-# GN target: //protos/perfetto/common:lite_gen
-proto_library(
-    name = "common",
-    srcs = [
-        "perfetto/common/android_log_constants.proto",
-        "perfetto/common/commit_data_request.proto",
-        "perfetto/common/data_source_descriptor.proto",
-        "perfetto/common/descriptor.proto",
-        "perfetto/common/gpu_counter_descriptor.proto",
-        "perfetto/common/observable_events.proto",
-        "perfetto/common/sys_stats_counters.proto",
-        "perfetto/common/trace_stats.proto",
-        "perfetto/common/tracing_service_state.proto",
-        "perfetto/common/track_event_descriptor.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/common:lite_gen
-cc_proto_library(
-    name = "common_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/common:lite_gen
-java_proto_library(
-    name = "common_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/common:zero_gen
-proto_library(
-    name = "common_zero",
-    srcs = [
-        "perfetto/common/android_log_constants.proto",
-        "perfetto/common/commit_data_request.proto",
-        "perfetto/common/data_source_descriptor.proto",
-        "perfetto/common/descriptor.proto",
-        "perfetto/common/gpu_counter_descriptor.proto",
-        "perfetto/common/observable_events.proto",
-        "perfetto/common/sys_stats_counters.proto",
-        "perfetto/common/trace_stats.proto",
-        "perfetto/common/tracing_service_state.proto",
-        "perfetto/common/track_event_descriptor.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/common:zero_gen
-pbzero_cc_proto_library(
-    name = "common_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:common_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config:lite_gen
-proto_library(
-    name = "config",
-    srcs = [
-        "perfetto/config/chrome/chrome_config.proto",
-        "perfetto/config/data_source_config.proto",
-        "perfetto/config/test_config.proto",
-        "perfetto/config/trace_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-        "//third_party/perfetto/protos:config_android",
-        "//third_party/perfetto/protos:config_ftrace",
-        "//third_party/perfetto/protos:config_gpu",
-        "//third_party/perfetto/protos:config_inode_file",
-        "//third_party/perfetto/protos:config_power",
-        "//third_party/perfetto/protos:config_process_stats",
-        "//third_party/perfetto/protos:config_profiling",
-        "//third_party/perfetto/protos:config_sys_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/config/android:lite_gen
-proto_library(
-    name = "config_android",
-    srcs = [
-        "perfetto/config/android/android_log_config.proto",
-        "perfetto/config/android/packages_list_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/config/android:lite_gen
-cc_proto_library(
-    name = "config_android_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_android",
-    ],
-)
-
-# GN target: //protos/perfetto/config/android:lite_gen
-java_proto_library(
-    name = "config_android_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_android",
-    ],
-)
-
-# GN target: //protos/perfetto/config/android:zero_gen
-proto_library(
-    name = "config_android_zero",
-    srcs = [
-        "perfetto/config/android/android_log_config.proto",
-        "perfetto/config/android/packages_list_config.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/android:zero_gen
-pbzero_cc_proto_library(
-    name = "config_android_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_android_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config:lite_gen
-cc_proto_library(
-    name = "config_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config",
-    ],
-)
-
-# GN target: //protos/perfetto/config/ftrace:lite_gen
-proto_library(
-    name = "config_ftrace",
-    srcs = [
-        "perfetto/config/ftrace/ftrace_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config/ftrace:lite_gen
-cc_proto_library(
-    name = "config_ftrace_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_ftrace",
-    ],
-)
-
-# GN target: //protos/perfetto/config/ftrace:lite_gen
-java_proto_library(
-    name = "config_ftrace_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_ftrace",
-    ],
-)
-
-# GN target: //protos/perfetto/config/ftrace:zero_gen
-proto_library(
-    name = "config_ftrace_zero",
-    srcs = [
-        "perfetto/config/ftrace/ftrace_config.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/config/ftrace:zero_gen
-pbzero_cc_proto_library(
-    name = "config_ftrace_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_ftrace_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/gpu:lite_gen
-proto_library(
-    name = "config_gpu",
-    srcs = [
-        "perfetto/config/gpu/gpu_counter_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config/gpu:lite_gen
-cc_proto_library(
-    name = "config_gpu_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_gpu",
-    ],
-)
-
-# GN target: //protos/perfetto/config/gpu:lite_gen
-java_proto_library(
-    name = "config_gpu_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_gpu",
-    ],
-)
-
-# GN target: //protos/perfetto/config/gpu:zero_gen
-proto_library(
-    name = "config_gpu_zero",
-    srcs = [
-        "perfetto/config/gpu/gpu_counter_config.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/config/gpu:zero_gen
-pbzero_cc_proto_library(
-    name = "config_gpu_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_gpu_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/inode_file:lite_gen
-proto_library(
-    name = "config_inode_file",
-    srcs = [
-        "perfetto/config/inode_file/inode_file_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config/inode_file:lite_gen
-cc_proto_library(
-    name = "config_inode_file_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_inode_file",
-    ],
-)
-
-# GN target: //protos/perfetto/config/inode_file:lite_gen
-java_proto_library(
-    name = "config_inode_file_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_inode_file",
-    ],
-)
-
-# GN target: //protos/perfetto/config/inode_file:zero_gen
-proto_library(
-    name = "config_inode_file_zero",
-    srcs = [
-        "perfetto/config/inode_file/inode_file_config.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/config/inode_file:zero_gen
-pbzero_cc_proto_library(
-    name = "config_inode_file_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_inode_file_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config:lite_gen
-java_proto_library(
-    name = "config_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config",
-    ],
-)
-
-# GN target: //protos/perfetto/config:merged_config_gen
-proto_library(
-    name = "config_merged_config_gen",
-    srcs = [
-        "perfetto/config/perfetto_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config:merged_config_gen
-cc_proto_library(
-    name = "config_merged_config_gen_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_merged_config_gen",
-    ],
-)
-
-# GN target: //protos/perfetto/config:merged_config_gen
-java_proto_library(
-    name = "config_merged_config_gen_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_merged_config_gen",
-    ],
-)
-
-# GN target: //protos/perfetto/config/power:lite_gen
-proto_library(
-    name = "config_power",
-    srcs = [
-        "perfetto/config/power/android_power_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config/power:lite_gen
-cc_proto_library(
-    name = "config_power_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_power",
-    ],
-)
-
-# GN target: //protos/perfetto/config/power:lite_gen
-java_proto_library(
-    name = "config_power_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_power",
-    ],
-)
-
-# GN target: //protos/perfetto/config/power:zero_gen
-proto_library(
-    name = "config_power_zero",
-    srcs = [
-        "perfetto/config/power/android_power_config.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/config/power:zero_gen
-pbzero_cc_proto_library(
-    name = "config_power_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_power_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/process_stats:lite_gen
-proto_library(
-    name = "config_process_stats",
-    srcs = [
-        "perfetto/config/process_stats/process_stats_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config/process_stats:lite_gen
-cc_proto_library(
-    name = "config_process_stats_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_process_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/config/process_stats:lite_gen
-java_proto_library(
-    name = "config_process_stats_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_process_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/config/process_stats:zero_gen
-proto_library(
-    name = "config_process_stats_zero",
-    srcs = [
-        "perfetto/config/process_stats/process_stats_config.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/config/process_stats:zero_gen
-pbzero_cc_proto_library(
-    name = "config_process_stats_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_process_stats_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/profiling:lite_gen
-proto_library(
-    name = "config_profiling",
-    srcs = [
-        "perfetto/config/profiling/heapprofd_config.proto",
-        "perfetto/config/profiling/java_hprof_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/config/profiling:lite_gen
-cc_proto_library(
-    name = "config_profiling_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_profiling",
-    ],
-)
-
-# GN target: //protos/perfetto/config/profiling:lite_gen
-java_proto_library(
-    name = "config_profiling_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_profiling",
-    ],
-)
-
-# GN target: //protos/perfetto/config/profiling:zero_gen
-proto_library(
-    name = "config_profiling_zero",
-    srcs = [
-        "perfetto/config/profiling/heapprofd_config.proto",
-        "perfetto/config/profiling/java_hprof_config.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/config/profiling:zero_gen
-pbzero_cc_proto_library(
-    name = "config_profiling_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_profiling_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/sys_stats:lite_gen
-proto_library(
-    name = "config_sys_stats",
-    srcs = [
-        "perfetto/config/sys_stats/sys_stats_config.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/config/sys_stats:lite_gen
-cc_proto_library(
-    name = "config_sys_stats_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_sys_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/config/sys_stats:lite_gen
-java_proto_library(
-    name = "config_sys_stats_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:config_sys_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/config/sys_stats:zero_gen
-proto_library(
-    name = "config_sys_stats_zero",
-    srcs = [
-        "perfetto/config/sys_stats/sys_stats_config.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/config/sys_stats:zero_gen
-pbzero_cc_proto_library(
-    name = "config_sys_stats_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_sys_stats_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/config:zero_gen
-proto_library(
-    name = "config_zero",
-    srcs = [
-        "perfetto/config/chrome/chrome_config.proto",
-        "perfetto/config/data_source_config.proto",
-        "perfetto/config/test_config.proto",
-        "perfetto/config/trace_config.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-        "//third_party/perfetto/protos:config_android_zero",
-        "//third_party/perfetto/protos:config_ftrace_zero",
-        "//third_party/perfetto/protos:config_gpu_zero",
-        "//third_party/perfetto/protos:config_inode_file_zero",
-        "//third_party/perfetto/protos:config_power_zero",
-        "//third_party/perfetto/protos:config_process_stats_zero",
-        "//third_party/perfetto/protos:config_profiling_zero",
-        "//third_party/perfetto/protos:config_sys_stats_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/config:zero_gen
-pbzero_cc_proto_library(
-    name = "config_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:config_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics:lite_gen
-proto_library(
-    name = "metrics",
-    srcs = [
-        "perfetto/metrics/metrics.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:metrics_android",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics/android:lite_gen
-proto_library(
-    name = "metrics_android",
-    srcs = [
-        "perfetto/metrics/android/batt_metric.proto",
-        "perfetto/metrics/android/cpu_metric.proto",
-        "perfetto/metrics/android/heap_profile_callsite_stats.proto",
-        "perfetto/metrics/android/ion_metric.proto",
-        "perfetto/metrics/android/lmk_metric.proto",
-        "perfetto/metrics/android/mem_metric.proto",
-        "perfetto/metrics/android/mem_unagg_metric.proto",
-        "perfetto/metrics/android/package_list.proto",
-        "perfetto/metrics/android/powrails_metric.proto",
-        "perfetto/metrics/android/process_growth.proto",
-        "perfetto/metrics/android/startup_metric.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics/android:lite_gen
-cc_proto_library(
-    name = "metrics_android_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:metrics_android",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics/android:lite_gen
-java_proto_library(
-    name = "metrics_android_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:metrics_android",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics/android:zero_gen
-proto_library(
-    name = "metrics_android_zero",
-    srcs = [
-        "perfetto/metrics/android/batt_metric.proto",
-        "perfetto/metrics/android/cpu_metric.proto",
-        "perfetto/metrics/android/heap_profile_callsite_stats.proto",
-        "perfetto/metrics/android/ion_metric.proto",
-        "perfetto/metrics/android/lmk_metric.proto",
-        "perfetto/metrics/android/mem_metric.proto",
-        "perfetto/metrics/android/mem_unagg_metric.proto",
-        "perfetto/metrics/android/package_list.proto",
-        "perfetto/metrics/android/powrails_metric.proto",
-        "perfetto/metrics/android/process_growth.proto",
-        "perfetto/metrics/android/startup_metric.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics/android:zero_gen
-pbzero_cc_proto_library(
-    name = "metrics_android_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:metrics_android_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics:lite_gen
-cc_proto_library(
-    name = "metrics_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:metrics",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics:lite_gen
-java_proto_library(
-    name = "metrics_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:metrics",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics:zero_gen
-proto_library(
-    name = "metrics_zero",
-    srcs = [
-        "perfetto/metrics/metrics.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:metrics_android_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/metrics:zero_gen
-pbzero_cc_proto_library(
-    name = "metrics_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:metrics_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/third_party/pprof:lite_gen
-proto_library(
-    name = "protos_third_party_pprof",
-    srcs = [
-        "third_party/pprof/profile.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/third_party/pprof:lite_gen
-cc_proto_library(
-    name = "protos_third_party_pprof_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:protos_third_party_pprof",
-    ],
-)
-
-# GN target: //protos/third_party/pprof:lite_gen
-java_proto_library(
-    name = "protos_third_party_pprof_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:protos_third_party_pprof",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/android:lite_gen
-proto_library(
-    name = "trace_android",
-    srcs = [
-        "perfetto/trace/android/android_log.proto",
-        "perfetto/trace/android/graphics_frame_event.proto",
-        "perfetto/trace/android/packages_list.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/android:lite_gen
-cc_proto_library(
-    name = "trace_android_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_android",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/android:lite_gen
-java_proto_library(
-    name = "trace_android_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_android",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/android:zero_gen
-proto_library(
-    name = "trace_android_zero",
-    srcs = [
-        "perfetto/trace/android/android_log.proto",
-        "perfetto/trace/android/graphics_frame_event.proto",
-        "perfetto/trace/android/packages_list.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/android:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_android_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_android_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/appended_data:lite_gen
-proto_library(
-    name = "trace_appended_data",
-    srcs = [
-        "perfetto/trace/appended_data/appended_data.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_profiling",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/appended_data:lite_gen
-cc_proto_library(
-    name = "trace_appended_data_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_appended_data",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/appended_data:lite_gen
-java_proto_library(
-    name = "trace_appended_data_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_appended_data",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/appended_data:zero_gen
-proto_library(
-    name = "trace_appended_data_zero",
-    srcs = [
-        "perfetto/trace/appended_data/appended_data.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_profiling_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/appended_data:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_appended_data_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_appended_data_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/chrome:lite_gen
-proto_library(
-    name = "trace_chrome",
-    srcs = [
-        "perfetto/trace/chrome/chrome_benchmark_metadata.proto",
-        "perfetto/trace/chrome/chrome_metadata.proto",
-        "perfetto/trace/chrome/chrome_trace_event.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/chrome:lite_gen
-cc_proto_library(
-    name = "trace_chrome_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_chrome",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/chrome:lite_gen
-java_proto_library(
-    name = "trace_chrome_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_chrome",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/chrome:zero_gen
-proto_library(
-    name = "trace_chrome_zero",
-    srcs = [
-        "perfetto/trace/chrome/chrome_benchmark_metadata.proto",
-        "perfetto/trace/chrome/chrome_metadata.proto",
-        "perfetto/trace/chrome/chrome_trace_event.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/chrome:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_chrome_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_chrome_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/filesystem:lite_gen
-proto_library(
-    name = "trace_filesystem",
-    srcs = [
-        "perfetto/trace/filesystem/inode_file_map.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/filesystem:lite_gen
-cc_proto_library(
-    name = "trace_filesystem_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_filesystem",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/filesystem:lite_gen
-java_proto_library(
-    name = "trace_filesystem_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_filesystem",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/filesystem:zero_gen
-proto_library(
-    name = "trace_filesystem_zero",
-    srcs = [
-        "perfetto/trace/filesystem/inode_file_map.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/filesystem:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_filesystem_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_filesystem_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ftrace:lite_gen
-proto_library(
-    name = "trace_ftrace",
-    srcs = [
-        "perfetto/trace/ftrace/binder.proto",
-        "perfetto/trace/ftrace/block.proto",
-        "perfetto/trace/ftrace/cgroup.proto",
-        "perfetto/trace/ftrace/clk.proto",
-        "perfetto/trace/ftrace/compaction.proto",
-        "perfetto/trace/ftrace/ext4.proto",
-        "perfetto/trace/ftrace/f2fs.proto",
-        "perfetto/trace/ftrace/fence.proto",
-        "perfetto/trace/ftrace/filemap.proto",
-        "perfetto/trace/ftrace/ftrace.proto",
-        "perfetto/trace/ftrace/ftrace_event.proto",
-        "perfetto/trace/ftrace/ftrace_event_bundle.proto",
-        "perfetto/trace/ftrace/ftrace_stats.proto",
-        "perfetto/trace/ftrace/generic.proto",
-        "perfetto/trace/ftrace/i2c.proto",
-        "perfetto/trace/ftrace/ipi.proto",
-        "perfetto/trace/ftrace/irq.proto",
-        "perfetto/trace/ftrace/kmem.proto",
-        "perfetto/trace/ftrace/lowmemorykiller.proto",
-        "perfetto/trace/ftrace/mdss.proto",
-        "perfetto/trace/ftrace/mm_event.proto",
-        "perfetto/trace/ftrace/oom.proto",
-        "perfetto/trace/ftrace/power.proto",
-        "perfetto/trace/ftrace/raw_syscalls.proto",
-        "perfetto/trace/ftrace/regulator.proto",
-        "perfetto/trace/ftrace/sched.proto",
-        "perfetto/trace/ftrace/signal.proto",
-        "perfetto/trace/ftrace/sync.proto",
-        "perfetto/trace/ftrace/systrace.proto",
-        "perfetto/trace/ftrace/task.proto",
-        "perfetto/trace/ftrace/test_bundle_wrapper.proto",
-        "perfetto/trace/ftrace/vmscan.proto",
-        "perfetto/trace/ftrace/workqueue.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ftrace:lite_gen
-cc_proto_library(
-    name = "trace_ftrace_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_ftrace",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ftrace:lite_gen
-java_proto_library(
-    name = "trace_ftrace_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_ftrace",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ftrace:zero_gen
-proto_library(
-    name = "trace_ftrace_zero",
-    srcs = [
-        "perfetto/trace/ftrace/binder.proto",
-        "perfetto/trace/ftrace/block.proto",
-        "perfetto/trace/ftrace/cgroup.proto",
-        "perfetto/trace/ftrace/clk.proto",
-        "perfetto/trace/ftrace/compaction.proto",
-        "perfetto/trace/ftrace/ext4.proto",
-        "perfetto/trace/ftrace/f2fs.proto",
-        "perfetto/trace/ftrace/fence.proto",
-        "perfetto/trace/ftrace/filemap.proto",
-        "perfetto/trace/ftrace/ftrace.proto",
-        "perfetto/trace/ftrace/ftrace_event.proto",
-        "perfetto/trace/ftrace/ftrace_event_bundle.proto",
-        "perfetto/trace/ftrace/ftrace_stats.proto",
-        "perfetto/trace/ftrace/generic.proto",
-        "perfetto/trace/ftrace/i2c.proto",
-        "perfetto/trace/ftrace/ipi.proto",
-        "perfetto/trace/ftrace/irq.proto",
-        "perfetto/trace/ftrace/kmem.proto",
-        "perfetto/trace/ftrace/lowmemorykiller.proto",
-        "perfetto/trace/ftrace/mdss.proto",
-        "perfetto/trace/ftrace/mm_event.proto",
-        "perfetto/trace/ftrace/oom.proto",
-        "perfetto/trace/ftrace/power.proto",
-        "perfetto/trace/ftrace/raw_syscalls.proto",
-        "perfetto/trace/ftrace/regulator.proto",
-        "perfetto/trace/ftrace/sched.proto",
-        "perfetto/trace/ftrace/signal.proto",
-        "perfetto/trace/ftrace/sync.proto",
-        "perfetto/trace/ftrace/systrace.proto",
-        "perfetto/trace/ftrace/task.proto",
-        "perfetto/trace/ftrace/test_bundle_wrapper.proto",
-        "perfetto/trace/ftrace/vmscan.proto",
-        "perfetto/trace/ftrace/workqueue.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ftrace:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_ftrace_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_ftrace_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/gpu:lite_gen
-proto_library(
-    name = "trace_gpu",
-    srcs = [
-        "perfetto/trace/gpu/gpu_counter_event.proto",
-        "perfetto/trace/gpu/gpu_render_stage_event.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/gpu:lite_gen
-cc_proto_library(
-    name = "trace_gpu_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_gpu",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/gpu:lite_gen
-java_proto_library(
-    name = "trace_gpu_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_gpu",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/gpu:zero_gen
-proto_library(
-    name = "trace_gpu_zero",
-    srcs = [
-        "perfetto/trace/gpu/gpu_counter_event.proto",
-        "perfetto/trace/gpu/gpu_render_stage_event.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/gpu:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_gpu_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_gpu_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/interned_data:lite_gen
-proto_library(
-    name = "trace_interned_data",
-    srcs = [
-        "perfetto/trace/interned_data/interned_data.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_profiling",
-        "//third_party/perfetto/protos:trace_track_event",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/interned_data:lite_gen
-cc_proto_library(
-    name = "trace_interned_data_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_interned_data",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/interned_data:lite_gen
-java_proto_library(
-    name = "trace_interned_data_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_interned_data",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/interned_data:zero_gen
-proto_library(
-    name = "trace_interned_data_zero",
-    srcs = [
-        "perfetto/trace/interned_data/interned_data.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_profiling_zero",
-        "//third_party/perfetto/protos:trace_track_event_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/interned_data:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_interned_data_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_interned_data_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:merged_trace_gen
-proto_library(
-    name = "trace_merged_trace_gen",
-    srcs = [
-        "perfetto/trace/perfetto_trace.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:merged_trace_gen
-cc_proto_library(
-    name = "trace_merged_trace_gen_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_merged_trace_gen",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:merged_trace_gen
-java_proto_library(
-    name = "trace_merged_trace_gen_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_merged_trace_gen",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:minimal_lite_gen
-proto_library(
-    name = "trace_minimal",
-    srcs = [
-        "perfetto/trace/clock_snapshot.proto",
-        "perfetto/trace/system_info.proto",
-        "perfetto/trace/trigger.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-        "//third_party/perfetto/protos:config",
-        "//third_party/perfetto/protos:config_android",
-        "//third_party/perfetto/protos:config_ftrace",
-        "//third_party/perfetto/protos:config_gpu",
-        "//third_party/perfetto/protos:config_inode_file",
-        "//third_party/perfetto/protos:config_power",
-        "//third_party/perfetto/protos:config_process_stats",
-        "//third_party/perfetto/protos:config_profiling",
-        "//third_party/perfetto/protos:config_sys_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:minimal_lite_gen
-cc_proto_library(
-    name = "trace_minimal_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_minimal",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:minimal_lite_gen
-java_proto_library(
-    name = "trace_minimal_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_minimal",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:minimal_zero_gen
-proto_library(
-    name = "trace_minimal_zero",
-    srcs = [
-        "perfetto/trace/clock_snapshot.proto",
-        "perfetto/trace/system_info.proto",
-        "perfetto/trace/trigger.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-        "//third_party/perfetto/protos:config_android_zero",
-        "//third_party/perfetto/protos:config_ftrace_zero",
-        "//third_party/perfetto/protos:config_gpu_zero",
-        "//third_party/perfetto/protos:config_inode_file_zero",
-        "//third_party/perfetto/protos:config_power_zero",
-        "//third_party/perfetto/protos:config_process_stats_zero",
-        "//third_party/perfetto/protos:config_profiling_zero",
-        "//third_party/perfetto/protos:config_sys_stats_zero",
-        "//third_party/perfetto/protos:config_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:minimal_zero_gen
-pbzero_cc_proto_library(
-    name = "trace_minimal_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_minimal_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:non_minimal_lite_gen
-proto_library(
-    name = "trace_non_minimal",
-    srcs = [
-        "perfetto/trace/test_event.proto",
-        "perfetto/trace/trace.proto",
-        "perfetto/trace/trace_packet.proto",
-        "perfetto/trace/trace_packet_defaults.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-        "//third_party/perfetto/protos:config",
-        "//third_party/perfetto/protos:config_android",
-        "//third_party/perfetto/protos:config_ftrace",
-        "//third_party/perfetto/protos:config_gpu",
-        "//third_party/perfetto/protos:config_inode_file",
-        "//third_party/perfetto/protos:config_power",
-        "//third_party/perfetto/protos:config_process_stats",
-        "//third_party/perfetto/protos:config_profiling",
-        "//third_party/perfetto/protos:config_sys_stats",
-        "//third_party/perfetto/protos:trace_android",
-        "//third_party/perfetto/protos:trace_appended_data",
-        "//third_party/perfetto/protos:trace_chrome",
-        "//third_party/perfetto/protos:trace_filesystem",
-        "//third_party/perfetto/protos:trace_ftrace",
-        "//third_party/perfetto/protos:trace_gpu",
-        "//third_party/perfetto/protos:trace_interned_data",
-        "//third_party/perfetto/protos:trace_minimal",
-        "//third_party/perfetto/protos:trace_perfetto",
-        "//third_party/perfetto/protos:trace_power",
-        "//third_party/perfetto/protos:trace_profiling",
-        "//third_party/perfetto/protos:trace_ps",
-        "//third_party/perfetto/protos:trace_sys_stats",
-        "//third_party/perfetto/protos:trace_track_event",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:non_minimal_lite_gen
-cc_proto_library(
-    name = "trace_non_minimal_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_non_minimal",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:non_minimal_lite_gen
-java_proto_library(
-    name = "trace_non_minimal_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_non_minimal",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:non_minimal_zero_gen
-proto_library(
-    name = "trace_non_minimal_zero",
-    srcs = [
-        "perfetto/trace/test_event.proto",
-        "perfetto/trace/trace.proto",
-        "perfetto/trace/trace_packet.proto",
-        "perfetto/trace/trace_packet_defaults.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-        "//third_party/perfetto/protos:config_android_zero",
-        "//third_party/perfetto/protos:config_ftrace_zero",
-        "//third_party/perfetto/protos:config_gpu_zero",
-        "//third_party/perfetto/protos:config_inode_file_zero",
-        "//third_party/perfetto/protos:config_power_zero",
-        "//third_party/perfetto/protos:config_process_stats_zero",
-        "//third_party/perfetto/protos:config_profiling_zero",
-        "//third_party/perfetto/protos:config_sys_stats_zero",
-        "//third_party/perfetto/protos:config_zero",
-        "//third_party/perfetto/protos:trace_android_zero",
-        "//third_party/perfetto/protos:trace_appended_data_zero",
-        "//third_party/perfetto/protos:trace_chrome_zero",
-        "//third_party/perfetto/protos:trace_filesystem_zero",
-        "//third_party/perfetto/protos:trace_ftrace_zero",
-        "//third_party/perfetto/protos:trace_gpu_zero",
-        "//third_party/perfetto/protos:trace_interned_data_zero",
-        "//third_party/perfetto/protos:trace_minimal_zero",
-        "//third_party/perfetto/protos:trace_perfetto_zero",
-        "//third_party/perfetto/protos:trace_power_zero",
-        "//third_party/perfetto/protos:trace_profiling_zero",
-        "//third_party/perfetto/protos:trace_ps_zero",
-        "//third_party/perfetto/protos:trace_sys_stats_zero",
-        "//third_party/perfetto/protos:trace_track_event_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace:non_minimal_zero_gen
-pbzero_cc_proto_library(
-    name = "trace_non_minimal_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_non_minimal_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/perfetto:lite_gen
-proto_library(
-    name = "trace_perfetto",
-    srcs = [
-        "perfetto/trace/perfetto/perfetto_metatrace.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/perfetto:lite_gen
-cc_proto_library(
-    name = "trace_perfetto_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_perfetto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/perfetto:lite_gen
-java_proto_library(
-    name = "trace_perfetto_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_perfetto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/perfetto:zero_gen
-proto_library(
-    name = "trace_perfetto_zero",
-    srcs = [
-        "perfetto/trace/perfetto/perfetto_metatrace.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/perfetto:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_perfetto_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_perfetto_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/power:lite_gen
-proto_library(
-    name = "trace_power",
-    srcs = [
-        "perfetto/trace/power/battery_counters.proto",
-        "perfetto/trace/power/power_rails.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/power:lite_gen
-cc_proto_library(
-    name = "trace_power_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_power",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/power:lite_gen
-java_proto_library(
-    name = "trace_power_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_power",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/power:zero_gen
-proto_library(
-    name = "trace_power_zero",
-    srcs = [
-        "perfetto/trace/power/battery_counters.proto",
-        "perfetto/trace/power/power_rails.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/power:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_power_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_power_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace_processor:lite_gen
-proto_library(
-    name = "trace_processor",
-    srcs = [
-        "perfetto/trace_processor/raw_query.proto",
-        "perfetto/trace_processor/trace_processor.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace_processor:lite_gen
-cc_proto_library(
-    name = "trace_processor_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_processor",
-    ],
-)
-
-# GN target: //protos/perfetto/trace_processor:lite_gen
-java_proto_library(
-    name = "trace_processor_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_processor",
-    ],
-)
-
-# GN target: //protos/perfetto/trace_processor:metrics_impl_zero_gen
-proto_library(
-    name = "trace_processor_metrics_impl_zero",
-    srcs = [
-        "perfetto/trace_processor/metrics_impl.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace_processor:metrics_impl_zero_gen
-pbzero_cc_proto_library(
-    name = "trace_processor_metrics_impl_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_processor_metrics_impl_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/profiling:lite_gen
-proto_library(
-    name = "trace_profiling",
-    srcs = [
-        "perfetto/trace/profiling/heap_graph.proto",
-        "perfetto/trace/profiling/profile_common.proto",
-        "perfetto/trace/profiling/profile_packet.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/profiling:lite_gen
-cc_proto_library(
-    name = "trace_profiling_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_profiling",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/profiling:lite_gen
-java_proto_library(
-    name = "trace_profiling_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_profiling",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/profiling:zero_gen
-proto_library(
-    name = "trace_profiling_zero",
-    srcs = [
-        "perfetto/trace/profiling/heap_graph.proto",
-        "perfetto/trace/profiling/profile_common.proto",
-        "perfetto/trace/profiling/profile_packet.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/profiling:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_profiling_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_profiling_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ps:lite_gen
-proto_library(
-    name = "trace_ps",
-    srcs = [
-        "perfetto/trace/ps/process_stats.proto",
-        "perfetto/trace/ps/process_tree.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ps:lite_gen
-cc_proto_library(
-    name = "trace_ps_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_ps",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ps:lite_gen
-java_proto_library(
-    name = "trace_ps_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_ps",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ps:zero_gen
-proto_library(
-    name = "trace_ps_zero",
-    srcs = [
-        "perfetto/trace/ps/process_stats.proto",
-        "perfetto/trace/ps/process_tree.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/ps:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_ps_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_ps_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/sys_stats:lite_gen
-proto_library(
-    name = "trace_sys_stats",
-    srcs = [
-        "perfetto/trace/sys_stats/sys_stats.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/sys_stats:lite_gen
-cc_proto_library(
-    name = "trace_sys_stats_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_sys_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/sys_stats:lite_gen
-java_proto_library(
-    name = "trace_sys_stats_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_sys_stats",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/sys_stats:zero_gen
-proto_library(
-    name = "trace_sys_stats_zero",
-    srcs = [
-        "perfetto/trace/sys_stats/sys_stats.proto",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:common_zero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/sys_stats:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_sys_stats_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_sys_stats_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/track_event:lite_gen
-proto_library(
-    name = "trace_track_event",
-    srcs = [
-        "perfetto/trace/track_event/debug_annotation.proto",
-        "perfetto/trace/track_event/log_message.proto",
-        "perfetto/trace/track_event/process_descriptor.proto",
-        "perfetto/trace/track_event/source_location.proto",
-        "perfetto/trace/track_event/task_execution.proto",
-        "perfetto/trace/track_event/thread_descriptor.proto",
-        "perfetto/trace/track_event/track_descriptor.proto",
-        "perfetto/trace/track_event/track_event.proto",
-    ],
-    has_services = 1,
-    cc_api_version = 2,
-    cc_generic_services = 1,
-    visibility = [
-        "//visibility:public",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/track_event:lite_gen
-cc_proto_library(
-    name = "trace_track_event_cc_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_track_event",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/track_event:lite_gen
-java_proto_library(
-    name = "trace_track_event_java_proto",
-    visibility = [
-        "//visibility:public",
-    ],
-    deps = [
-        "//third_party/perfetto/protos:trace_track_event",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/track_event:zero_gen
-proto_library(
-    name = "trace_track_event_zero",
-    srcs = [
-        "perfetto/trace/track_event/debug_annotation.proto",
-        "perfetto/trace/track_event/log_message.proto",
-        "perfetto/trace/track_event/process_descriptor.proto",
-        "perfetto/trace/track_event/source_location.proto",
-        "perfetto/trace/track_event/task_execution.proto",
-        "perfetto/trace/track_event/thread_descriptor.proto",
-        "perfetto/trace/track_event/track_descriptor.proto",
-        "perfetto/trace/track_event/track_event.proto",
-    ],
-)
-
-# GN target: //protos/perfetto/trace/track_event:zero_gen
-pbzero_cc_proto_library(
-    name = "trace_track_event_zero_cc_proto",
-    src_proto_library = "//third_party/perfetto/protos:trace_track_event_zero",
-    deps = [
-        "//third_party/perfetto:libprotozero",
-    ],
-)
diff --git a/src/ipc/BUILD.gn b/src/ipc/BUILD.gn
index 12353de..ed0ecd2 100644
--- a/src/ipc/BUILD.gn
+++ b/src/ipc/BUILD.gn
@@ -30,6 +30,7 @@
   ]
   deps = [
     "../../gn:default_deps",
+    "../../gn:protobuf_lite",
     "../../protos/perfetto/ipc:wire_protocol",
     "../base",
   ]
@@ -86,3 +87,12 @@
   proto_in_dir = perfetto_root_path
   proto_out_dir = perfetto_root_path
 }
+
+# This is used by Bazel BUILD rules.
+static_library("perfetto_ipc") {
+  complete_static_lib = true
+  deps = [
+    ":ipc",
+    "../../gn:default_deps",
+  ]
+}
diff --git a/src/trace_processor/tables/BUILD.gn b/src/trace_processor/tables/BUILD.gn
index ba41d12..ab79c88 100644
--- a/src/trace_processor/tables/BUILD.gn
+++ b/src/trace_processor/tables/BUILD.gn
@@ -16,6 +16,7 @@
   sources = [
     "macros.h",
     "macros_internal.h",
+    "profiler_tables.h",
     "slice_tables.h",
     "track_tables.h",
   ]
diff --git a/tools/gen_bazel b/tools/gen_bazel
index 0c2187b..27dee42 100755
--- a/tools/gen_bazel
+++ b/tools/gen_bazel
@@ -25,17 +25,262 @@
 
 from __future__ import print_function
 import argparse
-import functools
 import json
 import os
 import re
 import sys
-import textwrap
 
 import gn_utils
 
-# Copyright header for generated code.
-header = """# Copyright (C) 2019 The Android Open Source Project
+# Arguments for the GN output directory.
+# host_os="linux" is to generate the right build files from Mac OS.
+gn_args = ' '.join([
+    'host_os="linux"',
+    'is_debug=false',
+    'is_perfetto_build_generator=true',
+    'enable_perfetto_watchdog=true',
+    'monolithic_binaries=true',
+    'target_os="linux"',
+])
+
+# Default targets to translate to the blueprint file.
+
+# These targets will be exported with public visibility in the generated BUILD.
+public_targets = [
+    '//src/perfetto_cmd:perfetto',
+    '//src/traced/probes:traced_probes',
+    '//src/traced/service:traced',
+    '//src/trace_processor:trace_processor_shell',
+    '//src/trace_processor:trace_processor',
+    '//tools/trace_to_text:libpprofbuilder',
+]
+
+# These targets are required by internal build rules but don't need to be
+# exported publicly.
+default_targets = [
+    '//src/ipc:perfetto_ipc',
+    '//src/ipc/protoc_plugin:ipc_plugin',
+    '//src/protozero:libprotozero',
+    '//src/protozero/protoc_plugin:protozero_plugin',
+] + public_targets
+
+# Root proto targets (to force discovery of intermediate proto targets).
+proto_targets = [
+    '//protos/perfetto/metrics:lite',
+    '//protos/perfetto/trace:lite',
+    '//protos/perfetto/config:lite',
+]
+
+# The directory where the generated perfetto_build_flags.h will be copied into.
+buildflags_dir = 'include/perfetto/base/build_configs/bazel'
+
+# Internal equivalents for third-party libraries that the upstream project
+# depends on.
+external_deps = {
+    '//gn:default_deps': [],
+    '//gn:jsoncpp': ['PERFETTO_CONFIG.deps.jsoncpp'],
+    '//gn:linenoise': ['PERFETTO_CONFIG.deps.linenoise'],
+    '//gn:protobuf_full': ['PERFETTO_CONFIG.deps.protobuf_full'],
+    '//gn:protobuf_lite': ['PERFETTO_CONFIG.deps.protobuf_lite'],
+    '//gn:protoc_lib': ['PERFETTO_CONFIG.deps.protoc_lib'],
+    '//gn:protoc': ['PERFETTO_CONFIG.deps.protoc'],
+    '//gn:sqlite': [
+        'PERFETTO_CONFIG.deps.sqlite',
+        'PERFETTO_CONFIG.deps.sqlite_ext_percentile'
+    ],
+    '//gn:zlib': ['PERFETTO_CONFIG.deps.zlib'],
+    '//gn/standalone:gen_git_revision': [],
+    '//src/trace_processor/metrics:gen_merged_sql_metrics': [
+        '[ ":cc_merged_sql_metrics" ]'
+    ]
+}
+
+
+def gen_sql_metrics(target):
+  label = BazelLabel(get_bazel_label_name(target.name), 'genrule')
+  label.srcs += [re.sub('^//', '', x) for x in target.inputs]
+  label.outs += target.outputs
+  label.cmd = r'$(location gen_merged_sql_metrics_py) --cpp_out=$@ $(SRCS)'
+  label.tools += [':gen_merged_sql_metrics_py']
+  return [label]
+
+
+custom_actions = {
+    '//src/trace_processor/metrics:gen_merged_sql_metrics': gen_sql_metrics,
+}
+
+# ------------------------------------------------------------------------------
+# End of configuration.
+# ------------------------------------------------------------------------------
+
+
+class Error(Exception):
+  pass
+
+
+class BazelLabel(object):
+
+  def __init__(self, name, type):
+    self.comment = None
+    self.name = name
+    self.type = type
+    self.visibility = []
+    self.srcs = []
+    self.hdrs = []
+    self.deps = []
+    self.external_deps = []
+    self.tools = []
+    self.outs = []
+
+  def __str__(self):
+    """Converts the object into a Bazel Starlark label."""
+    res = ''
+    res += ('# GN target: %s\n' % self.comment) if self.comment else ''
+    res += '%s(\n' % self.type
+    any_deps = len(self.deps) + len(self.external_deps) > 0
+    ORD = ['name', 'srcs', 'hdrs', 'visibility', 'deps', 'outs', 'cmd', 'tools']
+    key_sorter = lambda kv: ORD.index(kv[0]) if kv[0] in ORD else '99-' + kv[0]
+    for k, v in sorted(self.__dict__.iteritems(), key=key_sorter):
+      if k in ('type', 'comment',
+               'external_deps') or v is None or (v == [] and
+                                                 (k != 'deps' or not any_deps)):
+        continue
+      res += '    %s = ' % k
+      if isinstance(v, basestring):
+        res += '"%s",\n' % v
+      elif isinstance(v, list):
+        res += '[\n'
+        for entry in v:
+          res += '        "%s",\n' % entry
+        res += '    ]'
+        if k == 'deps':
+          for edep in self.external_deps:
+            res += '\n    + %s' % edep
+        res += ',\n'
+      else:
+        raise Error('Unsupported value %s', type(v))
+    res += ')\n\n'
+    return res
+
+
+def get_bazel_label_name(gn_name):
+  """Converts a GN target name into a Bazel label name.
+
+  If target is in the public taraget list, returns only the GN target name,
+  e.g.: //src/ipc:perfetto_ipc -> perfetto_ipc
+
+  Otherwise, in the case of an intermediate taraget, returns a mangled path.
+  e.g.:  //include/perfetto/base:base -> include_perfetto_base_base.
+  """
+  if gn_name in default_targets:
+    return gn_utils.label_without_toolchain(gn_name).split(':')[1]
+  return gn_utils.label_to_target_name_with_path(gn_name)
+
+
+def gen_proto_labels(target):
+  """ Generates the xx_proto_library label for proto targets.
+
+  Bazel requires that each protobuf-related target is modeled with two labels:
+  1. A plugin-dependent target (e.g. cc_library, cc_protozero_library) that has
+     only a dependency on 2 and does NOT refer to any .proto sources.
+  2. A plugin-agnostic target that defines only the .proto sources and their
+     dependencies.
+  """
+  assert (target.type == 'proto_library')
+
+  def get_sources_label(target_name):
+    return re.sub('_(lite|zero)$', '',
+                  get_bazel_label_name(target_name)) + '_protos'
+
+  sources_label_name = get_sources_label(target.name)
+
+  # Generates 1.
+  if target.proto_plugin == 'proto':
+    plugin_label_type = 'perfetto_cc_proto_library'
+  elif target.proto_plugin == 'protozero':
+    plugin_label_type = 'perfetto_cc_protozero_library'
+  elif target.proto_plugin == 'ipc':
+    plugin_label_type = 'perfetto_cc_ipc_library'
+  else:
+    raise Error('Unknown proto plugin: %s' % target.proto_plugin)
+  plugin_label_name = get_bazel_label_name(target.name)
+  plugin_label = BazelLabel(plugin_label_name, plugin_label_type)
+  plugin_label.comment = target.name
+  plugin_label.deps += [':' + sources_label_name]
+
+  # Generates 2.
+  sources_label = BazelLabel(sources_label_name, 'perfetto_proto_library')
+  sources_label.comment = target.name
+  assert (all(x.startswith('//') for x in target.sources))
+  assert (all(x.endswith('.proto') for x in target.sources))
+  sources_label.srcs = sorted([x[2:] for x in target.sources])  # Strip //.
+  deps = [':' + get_sources_label(x) for x in target.proto_deps]
+  sources_label.deps = sorted(deps)
+
+  return [plugin_label, sources_label]
+
+
+def gen_target(gn_target):
+  if gn_target.type == 'proto_library':
+    return gen_proto_labels(gn_target)
+  elif gn_target.type == 'action':
+    if gn_target.name in custom_actions:
+      return custom_actions[gn_target.name](gn_target)
+    return []
+  elif gn_target.type == 'group':
+    return []
+  elif gn_target.type == 'executable':
+    bazel_type = 'perfetto_cc_binary'
+  elif gn_target.type == 'shared_library':
+    bazel_type = 'perfetto_cc_binary'
+    vars['linkshared'] = True
+  elif gn_target.type == 'static_library':
+    bazel_type = 'perfetto_cc_library'
+  elif gn_target.type == 'source_set':
+    bazel_type = 'filegroup'
+  else:
+    raise Error('target type not supported: %s' % gn_target.type)
+
+  label = BazelLabel(get_bazel_label_name(gn_target.name), bazel_type)
+  label.comment = gn_target.name
+  label.srcs = [x[2:] for x in gn_target.sources]
+
+  if gn_target.name in public_targets:
+    label.visibility = ['//visibility:public']
+
+  if gn_target.type in gn_utils.LINKER_UNIT_TYPES:
+    # |source_sets| contains the transitive set of source_set deps.
+    for trans_dep in gn_target.source_set_deps:
+      name = ':' + get_bazel_label_name(trans_dep)
+      if name.startswith(
+          ':include_perfetto_') and gn_target.type != 'executable':
+        label.hdrs += [name]
+      else:
+        label.srcs += [name]
+    for dep in gn_target.deps:
+      if dep.startswith('//gn:'):
+        assert (dep in external_deps), dep
+      if dep in external_deps:
+        assert (isinstance(external_deps[dep], list))
+        label.external_deps += external_deps[dep]
+      else:
+        label.deps += [':' + get_bazel_label_name(dep)]
+    label.deps += [':' + get_bazel_label_name(x) for x in gn_target.proto_deps]
+
+  label.deps = sorted(label.deps)
+  label.srcs = sorted(label.srcs)
+  label.hdrs = sorted(label.hdrs)
+  return [label]
+
+
+def gen_target_str(gn_target):
+  return ''.join(str(x) for x in gen_target(gn_target))
+
+
+def generate_build(gn_desc, targets, extras):
+  gn = gn_utils.GnParser(gn_desc)
+  res = '''
+# Copyright (C) 2019 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -50,580 +295,91 @@
 # limitations under the License.
 #
 # This file is automatically generated by {}. Do not edit.
-""".format(__file__)
 
-# Arguments for the GN output directory.
-# host_os="linux" is to generate the right build files from Mac OS.
-gn_args = ' '.join([
-    'host_os="linux"',
-    'is_debug=false',
-    'is_perfetto_build_generator=true',
-    'target_os="linux"',
-])
+load("@perfetto_cfg//:perfetto_cfg.bzl", "PERFETTO_CONFIG")
+load(
+    "@perfetto//bazel:rules.bzl",
+    "perfetto_cc_binary",
+    "perfetto_cc_ipc_library",
+    "perfetto_cc_library",
+    "perfetto_cc_proto_library",
+    "perfetto_cc_protozero_library",
+    "perfetto_proto_library",
+    "perfetto_py_binary",
+)
 
-# Default targets to translate to the blueprint file.
-default_targets = [
-  '//src/trace_processor:trace_processor_shell',
-  '//src/protozero:libprotozero',
-  '//src/trace_processor:trace_processor',
-  '//tools/trace_to_text:trace_to_text',
-  '//tools/trace_to_text:libpprofbuilder',
-  '//protos/perfetto/config:merged_config_gen',
-  '//protos/perfetto/trace:merged_trace_gen',
-  '//protos/perfetto/trace_processor:lite_gen',
-  '//protos/perfetto/metrics:lite_gen',
-]
+package(default_visibility = ["//visibility:private"])
+licenses(["notice"])  # Apache 2.0
+exports_files(["NOTICE"])
+'''.format(__file__)
 
-# The directory where the generated perfetto_build_flags.h will be copied into.
-buildflags_dir = 'include/perfetto/base/build_configs/bazel'
+  # Public targets need to be computed at the beginning (to figure out the
+  # intermediate deps) but printed at the end (because declaration order matters
+  # in Bazel).
+  public_str = ''
+  for target_name in sorted(public_targets):
+    target = gn.get_target(target_name)
+    public_str += gen_target_str(target)
 
+  res += '''
+# ##############################################################################
+# Internal targets
+# ##############################################################################
 
-def enable_sqlite(module):
-  module.deps.add(Label('//third_party/sqlite'))
-  module.deps.add(Label('//third_party/sqlite:sqlite_ext_percentile'))
+'''
+  # Generate the other non-public targets.
+  for target_name in sorted(set(default_targets) - set(public_targets)):
+    target = gn.get_target(target_name)
+    res += gen_target_str(target)
 
+  # Generate all the intermediate targets.
+  for target in sorted(gn.all_targets.itervalues(), key=lambda x: x.name):
+    if target.name in default_targets or target.name in gn.proto_libs:
+      continue
+    res += gen_target_str(target)
 
-def enable_jsoncpp(module):
-  module.deps.add(Label('//third_party/perfetto/google:jsoncpp'))
+  res += '''
+# ##############################################################################
+# Proto libraries
+# ##############################################################################
 
+'''
+  # Force discovery of explicilty listed root proto targets.
+  for target_name in proto_targets:
+    gn.get_target(target_name)
 
-def enable_linenoise(module):
-  module.deps.add(Label('//third_party/perfetto/google:linenoise'))
+  # Generate targets for the transitive set of proto targets.
+  # TODO explain deduping here.
+  labels = {}
+  for target in gn.proto_libs.itervalues():
+    for label in gen_target(target):
+      labels[label.name] = label
 
+  res += ''.join(str(x) for x in labels.itervalues())
 
-def enable_gtest_prod(module):
-  module.deps.add(Label('//third_party/perfetto/google:gtest_prod'))
+  res += '''
+# ##############################################################################
+# Public targets
+# ##############################################################################
 
-
-def enable_protobuf_full(module):
-  module.deps.add(Label('//third_party/protobuf:libprotoc_legacy'))
-  module.deps.add(Label('//third_party/protobuf:protobuf_legacy'))
-
-
-def enable_perfetto_version(module):
-  module.deps.add(Label('//third_party/perfetto/google:perfetto_version'))
-
-
-def enable_zlib(module):
-  module.deps.add(Label('//third_party/zlib:zlibsystem'))
-
-
-def disable_module(module):
-  pass
-
-
-# Internal equivalents for third-party libraries that the upstream project
-# depends on.
-builtin_deps = {
-    '//buildtools:linenoise': enable_linenoise,
-    '//buildtools:protobuf_full': enable_protobuf_full,
-    '//buildtools:protobuf_lite': disable_module,
-    '//buildtools:protoc': disable_module,
-    '//buildtools:sqlite': enable_sqlite,
-    '//buildtools:zlib': enable_zlib,
-    '//gn:default_deps': disable_module,
-    '//gn:jsoncpp': enable_jsoncpp,
-    '//gn:protoc_lib': enable_protobuf_full,
-    '//gn/standalone:gen_git_revision': enable_perfetto_version,
-}
-
-# ----------------------------------------------------------------------------
-# End of configuration.
-# ----------------------------------------------------------------------------
-
-
-class Error(Exception):
-  pass
-
-
-def is_public_header(label):
-  """
-  Returns if this is a c++ header file that is part of the API.
-  Args:
-      label: Label to evaluate
-  """
-  # TODO(135923303): Remove the pprof builder once the long-term solution lands
-  return label.endswith('.h') and (
-    label.startswith('//include/perfetto/') or
-    label == '//tools/trace_to_text/pprof_builder.h' or
-    label == '//tools/trace_to_text/symbolizer.h')
-
-
-@functools.total_ordering
-class Label(object):
-  """Represents a label in BUILD file terminology. This class wraps a string
-  label to allow for correct comparison of labels for sorting.
-
-  Args:
-      label: The string rerepsentation of the label.
-  """
-
-  def __init__(self, label):
-    self.label = label
-
-  def is_absolute(self):
-    return self.label.startswith('//')
-
-  def dirname(self):
-    return self.label.split(':')[0] if ':' in self.label else self.label
-
-  def basename(self):
-    return self.label.split(':')[1] if ':' in self.label else ''
-
-  def __eq__(self, other):
-    return self.label == other.label
-
-  def __lt__(self, other):
-    return (
-        self.is_absolute(),
-        self.dirname(),
-        self.basename()
-    ) < (
-        other.is_absolute(),
-        other.dirname(),
-        other.basename()
-    )
-
-  def __str__(self):
-    return self.label
-
-  def __hash__(self):
-    return hash(self.label)
-
-
-class Writer(object):
-  def __init__(self, output, width=79):
-    self.output = output
-    self.width = width
-
-  def comment(self, text):
-    for line in textwrap.wrap(text,
-                              self.width - 2,
-                              break_long_words=False,
-                              break_on_hyphens=False):
-      self.output.write('# {}\n'.format(line))
-
-  def newline(self):
-    self.output.write('\n')
-
-  def line(self, s, indent=0):
-    self.output.write('    ' * indent + s + '\n')
-
-  def variable(self, key, value, sort=True):
-    if value is None:
-      return
-    if isinstance(value, set) or isinstance(value, list):
-      if len(value) == 0:
-        return
-      self.line('{} = ['.format(key), indent=1)
-      for v in sorted(list(value)) if sort else value:
-        self.line('"{}",'.format(v), indent=2)
-      self.line('],', indent=1)
-    elif isinstance(value, basestring):
-      self.line('{} = "{}",'.format(key, value), indent=1)
-    else:
-      self.line('{} = {},'.format(key, value), indent=1)
-
-  def header(self):
-    self.output.write(header)
-
-
-class Target(object):
-  """In-memory representation of a BUILD target."""
-
-  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',
-                    'transitive_descriptor_set', 'java_proto_library' )
-    self.type = type
-    self.name = name
-    self.srcs = set()
-    self.hdrs = set()
-    self.deps = set()
-    self.visibility = set()
-    self.gn_name = gn_name
-    self.cc_proto_fields = 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.line('{}('.format(self.type))
-    writer.variable('name', self.name)
-    writer.variable('srcs', self.srcs)
-    writer.variable('hdrs', self.hdrs)
-
-    if self.cc_proto_fields:
-      assert(self.type == 'proto_library')
-      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):
-  """In-memory representation of a BUILD file."""
-
-  def __init__(self, public, header_lines=[]):
-    self.targets = {}
-    self.public = public
-    self.header_lines = header_lines
-
-  def add_target(self, target):
-    self.targets[target.name] = target
-
-  def write(self, writer):
-    writer.header()
-    writer.newline()
-    for line in self.header_lines:
-      writer.line(line)
-    if self.header_lines:
-      writer.newline()
-    if self.public:
-      writer.line(
-          'package(default_visibility = ["//visibility:public"])')
-    else:
-      writer.line(
-          'package(default_visibility = ["//third_party/perfetto:__subpackages__"])')
-    writer.newline()
-    writer.line('licenses(["notice"])  # Apache 2.0')
-    writer.newline()
-    writer.line('exports_files(["LICENSE"])')
-    writer.newline()
-
-    sorted_targets = sorted(
-        self.targets.itervalues(), key=lambda m: m.name)
-    for target in sorted_targets[:-1]:
-      target.write(writer)
-      writer.newline()
-
-    # BUILD files shouldn't have a trailing new line.
-    sorted_targets[-1].write(writer)
-
-
-class BuildGenerator(object):
-  def __init__(self, desc):
-    self.desc = desc
-    self.action_generated_files = set()
-
-    for target in self.desc.itervalues():
-      if target['type'] == 'action':
-        self.action_generated_files.update(target['outputs'])
-
-
-  def create_build_for_targets(self, targets):
-    """Generate a BUILD for a list of GN targets and aliases."""
-    self.build = Build(public=True)
-
-    proto_cc_import = 'load("//tools/build_defs/proto/cpp:cc_proto_library.bzl", "cc_proto_library")'
-    descriptor_set_import = 'load("//tools/build_defs/proto:descriptor_set.bzl", "transitive_descriptor_set")'
-    pbzero_cc_import = 'load("//third_party/perfetto/google:build_defs.bzl", "pbzero_cc_proto_library")'
-    self.proto_build = Build(public=False,
-                             header_lines=[
-                               proto_cc_import,
-                               descriptor_set_import,
-                               pbzero_cc_import,
-                             ])
-
-    for target in targets:
-      self.create_target(target)
-
-    return (self.build, self.proto_build)
-
-
-  def resolve_dependencies(self, target_name):
-    """Return the set of direct dependent-on targets for a GN target.
-
-    Args:
-        desc: JSON GN description.
-        target_name: Name of target
-
-    Returns:
-        A set of transitive dependencies in the form of GN targets.
-    """
-
-    if gn_utils.label_without_toolchain(target_name) in builtin_deps:
-      return set()
-    target = self.desc[target_name]
-    resolved_deps = set()
-    for dep in target.get('deps', []):
-      resolved_deps.add(dep)
-    return resolved_deps
-
-
-  def apply_module_sources_to_target(self, target, module_desc):
-    """
-    Args:
-        target: Module to which dependencies should be added.
-        module_desc: JSON GN description of the module.
-        visibility: Whether the module is visible with respect to the target.
-    """
-    for src in module_desc.get('sources', []):
-      label = Label(gn_utils.label_to_path(src))
-      if target.type == 'cc_library' and is_public_header(src):
-        target.hdrs.add(label)
-      else:
-        target.srcs.add(label)
-
-    if '//include/perfetto/base/build_config.h' in module_desc.get(
-        'sources', []):
-      label = Label(os.path.join(buildflags_dir, 'perfetto_build_flags.h'))
-      if target.type == 'cc_library':
-          target.hdrs.add(label)
-      elif target.type == 'cc_binary':
-        target.srcs.add(label)
-
-
-  def apply_module_dependency(self, target, dep_name):
-    """
-    Args:
-        build: BUILD instance which is being generated.
-        proto_build: BUILD instance which is being generated to hold protos.
-        desc: JSON GN description.
-        target: Module to which dependencies should be added.
-        dep_name: GN target of the dependency.
-    """
-    # If the dependency refers to a library which we can replace with an internal
-    # equivalent, stop recursing and patch the dependency in.
-    dep_name_no_toolchain = gn_utils.label_without_toolchain(dep_name)
-    if dep_name_no_toolchain in builtin_deps:
-      builtin_deps[dep_name_no_toolchain](target)
-      return
-
-    dep_desc = self.desc[dep_name]
-    if dep_desc['type'] == 'source_set':
-      for inner_name in self.resolve_dependencies(dep_name):
-        self.apply_module_dependency(target, inner_name)
-
-      # Any source set which has a source generated by an action doesn't need
-      # to be depended on as we will depend on the action directly.
-      sources = dep_desc.get('sources', [])
-      if any(src in self.action_generated_files for src in sources):
-        return
-
-      self.apply_module_sources_to_target(target, dep_desc)
-    elif dep_desc['type'] == 'action':
-      args = dep_desc['args']
-      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 '/protoc' in args[0]:
-        result = self.create_proto_target(dep_name);
-        if result is None:
-          return
-        (proto_target, cc_target) = result
-        if target.type == 'proto_library':
-          dep_target_name = proto_target.name
-        else:
-          dep_target_name = cc_target.name
-        target.deps.add(
-            Label("//third_party/perfetto/protos:" + dep_target_name))
-      else:
-        raise Error('Unsupported action in target %s: %s' % (dep_target_name,
-                                                            args))
-    elif dep_desc['type'] == 'static_library':
-      dep_target = self.create_target(dep_name)
-      target.deps.add(Label("//third_party/perfetto:" + dep_target.name))
-    elif dep_desc['type'] == 'group':
-      for inner_name in self.resolve_dependencies(dep_name):
-        self.apply_module_dependency(target, inner_name)
-    elif dep_desc['type'] == 'executable':
-      # Just create the dep target but don't add it as a dep because it's an
-      # executable.
-      self.create_target(dep_name)
-    else:
-      raise Error('Unknown target name %s with type: %s' %
-                  (dep_name, dep_desc['type']))
-
-  def create_merged_sql_metrics_target(self, gn_target_name):
-    target_desc = self.desc[gn_target_name]
-    gn_target_name_no_toolchain = gn_utils.label_without_toolchain(
-        gn_target_name)
-    target = Target(
-      'genrule',
-      'gen_merged_sql_metrics',
-      gn_name=gn_target_name_no_toolchain,
-    )
-    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(gn_utils.label_to_path(src))
-      for src in target_desc.get('inputs', [])
-      if src not in self.action_generated_files
-    )
-    self.build.add_target(target)
-    return target
-
-  def create_proto_target(self, gn_target_name):
-    target_desc = self.desc[gn_target_name]
-    args = target_desc['args']
-
-    gn_target_name_no_toolchain = gn_utils.label_without_toolchain(
-        gn_target_name)
-    stripped_path = gn_target_name_no_toolchain.replace("protos/perfetto/", "")
-
-    is_descriptor = any('descriptor_set_out' in arg for arg in args)
-    if is_descriptor:
-      return None
-
-    is_pbzero = any("pbzero" in arg for arg in args)
-    is_proto_lite = not is_pbzero and not is_descriptor
-
-    pretty_target_name = gn_utils.label_to_target_name_with_path(stripped_path)
-    pretty_target_name = pretty_target_name.replace("_lite_gen", "")
-    pretty_target_name = pretty_target_name.replace("_zero_gen", "_zero")
-    proto_target_name = pretty_target_name
-
-    proto_target = Target(
-      'proto_library',
-      proto_target_name,
-      gn_name=gn_target_name_no_toolchain
-    )
-    proto_target.cc_proto_fields = is_proto_lite
-    proto_target.srcs.update([
-      Label(gn_utils.label_to_path(src).replace('protos/', ''))
-      for src in target_desc.get('sources', [])
-    ])
-    if is_proto_lite:
-      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:
-      # 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')])
-
-      # 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')
-      ]
-      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.deps.add(Label('//third_party/perfetto:libprotozero'))
-      cc_target.deps.update(cc_deps)
-
-      # Add the proto_library to the cc_target.
-      cc_target.src_proto_library = \
-          "//third_party/perfetto/protos:" + proto_target.name
-
-      self.proto_build.add_target(cc_target)
-    else:
-      cc_target_name = proto_target.name + "_cc_proto"
-      cc_target = Target('cc_proto_library',
-                        cc_target_name, gn_name=gn_target_name_no_toolchain)
-      cc_target.visibility.add("//visibility:public")
-      cc_target.deps.add(
-          Label("//third_party/perfetto/protos:" + proto_target.name))
-      self.proto_build.add_target(cc_target)
-
-      java_target_name = proto_target.name + "_java_proto"
-      java_target = Target('java_proto_library',
-                           java_target_name,
-                           gn_name=gn_target_name_no_toolchain)
-      java_target.visibility.add("//visibility:public")
-      java_target.deps.add(
-          Label("//third_party/perfetto/protos:" + proto_target.name))
-      self.proto_build.add_target(java_target)
-
-    return (proto_target, cc_target)
-
-
-  def create_target(self, gn_target_name):
-    """Generate module(s) for a given GN target.
-
-    Given a GN target name, generate one or more corresponding modules into a
-    build file.
-
-    Args:
-        build: Build instance which is being generated.
-        desc: JSON GN description.
-        gn_target_name: GN target name for module generation.
-    """
-
-    target_desc = self.desc[gn_target_name]
-    if target_desc['type'] == 'action':
-      args = target_desc['args']
-      if '/protoc' in args[0]:
-        return self.create_proto_target(gn_target_name)
-      else:
-        raise Error('Unsupported action in target %s: %s' % (gn_target_name,
-                                                            args))
-    elif target_desc['type'] == 'executable':
-      target_type = 'cc_binary'
-    elif target_desc['type'] == 'static_library':
-      target_type = 'cc_library'
-    elif target_desc['type'] == 'source_set':
-      target_type = 'filegroup'
-    else:
-      raise Error('Unknown target type: %s' % target_desc['type'])
-
-    label_no_toolchain = gn_utils.label_without_toolchain(gn_target_name)
-    target_name_path = gn_utils.label_to_target_name_with_path(label_no_toolchain)
-    if label_no_toolchain in default_targets:
-        target_name = label_no_toolchain.split(':')[-1]
-    else:
-      target_name = target_name_path
-    target = Target(target_type, target_name, gn_name=label_no_toolchain)
-    target.srcs.update(
-        Label(gn_utils.label_to_path(src))
-        for src in target_desc.get('sources', [])
-        if src not in self.action_generated_files
-    )
-
-    for dep_name in self.resolve_dependencies(gn_target_name):
-      self.apply_module_dependency(target, dep_name)
+'''
+  res += public_str
+  res += '# Content from BUILD.extras\n\n'
+  res += extras
+  return res
 
-    self.build.add_target(target)
-    return target
 
 def main():
   parser = argparse.ArgumentParser(
       description='Generate BUILD from a GN description.')
   parser.add_argument(
-        '--check-only', help='Don\'t keep the generated files',
-        action='store_true')
+      '--check-only',
+      help='Don\'t keep the generated files',
+      action='store_true')
   parser.add_argument(
       '--desc',
-      help='GN description (e.g., gn desc out --format=json --all-toolchains "//*"'
-  )
+      help='GN description ' +
+      '(e.g., gn desc out --format=json --all-toolchains "//*"')
   parser.add_argument(
       '--repo-root',
       help='Standalone Perfetto repository to generate a GN description',
@@ -658,24 +414,14 @@
 
   out_files = []
 
-  build_generator = BuildGenerator(desc)
-  build, proto_build = build_generator.create_build_for_targets(
-      args.targets or default_targets)
-
   # Generate the main BUILD file.
-  out_files.append(args.output + '.swp')
-  with open(out_files[-1], 'w') as f:
-    writer = Writer(f)
-    build.write(writer)
-    writer.newline()
-    with open(args.extras, 'r') as r:
-      for line in r:
-        writer.line(line.rstrip("\n\r"))
+  with open(args.extras, 'r') as extra_f:
+    extras = extra_f.read()
 
-  # Generate the protos/BUILD file.
-  out_files.append(args.output_proto + '.swp')
-  with open(out_files[-1], 'w') as f:
-    proto_build.write(Writer(f))
+  contents = generate_build(desc, args.targets or default_targets, extras)
+  out_files.append(args.output + '.swp')
+  with open(out_files[-1], 'w') as out_f:
+    out_f.write(contents)
 
   # Generate the build flags file.
   out_files.append(os.path.join(buildflags_dir, 'perfetto_build_flags.h.swp'))
diff --git a/tools/gen_merged_sql_metrics.py b/tools/gen_merged_sql_metrics.py
index cb36db5..319d0d3 100755
--- a/tools/gen_merged_sql_metrics.py
+++ b/tools/gen_merged_sql_metrics.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python
 # Copyright (C) 2019 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -104,8 +104,7 @@
     for path in sql_outputs.keys():
       name = os.path.basename(path)
       variable = filename_to_variable(os.path.splitext(name)[0])
-      path_escaped = path.encode('string_escape')
-      output.write('\n  {{"{}", {}}},\n'.format(path_escaped, variable))
+      output.write('\n  {{"{}", {}}},\n'.format(path, variable))
     output.write("};\n")
 
     output.write(NAMESPACE_END)
diff --git a/tools/gn_utils.py b/tools/gn_utils.py
index 30c646b..1bc7afc 100644
--- a/tools/gn_utils.py
+++ b/tools/gn_utils.py
@@ -27,6 +27,7 @@
 
 
 BUILDFLAGS_TARGET = '//gn:gen_buildflags'
+LINKER_UNIT_TYPES = ('executable', 'shared_library', 'static_library')
 
 
 def _check_command_output(cmd, cwd):
@@ -183,4 +184,182 @@
             os.unlink(tmp_file)
         else:
             os.rename(tmp_file, target_file)
-    return res
\ No newline at end of file
+    return res
+
+
+class GnParser(object):
+    """A parser with some cleverness for GN json desc files
+
+    The main goals of this parser are:
+    1) Deal with the fact that other build systems don't have an equivalent
+       notion to GN's source_set. Conversely to Bazel's and Soong's filegroups,
+       GN source_sets expect that dependencies, cflags and other source_set
+       properties propagate up to the linker unit (static_library, executable or
+       shared_library). This parser simulates the same behavior: when a
+       source_set is encountered, some of its variables (cflags and such) are
+       copied up to the dependent targets. This is to allow gen_xxx to create
+       one filegroup for each source_set and then squash all the other flags
+       onto the linker unit.
+    2) Detect and special-case protobuf targets, figuring out the protoc-plugin
+       being used.
+    """
+    class Target(object):
+        """Reperesents A GN target.
+
+        Maked properties are propagated up the dependency chain when a
+        source_set dependency is encountered.
+        """
+        def __init__(self, name, type):
+            self.name = name  # e.g. //src/ipc:ipc
+
+            VALID_TYPES = ('static_library', 'shared_library', 'executable',
+                           'group', 'action', 'source_set', 'proto_library')
+            assert(type in VALID_TYPES)
+            self.type = type
+
+            # Only set when type == proto_library.
+            # This is typically: 'proto', 'protozero', 'ipc'.
+            self.proto_plugin = None
+
+            self.sources = set()
+
+            # These are valid only for type == 'action'
+            self.inputs = set()
+            self.outputs = set()
+            self.script = None
+            self.args = []
+
+            # These variables are propagated up when encountering a dependency
+            # on a source_set target.
+            self.cflags = set()
+            self.defines = set()
+            self.deps = set()
+            self.include_dirs = set()
+            self.ldflags = set()
+            self.source_set_deps = set()  # Transitive set of source_set deps.
+            self.proto_deps = set()  # Transitive set of protobuf deps.
+
+            # Deps on //gn:xxx have this flag set to True. These dependencies
+            # are special because they pull third_party code from buildtools/.
+            # We don't want to keep recursing into //buildtools in generators,
+            # this flag is used to stop the recursion and create an empty
+            # placeholder target once we hit //gn:protoc or similar.
+            self.is_third_party_dep_ = False
+
+        def __repr__(self):
+            return json.dumps({k:(list(v) if isinstance(v, set) else v)
+                    for (k,v) in self.__dict__.iteritems()}, indent=4)
+
+        def update(self, other):
+            for key in ('cflags', 'defines', 'deps', 'include_dirs', 'ldflags',
+                        'source_set_deps', 'proto_deps'):
+                self.__dict__[key].update(other.__dict__.get(key, []))
+
+
+    def __init__(self, gn_desc):
+        self.gn_desc_ = gn_desc
+        self.all_targets = {}
+        self.linker_units = {}  # Executables, shared or static libraries.
+        self.source_sets = {}
+        self.actions = {}
+        self.proto_libs = {}
+
+
+    def get_target(self, gn_target_name):
+        """Returns a Target object from the fully qualified GN target name.
+
+        It bubbles up variables from source_set dependencies as described in the
+        class-level comments.
+        """
+        target = self.all_targets.get(gn_target_name)
+        if target is not None:
+            return target  # Taraget already processed.
+
+        desc = self.gn_desc_[gn_target_name]
+        target = GnParser.Target(gn_target_name, desc['type'])
+        self.all_targets[gn_target_name] = target
+
+        # We should never have GN targets directly depend on buidtools. They
+        # should hop via //gn:xxx, so we can give generators an opportunity to
+        # override them.
+        assert(not gn_target_name.startswith('//buildtools'))
+
+        # Don't descend further into third_party targets. Genrators are supposed
+        # to either ignore them or route to other externally-provided targets.
+        if gn_target_name.startswith('//gn'):
+            target.is_third_party_dep_ = True
+            return target
+
+        proto_target_type = self.get_proto_target_type_(target)
+        if proto_target_type is not None:
+            self.proto_libs[target.name] = target
+            target.type = 'proto_library'
+            target.proto_plugin = proto_target_type
+            proto_desc = self.gn_desc_[target.name + '_gen']
+            target.sources.update(proto_desc.get('sources', []))
+            assert(all(x.endswith('.proto') for x in target.sources))
+        elif target.type == 'source_set':
+            self.source_sets[gn_target_name] = target
+            target.sources.update(desc.get('sources', []))
+        elif target.type in LINKER_UNIT_TYPES:
+            self.linker_units[gn_target_name] = target
+            target.sources.update(desc.get('sources', []))
+        elif target.type == 'action':
+            self.actions[gn_target_name] = target
+            target.inputs.update(desc['inputs'])
+            outs = [re.sub('^//out/[^/]+/gen/', '', x) for x in desc['outputs']]
+            target.outputs.update(outs)
+            target.script = desc['script']
+            # Args are typically relative to the root build dir (../../xxx)
+            # because root build dir is typically out/xxx/).
+            target.args = [re.sub('^../../', '//', x) for x in desc['args']]
+
+        target.cflags.update(desc.get('cflags', []) + desc.get('cflags_cc', []))
+        target.ldflags.update(desc.get('ldflags', []))
+        target.defines.update(desc.get('defines', []))
+        target.include_dirs.update(desc.get('include_dirs', []))
+
+        # Recurse in dependencies.
+        for dep_name in desc.get('deps', []):
+            dep = self.get_target(dep_name)
+            if dep.is_third_party_dep_:
+                target.deps.add(dep_name)
+            elif dep.type == 'proto_library':
+                target.proto_deps.add(dep_name)
+                target.proto_deps.update(dep.proto_deps)  # Bubble up deps.
+            elif dep.type == 'source_set':
+                target.source_set_deps.add(dep_name)
+                target.update(dep)  # Bubble up source set's cflags/ldflags etc.
+            elif dep.type == 'group':
+                target.update(dep)  # Bubble up groups's cflags/ldflags etc.
+            elif dep.type == 'action':
+                target.deps.add(dep_name)
+            elif dep.type in LINKER_UNIT_TYPES:
+                target.deps.add(dep_name)
+
+        return target
+
+    def get_proto_target_type_(self, target):
+        """ Checks if the target is a proto library and return the plugin.
+
+        Returns:
+            None: if the target is not a proto library.
+            The plugin name (or 'proto' in the default case) for proto library
+            targets.
+        """
+        gen_desc = self.gn_desc_.get(target.name + '_gen')
+        if gen_desc is None or gen_desc['type'] != 'action':
+            return None
+        args = gen_desc.get('args', [])
+        if '/protoc' not in args[0]:
+            return None
+        for arg in args:
+            if arg.startswith('--plugin='):
+                # |arg| at this point looks like:
+                #  --plugin=protoc-gen-plugin=gcc_like_host/protozero_plugin
+                # or
+                #  --plugin=protoc-gen-plugin=protozero_plugin
+                return arg.split('=')[-1].split('/')[-1].replace('_plugin', '')
+        return 'proto'
+
+