xref: /aosp_15_r20/external/perfetto/tools/gen_android_bp (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker#
4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker#
8*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker#
10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard Worker# This tool translates a collection of BUILD.gn files into a mostly equivalent
17*6dbdd20aSAndroid Build Coastguard Worker# Android.bp file for the Android Soong build system. The input to the tool is a
18*6dbdd20aSAndroid Build Coastguard Worker# JSON description of the GN build definition generated with the following
19*6dbdd20aSAndroid Build Coastguard Worker# command:
20*6dbdd20aSAndroid Build Coastguard Worker#
21*6dbdd20aSAndroid Build Coastguard Worker#   gn desc out --format=json --all-toolchains "//*" > desc.json
22*6dbdd20aSAndroid Build Coastguard Worker#
23*6dbdd20aSAndroid Build Coastguard Worker# The tool is then given a list of GN labels for which to generate Android.bp
24*6dbdd20aSAndroid Build Coastguard Worker# build rules. The dependencies for the GN labels are squashed to the generated
25*6dbdd20aSAndroid Build Coastguard Worker# Android.bp target, except for actions which get their own genrule. Some
26*6dbdd20aSAndroid Build Coastguard Worker# libraries are also mapped to their Android equivalents -- see |builtin_deps|.
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Workerimport argparse
29*6dbdd20aSAndroid Build Coastguard Workerimport json
30*6dbdd20aSAndroid Build Coastguard Workerimport os
31*6dbdd20aSAndroid Build Coastguard Workerimport re
32*6dbdd20aSAndroid Build Coastguard Workerimport sys
33*6dbdd20aSAndroid Build Coastguard Workerfrom typing import Dict
34*6dbdd20aSAndroid Build Coastguard Workerfrom typing import List
35*6dbdd20aSAndroid Build Coastguard Workerfrom typing import Optional
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Workerimport gn_utils
38*6dbdd20aSAndroid Build Coastguard Workerfrom gn_utils import GnParser
39*6dbdd20aSAndroid Build Coastguard Worker
40*6dbdd20aSAndroid Build Coastguard Workerfrom compat import itervalues
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard WorkerROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker# Arguments for the GN output directory.
45*6dbdd20aSAndroid Build Coastguard Workergn_args = ' '.join([
46*6dbdd20aSAndroid Build Coastguard Worker    'is_debug=false',
47*6dbdd20aSAndroid Build Coastguard Worker    'is_perfetto_build_generator=true',
48*6dbdd20aSAndroid Build Coastguard Worker    'perfetto_build_with_android=true',
49*6dbdd20aSAndroid Build Coastguard Worker    'target_cpu="arm"',
50*6dbdd20aSAndroid Build Coastguard Worker    'target_os="android"',
51*6dbdd20aSAndroid Build Coastguard Worker])
52*6dbdd20aSAndroid Build Coastguard Worker
53*6dbdd20aSAndroid Build Coastguard Worker# Default targets to translate to the blueprint file.
54*6dbdd20aSAndroid Build Coastguard Workerdefault_targets = [
55*6dbdd20aSAndroid Build Coastguard Worker    '//:libperfetto_client_experimental',
56*6dbdd20aSAndroid Build Coastguard Worker    '//:libperfetto',
57*6dbdd20aSAndroid Build Coastguard Worker    '//:perfetto_integrationtests',
58*6dbdd20aSAndroid Build Coastguard Worker    '//:perfetto_unittests',
59*6dbdd20aSAndroid Build Coastguard Worker    '//protos/perfetto/trace:perfetto_trace_protos',
60*6dbdd20aSAndroid Build Coastguard Worker    '//protos/perfetto/trace/android:perfetto_winscope_extensions_zero',
61*6dbdd20aSAndroid Build Coastguard Worker    '//src/android_internal:libperfetto_android_internal',
62*6dbdd20aSAndroid Build Coastguard Worker    '//src/base:perfetto_base_default_platform',
63*6dbdd20aSAndroid Build Coastguard Worker    '//src/shared_lib:libperfetto_c',
64*6dbdd20aSAndroid Build Coastguard Worker    '//src/perfetto_cmd:perfetto',
65*6dbdd20aSAndroid Build Coastguard Worker    '//src/perfetto_cmd:trigger_perfetto',
66*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:heapprofd_client',
67*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:heapprofd_client_api',
68*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:heapprofd_api_noop',
69*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:heapprofd',
70*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:heapprofd_standalone_client',
71*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/perf:traced_perf',
72*6dbdd20aSAndroid Build Coastguard Worker    '//src/traced/probes:traced_probes',
73*6dbdd20aSAndroid Build Coastguard Worker    '//src/traced/service:traced',
74*6dbdd20aSAndroid Build Coastguard Worker    '//src/traced_relay:traced_relay',
75*6dbdd20aSAndroid Build Coastguard Worker    '//src/trace_processor:trace_processor_shell',
76*6dbdd20aSAndroid Build Coastguard Worker    '//src/trace_redaction:trace_redactor',
77*6dbdd20aSAndroid Build Coastguard Worker    '//test/cts:perfetto_cts_deps',
78*6dbdd20aSAndroid Build Coastguard Worker    '//test/cts:perfetto_cts_jni_deps',
79*6dbdd20aSAndroid Build Coastguard Worker    '//test:perfetto_gtest_logcat_printer',
80*6dbdd20aSAndroid Build Coastguard Worker    '//test:perfetto_end_to_end_integrationtests',
81*6dbdd20aSAndroid Build Coastguard Worker    '//test/vts:perfetto_vts_deps',
82*6dbdd20aSAndroid Build Coastguard Worker]
83*6dbdd20aSAndroid Build Coastguard Worker
84*6dbdd20aSAndroid Build Coastguard Worker# Host targets
85*6dbdd20aSAndroid Build Coastguard Workeripc_plugin = '//src/ipc/protoc_plugin:ipc_plugin(%s)' % gn_utils.HOST_TOOLCHAIN
86*6dbdd20aSAndroid Build Coastguard Workerprotozero_plugin = '//src/protozero/protoc_plugin:protozero_plugin(%s)' % (
87*6dbdd20aSAndroid Build Coastguard Worker    gn_utils.HOST_TOOLCHAIN)
88*6dbdd20aSAndroid Build Coastguard Workercppgen_plugin = '//src/protozero/protoc_plugin:cppgen_plugin(%s)' % (
89*6dbdd20aSAndroid Build Coastguard Worker    gn_utils.HOST_TOOLCHAIN)
90*6dbdd20aSAndroid Build Coastguard Worker
91*6dbdd20aSAndroid Build Coastguard Workerdefault_targets += [
92*6dbdd20aSAndroid Build Coastguard Worker    '//src/traceconv:traceconv(%s)' % gn_utils.HOST_TOOLCHAIN,
93*6dbdd20aSAndroid Build Coastguard Worker    protozero_plugin,
94*6dbdd20aSAndroid Build Coastguard Worker    ipc_plugin,
95*6dbdd20aSAndroid Build Coastguard Worker]
96*6dbdd20aSAndroid Build Coastguard Worker
97*6dbdd20aSAndroid Build Coastguard Worker# Defines a custom init_rc argument to be applied to the corresponding output
98*6dbdd20aSAndroid Build Coastguard Worker# blueprint target.
99*6dbdd20aSAndroid Build Coastguard Workertarget_initrc = {
100*6dbdd20aSAndroid Build Coastguard Worker    '//src/traced/service:traced': {'perfetto.rc'},
101*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:heapprofd': {'heapprofd.rc'},
102*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/perf:traced_perf': {'traced_perf.rc'},
103*6dbdd20aSAndroid Build Coastguard Worker}
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard Workertarget_host_supported = [
106*6dbdd20aSAndroid Build Coastguard Worker    '//:libperfetto',
107*6dbdd20aSAndroid Build Coastguard Worker    '//:libperfetto_client_experimental',
108*6dbdd20aSAndroid Build Coastguard Worker    '//protos/perfetto/trace:perfetto_trace_protos',
109*6dbdd20aSAndroid Build Coastguard Worker    '//protos/perfetto/trace/android:perfetto_winscope_extensions_zero',
110*6dbdd20aSAndroid Build Coastguard Worker    '//src/shared_lib:libperfetto_c',
111*6dbdd20aSAndroid Build Coastguard Worker    '//src/trace_processor:demangle',
112*6dbdd20aSAndroid Build Coastguard Worker    '//src/trace_processor:trace_processor_shell',
113*6dbdd20aSAndroid Build Coastguard Worker    '//src/traced/probes:traced_probes',
114*6dbdd20aSAndroid Build Coastguard Worker    '//src/traced/service:traced',
115*6dbdd20aSAndroid Build Coastguard Worker]
116*6dbdd20aSAndroid Build Coastguard Worker
117*6dbdd20aSAndroid Build Coastguard Workertarget_vendor_available = [
118*6dbdd20aSAndroid Build Coastguard Worker    '//:libperfetto_client_experimental',
119*6dbdd20aSAndroid Build Coastguard Worker    '//src/shared_lib:libperfetto_c',
120*6dbdd20aSAndroid Build Coastguard Worker]
121*6dbdd20aSAndroid Build Coastguard Worker
122*6dbdd20aSAndroid Build Coastguard Workertarget_product_available = [
123*6dbdd20aSAndroid Build Coastguard Worker    '//:libperfetto_client_experimental',
124*6dbdd20aSAndroid Build Coastguard Worker]
125*6dbdd20aSAndroid Build Coastguard Worker
126*6dbdd20aSAndroid Build Coastguard Worker# Proto target groups which will be made public.
127*6dbdd20aSAndroid Build Coastguard Workerproto_groups = {
128*6dbdd20aSAndroid Build Coastguard Worker    'trace': {
129*6dbdd20aSAndroid Build Coastguard Worker        'types': ['lite'],
130*6dbdd20aSAndroid Build Coastguard Worker        'targets': [
131*6dbdd20aSAndroid Build Coastguard Worker            '//protos/perfetto/trace:non_minimal_source_set',
132*6dbdd20aSAndroid Build Coastguard Worker            '//protos/perfetto/trace:minimal_source_set',
133*6dbdd20aSAndroid Build Coastguard Worker        ]
134*6dbdd20aSAndroid Build Coastguard Worker    },
135*6dbdd20aSAndroid Build Coastguard Worker    'winscope': {
136*6dbdd20aSAndroid Build Coastguard Worker        'types': ['filegroup'],
137*6dbdd20aSAndroid Build Coastguard Worker        'targets': [
138*6dbdd20aSAndroid Build Coastguard Worker            '//protos/perfetto/trace:non_minimal_source_set',
139*6dbdd20aSAndroid Build Coastguard Worker            '//protos/perfetto/trace/android:winscope_extensions_source_set',
140*6dbdd20aSAndroid Build Coastguard Worker        ]
141*6dbdd20aSAndroid Build Coastguard Worker    },
142*6dbdd20aSAndroid Build Coastguard Worker    'config': {
143*6dbdd20aSAndroid Build Coastguard Worker        'types': ['lite', 'filegroup'],
144*6dbdd20aSAndroid Build Coastguard Worker        'targets': [
145*6dbdd20aSAndroid Build Coastguard Worker            '//protos/perfetto/config:source_set',
146*6dbdd20aSAndroid Build Coastguard Worker        ]
147*6dbdd20aSAndroid Build Coastguard Worker    },
148*6dbdd20aSAndroid Build Coastguard Worker    'metrics': {
149*6dbdd20aSAndroid Build Coastguard Worker        'types': ['python'],
150*6dbdd20aSAndroid Build Coastguard Worker        'targets': [
151*6dbdd20aSAndroid Build Coastguard Worker            '//protos/perfetto/metrics:source_set',
152*6dbdd20aSAndroid Build Coastguard Worker        ]
153*6dbdd20aSAndroid Build Coastguard Worker    },
154*6dbdd20aSAndroid Build Coastguard Worker}
155*6dbdd20aSAndroid Build Coastguard Worker
156*6dbdd20aSAndroid Build Coastguard Workerneeds_libfts = [
157*6dbdd20aSAndroid Build Coastguard Worker    '//:perfetto_unittests',
158*6dbdd20aSAndroid Build Coastguard Worker    '//src/trace_processor:trace_processor_shell',
159*6dbdd20aSAndroid Build Coastguard Worker    '//src/traceconv:traceconv',
160*6dbdd20aSAndroid Build Coastguard Worker]
161*6dbdd20aSAndroid Build Coastguard Worker
162*6dbdd20aSAndroid Build Coastguard Worker# All module names are prefixed with this string to avoid collisions.
163*6dbdd20aSAndroid Build Coastguard Workermodule_prefix = 'perfetto_'
164*6dbdd20aSAndroid Build Coastguard Worker
165*6dbdd20aSAndroid Build Coastguard Worker# Shared libraries which are directly translated to Android system equivalents.
166*6dbdd20aSAndroid Build Coastguard Workershared_library_allowlist = [
167*6dbdd20aSAndroid Build Coastguard Worker    'android',
168*6dbdd20aSAndroid Build Coastguard Worker    '[email protected]',
169*6dbdd20aSAndroid Build Coastguard Worker    '[email protected]',
170*6dbdd20aSAndroid Build Coastguard Worker    'android.hardware.health-V2-ndk',
171*6dbdd20aSAndroid Build Coastguard Worker    '[email protected]',
172*6dbdd20aSAndroid Build Coastguard Worker    'android.hardware.power.stats-V1-cpp',
173*6dbdd20aSAndroid Build Coastguard Worker    'base',
174*6dbdd20aSAndroid Build Coastguard Worker    'binder',
175*6dbdd20aSAndroid Build Coastguard Worker    'binder_ndk',
176*6dbdd20aSAndroid Build Coastguard Worker    'cutils',
177*6dbdd20aSAndroid Build Coastguard Worker    'hidlbase',
178*6dbdd20aSAndroid Build Coastguard Worker    'hidltransport',
179*6dbdd20aSAndroid Build Coastguard Worker    'hwbinder',
180*6dbdd20aSAndroid Build Coastguard Worker    'incident',
181*6dbdd20aSAndroid Build Coastguard Worker    'log',
182*6dbdd20aSAndroid Build Coastguard Worker    'services',
183*6dbdd20aSAndroid Build Coastguard Worker    'statssocket',
184*6dbdd20aSAndroid Build Coastguard Worker    'tracingproxy',
185*6dbdd20aSAndroid Build Coastguard Worker    'utils',
186*6dbdd20aSAndroid Build Coastguard Worker    'statspull',
187*6dbdd20aSAndroid Build Coastguard Worker]
188*6dbdd20aSAndroid Build Coastguard Worker
189*6dbdd20aSAndroid Build Coastguard Worker# Static libraries which are directly translated to Android system equivalents.
190*6dbdd20aSAndroid Build Coastguard Workerstatic_library_allowlist = [
191*6dbdd20aSAndroid Build Coastguard Worker    'statslog_perfetto',
192*6dbdd20aSAndroid Build Coastguard Worker]
193*6dbdd20aSAndroid Build Coastguard Worker
194*6dbdd20aSAndroid Build Coastguard Worker# Name of the module which settings such as compiler flags for all other
195*6dbdd20aSAndroid Build Coastguard Worker# modules.
196*6dbdd20aSAndroid Build Coastguard Workerdefaults_module = module_prefix + 'defaults'
197*6dbdd20aSAndroid Build Coastguard Worker
198*6dbdd20aSAndroid Build Coastguard Worker# Location of the project in the Android source tree.
199*6dbdd20aSAndroid Build Coastguard Workertree_path = 'external/perfetto'
200*6dbdd20aSAndroid Build Coastguard Worker
201*6dbdd20aSAndroid Build Coastguard Worker# Path for the protobuf sources in the standalone build.
202*6dbdd20aSAndroid Build Coastguard Workerbuildtools_protobuf_src = '//buildtools/protobuf/src'
203*6dbdd20aSAndroid Build Coastguard Worker
204*6dbdd20aSAndroid Build Coastguard Worker# Location of the protobuf src dir in the Android source tree.
205*6dbdd20aSAndroid Build Coastguard Workerandroid_protobuf_src = 'external/protobuf/src'
206*6dbdd20aSAndroid Build Coastguard Worker
207*6dbdd20aSAndroid Build Coastguard Worker# Compiler flags which are passed through to the blueprint.
208*6dbdd20aSAndroid Build Coastguard Workercflag_allowlist = r'^-DPERFETTO.*$'
209*6dbdd20aSAndroid Build Coastguard Worker
210*6dbdd20aSAndroid Build Coastguard Worker# Compiler defines which are passed through to the blueprint.
211*6dbdd20aSAndroid Build Coastguard Workerdefine_allowlist = r'^(GOOGLE_PROTO.*)|(ZLIB_.*)|(USE_MMAP)$'
212*6dbdd20aSAndroid Build Coastguard Worker
213*6dbdd20aSAndroid Build Coastguard Worker# The directory where the generated perfetto_build_flags.h will be copied into.
214*6dbdd20aSAndroid Build Coastguard Workerbuildflags_dir = 'include/perfetto/base/build_configs/android_tree'
215*6dbdd20aSAndroid Build Coastguard Worker
216*6dbdd20aSAndroid Build Coastguard Workerdef enumerate_data_deps():
217*6dbdd20aSAndroid Build Coastguard Worker  with open(os.path.join(ROOT_DIR, 'tools', 'test_data.txt')) as f:
218*6dbdd20aSAndroid Build Coastguard Worker    lines = f.readlines()
219*6dbdd20aSAndroid Build Coastguard Worker  for line in (line.strip() for line in lines if not line.startswith('#')):
220*6dbdd20aSAndroid Build Coastguard Worker    assert os.path.exists(line), 'file %s should exist' % line
221*6dbdd20aSAndroid Build Coastguard Worker    if line.startswith('test/data/'):
222*6dbdd20aSAndroid Build Coastguard Worker      # Skip test data files that require GCS. They are only for benchmarks.
223*6dbdd20aSAndroid Build Coastguard Worker      # We don't run benchmarks in the android tree.
224*6dbdd20aSAndroid Build Coastguard Worker      continue
225*6dbdd20aSAndroid Build Coastguard Worker    if line.endswith('/.'):
226*6dbdd20aSAndroid Build Coastguard Worker      yield line[:-1] + '**/*'
227*6dbdd20aSAndroid Build Coastguard Worker    else:
228*6dbdd20aSAndroid Build Coastguard Worker      yield line
229*6dbdd20aSAndroid Build Coastguard Worker
230*6dbdd20aSAndroid Build Coastguard Worker
231*6dbdd20aSAndroid Build Coastguard Worker# Additional arguments to apply to Android.bp rules.
232*6dbdd20aSAndroid Build Coastguard Workeradditional_args = {
233*6dbdd20aSAndroid Build Coastguard Worker    'heapprofd_client_api': [
234*6dbdd20aSAndroid Build Coastguard Worker        ('static_libs', {'libasync_safe'}),
235*6dbdd20aSAndroid Build Coastguard Worker        # heapprofd_client_api MUST NOT have global constructors. Because it
236*6dbdd20aSAndroid Build Coastguard Worker        # is loaded in an __attribute__((constructor)) of libc, we cannot
237*6dbdd20aSAndroid Build Coastguard Worker        # guarantee that the global constructors get run before it is used.
238*6dbdd20aSAndroid Build Coastguard Worker        ('cflags', {'-Wglobal-constructors', '-Werror=global-constructors'}),
239*6dbdd20aSAndroid Build Coastguard Worker        ('version_script', 'src/profiling/memory/heapprofd_client_api.map.txt'),
240*6dbdd20aSAndroid Build Coastguard Worker        ('stubs', {
241*6dbdd20aSAndroid Build Coastguard Worker            'versions': ['S'],
242*6dbdd20aSAndroid Build Coastguard Worker            'symbol_file': 'src/profiling/memory/heapprofd_client_api.map.txt',
243*6dbdd20aSAndroid Build Coastguard Worker        }),
244*6dbdd20aSAndroid Build Coastguard Worker        ('export_include_dirs', {'src/profiling/memory/include'}),
245*6dbdd20aSAndroid Build Coastguard Worker    ],
246*6dbdd20aSAndroid Build Coastguard Worker    'heapprofd_api_noop': [
247*6dbdd20aSAndroid Build Coastguard Worker        ('version_script', 'src/profiling/memory/heapprofd_client_api.map.txt'),
248*6dbdd20aSAndroid Build Coastguard Worker        ('stubs', {
249*6dbdd20aSAndroid Build Coastguard Worker            'versions': ['S'],
250*6dbdd20aSAndroid Build Coastguard Worker            'symbol_file': 'src/profiling/memory/heapprofd_client_api.map.txt',
251*6dbdd20aSAndroid Build Coastguard Worker        }),
252*6dbdd20aSAndroid Build Coastguard Worker        ('export_include_dirs', {'src/profiling/memory/include'}),
253*6dbdd20aSAndroid Build Coastguard Worker    ],
254*6dbdd20aSAndroid Build Coastguard Worker    'heapprofd_client': [
255*6dbdd20aSAndroid Build Coastguard Worker        ('include_dirs', {'bionic/libc'}),
256*6dbdd20aSAndroid Build Coastguard Worker        ('static_libs', {'libasync_safe'}),
257*6dbdd20aSAndroid Build Coastguard Worker    ],
258*6dbdd20aSAndroid Build Coastguard Worker    'heapprofd_standalone_client': [
259*6dbdd20aSAndroid Build Coastguard Worker        ('static_libs', {'libasync_safe'}),
260*6dbdd20aSAndroid Build Coastguard Worker        ('version_script', 'src/profiling/memory/heapprofd_client_api.map.txt'),
261*6dbdd20aSAndroid Build Coastguard Worker        ('export_include_dirs', {'src/profiling/memory/include'}),
262*6dbdd20aSAndroid Build Coastguard Worker        ('stl', 'libc++_static'),
263*6dbdd20aSAndroid Build Coastguard Worker    ],
264*6dbdd20aSAndroid Build Coastguard Worker    'perfetto_unittests': [
265*6dbdd20aSAndroid Build Coastguard Worker        ('data', set(enumerate_data_deps())),
266*6dbdd20aSAndroid Build Coastguard Worker        ('include_dirs', {'bionic/libc/kernel'}),
267*6dbdd20aSAndroid Build Coastguard Worker    ],
268*6dbdd20aSAndroid Build Coastguard Worker    'perfetto_integrationtests': [
269*6dbdd20aSAndroid Build Coastguard Worker        ('test_suites', {'general-tests'}),
270*6dbdd20aSAndroid Build Coastguard Worker        ('test_config', 'PerfettoIntegrationTests.xml'),
271*6dbdd20aSAndroid Build Coastguard Worker    ],
272*6dbdd20aSAndroid Build Coastguard Worker    'libperfetto_android_internal': [('static_libs', {'libhealthhalutils'}),],
273*6dbdd20aSAndroid Build Coastguard Worker    'trace_processor_shell': [
274*6dbdd20aSAndroid Build Coastguard Worker        ('strip', {
275*6dbdd20aSAndroid Build Coastguard Worker            'all': True
276*6dbdd20aSAndroid Build Coastguard Worker        }),
277*6dbdd20aSAndroid Build Coastguard Worker        ('host', {
278*6dbdd20aSAndroid Build Coastguard Worker            'stl': 'libc++_static',
279*6dbdd20aSAndroid Build Coastguard Worker            'dist': {
280*6dbdd20aSAndroid Build Coastguard Worker                'targets': ['sdk_repo']
281*6dbdd20aSAndroid Build Coastguard Worker            },
282*6dbdd20aSAndroid Build Coastguard Worker        }),
283*6dbdd20aSAndroid Build Coastguard Worker    ],
284*6dbdd20aSAndroid Build Coastguard Worker    'libperfetto_client_experimental': [
285*6dbdd20aSAndroid Build Coastguard Worker        ('apex_available', {
286*6dbdd20aSAndroid Build Coastguard Worker            '//apex_available:platform', '//apex_available:anyapex'
287*6dbdd20aSAndroid Build Coastguard Worker        }),
288*6dbdd20aSAndroid Build Coastguard Worker        ('min_sdk_version', '30'),
289*6dbdd20aSAndroid Build Coastguard Worker        ('shared_libs', {'liblog'}),
290*6dbdd20aSAndroid Build Coastguard Worker        ('export_include_dirs', {'include', buildflags_dir}),
291*6dbdd20aSAndroid Build Coastguard Worker    ],
292*6dbdd20aSAndroid Build Coastguard Worker    'libperfetto_c': [
293*6dbdd20aSAndroid Build Coastguard Worker        ('min_sdk_version', '30'),
294*6dbdd20aSAndroid Build Coastguard Worker        ('export_include_dirs', {'include'}),
295*6dbdd20aSAndroid Build Coastguard Worker        ('cflags', {'-DPERFETTO_SHLIB_SDK_IMPLEMENTATION'}),
296*6dbdd20aSAndroid Build Coastguard Worker    ],
297*6dbdd20aSAndroid Build Coastguard Worker    'perfetto_trace_protos': [
298*6dbdd20aSAndroid Build Coastguard Worker        ('apex_available', {
299*6dbdd20aSAndroid Build Coastguard Worker            '//apex_available:platform', 'com.android.art',
300*6dbdd20aSAndroid Build Coastguard Worker            'com.android.art.debug'
301*6dbdd20aSAndroid Build Coastguard Worker        }),
302*6dbdd20aSAndroid Build Coastguard Worker        ('min_sdk_version', 'S'),
303*6dbdd20aSAndroid Build Coastguard Worker    ],
304*6dbdd20aSAndroid Build Coastguard Worker    'libperfetto': [('export_include_dirs', {'include', buildflags_dir}),],
305*6dbdd20aSAndroid Build Coastguard Worker    'perfetto': [('required', {'perfetto_persistent_cfg.pbtxt'}),],
306*6dbdd20aSAndroid Build Coastguard Worker    'trace_redactor': [
307*6dbdd20aSAndroid Build Coastguard Worker        ('min_sdk_version', '35'),
308*6dbdd20aSAndroid Build Coastguard Worker        ('apex_available', {
309*6dbdd20aSAndroid Build Coastguard Worker            '//apex_available:platform',
310*6dbdd20aSAndroid Build Coastguard Worker            'com.android.profiling'
311*6dbdd20aSAndroid Build Coastguard Worker        }),
312*6dbdd20aSAndroid Build Coastguard Worker    ],
313*6dbdd20aSAndroid Build Coastguard Worker}
314*6dbdd20aSAndroid Build Coastguard Worker
315*6dbdd20aSAndroid Build Coastguard Worker
316*6dbdd20aSAndroid Build Coastguard Workerdef enable_base_platform(module):
317*6dbdd20aSAndroid Build Coastguard Worker  module.srcs.add(':perfetto_base_default_platform')
318*6dbdd20aSAndroid Build Coastguard Worker
319*6dbdd20aSAndroid Build Coastguard Worker
320*6dbdd20aSAndroid Build Coastguard Workerdef enable_gtest_and_gmock(module):
321*6dbdd20aSAndroid Build Coastguard Worker  module.static_libs.add('libgmock')
322*6dbdd20aSAndroid Build Coastguard Worker  module.static_libs.add('libgtest')
323*6dbdd20aSAndroid Build Coastguard Worker  if module.name != 'perfetto_gtest_logcat_printer':
324*6dbdd20aSAndroid Build Coastguard Worker    module.whole_static_libs.add('perfetto_gtest_logcat_printer')
325*6dbdd20aSAndroid Build Coastguard Worker
326*6dbdd20aSAndroid Build Coastguard Worker
327*6dbdd20aSAndroid Build Coastguard Workerdef enable_protobuf_full(module):
328*6dbdd20aSAndroid Build Coastguard Worker  if module.type == 'cc_binary_host':
329*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libprotobuf-cpp-full')
330*6dbdd20aSAndroid Build Coastguard Worker  elif module.host_supported:
331*6dbdd20aSAndroid Build Coastguard Worker    module.host.static_libs.add('libprotobuf-cpp-full')
332*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('libprotobuf-cpp-full')
333*6dbdd20aSAndroid Build Coastguard Worker  else:
334*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libprotobuf-cpp-full')
335*6dbdd20aSAndroid Build Coastguard Worker
336*6dbdd20aSAndroid Build Coastguard Worker
337*6dbdd20aSAndroid Build Coastguard Workerdef enable_protobuf_lite(module):
338*6dbdd20aSAndroid Build Coastguard Worker  module.shared_libs.add('libprotobuf-cpp-lite')
339*6dbdd20aSAndroid Build Coastguard Worker
340*6dbdd20aSAndroid Build Coastguard Worker
341*6dbdd20aSAndroid Build Coastguard Workerdef enable_protoc_lib(module):
342*6dbdd20aSAndroid Build Coastguard Worker  if module.type == 'cc_binary_host':
343*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libprotoc')
344*6dbdd20aSAndroid Build Coastguard Worker  else:
345*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libprotoc')
346*6dbdd20aSAndroid Build Coastguard Worker
347*6dbdd20aSAndroid Build Coastguard Worker
348*6dbdd20aSAndroid Build Coastguard Workerdef enable_libunwindstack(module):
349*6dbdd20aSAndroid Build Coastguard Worker  if module.name != 'heapprofd_standalone_client':
350*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libunwindstack')
351*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libprocinfo')
352*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libbase')
353*6dbdd20aSAndroid Build Coastguard Worker  else:
354*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libunwindstack')
355*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libprocinfo')
356*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libbase')
357*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('liblzma')
358*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libdexfile_support')
359*6dbdd20aSAndroid Build Coastguard Worker    module.runtime_libs.add('libdexfile')  # libdexfile_support dependency
360*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libz') # libunwindstack dependency
361*6dbdd20aSAndroid Build Coastguard Worker
362*6dbdd20aSAndroid Build Coastguard Worker
363*6dbdd20aSAndroid Build Coastguard Workerdef enable_libunwind(module):
364*6dbdd20aSAndroid Build Coastguard Worker  # libunwind is disabled on Darwin so we cannot depend on it.
365*6dbdd20aSAndroid Build Coastguard Worker  pass
366*6dbdd20aSAndroid Build Coastguard Worker
367*6dbdd20aSAndroid Build Coastguard Worker
368*6dbdd20aSAndroid Build Coastguard Workerdef enable_sqlite(module):
369*6dbdd20aSAndroid Build Coastguard Worker  if module.type == 'cc_binary_host':
370*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libsqlite_static_noicu')
371*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('sqlite_ext_percentile')
372*6dbdd20aSAndroid Build Coastguard Worker  elif module.host_supported:
373*6dbdd20aSAndroid Build Coastguard Worker    # Copy what the sqlite3 command line tool does.
374*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('libsqlite')
375*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('libicu')
376*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('liblog')
377*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('libutils')
378*6dbdd20aSAndroid Build Coastguard Worker    module.android.static_libs.add('sqlite_ext_percentile')
379*6dbdd20aSAndroid Build Coastguard Worker    module.host.static_libs.add('libsqlite_static_noicu')
380*6dbdd20aSAndroid Build Coastguard Worker    module.host.static_libs.add('sqlite_ext_percentile')
381*6dbdd20aSAndroid Build Coastguard Worker  else:
382*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libsqlite')
383*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libicu')
384*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('liblog')
385*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libutils')
386*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('sqlite_ext_percentile')
387*6dbdd20aSAndroid Build Coastguard Worker
388*6dbdd20aSAndroid Build Coastguard Worker
389*6dbdd20aSAndroid Build Coastguard Workerdef enable_zlib(module):
390*6dbdd20aSAndroid Build Coastguard Worker  if module.type == 'cc_binary_host':
391*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libz')
392*6dbdd20aSAndroid Build Coastguard Worker  elif module.host_supported:
393*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('libz')
394*6dbdd20aSAndroid Build Coastguard Worker    module.host.static_libs.add('libz')
395*6dbdd20aSAndroid Build Coastguard Worker  else:
396*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libz')
397*6dbdd20aSAndroid Build Coastguard Worker
398*6dbdd20aSAndroid Build Coastguard Worker
399*6dbdd20aSAndroid Build Coastguard Workerdef enable_expat(module):
400*6dbdd20aSAndroid Build Coastguard Worker  if module.type == 'cc_binary_host':
401*6dbdd20aSAndroid Build Coastguard Worker    module.static_libs.add('libexpat')
402*6dbdd20aSAndroid Build Coastguard Worker  elif module.host_supported:
403*6dbdd20aSAndroid Build Coastguard Worker    module.android.shared_libs.add('libexpat')
404*6dbdd20aSAndroid Build Coastguard Worker    module.host.static_libs.add('libexpat')
405*6dbdd20aSAndroid Build Coastguard Worker  else:
406*6dbdd20aSAndroid Build Coastguard Worker    module.shared_libs.add('libexpat')
407*6dbdd20aSAndroid Build Coastguard Worker
408*6dbdd20aSAndroid Build Coastguard Worker
409*6dbdd20aSAndroid Build Coastguard Workerdef enable_uapi_headers(module):
410*6dbdd20aSAndroid Build Coastguard Worker  module.include_dirs.add('bionic/libc/kernel')
411*6dbdd20aSAndroid Build Coastguard Worker
412*6dbdd20aSAndroid Build Coastguard Worker
413*6dbdd20aSAndroid Build Coastguard Workerdef enable_bionic_libc_platform_headers_on_android(module):
414*6dbdd20aSAndroid Build Coastguard Worker  module.header_libs.add('bionic_libc_platform_headers')
415*6dbdd20aSAndroid Build Coastguard Worker
416*6dbdd20aSAndroid Build Coastguard Worker
417*6dbdd20aSAndroid Build Coastguard Worker# Android equivalents for third-party libraries that the upstream project
418*6dbdd20aSAndroid Build Coastguard Worker# depends on.
419*6dbdd20aSAndroid Build Coastguard Workerbuiltin_deps = {
420*6dbdd20aSAndroid Build Coastguard Worker    '//gn:default_deps':
421*6dbdd20aSAndroid Build Coastguard Worker        lambda x: None,
422*6dbdd20aSAndroid Build Coastguard Worker    '//gn:gtest_main':
423*6dbdd20aSAndroid Build Coastguard Worker        lambda x: None,
424*6dbdd20aSAndroid Build Coastguard Worker    '//gn:protoc':
425*6dbdd20aSAndroid Build Coastguard Worker        lambda x: None,
426*6dbdd20aSAndroid Build Coastguard Worker    '//gn:base_platform':
427*6dbdd20aSAndroid Build Coastguard Worker        enable_base_platform,
428*6dbdd20aSAndroid Build Coastguard Worker    '//gn:gtest_and_gmock':
429*6dbdd20aSAndroid Build Coastguard Worker        enable_gtest_and_gmock,
430*6dbdd20aSAndroid Build Coastguard Worker    '//gn:libunwind':
431*6dbdd20aSAndroid Build Coastguard Worker        enable_libunwind,
432*6dbdd20aSAndroid Build Coastguard Worker    '//gn:protobuf_full':
433*6dbdd20aSAndroid Build Coastguard Worker        enable_protobuf_full,
434*6dbdd20aSAndroid Build Coastguard Worker    '//gn:protobuf_lite':
435*6dbdd20aSAndroid Build Coastguard Worker        enable_protobuf_lite,
436*6dbdd20aSAndroid Build Coastguard Worker    '//gn:protoc_lib':
437*6dbdd20aSAndroid Build Coastguard Worker        enable_protoc_lib,
438*6dbdd20aSAndroid Build Coastguard Worker    '//gn:libunwindstack':
439*6dbdd20aSAndroid Build Coastguard Worker        enable_libunwindstack,
440*6dbdd20aSAndroid Build Coastguard Worker    '//gn:sqlite':
441*6dbdd20aSAndroid Build Coastguard Worker        enable_sqlite,
442*6dbdd20aSAndroid Build Coastguard Worker    '//gn:zlib':
443*6dbdd20aSAndroid Build Coastguard Worker        enable_zlib,
444*6dbdd20aSAndroid Build Coastguard Worker    '//gn:expat':
445*6dbdd20aSAndroid Build Coastguard Worker        enable_expat,
446*6dbdd20aSAndroid Build Coastguard Worker    '//gn:bionic_kernel_uapi_headers':
447*6dbdd20aSAndroid Build Coastguard Worker        enable_uapi_headers,
448*6dbdd20aSAndroid Build Coastguard Worker    '//src/profiling/memory:bionic_libc_platform_headers_on_android':
449*6dbdd20aSAndroid Build Coastguard Worker        enable_bionic_libc_platform_headers_on_android,
450*6dbdd20aSAndroid Build Coastguard Worker}
451*6dbdd20aSAndroid Build Coastguard Worker
452*6dbdd20aSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------
453*6dbdd20aSAndroid Build Coastguard Worker# End of configuration.
454*6dbdd20aSAndroid Build Coastguard Worker# ----------------------------------------------------------------------------
455*6dbdd20aSAndroid Build Coastguard Worker
456*6dbdd20aSAndroid Build Coastguard Worker
457*6dbdd20aSAndroid Build Coastguard Workerclass Error(Exception):
458*6dbdd20aSAndroid Build Coastguard Worker  pass
459*6dbdd20aSAndroid Build Coastguard Worker
460*6dbdd20aSAndroid Build Coastguard Worker
461*6dbdd20aSAndroid Build Coastguard Workerclass ThrowingArgumentParser(argparse.ArgumentParser):
462*6dbdd20aSAndroid Build Coastguard Worker
463*6dbdd20aSAndroid Build Coastguard Worker  def __init__(self, context):
464*6dbdd20aSAndroid Build Coastguard Worker    super(ThrowingArgumentParser, self).__init__()
465*6dbdd20aSAndroid Build Coastguard Worker    self.context = context
466*6dbdd20aSAndroid Build Coastguard Worker
467*6dbdd20aSAndroid Build Coastguard Worker  def error(self, message):
468*6dbdd20aSAndroid Build Coastguard Worker    raise Error('%s: %s' % (self.context, message))
469*6dbdd20aSAndroid Build Coastguard Worker
470*6dbdd20aSAndroid Build Coastguard Worker
471*6dbdd20aSAndroid Build Coastguard Workerdef write_blueprint_key_value(output, name, value, sort=True):
472*6dbdd20aSAndroid Build Coastguard Worker  """Writes a Blueprint key-value pair to the output"""
473*6dbdd20aSAndroid Build Coastguard Worker
474*6dbdd20aSAndroid Build Coastguard Worker  if isinstance(value, bool):
475*6dbdd20aSAndroid Build Coastguard Worker    if value:
476*6dbdd20aSAndroid Build Coastguard Worker      output.append('    %s: true,' % name)
477*6dbdd20aSAndroid Build Coastguard Worker    else:
478*6dbdd20aSAndroid Build Coastguard Worker      output.append('    %s: false,' % name)
479*6dbdd20aSAndroid Build Coastguard Worker    return
480*6dbdd20aSAndroid Build Coastguard Worker  if not value:
481*6dbdd20aSAndroid Build Coastguard Worker    return
482*6dbdd20aSAndroid Build Coastguard Worker  if isinstance(value, set):
483*6dbdd20aSAndroid Build Coastguard Worker    value = sorted(value)
484*6dbdd20aSAndroid Build Coastguard Worker  if isinstance(value, list):
485*6dbdd20aSAndroid Build Coastguard Worker    output.append('    %s: [' % name)
486*6dbdd20aSAndroid Build Coastguard Worker    for item in sorted(value) if sort else value:
487*6dbdd20aSAndroid Build Coastguard Worker      output.append('        "%s",' % item)
488*6dbdd20aSAndroid Build Coastguard Worker    output.append('    ],')
489*6dbdd20aSAndroid Build Coastguard Worker    return
490*6dbdd20aSAndroid Build Coastguard Worker  if isinstance(value, Target):
491*6dbdd20aSAndroid Build Coastguard Worker    value.to_string(output)
492*6dbdd20aSAndroid Build Coastguard Worker    return
493*6dbdd20aSAndroid Build Coastguard Worker  if isinstance(value, dict):
494*6dbdd20aSAndroid Build Coastguard Worker    kv_output = []
495*6dbdd20aSAndroid Build Coastguard Worker    for k, v in value.items():
496*6dbdd20aSAndroid Build Coastguard Worker      write_blueprint_key_value(kv_output, k, v)
497*6dbdd20aSAndroid Build Coastguard Worker
498*6dbdd20aSAndroid Build Coastguard Worker    output.append('    %s: {' % name)
499*6dbdd20aSAndroid Build Coastguard Worker    for line in kv_output:
500*6dbdd20aSAndroid Build Coastguard Worker      output.append('    %s' % line)
501*6dbdd20aSAndroid Build Coastguard Worker    output.append('    },')
502*6dbdd20aSAndroid Build Coastguard Worker    return
503*6dbdd20aSAndroid Build Coastguard Worker  output.append('    %s: "%s",' % (name, value))
504*6dbdd20aSAndroid Build Coastguard Worker
505*6dbdd20aSAndroid Build Coastguard Worker
506*6dbdd20aSAndroid Build Coastguard Workerclass Target(object):
507*6dbdd20aSAndroid Build Coastguard Worker  """A target-scoped part of a module"""
508*6dbdd20aSAndroid Build Coastguard Worker
509*6dbdd20aSAndroid Build Coastguard Worker  def __init__(self, name):
510*6dbdd20aSAndroid Build Coastguard Worker    self.name = name
511*6dbdd20aSAndroid Build Coastguard Worker    self.shared_libs = set()
512*6dbdd20aSAndroid Build Coastguard Worker    self.static_libs = set()
513*6dbdd20aSAndroid Build Coastguard Worker    self.whole_static_libs = set()
514*6dbdd20aSAndroid Build Coastguard Worker    self.cflags = set()
515*6dbdd20aSAndroid Build Coastguard Worker    self.dist = dict()
516*6dbdd20aSAndroid Build Coastguard Worker    self.strip = dict()
517*6dbdd20aSAndroid Build Coastguard Worker    self.stl = None
518*6dbdd20aSAndroid Build Coastguard Worker
519*6dbdd20aSAndroid Build Coastguard Worker  def to_string(self, output):
520*6dbdd20aSAndroid Build Coastguard Worker    nested_out = []
521*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'shared_libs')
522*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'static_libs')
523*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'whole_static_libs')
524*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'cflags')
525*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'stl')
526*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'dist')
527*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(nested_out, 'strip')
528*6dbdd20aSAndroid Build Coastguard Worker
529*6dbdd20aSAndroid Build Coastguard Worker    if nested_out:
530*6dbdd20aSAndroid Build Coastguard Worker      output.append('    %s: {' % self.name)
531*6dbdd20aSAndroid Build Coastguard Worker      for line in nested_out:
532*6dbdd20aSAndroid Build Coastguard Worker        output.append('    %s' % line)
533*6dbdd20aSAndroid Build Coastguard Worker      output.append('    },')
534*6dbdd20aSAndroid Build Coastguard Worker
535*6dbdd20aSAndroid Build Coastguard Worker  def _output_field(self, output, name, sort=True):
536*6dbdd20aSAndroid Build Coastguard Worker    value = getattr(self, name)
537*6dbdd20aSAndroid Build Coastguard Worker    return write_blueprint_key_value(output, name, value, sort)
538*6dbdd20aSAndroid Build Coastguard Worker
539*6dbdd20aSAndroid Build Coastguard Worker
540*6dbdd20aSAndroid Build Coastguard Workerclass Module(object):
541*6dbdd20aSAndroid Build Coastguard Worker  """A single module (e.g., cc_binary, cc_test) in a blueprint."""
542*6dbdd20aSAndroid Build Coastguard Worker
543*6dbdd20aSAndroid Build Coastguard Worker  def __init__(self, mod_type, name, gn_target):
544*6dbdd20aSAndroid Build Coastguard Worker    assert (gn_target)
545*6dbdd20aSAndroid Build Coastguard Worker    self.type = mod_type
546*6dbdd20aSAndroid Build Coastguard Worker    self.gn_target = gn_target
547*6dbdd20aSAndroid Build Coastguard Worker    self.name = name
548*6dbdd20aSAndroid Build Coastguard Worker    self.srcs = set()
549*6dbdd20aSAndroid Build Coastguard Worker    self.main: Optional[str] = None
550*6dbdd20aSAndroid Build Coastguard Worker    self.comment = 'GN: ' + gn_utils.label_without_toolchain(gn_target)
551*6dbdd20aSAndroid Build Coastguard Worker    self.shared_libs = set()
552*6dbdd20aSAndroid Build Coastguard Worker    self.static_libs = set()
553*6dbdd20aSAndroid Build Coastguard Worker    self.whole_static_libs = set()
554*6dbdd20aSAndroid Build Coastguard Worker    self.runtime_libs = set()
555*6dbdd20aSAndroid Build Coastguard Worker    self.tools = set()
556*6dbdd20aSAndroid Build Coastguard Worker    self.cmd: Optional[str] = None
557*6dbdd20aSAndroid Build Coastguard Worker    self.host_supported = False
558*6dbdd20aSAndroid Build Coastguard Worker    self.vendor_available = False
559*6dbdd20aSAndroid Build Coastguard Worker    self.product_available = False
560*6dbdd20aSAndroid Build Coastguard Worker    self.init_rc = set()
561*6dbdd20aSAndroid Build Coastguard Worker    self.out = set()
562*6dbdd20aSAndroid Build Coastguard Worker    self.export_include_dirs = set()
563*6dbdd20aSAndroid Build Coastguard Worker    self.generated_headers = set()
564*6dbdd20aSAndroid Build Coastguard Worker    self.export_generated_headers = set()
565*6dbdd20aSAndroid Build Coastguard Worker    self.defaults = set()
566*6dbdd20aSAndroid Build Coastguard Worker    self.cflags = set()
567*6dbdd20aSAndroid Build Coastguard Worker    self.include_dirs = set()
568*6dbdd20aSAndroid Build Coastguard Worker    self.header_libs = set()
569*6dbdd20aSAndroid Build Coastguard Worker    self.required = set()
570*6dbdd20aSAndroid Build Coastguard Worker    self.user_debug_flag = False
571*6dbdd20aSAndroid Build Coastguard Worker    self.tool_files: Optional[List[str]] = None
572*6dbdd20aSAndroid Build Coastguard Worker    self.android = Target('android')
573*6dbdd20aSAndroid Build Coastguard Worker    self.host = Target('host')
574*6dbdd20aSAndroid Build Coastguard Worker    self.musl = Target('musl')
575*6dbdd20aSAndroid Build Coastguard Worker    self.lto: Optional[bool] = None
576*6dbdd20aSAndroid Build Coastguard Worker    self.stl = None
577*6dbdd20aSAndroid Build Coastguard Worker    self.dist = dict()
578*6dbdd20aSAndroid Build Coastguard Worker    self.strip = dict()
579*6dbdd20aSAndroid Build Coastguard Worker    self.data = set()
580*6dbdd20aSAndroid Build Coastguard Worker    self.apex_available = set()
581*6dbdd20aSAndroid Build Coastguard Worker    self.min_sdk_version = None
582*6dbdd20aSAndroid Build Coastguard Worker    self.proto = dict()
583*6dbdd20aSAndroid Build Coastguard Worker    self.output_extension: Optional[str] = None
584*6dbdd20aSAndroid Build Coastguard Worker    # The genrule_XXX below are properties that must to be propagated back
585*6dbdd20aSAndroid Build Coastguard Worker    # on the module(s) that depend on the genrule.
586*6dbdd20aSAndroid Build Coastguard Worker    self.genrule_headers = set()
587*6dbdd20aSAndroid Build Coastguard Worker    self.genrule_srcs = set()
588*6dbdd20aSAndroid Build Coastguard Worker    self.genrule_shared_libs = set()
589*6dbdd20aSAndroid Build Coastguard Worker    self.version_script = None
590*6dbdd20aSAndroid Build Coastguard Worker    self.test_suites = set()
591*6dbdd20aSAndroid Build Coastguard Worker    self.test_config = None
592*6dbdd20aSAndroid Build Coastguard Worker    self.stubs = {}
593*6dbdd20aSAndroid Build Coastguard Worker
594*6dbdd20aSAndroid Build Coastguard Worker  def to_string(self, output):
595*6dbdd20aSAndroid Build Coastguard Worker    if self.comment:
596*6dbdd20aSAndroid Build Coastguard Worker      output.append('// %s' % self.comment)
597*6dbdd20aSAndroid Build Coastguard Worker    output.append('%s {' % self.type)
598*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'name')
599*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'srcs')
600*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'shared_libs')
601*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'static_libs')
602*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'whole_static_libs')
603*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'runtime_libs')
604*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'tools')
605*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'cmd', sort=False)
606*6dbdd20aSAndroid Build Coastguard Worker    if self.host_supported:
607*6dbdd20aSAndroid Build Coastguard Worker      self._output_field(output, 'host_supported')
608*6dbdd20aSAndroid Build Coastguard Worker    if self.vendor_available:
609*6dbdd20aSAndroid Build Coastguard Worker      self._output_field(output, 'vendor_available')
610*6dbdd20aSAndroid Build Coastguard Worker    if self.product_available:
611*6dbdd20aSAndroid Build Coastguard Worker      self._output_field(output, 'product_available')
612*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'init_rc')
613*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'out')
614*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'export_include_dirs')
615*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'generated_headers')
616*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'export_generated_headers')
617*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'defaults')
618*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'cflags')
619*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'include_dirs')
620*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'header_libs')
621*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'required')
622*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'dist')
623*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'strip')
624*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'tool_files')
625*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'data')
626*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'stl')
627*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'apex_available')
628*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'min_sdk_version')
629*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'version_script')
630*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'test_suites')
631*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'test_config')
632*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'stubs')
633*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'proto')
634*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'main')
635*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(output, 'output_extension')
636*6dbdd20aSAndroid Build Coastguard Worker
637*6dbdd20aSAndroid Build Coastguard Worker    target_out = []
638*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(target_out, 'android')
639*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(target_out, 'host')
640*6dbdd20aSAndroid Build Coastguard Worker    self._output_field(target_out, 'musl')
641*6dbdd20aSAndroid Build Coastguard Worker    if target_out:
642*6dbdd20aSAndroid Build Coastguard Worker      output.append('    target: {')
643*6dbdd20aSAndroid Build Coastguard Worker      for line in target_out:
644*6dbdd20aSAndroid Build Coastguard Worker        output.append('    %s' % line)
645*6dbdd20aSAndroid Build Coastguard Worker      output.append('    },')
646*6dbdd20aSAndroid Build Coastguard Worker
647*6dbdd20aSAndroid Build Coastguard Worker    if self.user_debug_flag:
648*6dbdd20aSAndroid Build Coastguard Worker      output.append('    product_variables: {')
649*6dbdd20aSAndroid Build Coastguard Worker      output.append('        debuggable: {')
650*6dbdd20aSAndroid Build Coastguard Worker      output.append(
651*6dbdd20aSAndroid Build Coastguard Worker          '            cflags: ["-DPERFETTO_BUILD_WITH_ANDROID_USERDEBUG"],')
652*6dbdd20aSAndroid Build Coastguard Worker      output.append('        },')
653*6dbdd20aSAndroid Build Coastguard Worker      output.append('    },')
654*6dbdd20aSAndroid Build Coastguard Worker    if self.lto is not None:
655*6dbdd20aSAndroid Build Coastguard Worker      output.append('    target: {')
656*6dbdd20aSAndroid Build Coastguard Worker      output.append('        android: {')
657*6dbdd20aSAndroid Build Coastguard Worker      output.append('            lto: {')
658*6dbdd20aSAndroid Build Coastguard Worker      output.append('                thin: %s,' %
659*6dbdd20aSAndroid Build Coastguard Worker                    'true' if self.lto else 'false')
660*6dbdd20aSAndroid Build Coastguard Worker      output.append('            },')
661*6dbdd20aSAndroid Build Coastguard Worker      output.append('        },')
662*6dbdd20aSAndroid Build Coastguard Worker      output.append('    },')
663*6dbdd20aSAndroid Build Coastguard Worker    output.append('}')
664*6dbdd20aSAndroid Build Coastguard Worker    output.append('')
665*6dbdd20aSAndroid Build Coastguard Worker
666*6dbdd20aSAndroid Build Coastguard Worker  def add_android_static_lib(self, lib):
667*6dbdd20aSAndroid Build Coastguard Worker    if self.type == 'cc_binary_host':
668*6dbdd20aSAndroid Build Coastguard Worker      raise Exception('Adding Android static lib for host tool is unsupported')
669*6dbdd20aSAndroid Build Coastguard Worker    elif self.host_supported:
670*6dbdd20aSAndroid Build Coastguard Worker      self.android.static_libs.add(lib)
671*6dbdd20aSAndroid Build Coastguard Worker    else:
672*6dbdd20aSAndroid Build Coastguard Worker      self.static_libs.add(lib)
673*6dbdd20aSAndroid Build Coastguard Worker
674*6dbdd20aSAndroid Build Coastguard Worker  def add_android_shared_lib(self, lib):
675*6dbdd20aSAndroid Build Coastguard Worker    if self.type == 'cc_binary_host':
676*6dbdd20aSAndroid Build Coastguard Worker      raise Exception('Adding Android shared lib for host tool is unsupported')
677*6dbdd20aSAndroid Build Coastguard Worker    elif self.host_supported:
678*6dbdd20aSAndroid Build Coastguard Worker      self.android.shared_libs.add(lib)
679*6dbdd20aSAndroid Build Coastguard Worker    else:
680*6dbdd20aSAndroid Build Coastguard Worker      self.shared_libs.add(lib)
681*6dbdd20aSAndroid Build Coastguard Worker
682*6dbdd20aSAndroid Build Coastguard Worker  def _output_field(self, output, name, sort=True):
683*6dbdd20aSAndroid Build Coastguard Worker    value = getattr(self, name)
684*6dbdd20aSAndroid Build Coastguard Worker    return write_blueprint_key_value(output, name, value, sort)
685*6dbdd20aSAndroid Build Coastguard Worker
686*6dbdd20aSAndroid Build Coastguard Worker
687*6dbdd20aSAndroid Build Coastguard Workerclass Blueprint(object):
688*6dbdd20aSAndroid Build Coastguard Worker  """In-memory representation of an Android.bp file."""
689*6dbdd20aSAndroid Build Coastguard Worker
690*6dbdd20aSAndroid Build Coastguard Worker  def __init__(self):
691*6dbdd20aSAndroid Build Coastguard Worker    self.modules: Dict[str, Module] = {}
692*6dbdd20aSAndroid Build Coastguard Worker    self.gn_target_to_module: Dict[str, Module] = {}
693*6dbdd20aSAndroid Build Coastguard Worker
694*6dbdd20aSAndroid Build Coastguard Worker  def add_module(self, module: Module):
695*6dbdd20aSAndroid Build Coastguard Worker    """Adds a new module to the blueprint, replacing any existing module
696*6dbdd20aSAndroid Build Coastguard Worker        with the same name.
697*6dbdd20aSAndroid Build Coastguard Worker
698*6dbdd20aSAndroid Build Coastguard Worker        Args:
699*6dbdd20aSAndroid Build Coastguard Worker            module: Module instance.
700*6dbdd20aSAndroid Build Coastguard Worker        """
701*6dbdd20aSAndroid Build Coastguard Worker    self.modules[module.name] = module
702*6dbdd20aSAndroid Build Coastguard Worker    self.gn_target_to_module[module.gn_target] = module
703*6dbdd20aSAndroid Build Coastguard Worker
704*6dbdd20aSAndroid Build Coastguard Worker  def to_string(self, output):
705*6dbdd20aSAndroid Build Coastguard Worker    for m in sorted(itervalues(self.modules), key=lambda m: m.name):
706*6dbdd20aSAndroid Build Coastguard Worker      m.to_string(output)
707*6dbdd20aSAndroid Build Coastguard Worker
708*6dbdd20aSAndroid Build Coastguard Worker
709*6dbdd20aSAndroid Build Coastguard Workerdef label_to_module_name(label: str):
710*6dbdd20aSAndroid Build Coastguard Worker  """Turn a GN label (e.g., //:perfetto_tests) into a module name."""
711*6dbdd20aSAndroid Build Coastguard Worker  # If the label is explicibly listed in the default target list, don't prefix
712*6dbdd20aSAndroid Build Coastguard Worker  # its name and return just the target name. This is so tools like
713*6dbdd20aSAndroid Build Coastguard Worker  # "traceconv" stay as such in the Android tree.
714*6dbdd20aSAndroid Build Coastguard Worker  label_without_toolchain = gn_utils.label_without_toolchain(label)
715*6dbdd20aSAndroid Build Coastguard Worker  if label in default_targets or label_without_toolchain in default_targets:
716*6dbdd20aSAndroid Build Coastguard Worker    return label_without_toolchain.split(':')[-1]
717*6dbdd20aSAndroid Build Coastguard Worker
718*6dbdd20aSAndroid Build Coastguard Worker  module = re.sub(r'^//:?', '', label_without_toolchain)
719*6dbdd20aSAndroid Build Coastguard Worker  module = re.sub(r'[^a-zA-Z0-9_]', '_', module)
720*6dbdd20aSAndroid Build Coastguard Worker  if not module.startswith(module_prefix):
721*6dbdd20aSAndroid Build Coastguard Worker    return module_prefix + module
722*6dbdd20aSAndroid Build Coastguard Worker  return module
723*6dbdd20aSAndroid Build Coastguard Worker
724*6dbdd20aSAndroid Build Coastguard Worker
725*6dbdd20aSAndroid Build Coastguard Workerdef is_supported_source_file(name: str):
726*6dbdd20aSAndroid Build Coastguard Worker  """Returns True if |name| can appear in a 'srcs' list."""
727*6dbdd20aSAndroid Build Coastguard Worker  return os.path.splitext(name)[1] in ['.c', '.cc', '.proto']
728*6dbdd20aSAndroid Build Coastguard Worker
729*6dbdd20aSAndroid Build Coastguard Worker
730*6dbdd20aSAndroid Build Coastguard Workerdef create_proto_modules(blueprint: Blueprint, gn: GnParser,
731*6dbdd20aSAndroid Build Coastguard Worker                         target: GnParser.Target):
732*6dbdd20aSAndroid Build Coastguard Worker  """Generate genrules for a proto GN target.
733*6dbdd20aSAndroid Build Coastguard Worker
734*6dbdd20aSAndroid Build Coastguard Worker    GN actions are used to dynamically generate files during the build. The
735*6dbdd20aSAndroid Build Coastguard Worker    Soong equivalent is a genrule. This function turns a specific kind of
736*6dbdd20aSAndroid Build Coastguard Worker    genrule which turns .proto files into source and header files into a pair
737*6dbdd20aSAndroid Build Coastguard Worker    equivalent genrules.
738*6dbdd20aSAndroid Build Coastguard Worker
739*6dbdd20aSAndroid Build Coastguard Worker    Args:
740*6dbdd20aSAndroid Build Coastguard Worker        blueprint: Blueprint instance which is being generated.
741*6dbdd20aSAndroid Build Coastguard Worker        target: gn_utils.Target object.
742*6dbdd20aSAndroid Build Coastguard Worker
743*6dbdd20aSAndroid Build Coastguard Worker    Returns:
744*6dbdd20aSAndroid Build Coastguard Worker        The source_genrule module.
745*6dbdd20aSAndroid Build Coastguard Worker    """
746*6dbdd20aSAndroid Build Coastguard Worker  assert (target.type == 'proto_library')
747*6dbdd20aSAndroid Build Coastguard Worker
748*6dbdd20aSAndroid Build Coastguard Worker  # We don't generate any targets for source_set proto modules because
749*6dbdd20aSAndroid Build Coastguard Worker  # they will be inlined into other modules if required.
750*6dbdd20aSAndroid Build Coastguard Worker  if target.proto_plugin == 'source_set':
751*6dbdd20aSAndroid Build Coastguard Worker    return None
752*6dbdd20aSAndroid Build Coastguard Worker
753*6dbdd20aSAndroid Build Coastguard Worker  tools = {'aprotoc'}
754*6dbdd20aSAndroid Build Coastguard Worker  cpp_out_dir = '$(genDir)/%s/' % tree_path
755*6dbdd20aSAndroid Build Coastguard Worker  target_module_name = label_to_module_name(target.name)
756*6dbdd20aSAndroid Build Coastguard Worker
757*6dbdd20aSAndroid Build Coastguard Worker  # In GN builds the proto path is always relative to the output directory
758*6dbdd20aSAndroid Build Coastguard Worker  # (out/tmp.xxx).
759*6dbdd20aSAndroid Build Coastguard Worker  cmd = ['mkdir -p %s &&' % cpp_out_dir, '$(location aprotoc)']
760*6dbdd20aSAndroid Build Coastguard Worker  cmd += ['--proto_path=%s' % tree_path]
761*6dbdd20aSAndroid Build Coastguard Worker
762*6dbdd20aSAndroid Build Coastguard Worker  tool_files = set()
763*6dbdd20aSAndroid Build Coastguard Worker  if buildtools_protobuf_src in target.proto_paths:
764*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--proto_path=%s' % android_protobuf_src]
765*6dbdd20aSAndroid Build Coastguard Worker    # Add `google/protobuf/descriptor.proto` to implicit deps
766*6dbdd20aSAndroid Build Coastguard Worker    tool_files.add(':libprotobuf-internal-descriptor-proto')
767*6dbdd20aSAndroid Build Coastguard Worker
768*6dbdd20aSAndroid Build Coastguard Worker  # Descriptor targets only generate a single target.
769*6dbdd20aSAndroid Build Coastguard Worker  if target.proto_plugin == 'descriptor':
770*6dbdd20aSAndroid Build Coastguard Worker    out = '{}.bin'.format(target_module_name)
771*6dbdd20aSAndroid Build Coastguard Worker
772*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--descriptor_set_out=$(out)']
773*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['$(in)']
774*6dbdd20aSAndroid Build Coastguard Worker
775*6dbdd20aSAndroid Build Coastguard Worker    descriptor_module = Module('genrule', target_module_name, target.name)
776*6dbdd20aSAndroid Build Coastguard Worker    descriptor_module.cmd = ' '.join(cmd)
777*6dbdd20aSAndroid Build Coastguard Worker    descriptor_module.out.add(out)
778*6dbdd20aSAndroid Build Coastguard Worker    descriptor_module.tools = tools
779*6dbdd20aSAndroid Build Coastguard Worker    blueprint.add_module(descriptor_module)
780*6dbdd20aSAndroid Build Coastguard Worker
781*6dbdd20aSAndroid Build Coastguard Worker    # Recursively extract the .proto files of all the dependencies and
782*6dbdd20aSAndroid Build Coastguard Worker    # add them to srcs.
783*6dbdd20aSAndroid Build Coastguard Worker    descriptor_module.srcs.update(
784*6dbdd20aSAndroid Build Coastguard Worker        gn_utils.label_to_path(src) for src in target.sources)
785*6dbdd20aSAndroid Build Coastguard Worker    # Add the tool_files to srcs so that they get copied if this action is
786*6dbdd20aSAndroid Build Coastguard Worker    # sandboxed in Soong.
787*6dbdd20aSAndroid Build Coastguard Worker    # Add to `srcs` instead of `tool_files` (the latter will require a
788*6dbdd20aSAndroid Build Coastguard Worker    # --proto_path that depends on Soong's sandbox implementation.)
789*6dbdd20aSAndroid Build Coastguard Worker    descriptor_module.srcs.update(
790*6dbdd20aSAndroid Build Coastguard Worker        src for src in tool_files)
791*6dbdd20aSAndroid Build Coastguard Worker    for dep in target.transitive_proto_deps():
792*6dbdd20aSAndroid Build Coastguard Worker      current_target = gn.get_target(dep.name)
793*6dbdd20aSAndroid Build Coastguard Worker      descriptor_module.srcs.update(
794*6dbdd20aSAndroid Build Coastguard Worker          gn_utils.label_to_path(src) for src in current_target.sources)
795*6dbdd20aSAndroid Build Coastguard Worker
796*6dbdd20aSAndroid Build Coastguard Worker    return descriptor_module
797*6dbdd20aSAndroid Build Coastguard Worker
798*6dbdd20aSAndroid Build Coastguard Worker  # We create two genrules for each proto target: one for the headers and
799*6dbdd20aSAndroid Build Coastguard Worker  # another for the sources. This is because the module that depends on the
800*6dbdd20aSAndroid Build Coastguard Worker  # generated files needs to declare two different types of dependencies --
801*6dbdd20aSAndroid Build Coastguard Worker  # source files in 'srcs' and headers in 'generated_headers' -- and it's not
802*6dbdd20aSAndroid Build Coastguard Worker  # valid to generate .h files from a source dependency and vice versa.
803*6dbdd20aSAndroid Build Coastguard Worker  #
804*6dbdd20aSAndroid Build Coastguard Worker  # We create an additional filegroup for .proto
805*6dbdd20aSAndroid Build Coastguard Worker  # The .proto filegroup will be added to `tool_files` of rdeps so that the
806*6dbdd20aSAndroid Build Coastguard Worker  # genrules can be sandboxed.
807*6dbdd20aSAndroid Build Coastguard Worker
808*6dbdd20aSAndroid Build Coastguard Worker  for proto_dep in target.proto_deps().union(target.transitive_proto_deps()):
809*6dbdd20aSAndroid Build Coastguard Worker    tool_files.add(":" + label_to_module_name(proto_dep.name))
810*6dbdd20aSAndroid Build Coastguard Worker
811*6dbdd20aSAndroid Build Coastguard Worker  filegroup_module = Module('filegroup', target_module_name, target.name)
812*6dbdd20aSAndroid Build Coastguard Worker  filegroup_module.srcs.update(
813*6dbdd20aSAndroid Build Coastguard Worker      gn_utils.label_to_path(src) for src in target.sources)
814*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(filegroup_module)
815*6dbdd20aSAndroid Build Coastguard Worker
816*6dbdd20aSAndroid Build Coastguard Worker  source_module_name = target_module_name + '_gen'
817*6dbdd20aSAndroid Build Coastguard Worker  source_module = Module('genrule', source_module_name, target.name)
818*6dbdd20aSAndroid Build Coastguard Worker  # Add the "root" .proto filegroup to srcs
819*6dbdd20aSAndroid Build Coastguard Worker  source_module.srcs = set([':' + target_module_name])
820*6dbdd20aSAndroid Build Coastguard Worker  # Add the tool_files to srcs so that they get copied if this action is
821*6dbdd20aSAndroid Build Coastguard Worker  # sandboxed in Soong.
822*6dbdd20aSAndroid Build Coastguard Worker  # Add to `srcs` instead of `tool_files` (the latter will require a
823*6dbdd20aSAndroid Build Coastguard Worker  # --proto_path that depends on Soong's sandbox implementation.)
824*6dbdd20aSAndroid Build Coastguard Worker  source_module.srcs.update(
825*6dbdd20aSAndroid Build Coastguard Worker      src for src in tool_files)
826*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(source_module)
827*6dbdd20aSAndroid Build Coastguard Worker
828*6dbdd20aSAndroid Build Coastguard Worker  header_module = Module('genrule', source_module_name + '_headers',
829*6dbdd20aSAndroid Build Coastguard Worker                         target.name)
830*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(header_module)
831*6dbdd20aSAndroid Build Coastguard Worker  header_module.srcs = set(source_module.srcs)
832*6dbdd20aSAndroid Build Coastguard Worker
833*6dbdd20aSAndroid Build Coastguard Worker  # TODO(primiano): at some point we should remove this. This was introduced
834*6dbdd20aSAndroid Build Coastguard Worker  # by aosp/1108421 when adding "protos/" to .proto include paths, in order to
835*6dbdd20aSAndroid Build Coastguard Worker  # avoid doing multi-repo changes and allow old clients in the android tree
836*6dbdd20aSAndroid Build Coastguard Worker  # to still do the old #include "perfetto/..." rather than
837*6dbdd20aSAndroid Build Coastguard Worker  # #include "protos/perfetto/...".
838*6dbdd20aSAndroid Build Coastguard Worker  header_module.export_include_dirs = {'.', 'protos'}
839*6dbdd20aSAndroid Build Coastguard Worker
840*6dbdd20aSAndroid Build Coastguard Worker  source_module.genrule_srcs.add(':' + source_module.name)
841*6dbdd20aSAndroid Build Coastguard Worker  source_module.genrule_headers.add(header_module.name)
842*6dbdd20aSAndroid Build Coastguard Worker
843*6dbdd20aSAndroid Build Coastguard Worker  if target.proto_plugin == 'proto':
844*6dbdd20aSAndroid Build Coastguard Worker    suffixes = ['pb']
845*6dbdd20aSAndroid Build Coastguard Worker    source_module.genrule_shared_libs.add('libprotobuf-cpp-lite')
846*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--cpp_out=lite=true:' + cpp_out_dir]
847*6dbdd20aSAndroid Build Coastguard Worker  elif target.proto_plugin == 'protozero':
848*6dbdd20aSAndroid Build Coastguard Worker    suffixes = ['pbzero']
849*6dbdd20aSAndroid Build Coastguard Worker    plugin = create_modules_from_target(blueprint, gn, protozero_plugin)
850*6dbdd20aSAndroid Build Coastguard Worker    assert (plugin)
851*6dbdd20aSAndroid Build Coastguard Worker    tools.add(plugin.name)
852*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--plugin=protoc-gen-plugin=$(location %s)' % plugin.name]
853*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--plugin_out=wrapper_namespace=pbzero:' + cpp_out_dir]
854*6dbdd20aSAndroid Build Coastguard Worker  elif target.proto_plugin == 'cppgen':
855*6dbdd20aSAndroid Build Coastguard Worker    suffixes = ['gen']
856*6dbdd20aSAndroid Build Coastguard Worker    plugin = create_modules_from_target(blueprint, gn, cppgen_plugin)
857*6dbdd20aSAndroid Build Coastguard Worker    assert (plugin)
858*6dbdd20aSAndroid Build Coastguard Worker    tools.add(plugin.name)
859*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--plugin=protoc-gen-plugin=$(location %s)' % plugin.name]
860*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--plugin_out=wrapper_namespace=gen:' + cpp_out_dir]
861*6dbdd20aSAndroid Build Coastguard Worker  elif target.proto_plugin == 'ipc':
862*6dbdd20aSAndroid Build Coastguard Worker    suffixes = ['ipc']
863*6dbdd20aSAndroid Build Coastguard Worker    plugin = create_modules_from_target(blueprint, gn, ipc_plugin)
864*6dbdd20aSAndroid Build Coastguard Worker    assert (plugin)
865*6dbdd20aSAndroid Build Coastguard Worker    tools.add(plugin.name)
866*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--plugin=protoc-gen-plugin=$(location %s)' % plugin.name]
867*6dbdd20aSAndroid Build Coastguard Worker    cmd += ['--plugin_out=wrapper_namespace=gen:' + cpp_out_dir]
868*6dbdd20aSAndroid Build Coastguard Worker  else:
869*6dbdd20aSAndroid Build Coastguard Worker    raise Error('Unsupported proto plugin: %s' % target.proto_plugin)
870*6dbdd20aSAndroid Build Coastguard Worker
871*6dbdd20aSAndroid Build Coastguard Worker  cmd += ['$(locations :%s)' % target_module_name]
872*6dbdd20aSAndroid Build Coastguard Worker  source_module.cmd = ' '.join(cmd)
873*6dbdd20aSAndroid Build Coastguard Worker  header_module.cmd = source_module.cmd
874*6dbdd20aSAndroid Build Coastguard Worker  source_module.tools = tools
875*6dbdd20aSAndroid Build Coastguard Worker  header_module.tools = tools
876*6dbdd20aSAndroid Build Coastguard Worker
877*6dbdd20aSAndroid Build Coastguard Worker
878*6dbdd20aSAndroid Build Coastguard Worker  for sfx in suffixes:
879*6dbdd20aSAndroid Build Coastguard Worker    source_module.out.update('%s/%s' %
880*6dbdd20aSAndroid Build Coastguard Worker                             (tree_path, src.replace('.proto', '.%s.cc' % sfx))
881*6dbdd20aSAndroid Build Coastguard Worker                             for src in filegroup_module.srcs)
882*6dbdd20aSAndroid Build Coastguard Worker    header_module.out.update('%s/%s' %
883*6dbdd20aSAndroid Build Coastguard Worker                             (tree_path, src.replace('.proto', '.%s.h' % sfx))
884*6dbdd20aSAndroid Build Coastguard Worker                             for src in filegroup_module.srcs)
885*6dbdd20aSAndroid Build Coastguard Worker  return source_module
886*6dbdd20aSAndroid Build Coastguard Worker
887*6dbdd20aSAndroid Build Coastguard Worker
888*6dbdd20aSAndroid Build Coastguard Workerdef create_tp_tables_module(blueprint: Blueprint, gn: GnParser,
889*6dbdd20aSAndroid Build Coastguard Worker                            target: GnParser.Target):
890*6dbdd20aSAndroid Build Coastguard Worker  bp_module_name = label_to_module_name(target.name)
891*6dbdd20aSAndroid Build Coastguard Worker  bp_binary_module_name = f'{bp_module_name}_binary'
892*6dbdd20aSAndroid Build Coastguard Worker  srcs = [gn_utils.label_to_path(src) for src in target.sources]
893*6dbdd20aSAndroid Build Coastguard Worker
894*6dbdd20aSAndroid Build Coastguard Worker  binary_module = Module('python_binary_host', bp_binary_module_name,
895*6dbdd20aSAndroid Build Coastguard Worker                         target.name)
896*6dbdd20aSAndroid Build Coastguard Worker  for dep in target.non_proto_or_source_set_deps():
897*6dbdd20aSAndroid Build Coastguard Worker    binary_module.srcs.update([
898*6dbdd20aSAndroid Build Coastguard Worker        gn_utils.label_to_path(src) for src in gn.get_target(dep.name).sources
899*6dbdd20aSAndroid Build Coastguard Worker    ])
900*6dbdd20aSAndroid Build Coastguard Worker  binary_module.srcs.update(srcs)
901*6dbdd20aSAndroid Build Coastguard Worker  binary_module.srcs.add('tools/gen_tp_table_headers.py')
902*6dbdd20aSAndroid Build Coastguard Worker  binary_module.main = 'tools/gen_tp_table_headers.py'
903*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(binary_module)
904*6dbdd20aSAndroid Build Coastguard Worker
905*6dbdd20aSAndroid Build Coastguard Worker  module = Module('genrule', bp_module_name, target.name)
906*6dbdd20aSAndroid Build Coastguard Worker  module.tools = set([
907*6dbdd20aSAndroid Build Coastguard Worker      bp_binary_module_name,
908*6dbdd20aSAndroid Build Coastguard Worker  ])
909*6dbdd20aSAndroid Build Coastguard Worker  module.cmd = ' '.join([
910*6dbdd20aSAndroid Build Coastguard Worker      f'$(location {bp_binary_module_name})',
911*6dbdd20aSAndroid Build Coastguard Worker      '--gen-dir=$(genDir)',
912*6dbdd20aSAndroid Build Coastguard Worker      '--relative-input-dir=external/perfetto',
913*6dbdd20aSAndroid Build Coastguard Worker      '--inputs',
914*6dbdd20aSAndroid Build Coastguard Worker      '$(in)',
915*6dbdd20aSAndroid Build Coastguard Worker  ])
916*6dbdd20aSAndroid Build Coastguard Worker  module.out.update(target.outputs)
917*6dbdd20aSAndroid Build Coastguard Worker  module.genrule_headers.add(module.name)
918*6dbdd20aSAndroid Build Coastguard Worker  module.srcs.update(srcs)
919*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(module)
920*6dbdd20aSAndroid Build Coastguard Worker
921*6dbdd20aSAndroid Build Coastguard Worker  return module
922*6dbdd20aSAndroid Build Coastguard Worker
923*6dbdd20aSAndroid Build Coastguard Worker
924*6dbdd20aSAndroid Build Coastguard Workerdef create_amalgamated_sql_module(blueprint: Blueprint, gn: GnParser,
925*6dbdd20aSAndroid Build Coastguard Worker                                  target: GnParser.Target):
926*6dbdd20aSAndroid Build Coastguard Worker  bp_module_name = label_to_module_name(target.name)
927*6dbdd20aSAndroid Build Coastguard Worker
928*6dbdd20aSAndroid Build Coastguard Worker  def find_arg(name):
929*6dbdd20aSAndroid Build Coastguard Worker    for i, arg in enumerate(target.args):
930*6dbdd20aSAndroid Build Coastguard Worker      if arg.startswith(f'--{name}'):
931*6dbdd20aSAndroid Build Coastguard Worker        return target.args[i + 1]
932*6dbdd20aSAndroid Build Coastguard Worker
933*6dbdd20aSAndroid Build Coastguard Worker  namespace = find_arg('namespace')
934*6dbdd20aSAndroid Build Coastguard Worker
935*6dbdd20aSAndroid Build Coastguard Worker  module = Module('genrule', bp_module_name, target.name)
936*6dbdd20aSAndroid Build Coastguard Worker  module.tool_files = [
937*6dbdd20aSAndroid Build Coastguard Worker      'tools/gen_amalgamated_sql.py',
938*6dbdd20aSAndroid Build Coastguard Worker  ]
939*6dbdd20aSAndroid Build Coastguard Worker  module.cmd = ' '.join([
940*6dbdd20aSAndroid Build Coastguard Worker      '$(location tools/gen_amalgamated_sql.py)',
941*6dbdd20aSAndroid Build Coastguard Worker      f'--namespace={namespace}',
942*6dbdd20aSAndroid Build Coastguard Worker      '--cpp-out=$(out)',
943*6dbdd20aSAndroid Build Coastguard Worker      '$(in)',
944*6dbdd20aSAndroid Build Coastguard Worker  ])
945*6dbdd20aSAndroid Build Coastguard Worker  module.genrule_headers.add(module.name)
946*6dbdd20aSAndroid Build Coastguard Worker  module.out.update(target.outputs)
947*6dbdd20aSAndroid Build Coastguard Worker
948*6dbdd20aSAndroid Build Coastguard Worker  for dep in target.transitive_deps:
949*6dbdd20aSAndroid Build Coastguard Worker    # Use globs for the chrome stdlib so the file does not need to be
950*6dbdd20aSAndroid Build Coastguard Worker    # regenerated in autoroll CLs.
951*6dbdd20aSAndroid Build Coastguard Worker    if dep.name.startswith(
952*6dbdd20aSAndroid Build Coastguard Worker          '//src/trace_processor/perfetto_sql/stdlib/chrome:chrome_sql'):
953*6dbdd20aSAndroid Build Coastguard Worker      module.srcs.add('src/trace_processor/perfetto_sql/stdlib/chrome/**/*.sql')
954*6dbdd20aSAndroid Build Coastguard Worker      continue
955*6dbdd20aSAndroid Build Coastguard Worker    module.srcs.update(
956*6dbdd20aSAndroid Build Coastguard Worker        [gn_utils.label_to_path(src) for src in gn.get_target(dep.name).inputs])
957*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(module)
958*6dbdd20aSAndroid Build Coastguard Worker  return module
959*6dbdd20aSAndroid Build Coastguard Worker
960*6dbdd20aSAndroid Build Coastguard Worker
961*6dbdd20aSAndroid Build Coastguard Workerdef create_cc_proto_descriptor_module(blueprint: Blueprint,
962*6dbdd20aSAndroid Build Coastguard Worker                                      target: GnParser.Target):
963*6dbdd20aSAndroid Build Coastguard Worker  bp_module_name = label_to_module_name(target.name)
964*6dbdd20aSAndroid Build Coastguard Worker  module = Module('genrule', bp_module_name, target.name)
965*6dbdd20aSAndroid Build Coastguard Worker  module.tool_files = [
966*6dbdd20aSAndroid Build Coastguard Worker      'tools/gen_cc_proto_descriptor.py',
967*6dbdd20aSAndroid Build Coastguard Worker  ]
968*6dbdd20aSAndroid Build Coastguard Worker  module.cmd = ' '.join([
969*6dbdd20aSAndroid Build Coastguard Worker      '$(location tools/gen_cc_proto_descriptor.py)', '--gen_dir=$(genDir)',
970*6dbdd20aSAndroid Build Coastguard Worker      '--cpp_out=$(out)', '$(in)'
971*6dbdd20aSAndroid Build Coastguard Worker  ])
972*6dbdd20aSAndroid Build Coastguard Worker  module.genrule_headers.add(module.name)
973*6dbdd20aSAndroid Build Coastguard Worker  module.srcs.update(
974*6dbdd20aSAndroid Build Coastguard Worker      ':' + label_to_module_name(dep.name) for dep in target.proto_deps())
975*6dbdd20aSAndroid Build Coastguard Worker  module.srcs.update(
976*6dbdd20aSAndroid Build Coastguard Worker      gn_utils.label_to_path(src)
977*6dbdd20aSAndroid Build Coastguard Worker      for src in target.inputs
978*6dbdd20aSAndroid Build Coastguard Worker      if "tmp.gn_utils" not in src)
979*6dbdd20aSAndroid Build Coastguard Worker  module.out.update(target.outputs)
980*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(module)
981*6dbdd20aSAndroid Build Coastguard Worker  return module
982*6dbdd20aSAndroid Build Coastguard Worker
983*6dbdd20aSAndroid Build Coastguard Worker
984*6dbdd20aSAndroid Build Coastguard Workerdef create_gen_version_module(blueprint: Blueprint, target: GnParser.Target,
985*6dbdd20aSAndroid Build Coastguard Worker                              bp_module_name: str):
986*6dbdd20aSAndroid Build Coastguard Worker  module = Module('genrule', bp_module_name, gn_utils.GEN_VERSION_TARGET)
987*6dbdd20aSAndroid Build Coastguard Worker  script_path = gn_utils.label_to_path(target.script)
988*6dbdd20aSAndroid Build Coastguard Worker  module.genrule_headers.add(bp_module_name)
989*6dbdd20aSAndroid Build Coastguard Worker  module.tool_files = [script_path]
990*6dbdd20aSAndroid Build Coastguard Worker  module.out.update(target.outputs)
991*6dbdd20aSAndroid Build Coastguard Worker  module.srcs.update(gn_utils.label_to_path(src) for src in target.inputs)
992*6dbdd20aSAndroid Build Coastguard Worker  module.cmd = ' '.join([
993*6dbdd20aSAndroid Build Coastguard Worker      'python3 $(location %s)' % script_path, '--no_git',
994*6dbdd20aSAndroid Build Coastguard Worker      '--changelog=$(location CHANGELOG)', '--cpp_out=$(out)'
995*6dbdd20aSAndroid Build Coastguard Worker  ])
996*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(module)
997*6dbdd20aSAndroid Build Coastguard Worker  return module
998*6dbdd20aSAndroid Build Coastguard Worker
999*6dbdd20aSAndroid Build Coastguard Worker
1000*6dbdd20aSAndroid Build Coastguard Workerdef create_proto_group_modules(blueprint, gn: GnParser, module_name: str,
1001*6dbdd20aSAndroid Build Coastguard Worker                               group):
1002*6dbdd20aSAndroid Build Coastguard Worker  target_names = group['targets']
1003*6dbdd20aSAndroid Build Coastguard Worker  module_types = group['types']
1004*6dbdd20aSAndroid Build Coastguard Worker  module_sources = set()
1005*6dbdd20aSAndroid Build Coastguard Worker
1006*6dbdd20aSAndroid Build Coastguard Worker  for name in target_names:
1007*6dbdd20aSAndroid Build Coastguard Worker    target = gn.get_target(name)
1008*6dbdd20aSAndroid Build Coastguard Worker    module_sources.update(gn_utils.label_to_path(src) for src in target.sources)
1009*6dbdd20aSAndroid Build Coastguard Worker    for dep_label in target.transitive_proto_deps():
1010*6dbdd20aSAndroid Build Coastguard Worker      dep = gn.get_target(dep_label.name)
1011*6dbdd20aSAndroid Build Coastguard Worker      module_sources.update(gn_utils.label_to_path(src) for src in dep.sources)
1012*6dbdd20aSAndroid Build Coastguard Worker
1013*6dbdd20aSAndroid Build Coastguard Worker  for type in module_types:
1014*6dbdd20aSAndroid Build Coastguard Worker    if type == 'filegroup':
1015*6dbdd20aSAndroid Build Coastguard Worker      name = label_to_module_name(module_name) + '_filegroup_proto'
1016*6dbdd20aSAndroid Build Coastguard Worker      module = Module('filegroup', name, name)
1017*6dbdd20aSAndroid Build Coastguard Worker      module.comment = f'''GN: [{', '.join(target_names)}]'''
1018*6dbdd20aSAndroid Build Coastguard Worker      module.srcs = module_sources
1019*6dbdd20aSAndroid Build Coastguard Worker      blueprint.add_module(module)
1020*6dbdd20aSAndroid Build Coastguard Worker    elif type == 'lite':
1021*6dbdd20aSAndroid Build Coastguard Worker      name = label_to_module_name(module_name) + '_java_protos'
1022*6dbdd20aSAndroid Build Coastguard Worker      module = Module('java_library', name, name)
1023*6dbdd20aSAndroid Build Coastguard Worker      module.comment = f'''GN: [{', '.join(target_names)}]'''
1024*6dbdd20aSAndroid Build Coastguard Worker      module.proto = {'type': 'lite', 'canonical_path_from_root': False}
1025*6dbdd20aSAndroid Build Coastguard Worker      module.srcs = module_sources
1026*6dbdd20aSAndroid Build Coastguard Worker      blueprint.add_module(module)
1027*6dbdd20aSAndroid Build Coastguard Worker    elif type == 'python':
1028*6dbdd20aSAndroid Build Coastguard Worker      name = label_to_module_name(module_name) + '_python_protos'
1029*6dbdd20aSAndroid Build Coastguard Worker      module = Module('python_library_host', name, name)
1030*6dbdd20aSAndroid Build Coastguard Worker      module.comment = f'''GN: [{', '.join(target_names)}]'''
1031*6dbdd20aSAndroid Build Coastguard Worker      module.proto = {'canonical_path_from_root': False}
1032*6dbdd20aSAndroid Build Coastguard Worker      module.srcs = module_sources
1033*6dbdd20aSAndroid Build Coastguard Worker      blueprint.add_module(module)
1034*6dbdd20aSAndroid Build Coastguard Worker    else:
1035*6dbdd20aSAndroid Build Coastguard Worker      raise Error('Unhandled proto group type: {}'.format(group.type))
1036*6dbdd20aSAndroid Build Coastguard Worker
1037*6dbdd20aSAndroid Build Coastguard Worker
1038*6dbdd20aSAndroid Build Coastguard Workerdef _get_cflags(target: GnParser.Target):
1039*6dbdd20aSAndroid Build Coastguard Worker  cflags = {flag for flag in target.cflags if re.match(cflag_allowlist, flag)}
1040*6dbdd20aSAndroid Build Coastguard Worker  cflags |= set("-D%s" % define
1041*6dbdd20aSAndroid Build Coastguard Worker                for define in target.defines
1042*6dbdd20aSAndroid Build Coastguard Worker                if re.match(define_allowlist, define))
1043*6dbdd20aSAndroid Build Coastguard Worker  return cflags
1044*6dbdd20aSAndroid Build Coastguard Worker
1045*6dbdd20aSAndroid Build Coastguard Worker
1046*6dbdd20aSAndroid Build Coastguard Workerdef create_modules_from_target(blueprint: Blueprint, gn: GnParser,
1047*6dbdd20aSAndroid Build Coastguard Worker                               gn_target_name: str) -> Optional[Module]:
1048*6dbdd20aSAndroid Build Coastguard Worker  """Generate module(s) for a given GN target.
1049*6dbdd20aSAndroid Build Coastguard Worker
1050*6dbdd20aSAndroid Build Coastguard Worker    Given a GN target name, generate one or more corresponding modules into a
1051*6dbdd20aSAndroid Build Coastguard Worker    blueprint. The only case when this generates >1 module is proto libraries.
1052*6dbdd20aSAndroid Build Coastguard Worker
1053*6dbdd20aSAndroid Build Coastguard Worker    Args:
1054*6dbdd20aSAndroid Build Coastguard Worker        blueprint: Blueprint instance which is being generated.
1055*6dbdd20aSAndroid Build Coastguard Worker        gn: gn_utils.GnParser object.
1056*6dbdd20aSAndroid Build Coastguard Worker        gn_target_name: GN target for module generation.
1057*6dbdd20aSAndroid Build Coastguard Worker    """
1058*6dbdd20aSAndroid Build Coastguard Worker  if gn_target_name in blueprint.gn_target_to_module:
1059*6dbdd20aSAndroid Build Coastguard Worker    return blueprint.gn_target_to_module[gn_target_name]
1060*6dbdd20aSAndroid Build Coastguard Worker
1061*6dbdd20aSAndroid Build Coastguard Worker  target = gn.get_target(gn_target_name)
1062*6dbdd20aSAndroid Build Coastguard Worker  bp_module_name = label_to_module_name(gn_target_name)
1063*6dbdd20aSAndroid Build Coastguard Worker  name_without_toolchain = gn_utils.label_without_toolchain(target.name)
1064*6dbdd20aSAndroid Build Coastguard Worker  if target.type == 'executable':
1065*6dbdd20aSAndroid Build Coastguard Worker    if target.toolchain == gn_utils.HOST_TOOLCHAIN:
1066*6dbdd20aSAndroid Build Coastguard Worker      module_type = 'cc_binary_host'
1067*6dbdd20aSAndroid Build Coastguard Worker    elif target.testonly:
1068*6dbdd20aSAndroid Build Coastguard Worker      module_type = 'cc_test'
1069*6dbdd20aSAndroid Build Coastguard Worker    else:
1070*6dbdd20aSAndroid Build Coastguard Worker      module_type = 'cc_binary'
1071*6dbdd20aSAndroid Build Coastguard Worker    module = Module(module_type, bp_module_name, gn_target_name)
1072*6dbdd20aSAndroid Build Coastguard Worker  elif target.type == 'static_library':
1073*6dbdd20aSAndroid Build Coastguard Worker    module = Module('cc_library_static', bp_module_name, gn_target_name)
1074*6dbdd20aSAndroid Build Coastguard Worker  elif target.type == 'shared_library':
1075*6dbdd20aSAndroid Build Coastguard Worker    module = Module('cc_library_shared', bp_module_name, gn_target_name)
1076*6dbdd20aSAndroid Build Coastguard Worker  elif target.type == 'source_set':
1077*6dbdd20aSAndroid Build Coastguard Worker    module = Module('filegroup', bp_module_name, gn_target_name)
1078*6dbdd20aSAndroid Build Coastguard Worker  elif target.type == 'group':
1079*6dbdd20aSAndroid Build Coastguard Worker    # "group" targets are resolved recursively by gn_utils.get_target().
1080*6dbdd20aSAndroid Build Coastguard Worker    # There's nothing we need to do at this level for them.
1081*6dbdd20aSAndroid Build Coastguard Worker    return None
1082*6dbdd20aSAndroid Build Coastguard Worker  elif target.type == 'proto_library':
1083*6dbdd20aSAndroid Build Coastguard Worker    module = create_proto_modules(blueprint, gn, target)
1084*6dbdd20aSAndroid Build Coastguard Worker    if module is None:
1085*6dbdd20aSAndroid Build Coastguard Worker      return None
1086*6dbdd20aSAndroid Build Coastguard Worker  elif target.type == 'action':
1087*6dbdd20aSAndroid Build Coastguard Worker    if target.custom_action_type == 'sql_amalgamation':
1088*6dbdd20aSAndroid Build Coastguard Worker      return create_amalgamated_sql_module(blueprint, gn, target)
1089*6dbdd20aSAndroid Build Coastguard Worker    if target.custom_action_type == 'tp_tables':
1090*6dbdd20aSAndroid Build Coastguard Worker      return create_tp_tables_module(blueprint, gn, target)
1091*6dbdd20aSAndroid Build Coastguard Worker
1092*6dbdd20aSAndroid Build Coastguard Worker    if target.custom_action_type == 'cc_proto_descriptor':
1093*6dbdd20aSAndroid Build Coastguard Worker      module = create_cc_proto_descriptor_module(blueprint, target)
1094*6dbdd20aSAndroid Build Coastguard Worker    elif name_without_toolchain == gn_utils.GEN_VERSION_TARGET:
1095*6dbdd20aSAndroid Build Coastguard Worker      module = create_gen_version_module(blueprint, target, bp_module_name)
1096*6dbdd20aSAndroid Build Coastguard Worker    else:
1097*6dbdd20aSAndroid Build Coastguard Worker      raise Error('Unhandled action: {}'.format(target.name))
1098*6dbdd20aSAndroid Build Coastguard Worker  else:
1099*6dbdd20aSAndroid Build Coastguard Worker    raise Error('Unknown target %s (%s)' % (target.name, target.type))
1100*6dbdd20aSAndroid Build Coastguard Worker
1101*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(module)
1102*6dbdd20aSAndroid Build Coastguard Worker  module.host_supported = (name_without_toolchain in target_host_supported)
1103*6dbdd20aSAndroid Build Coastguard Worker  module.vendor_available = (name_without_toolchain in target_vendor_available)
1104*6dbdd20aSAndroid Build Coastguard Worker  module.product_available = (name_without_toolchain in target_product_available)
1105*6dbdd20aSAndroid Build Coastguard Worker  module.init_rc.update(target_initrc.get(target.name, []))
1106*6dbdd20aSAndroid Build Coastguard Worker  if target.type != 'proto_library':
1107*6dbdd20aSAndroid Build Coastguard Worker    # proto_library embeds a "root" filegroup in its srcs.
1108*6dbdd20aSAndroid Build Coastguard Worker    # Skip to prevent adding dups
1109*6dbdd20aSAndroid Build Coastguard Worker    module.srcs.update(
1110*6dbdd20aSAndroid Build Coastguard Worker      gn_utils.label_to_path(src)
1111*6dbdd20aSAndroid Build Coastguard Worker      for src in target.sources
1112*6dbdd20aSAndroid Build Coastguard Worker      if is_supported_source_file(src))
1113*6dbdd20aSAndroid Build Coastguard Worker
1114*6dbdd20aSAndroid Build Coastguard Worker  if name_without_toolchain in needs_libfts:
1115*6dbdd20aSAndroid Build Coastguard Worker    module.musl.static_libs.add('libfts')
1116*6dbdd20aSAndroid Build Coastguard Worker
1117*6dbdd20aSAndroid Build Coastguard Worker  if target.type in gn_utils.LINKER_UNIT_TYPES:
1118*6dbdd20aSAndroid Build Coastguard Worker    module.cflags.update(_get_cflags(target))
1119*6dbdd20aSAndroid Build Coastguard Worker
1120*6dbdd20aSAndroid Build Coastguard Worker  module_is_compiled = module.type not in ('genrule', 'filegroup')
1121*6dbdd20aSAndroid Build Coastguard Worker  if module_is_compiled:
1122*6dbdd20aSAndroid Build Coastguard Worker    # Don't try to inject library/source dependencies into genrules or
1123*6dbdd20aSAndroid Build Coastguard Worker    # filegroups because they are not compiled in the traditional sense.
1124*6dbdd20aSAndroid Build Coastguard Worker    module.defaults.update([defaults_module])
1125*6dbdd20aSAndroid Build Coastguard Worker    for lib in target.libs:
1126*6dbdd20aSAndroid Build Coastguard Worker      # Generally library names should be mangled as 'libXXX', unless they
1127*6dbdd20aSAndroid Build Coastguard Worker      # are HAL libraries (e.g., [email protected]) or AIDL c++ / NDK
1128*6dbdd20aSAndroid Build Coastguard Worker      # libraries (e.g. "android.hardware.power.stats-V1-cpp")
1129*6dbdd20aSAndroid Build Coastguard Worker      android_lib = lib if '@' in lib or "-cpp" in lib or "-ndk" in lib \
1130*6dbdd20aSAndroid Build Coastguard Worker        else 'lib' + lib
1131*6dbdd20aSAndroid Build Coastguard Worker      if lib in shared_library_allowlist:
1132*6dbdd20aSAndroid Build Coastguard Worker        module.add_android_shared_lib(android_lib)
1133*6dbdd20aSAndroid Build Coastguard Worker      if lib in static_library_allowlist:
1134*6dbdd20aSAndroid Build Coastguard Worker        module.add_android_static_lib(android_lib)
1135*6dbdd20aSAndroid Build Coastguard Worker
1136*6dbdd20aSAndroid Build Coastguard Worker  # If the module is a static library, export all the generated headers.
1137*6dbdd20aSAndroid Build Coastguard Worker  if module.type == 'cc_library_static':
1138*6dbdd20aSAndroid Build Coastguard Worker    module.export_generated_headers = module.generated_headers
1139*6dbdd20aSAndroid Build Coastguard Worker
1140*6dbdd20aSAndroid Build Coastguard Worker  # Merge in additional hardcoded arguments.
1141*6dbdd20aSAndroid Build Coastguard Worker  for key, add_val in additional_args.get(module.name, []):
1142*6dbdd20aSAndroid Build Coastguard Worker    curr = getattr(module, key)
1143*6dbdd20aSAndroid Build Coastguard Worker    if add_val and isinstance(add_val, set) and isinstance(curr, set):
1144*6dbdd20aSAndroid Build Coastguard Worker      curr.update(add_val)
1145*6dbdd20aSAndroid Build Coastguard Worker    elif isinstance(add_val, str) and (not curr or isinstance(curr, str)):
1146*6dbdd20aSAndroid Build Coastguard Worker      setattr(module, key, add_val)
1147*6dbdd20aSAndroid Build Coastguard Worker    elif isinstance(add_val, bool) and (not curr or isinstance(curr, bool)):
1148*6dbdd20aSAndroid Build Coastguard Worker      setattr(module, key, add_val)
1149*6dbdd20aSAndroid Build Coastguard Worker    elif isinstance(add_val, dict) and isinstance(curr, dict):
1150*6dbdd20aSAndroid Build Coastguard Worker      curr.update(add_val)
1151*6dbdd20aSAndroid Build Coastguard Worker    elif isinstance(add_val, dict) and isinstance(curr, Target):
1152*6dbdd20aSAndroid Build Coastguard Worker      curr.__dict__.update(add_val)
1153*6dbdd20aSAndroid Build Coastguard Worker    else:
1154*6dbdd20aSAndroid Build Coastguard Worker      raise Error('Unimplemented type %r of additional_args: %r' %
1155*6dbdd20aSAndroid Build Coastguard Worker                  (type(add_val), key))
1156*6dbdd20aSAndroid Build Coastguard Worker
1157*6dbdd20aSAndroid Build Coastguard Worker  # dep_name is an unmangled GN target name (e.g. //foo:bar(toolchain)).
1158*6dbdd20aSAndroid Build Coastguard Worker  all_deps = target.non_proto_or_source_set_deps()
1159*6dbdd20aSAndroid Build Coastguard Worker  all_deps |= target.transitive_source_set_deps()
1160*6dbdd20aSAndroid Build Coastguard Worker  all_deps |= target.transitive_proto_deps()
1161*6dbdd20aSAndroid Build Coastguard Worker  for dep in all_deps:
1162*6dbdd20aSAndroid Build Coastguard Worker    # If the dependency refers to a library which we can replace with an
1163*6dbdd20aSAndroid Build Coastguard Worker    # Android equivalent, stop recursing and patch the dependency in.
1164*6dbdd20aSAndroid Build Coastguard Worker    # Don't recurse into //buildtools, builtin_deps are intercepted at
1165*6dbdd20aSAndroid Build Coastguard Worker    # the //gn:xxx level.
1166*6dbdd20aSAndroid Build Coastguard Worker    dep_name = dep.name
1167*6dbdd20aSAndroid Build Coastguard Worker    if dep_name.startswith('//buildtools'):
1168*6dbdd20aSAndroid Build Coastguard Worker      continue
1169*6dbdd20aSAndroid Build Coastguard Worker
1170*6dbdd20aSAndroid Build Coastguard Worker    # Ignore the dependency on the gen_buildflags genrule. That is run
1171*6dbdd20aSAndroid Build Coastguard Worker    # separately in this generator and the generated file is copied over
1172*6dbdd20aSAndroid Build Coastguard Worker    # into the repo (see usage of |buildflags_dir| in this script).
1173*6dbdd20aSAndroid Build Coastguard Worker    if dep_name.startswith(gn_utils.BUILDFLAGS_TARGET):
1174*6dbdd20aSAndroid Build Coastguard Worker      continue
1175*6dbdd20aSAndroid Build Coastguard Worker
1176*6dbdd20aSAndroid Build Coastguard Worker    dep_module = create_modules_from_target(blueprint, gn, dep_name)
1177*6dbdd20aSAndroid Build Coastguard Worker
1178*6dbdd20aSAndroid Build Coastguard Worker    # For filegroups and genrule, recurse but don't apply the deps.
1179*6dbdd20aSAndroid Build Coastguard Worker    if not module_is_compiled:
1180*6dbdd20aSAndroid Build Coastguard Worker      continue
1181*6dbdd20aSAndroid Build Coastguard Worker
1182*6dbdd20aSAndroid Build Coastguard Worker    # |builtin_deps| override GN deps with Android-specific ones. See the
1183*6dbdd20aSAndroid Build Coastguard Worker    # config in the top of this file.
1184*6dbdd20aSAndroid Build Coastguard Worker    if gn_utils.label_without_toolchain(dep_name) in builtin_deps:
1185*6dbdd20aSAndroid Build Coastguard Worker      builtin_deps[gn_utils.label_without_toolchain(dep_name)](module)
1186*6dbdd20aSAndroid Build Coastguard Worker      continue
1187*6dbdd20aSAndroid Build Coastguard Worker
1188*6dbdd20aSAndroid Build Coastguard Worker    # Don't recurse in any other //gn dep if not handled by builtin_deps.
1189*6dbdd20aSAndroid Build Coastguard Worker    if dep_name.startswith('//gn:'):
1190*6dbdd20aSAndroid Build Coastguard Worker      continue
1191*6dbdd20aSAndroid Build Coastguard Worker
1192*6dbdd20aSAndroid Build Coastguard Worker    if dep_module is None:
1193*6dbdd20aSAndroid Build Coastguard Worker      continue
1194*6dbdd20aSAndroid Build Coastguard Worker    if dep_module.type == 'cc_library_shared':
1195*6dbdd20aSAndroid Build Coastguard Worker      module.shared_libs.add(dep_module.name)
1196*6dbdd20aSAndroid Build Coastguard Worker    elif dep_module.type == 'cc_library_static':
1197*6dbdd20aSAndroid Build Coastguard Worker      module.static_libs.add(dep_module.name)
1198*6dbdd20aSAndroid Build Coastguard Worker    elif dep_module.type == 'filegroup':
1199*6dbdd20aSAndroid Build Coastguard Worker      module.srcs.add(':' + dep_module.name)
1200*6dbdd20aSAndroid Build Coastguard Worker    elif dep_module.type == 'genrule':
1201*6dbdd20aSAndroid Build Coastguard Worker      module.generated_headers.update(dep_module.genrule_headers)
1202*6dbdd20aSAndroid Build Coastguard Worker      module.srcs.update(dep_module.genrule_srcs)
1203*6dbdd20aSAndroid Build Coastguard Worker      module.shared_libs.update(dep_module.genrule_shared_libs)
1204*6dbdd20aSAndroid Build Coastguard Worker    elif dep_module.type == 'cc_binary':
1205*6dbdd20aSAndroid Build Coastguard Worker      continue  # Ignore executables deps (used by cmdline integration tests).
1206*6dbdd20aSAndroid Build Coastguard Worker    else:
1207*6dbdd20aSAndroid Build Coastguard Worker      raise Error('Unknown dep %s (%s) for target %s' %
1208*6dbdd20aSAndroid Build Coastguard Worker                  (dep_module.name, dep_module.type, module.name))
1209*6dbdd20aSAndroid Build Coastguard Worker
1210*6dbdd20aSAndroid Build Coastguard Worker  return module
1211*6dbdd20aSAndroid Build Coastguard Worker
1212*6dbdd20aSAndroid Build Coastguard Worker
1213*6dbdd20aSAndroid Build Coastguard Workerdef create_blueprint_for_targets(gn: GnParser, targets: List[str]):
1214*6dbdd20aSAndroid Build Coastguard Worker  """Generate a blueprint for a list of GN targets."""
1215*6dbdd20aSAndroid Build Coastguard Worker  blueprint = Blueprint()
1216*6dbdd20aSAndroid Build Coastguard Worker
1217*6dbdd20aSAndroid Build Coastguard Worker  # Default settings used by all modules.
1218*6dbdd20aSAndroid Build Coastguard Worker  defaults = Module('cc_defaults', defaults_module, '//gn:default_deps')
1219*6dbdd20aSAndroid Build Coastguard Worker
1220*6dbdd20aSAndroid Build Coastguard Worker  # We have to use include_dirs passing the path relative to the android tree.
1221*6dbdd20aSAndroid Build Coastguard Worker  # This is because: (i) perfetto_cc_defaults is used also by
1222*6dbdd20aSAndroid Build Coastguard Worker  # test/**/Android.bp; (ii) if we use local_include_dirs instead, paths
1223*6dbdd20aSAndroid Build Coastguard Worker  # become relative to the Android.bp that *uses* cc_defaults (not the one
1224*6dbdd20aSAndroid Build Coastguard Worker  # that defines it).s
1225*6dbdd20aSAndroid Build Coastguard Worker  defaults.include_dirs = {
1226*6dbdd20aSAndroid Build Coastguard Worker      tree_path, tree_path + '/include', tree_path + '/' + buildflags_dir,
1227*6dbdd20aSAndroid Build Coastguard Worker      tree_path + '/src/profiling/memory/include'
1228*6dbdd20aSAndroid Build Coastguard Worker  }
1229*6dbdd20aSAndroid Build Coastguard Worker  defaults.cflags.update([
1230*6dbdd20aSAndroid Build Coastguard Worker      '-Wno-error=return-type',
1231*6dbdd20aSAndroid Build Coastguard Worker      '-Wno-sign-compare',
1232*6dbdd20aSAndroid Build Coastguard Worker      '-Wno-sign-promo',
1233*6dbdd20aSAndroid Build Coastguard Worker      '-Wno-unused-parameter',
1234*6dbdd20aSAndroid Build Coastguard Worker      '-fvisibility=hidden',
1235*6dbdd20aSAndroid Build Coastguard Worker      '-O2',
1236*6dbdd20aSAndroid Build Coastguard Worker  ])
1237*6dbdd20aSAndroid Build Coastguard Worker  defaults.user_debug_flag = True
1238*6dbdd20aSAndroid Build Coastguard Worker  defaults.lto = True
1239*6dbdd20aSAndroid Build Coastguard Worker
1240*6dbdd20aSAndroid Build Coastguard Worker  blueprint.add_module(defaults)
1241*6dbdd20aSAndroid Build Coastguard Worker  for target in targets:
1242*6dbdd20aSAndroid Build Coastguard Worker    create_modules_from_target(blueprint, gn, target)
1243*6dbdd20aSAndroid Build Coastguard Worker  return blueprint
1244*6dbdd20aSAndroid Build Coastguard Worker
1245*6dbdd20aSAndroid Build Coastguard Worker
1246*6dbdd20aSAndroid Build Coastguard Workerdef main():
1247*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser(
1248*6dbdd20aSAndroid Build Coastguard Worker      description='Generate Android.bp from a GN description.')
1249*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
1250*6dbdd20aSAndroid Build Coastguard Worker      '--check-only',
1251*6dbdd20aSAndroid Build Coastguard Worker      help='Don\'t keep the generated files',
1252*6dbdd20aSAndroid Build Coastguard Worker      action='store_true')
1253*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
1254*6dbdd20aSAndroid Build Coastguard Worker      '--desc',
1255*6dbdd20aSAndroid Build Coastguard Worker      help='GN description (e.g., gn desc out --format=json --all-toolchains "//*"'
1256*6dbdd20aSAndroid Build Coastguard Worker  )
1257*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
1258*6dbdd20aSAndroid Build Coastguard Worker      '--extras',
1259*6dbdd20aSAndroid Build Coastguard Worker      help='Extra targets to include at the end of the Blueprint file',
1260*6dbdd20aSAndroid Build Coastguard Worker      default=os.path.join(gn_utils.repo_root(), 'Android.bp.extras'),
1261*6dbdd20aSAndroid Build Coastguard Worker  )
1262*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
1263*6dbdd20aSAndroid Build Coastguard Worker      '--output',
1264*6dbdd20aSAndroid Build Coastguard Worker      help='Blueprint file to create',
1265*6dbdd20aSAndroid Build Coastguard Worker      default=os.path.join(gn_utils.repo_root(), 'Android.bp'),
1266*6dbdd20aSAndroid Build Coastguard Worker  )
1267*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
1268*6dbdd20aSAndroid Build Coastguard Worker      'targets',
1269*6dbdd20aSAndroid Build Coastguard Worker      nargs=argparse.REMAINDER,
1270*6dbdd20aSAndroid Build Coastguard Worker      help='Targets to include in the blueprint (e.g., "//:perfetto_tests")')
1271*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
1272*6dbdd20aSAndroid Build Coastguard Worker
1273*6dbdd20aSAndroid Build Coastguard Worker  if args.desc:
1274*6dbdd20aSAndroid Build Coastguard Worker    with open(args.desc) as f:
1275*6dbdd20aSAndroid Build Coastguard Worker      desc = json.load(f)
1276*6dbdd20aSAndroid Build Coastguard Worker  else:
1277*6dbdd20aSAndroid Build Coastguard Worker    desc = gn_utils.create_build_description(gn_args)
1278*6dbdd20aSAndroid Build Coastguard Worker
1279*6dbdd20aSAndroid Build Coastguard Worker  gn = gn_utils.GnParser(desc)
1280*6dbdd20aSAndroid Build Coastguard Worker  blueprint = create_blueprint_for_targets(gn, args.targets or default_targets)
1281*6dbdd20aSAndroid Build Coastguard Worker  project_root = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
1282*6dbdd20aSAndroid Build Coastguard Worker  tool_name = os.path.relpath(os.path.abspath(__file__), project_root)
1283*6dbdd20aSAndroid Build Coastguard Worker
1284*6dbdd20aSAndroid Build Coastguard Worker  # TODO(primiano): enable this on Android after the TODO in
1285*6dbdd20aSAndroid Build Coastguard Worker  # perfetto_component.gni is fixed.
1286*6dbdd20aSAndroid Build Coastguard Worker  # Check for ODR violations
1287*6dbdd20aSAndroid Build Coastguard Worker  # for target_name in default_targets:
1288*6dbdd20aSAndroid Build Coastguard Worker  # checker = gn_utils.ODRChecker(gn, target_name)
1289*6dbdd20aSAndroid Build Coastguard Worker
1290*6dbdd20aSAndroid Build Coastguard Worker  # Add any proto groups to the blueprint.
1291*6dbdd20aSAndroid Build Coastguard Worker  for name, group in proto_groups.items():
1292*6dbdd20aSAndroid Build Coastguard Worker    create_proto_group_modules(blueprint, gn, name, group)
1293*6dbdd20aSAndroid Build Coastguard Worker
1294*6dbdd20aSAndroid Build Coastguard Worker  output = [
1295*6dbdd20aSAndroid Build Coastguard Worker      """// Copyright (C) 2017 The Android Open Source Project
1296*6dbdd20aSAndroid Build Coastguard Worker//
1297*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
1298*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
1299*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
1300*6dbdd20aSAndroid Build Coastguard Worker//
1301*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
1302*6dbdd20aSAndroid Build Coastguard Worker//
1303*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
1304*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
1305*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1306*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
1307*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
1308*6dbdd20aSAndroid Build Coastguard Worker//
1309*6dbdd20aSAndroid Build Coastguard Worker// This file is automatically generated by %s. Do not edit.
1310*6dbdd20aSAndroid Build Coastguard Worker""" % (tool_name)
1311*6dbdd20aSAndroid Build Coastguard Worker  ]
1312*6dbdd20aSAndroid Build Coastguard Worker  blueprint.to_string(output)
1313*6dbdd20aSAndroid Build Coastguard Worker  with open(args.extras, 'r') as r:
1314*6dbdd20aSAndroid Build Coastguard Worker    for line in r:
1315*6dbdd20aSAndroid Build Coastguard Worker      output.append(line.rstrip("\n\r"))
1316*6dbdd20aSAndroid Build Coastguard Worker
1317*6dbdd20aSAndroid Build Coastguard Worker  out_files = []
1318*6dbdd20aSAndroid Build Coastguard Worker
1319*6dbdd20aSAndroid Build Coastguard Worker  # Generate the Android.bp file.
1320*6dbdd20aSAndroid Build Coastguard Worker  out_files.append(args.output + '.swp')
1321*6dbdd20aSAndroid Build Coastguard Worker  with open(out_files[-1], 'w') as f:
1322*6dbdd20aSAndroid Build Coastguard Worker    f.write('\n'.join(output))
1323*6dbdd20aSAndroid Build Coastguard Worker    # Text files should have a trailing EOL.
1324*6dbdd20aSAndroid Build Coastguard Worker    f.write('\n')
1325*6dbdd20aSAndroid Build Coastguard Worker
1326*6dbdd20aSAndroid Build Coastguard Worker  # Generate the perfetto_build_flags.h file.
1327*6dbdd20aSAndroid Build Coastguard Worker  out_files.append(os.path.join(buildflags_dir, 'perfetto_build_flags.h.swp'))
1328*6dbdd20aSAndroid Build Coastguard Worker  gn_utils.gen_buildflags(gn_args, out_files[-1])
1329*6dbdd20aSAndroid Build Coastguard Worker
1330*6dbdd20aSAndroid Build Coastguard Worker  # Either check the contents or move the files to their final destination.
1331*6dbdd20aSAndroid Build Coastguard Worker  return gn_utils.check_or_commit_generated_files(out_files, args.check_only)
1332*6dbdd20aSAndroid Build Coastguard Worker
1333*6dbdd20aSAndroid Build Coastguard Worker
1334*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__':
1335*6dbdd20aSAndroid Build Coastguard Worker  sys.exit(main())
1336