Add host target for perfetto protos on Android host builds

This CL introduces a "perfetto_trace_protos" static_library
target that allows to link the perfetto protobuf code on
host executable builds.
This CL also disentangles some awkward dep between proto:lite
targets and the IPC proto targets, that was indirectly causing
the core tracing target to depend on ipc.
Also fixes a small breakage on mac by removing an unnecessary
include in trace_to_text.

Sample usage:

In the .bp file:
---
cc_binary_host {
  name: "perfetto_proto_test",
  static_libs: [
    "perfetto_trace_protos",
    "libprotobuf-cpp-lite",
  ],
  srcs: [
    "host_test.cc"
  ],
}
---

Where host_test.cc:
---
#include "perfetto/trace/trace.pb.h"

int main(int, char** argv) {
  perfetto::protos::Trace trace;
  return trace.ParseFromString(std::string(argv[1]));
}
---

Bug: 73611302
Change-Id: Ie371e82941890a3a7567c30261befd756147cc1c
Test: manual. Checked that builds on mac.
diff --git a/Android.bp b/Android.bp
index 9911868..bf0711f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -18,6 +18,7 @@
 cc_library_shared {
   name: "libtraced_shared",
   srcs: [
+    ":perfetto_protos_perfetto_common_common_gen",
     ":perfetto_protos_perfetto_config_config_gen",
     ":perfetto_protos_perfetto_ipc_ipc_gen",
     ":perfetto_protos_perfetto_trace_chrome_lite_gen",
@@ -93,6 +94,7 @@
     "perfetto_src_tracing_ipc",
   ],
   generated_headers: [
+    "perfetto_protos_perfetto_common_common_gen_headers",
     "perfetto_protos_perfetto_config_config_gen_headers",
     "perfetto_protos_perfetto_ipc_ipc_gen_headers",
     "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
@@ -120,6 +122,7 @@
 cc_binary {
   name: "perfetto",
   srcs: [
+    ":perfetto_protos_perfetto_common_common_gen",
     ":perfetto_protos_perfetto_config_config_gen",
     ":perfetto_protos_perfetto_ipc_ipc_gen",
     ":perfetto_protos_perfetto_trace_chrome_lite_gen",
@@ -184,6 +187,7 @@
     "libgtest_prod",
   ],
   generated_headers: [
+    "perfetto_protos_perfetto_common_common_gen_headers",
     "perfetto_protos_perfetto_config_config_gen_headers",
     "perfetto_protos_perfetto_ipc_ipc_gen_headers",
     "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
@@ -232,6 +236,7 @@
 cc_test {
   name: "perfetto_integrationtests",
   srcs: [
+    ":perfetto_protos_perfetto_common_common_gen",
     ":perfetto_protos_perfetto_config_config_gen",
     ":perfetto_protos_perfetto_ipc_ipc_gen",
     ":perfetto_protos_perfetto_trace_chrome_lite_gen",
@@ -319,6 +324,7 @@
     "perfetto_src_tracing_ipc",
   ],
   generated_headers: [
+    "perfetto_protos_perfetto_common_common_gen_headers",
     "perfetto_protos_perfetto_config_config_gen_headers",
     "perfetto_protos_perfetto_ipc_ipc_gen_headers",
     "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
@@ -348,6 +354,39 @@
   },
 }
 
+// GN target: //protos/perfetto/common:common_gen
+genrule {
+  name: "perfetto_protos_perfetto_common_common_gen",
+  srcs: [
+    "protos/perfetto/common/commit_data_request.proto",
+  ],
+  tools: [
+    "aprotoc",
+  ],
+  cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos $(in)",
+  out: [
+    "external/perfetto/protos/perfetto/common/commit_data_request.pb.cc",
+  ],
+}
+
+// GN target: //protos/perfetto/common:common_gen
+genrule {
+  name: "perfetto_protos_perfetto_common_common_gen_headers",
+  srcs: [
+    "protos/perfetto/common/commit_data_request.proto",
+  ],
+  tools: [
+    "aprotoc",
+  ],
+  cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos $(in)",
+  out: [
+    "external/perfetto/protos/perfetto/common/commit_data_request.pb.h",
+  ],
+  export_include_dirs: [
+    "protos",
+  ],
+}
+
 // GN target: //protos/perfetto/config:config_gen
 genrule {
   name: "perfetto_protos_perfetto_config_config_gen",
@@ -405,7 +444,6 @@
 genrule {
   name: "perfetto_protos_perfetto_ipc_ipc_gen",
   srcs: [
-    "protos/perfetto/ipc/commit_data_request.proto",
     "protos/perfetto/ipc/consumer_port.proto",
     "protos/perfetto/ipc/producer_port.proto",
   ],
@@ -415,8 +453,6 @@
   ],
   cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos --plugin=protoc-gen-plugin=$(location perfetto_src_ipc_protoc_plugin_ipc_plugin___gn_standalone_toolchain_gcc_like_host_) --plugin_out=:$(genDir)/external/perfetto/protos $(in)",
   out: [
-    "external/perfetto/protos/perfetto/ipc/commit_data_request.ipc.cc",
-    "external/perfetto/protos/perfetto/ipc/commit_data_request.pb.cc",
     "external/perfetto/protos/perfetto/ipc/consumer_port.ipc.cc",
     "external/perfetto/protos/perfetto/ipc/consumer_port.pb.cc",
     "external/perfetto/protos/perfetto/ipc/producer_port.ipc.cc",
@@ -428,7 +464,6 @@
 genrule {
   name: "perfetto_protos_perfetto_ipc_ipc_gen_headers",
   srcs: [
-    "protos/perfetto/ipc/commit_data_request.proto",
     "protos/perfetto/ipc/consumer_port.proto",
     "protos/perfetto/ipc/producer_port.proto",
   ],
@@ -438,8 +473,6 @@
   ],
   cmd: "mkdir -p $(genDir)/external/perfetto/protos && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/protos --proto_path=external/perfetto/protos --plugin=protoc-gen-plugin=$(location perfetto_src_ipc_protoc_plugin_ipc_plugin___gn_standalone_toolchain_gcc_like_host_) --plugin_out=:$(genDir)/external/perfetto/protos $(in)",
   out: [
-    "external/perfetto/protos/perfetto/ipc/commit_data_request.ipc.h",
-    "external/perfetto/protos/perfetto/ipc/commit_data_request.pb.h",
     "external/perfetto/protos/perfetto/ipc/consumer_port.ipc.h",
     "external/perfetto/protos/perfetto/ipc/consumer_port.pb.h",
     "external/perfetto/protos/perfetto/ipc/producer_port.ipc.h",
@@ -2946,6 +2979,7 @@
 cc_library_static {
   name: "perfetto_src_tracing_ipc",
   srcs: [
+    ":perfetto_protos_perfetto_common_common_gen",
     ":perfetto_protos_perfetto_config_config_gen",
     ":perfetto_protos_perfetto_ipc_ipc_gen",
     ":perfetto_protos_perfetto_trace_chrome_lite_gen",
@@ -3010,6 +3044,7 @@
     "include",
   ],
   generated_headers: [
+    "perfetto_protos_perfetto_common_common_gen_headers",
     "perfetto_protos_perfetto_config_config_gen_headers",
     "perfetto_protos_perfetto_ipc_ipc_gen_headers",
     "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
@@ -3025,6 +3060,7 @@
     "perfetto_src_ipc_wire_protocol_gen_headers",
   ],
   export_generated_headers: [
+    "perfetto_protos_perfetto_common_common_gen_headers",
     "perfetto_protos_perfetto_config_config_gen_headers",
     "perfetto_protos_perfetto_ipc_ipc_gen_headers",
     "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
@@ -3048,10 +3084,52 @@
   ],
 }
 
+// GN target: //:perfetto_trace_protos
+cc_library_static {
+  name: "perfetto_trace_protos",
+  srcs: [
+    ":perfetto_protos_perfetto_trace_chrome_lite_gen",
+    ":perfetto_protos_perfetto_trace_filesystem_lite_gen",
+    ":perfetto_protos_perfetto_trace_ftrace_lite_gen",
+    ":perfetto_protos_perfetto_trace_lite_gen",
+    ":perfetto_protos_perfetto_trace_ps_lite_gen",
+  ],
+  shared_libs: [
+    "liblog",
+    "libprotobuf-cpp-lite",
+  ],
+  host_supported: true,
+  export_include_dirs: [
+    "include",
+  ],
+  generated_headers: [
+    "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_filesystem_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_ftrace_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_ps_lite_gen_headers",
+  ],
+  export_generated_headers: [
+    "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_filesystem_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_ftrace_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_lite_gen_headers",
+    "perfetto_protos_perfetto_trace_ps_lite_gen_headers",
+  ],
+  defaults: [
+    "perfetto_defaults",
+  ],
+  cflags: [
+    "-DGOOGLE_PROTOBUF_NO_RTTI",
+    "-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER",
+  ],
+}
+
 // GN target: //:perfetto_unittests
 cc_test {
   name: "perfetto_unittests",
   srcs: [
+    ":perfetto_protos_perfetto_common_common_gen",
     ":perfetto_protos_perfetto_config_config_gen",
     ":perfetto_protos_perfetto_ipc_ipc_gen",
     ":perfetto_protos_perfetto_trace_chrome_lite_gen",
@@ -3189,6 +3267,7 @@
     "perfetto_src_tracing_ipc",
   ],
   generated_headers: [
+    "perfetto_protos_perfetto_common_common_gen_headers",
     "perfetto_protos_perfetto_config_config_gen_headers",
     "perfetto_protos_perfetto_ipc_ipc_gen_headers",
     "perfetto_protos_perfetto_trace_chrome_lite_gen_headers",
diff --git a/BUILD.gn b/BUILD.gn
index 74e972e..ea02315 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -161,6 +161,15 @@
       ]
     }
   }
+
+  # This target exports perfetto trace protos in the Android build system,
+  # allowing both host and device targets to implement custom parsers based on
+  # our protos.
+  static_library("perfetto_trace_protos") {
+    deps = [
+      "protos/perfetto/trace:lite",
+    ]
+  }
 } else {
   group("lib") {
     public_configs = [ "gn:public_config" ]
diff --git a/include/perfetto/tracing/core/commit_data_request.h b/include/perfetto/tracing/core/commit_data_request.h
index b17d1e7..d72e720 100644
--- a/include/perfetto/tracing/core/commit_data_request.h
+++ b/include/perfetto/tracing/core/commit_data_request.h
@@ -18,7 +18,7 @@
  * AUTOGENERATED - DO NOT EDIT
  *******************************************************************************
  * This file has been generated from the protobuf message
- * perfetto/ipc/commit_data_request.proto
+ * perfetto/common/commit_data_request.proto
  * by
  * ../../tools/proto_to_cpp/proto_to_cpp.cc.
  * If you need to make changes here, change the .proto file and then run
diff --git a/protos/perfetto/common/BUILD.gn b/protos/perfetto/common/BUILD.gn
new file mode 100644
index 0000000..9a07e5a
--- /dev/null
+++ b/protos/perfetto/common/BUILD.gn
@@ -0,0 +1,27 @@
+# Copyright (C) 2018 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.
+
+import("../../../gn/perfetto.gni")
+import("../../../gn/proto_library.gni")
+
+# Proto messages that are required by the IPC service definitions but have also
+# a C++ counterpart in tracing/core (i.e. are used also for the non-IPC cases).
+proto_library("common") {
+  generate_python = false
+  proto_in_dir = "$perfetto_root_path/protos"
+  proto_out_dir = "$perfetto_root_path/protos"
+  sources = [
+    "commit_data_request.proto",
+  ]
+}
diff --git a/protos/perfetto/ipc/commit_data_request.proto b/protos/perfetto/common/commit_data_request.proto
similarity index 100%
rename from protos/perfetto/ipc/commit_data_request.proto
rename to protos/perfetto/common/commit_data_request.proto
diff --git a/protos/perfetto/ipc/BUILD.gn b/protos/perfetto/ipc/BUILD.gn
index e65cace..e9055be 100644
--- a/protos/perfetto/ipc/BUILD.gn
+++ b/protos/perfetto/ipc/BUILD.gn
@@ -18,12 +18,12 @@
 # IPC service definitions.
 ipc_library("ipc") {
   deps = [
+    "../common",
     "../config",
   ]
   proto_in_dir = "$perfetto_root_path/protos"
   proto_out_dir = "$perfetto_root_path/protos"
   sources = [
-    "commit_data_request.proto",
     "consumer_port.proto",
     "producer_port.proto",
   ]
diff --git a/protos/perfetto/ipc/producer_port.proto b/protos/perfetto/ipc/producer_port.proto
index 572e83d..a6c15ef 100644
--- a/protos/perfetto/ipc/producer_port.proto
+++ b/protos/perfetto/ipc/producer_port.proto
@@ -19,7 +19,7 @@
 
 import "perfetto/config/data_source_config.proto";
 import "perfetto/config/data_source_descriptor.proto";
-import "perfetto/ipc/commit_data_request.proto";
+import "perfetto/common/commit_data_request.proto";
 
 package perfetto.protos;
 
diff --git a/protos/perfetto/trace/BUILD.gn b/protos/perfetto/trace/BUILD.gn
index 214b67d..85947c0 100644
--- a/protos/perfetto/trace/BUILD.gn
+++ b/protos/perfetto/trace/BUILD.gn
@@ -41,7 +41,6 @@
 proto_library("lite") {
   generate_python = false
   deps = [
-    "../ipc",
     "chrome:lite",
     "filesystem:lite",
     "ftrace:lite",
diff --git a/src/tracing/BUILD.gn b/src/tracing/BUILD.gn
index 189fbe0..eef490d 100644
--- a/src/tracing/BUILD.gn
+++ b/src/tracing/BUILD.gn
@@ -19,6 +19,7 @@
 source_set("tracing") {
   public_deps = [
     "../../include/perfetto/tracing/core",
+    "../../protos/perfetto/common",
     "../../protos/perfetto/trace:lite",
     "../../protos/perfetto/trace:zero",
   ]
diff --git a/src/tracing/core/commit_data_request.cc b/src/tracing/core/commit_data_request.cc
index 826d09f..9468465 100644
--- a/src/tracing/core/commit_data_request.cc
+++ b/src/tracing/core/commit_data_request.cc
@@ -18,7 +18,7 @@
  * AUTOGENERATED - DO NOT EDIT
  *******************************************************************************
  * This file has been generated from the protobuf message
- * perfetto/ipc/commit_data_request.proto
+ * perfetto/common/commit_data_request.proto
  * by
  * ../../tools/proto_to_cpp/proto_to_cpp.cc.
  * If you need to make changes here, change the .proto file and then run
@@ -27,7 +27,7 @@
 
 #include "perfetto/tracing/core/commit_data_request.h"
 
-#include "perfetto/ipc/commit_data_request.pb.h"
+#include "perfetto/common/commit_data_request.pb.h"
 
 namespace perfetto {
 
diff --git a/tools/gen_android_bp b/tools/gen_android_bp
index a7dafc5..728ed23 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -38,6 +38,7 @@
 default_targets = [
     '//:libtraced_shared',
     '//:perfetto_integrationtests',
+    '//:perfetto_trace_protos',
     '//:perfetto_unittests',
     '//:perfetto',
     '//:traced',
@@ -50,6 +51,10 @@
     '//:traced': 'perfetto.rc',
 }
 
+target_host_supported = [
+    '//:perfetto_trace_protos',
+]
+
 # Arguments for the GN output directory.
 gn_args = 'target_os="android" target_cpu="arm" is_debug=false build_with_android=true'
 
@@ -157,6 +162,7 @@
         self.static_libs = []
         self.tools = []
         self.cmd = None
+        self.host_supported = False
         self.init_rc = []
         self.out = []
         self.export_include_dirs = []
@@ -176,6 +182,7 @@
         self._output_field(output, 'static_libs')
         self._output_field(output, 'tools')
         self._output_field(output, 'cmd', sort=False)
+        self._output_field(output, 'host_supported')
         self._output_field(output, 'init_rc')
         self._output_field(output, 'out')
         self._output_field(output, 'export_include_dirs')
@@ -204,8 +211,11 @@
             for item in sorted(value) if sort else value:
                 output.append('    "%s",' % item)
             output.append('  ],')
-        else:
-            output.append('  %s: "%s",' % (name, value))
+            return
+        if isinstance(value, bool):
+           output.append('  %s: true,' % name)
+           return
+        output.append('  %s: "%s",' % (name, value))
 
 
 class Blueprint(object):
@@ -484,6 +494,8 @@
         module.comment = 'GN target: %s' % target_name
         if target_name in target_initrc:
           module.init_rc = [target_initrc[target_name]]
+        if target_name in target_host_supported:
+          module.host_supported = True
 
         # Don't try to inject library/source dependencies into genrules because
         # they are not compiled in the traditional sense.
diff --git a/tools/gen_tracing_cpp_headers_from_protos.py b/tools/gen_tracing_cpp_headers_from_protos.py
index d855c77..350c5ad 100755
--- a/tools/gen_tracing_cpp_headers_from_protos.py
+++ b/tools/gen_tracing_cpp_headers_from_protos.py
@@ -24,7 +24,7 @@
   'perfetto/config/ftrace/ftrace_config.proto',
   'perfetto/config/trace_config.proto',
   'perfetto/config/test_config.proto',
-  'perfetto/ipc/commit_data_request.proto',
+  'perfetto/common/commit_data_request.proto',
 )
 
 HEADER_PATH = 'include/perfetto/tracing/core'
diff --git a/tools/trace_to_text/main.cc b/tools/trace_to_text/main.cc
index a6b6deb..5e05b8f 100644
--- a/tools/trace_to_text/main.cc
+++ b/tools/trace_to_text/main.cc
@@ -17,7 +17,6 @@
 #include <inttypes.h>
 
 #include <stdio.h>
-#include <sys/sysmacros.h>
 #include <algorithm>
 #include <fstream>
 #include <iostream>