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>