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