1*8975f5c5SAndroid Build Coastguard Worker# Copyright The ANGLE Project Authors. All rights reserved. 2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 4*8975f5c5SAndroid Build Coastguard Worker# 5*8975f5c5SAndroid Build Coastguard Worker# Generates an Android.bp file from the json output of 4 'gn desc' commands. 6*8975f5c5SAndroid Build Coastguard Worker# Invoked during Skia rolls by roll_aosp.sh. For local testing, see: 7*8975f5c5SAndroid Build Coastguard Worker# scripts/roll_aosp.sh --genAndroidBp 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Workerimport json 10*8975f5c5SAndroid Build Coastguard Workerimport sys 11*8975f5c5SAndroid Build Coastguard Workerimport re 12*8975f5c5SAndroid Build Coastguard Workerimport os 13*8975f5c5SAndroid Build Coastguard Workerimport argparse 14*8975f5c5SAndroid Build Coastguard Workerimport functools 15*8975f5c5SAndroid Build Coastguard Workerimport collections 16*8975f5c5SAndroid Build Coastguard Workerimport textwrap 17*8975f5c5SAndroid Build Coastguard Workerfrom typing import List, Tuple 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard WorkerROOT_TARGETS = [ 20*8975f5c5SAndroid Build Coastguard Worker "//:libGLESv2", 21*8975f5c5SAndroid Build Coastguard Worker "//:libGLESv1_CM", 22*8975f5c5SAndroid Build Coastguard Worker "//:libEGL", 23*8975f5c5SAndroid Build Coastguard Worker] 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard WorkerEND2END_TEST_TARGET = "//src/tests:angle_end2end_tests__library" 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker# Used only in generated Android.bp file for DMA-BUF-enabled builds on Android. 28*8975f5c5SAndroid Build Coastguard Worker# See b/353262025 for details. 29*8975f5c5SAndroid Build Coastguard WorkerDMA_BUF_TARGET = "//src/libANGLE/renderer/vulkan:angle_android_vulkan_dma_buf" 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard WorkerBLUEPRINT_COMMENT_PROPERTY = '__android_bp_comment' 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard WorkerCURRENT_SDK_VERSION = 'current' 34*8975f5c5SAndroid Build Coastguard WorkerMIN_SDK_VERSION = '28' 35*8975f5c5SAndroid Build Coastguard WorkerTARGET_SDK_VERSION = '35' 36*8975f5c5SAndroid Build Coastguard WorkerSTL = 'libc++_static' 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard WorkerABI_ARM = 'arm' 39*8975f5c5SAndroid Build Coastguard WorkerABI_ARM64 = 'arm64' 40*8975f5c5SAndroid Build Coastguard WorkerABI_X86 = 'x86' 41*8975f5c5SAndroid Build Coastguard WorkerABI_X64 = 'x86_64' 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard WorkerABI_TARGETS = [ABI_ARM, ABI_ARM64, ABI_X86, ABI_X64] 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Workerdef gn_abi(abi): 47*8975f5c5SAndroid Build Coastguard Worker # gn uses x64, rather than x86_64 48*8975f5c5SAndroid Build Coastguard Worker return 'x64' if abi == ABI_X64 else abi 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker# Makes dict cache-able "by reference" (assumed not to be mutated) 52*8975f5c5SAndroid Build Coastguard Workerclass BuildInfo(dict): 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker def __hash__(self): 55*8975f5c5SAndroid Build Coastguard Worker return 0 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker def __eq__(self, other): 58*8975f5c5SAndroid Build Coastguard Worker return self is other 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Workerdef tabs(indent): 62*8975f5c5SAndroid Build Coastguard Worker return ' ' * (indent * 4) 63*8975f5c5SAndroid Build Coastguard Worker 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Workerdef has_child_values(value): 66*8975f5c5SAndroid Build Coastguard Worker # Elements of the blueprint can be pruned if they are empty lists or dictionaries of empty 67*8975f5c5SAndroid Build Coastguard Worker # lists 68*8975f5c5SAndroid Build Coastguard Worker if isinstance(value, list): 69*8975f5c5SAndroid Build Coastguard Worker return len(value) > 0 70*8975f5c5SAndroid Build Coastguard Worker if isinstance(value, dict): 71*8975f5c5SAndroid Build Coastguard Worker for (item, item_value) in value.items(): 72*8975f5c5SAndroid Build Coastguard Worker if has_child_values(item_value): 73*8975f5c5SAndroid Build Coastguard Worker return True 74*8975f5c5SAndroid Build Coastguard Worker return False 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker # This is a value leaf node 77*8975f5c5SAndroid Build Coastguard Worker return True 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker 80*8975f5c5SAndroid Build Coastguard Workerdef write_blueprint_key_value(output, name, value, indent=1): 81*8975f5c5SAndroid Build Coastguard Worker if not has_child_values(value): 82*8975f5c5SAndroid Build Coastguard Worker return 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker if isinstance(value, set) or isinstance(value, list): 85*8975f5c5SAndroid Build Coastguard Worker value = list(sorted(set(value))) 86*8975f5c5SAndroid Build Coastguard Worker if name == 'cflags': 87*8975f5c5SAndroid Build Coastguard Worker fix_fortify_source_cflags(value) 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker if isinstance(value, list): 90*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent) + '%s: [' % name) 91*8975f5c5SAndroid Build Coastguard Worker for item in value: 92*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent + 1) + '"%s",' % item) 93*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent) + '],') 94*8975f5c5SAndroid Build Coastguard Worker return 95*8975f5c5SAndroid Build Coastguard Worker if isinstance(value, dict): 96*8975f5c5SAndroid Build Coastguard Worker if not value: 97*8975f5c5SAndroid Build Coastguard Worker return 98*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent) + '%s: {' % name) 99*8975f5c5SAndroid Build Coastguard Worker for (item, item_value) in value.items(): 100*8975f5c5SAndroid Build Coastguard Worker write_blueprint_key_value(output, item, item_value, indent + 1) 101*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent) + '},') 102*8975f5c5SAndroid Build Coastguard Worker return 103*8975f5c5SAndroid Build Coastguard Worker if isinstance(value, bool): 104*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent) + '%s: %s,' % (name, 'true' if value else 'false')) 105*8975f5c5SAndroid Build Coastguard Worker return 106*8975f5c5SAndroid Build Coastguard Worker output.append(tabs(indent) + '%s: "%s",' % (name, value)) 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Worker 109*8975f5c5SAndroid Build Coastguard Workerdef write_blueprint(output, target_type, values): 110*8975f5c5SAndroid Build Coastguard Worker if target_type == 'license': 111*8975f5c5SAndroid Build Coastguard Worker comment = """ 112*8975f5c5SAndroid Build Coastguard Worker// Added automatically by a large-scale-change that took the approach of 113*8975f5c5SAndroid Build Coastguard Worker// 'apply every license found to every target'. While this makes sure we respect 114*8975f5c5SAndroid Build Coastguard Worker// every license restriction, it may not be entirely correct. 115*8975f5c5SAndroid Build Coastguard Worker// 116*8975f5c5SAndroid Build Coastguard Worker// e.g. GPL in an MIT project might only apply to the contrib/ directory. 117*8975f5c5SAndroid Build Coastguard Worker// 118*8975f5c5SAndroid Build Coastguard Worker// Please consider splitting the single license below into multiple licenses, 119*8975f5c5SAndroid Build Coastguard Worker// taking care not to lose any license_kind information, and overriding the 120*8975f5c5SAndroid Build Coastguard Worker// default license using the 'licenses: [...]' property on targets as needed. 121*8975f5c5SAndroid Build Coastguard Worker// 122*8975f5c5SAndroid Build Coastguard Worker// For unused files, consider creating a 'fileGroup' with "//visibility:private" 123*8975f5c5SAndroid Build Coastguard Worker// to attach the license to, and including a comment whether the files may be 124*8975f5c5SAndroid Build Coastguard Worker// used in the current project. 125*8975f5c5SAndroid Build Coastguard Worker// See: http://go/android-license-faq""" 126*8975f5c5SAndroid Build Coastguard Worker output.append(comment) 127*8975f5c5SAndroid Build Coastguard Worker 128*8975f5c5SAndroid Build Coastguard Worker output.append('') 129*8975f5c5SAndroid Build Coastguard Worker blueprint_comment = values.get(BLUEPRINT_COMMENT_PROPERTY) 130*8975f5c5SAndroid Build Coastguard Worker if blueprint_comment: 131*8975f5c5SAndroid Build Coastguard Worker for comment_line in textwrap.wrap(blueprint_comment, width=70): 132*8975f5c5SAndroid Build Coastguard Worker output.append('// %s' % comment_line) 133*8975f5c5SAndroid Build Coastguard Worker output.append('%s {' % target_type) 134*8975f5c5SAndroid Build Coastguard Worker for (key, value) in values.items(): 135*8975f5c5SAndroid Build Coastguard Worker if key != BLUEPRINT_COMMENT_PROPERTY: 136*8975f5c5SAndroid Build Coastguard Worker write_blueprint_key_value(output, key, value) 137*8975f5c5SAndroid Build Coastguard Worker output.append('}') 138*8975f5c5SAndroid Build Coastguard Worker 139*8975f5c5SAndroid Build Coastguard Worker 140*8975f5c5SAndroid Build Coastguard Workerdef gn_target_to_blueprint_target(target, target_info): 141*8975f5c5SAndroid Build Coastguard Worker if 'output_name' in target_info: 142*8975f5c5SAndroid Build Coastguard Worker return target_info['output_name'] 143*8975f5c5SAndroid Build Coastguard Worker 144*8975f5c5SAndroid Build Coastguard Worker if target_info.get('type') == 'shared_library': 145*8975f5c5SAndroid Build Coastguard Worker # Deduce name from the shared library path 146*8975f5c5SAndroid Build Coastguard Worker # end2end tests lib and libangle_util.so don't have output_name set for the early return above 147*8975f5c5SAndroid Build Coastguard Worker return os.path.splitext(os.path.basename(target_info['outputs'][0]))[0] 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker # Split the gn target name (in the form of //gn_file_path:target_name) into gn_file_path and 150*8975f5c5SAndroid Build Coastguard Worker # target_name 151*8975f5c5SAndroid Build Coastguard Worker match = re.match(r"^//([a-zA-Z0-9\-\+_/]*):([a-zA-Z0-9\-\+_.]+)$", target) 152*8975f5c5SAndroid Build Coastguard Worker assert match is not None, target 153*8975f5c5SAndroid Build Coastguard Worker 154*8975f5c5SAndroid Build Coastguard Worker gn_file_path = match.group(1) 155*8975f5c5SAndroid Build Coastguard Worker target_name = match.group(2) 156*8975f5c5SAndroid Build Coastguard Worker assert len(target_name) > 0 157*8975f5c5SAndroid Build Coastguard Worker 158*8975f5c5SAndroid Build Coastguard Worker # Clean up the gn file path to be a valid blueprint target name. 159*8975f5c5SAndroid Build Coastguard Worker gn_file_path = gn_file_path.replace("/", "_").replace(".", "_").replace("-", "_") 160*8975f5c5SAndroid Build Coastguard Worker 161*8975f5c5SAndroid Build Coastguard Worker # Generate a blueprint target name by merging the gn path and target so each target is unique. 162*8975f5c5SAndroid Build Coastguard Worker # Prepend the 'angle' prefix to all targets in the root path (empty gn_file_path). 163*8975f5c5SAndroid Build Coastguard Worker # Skip this step if the target name already starts with 'angle' to avoid target names such as 'angle_angle_common'. 164*8975f5c5SAndroid Build Coastguard Worker root_prefix = "angle" 165*8975f5c5SAndroid Build Coastguard Worker if len(gn_file_path) == 0 and not target_name.startswith(root_prefix): 166*8975f5c5SAndroid Build Coastguard Worker gn_file_path = root_prefix 167*8975f5c5SAndroid Build Coastguard Worker 168*8975f5c5SAndroid Build Coastguard Worker # Avoid names such as _angle_common if the gn_file_path is empty. 169*8975f5c5SAndroid Build Coastguard Worker if len(gn_file_path) > 0: 170*8975f5c5SAndroid Build Coastguard Worker gn_file_path += "_" 171*8975f5c5SAndroid Build Coastguard Worker 172*8975f5c5SAndroid Build Coastguard Worker return gn_file_path + target_name 173*8975f5c5SAndroid Build Coastguard Worker 174*8975f5c5SAndroid Build Coastguard Worker 175*8975f5c5SAndroid Build Coastguard Workerdef remap_gn_path(path): 176*8975f5c5SAndroid Build Coastguard Worker # TODO: pass the gn gen folder as an arg so it is future proof. b/150457277 177*8975f5c5SAndroid Build Coastguard Worker remap_folders = [ 178*8975f5c5SAndroid Build Coastguard Worker ('out/Android/gen/angle/', ''), 179*8975f5c5SAndroid Build Coastguard Worker ('out/Android/gen/', ''), 180*8975f5c5SAndroid Build Coastguard Worker ] 181*8975f5c5SAndroid Build Coastguard Worker 182*8975f5c5SAndroid Build Coastguard Worker remapped_path = path 183*8975f5c5SAndroid Build Coastguard Worker for (remap_source, remap_dest) in remap_folders: 184*8975f5c5SAndroid Build Coastguard Worker remapped_path = remapped_path.replace(remap_source, remap_dest) 185*8975f5c5SAndroid Build Coastguard Worker 186*8975f5c5SAndroid Build Coastguard Worker return remapped_path 187*8975f5c5SAndroid Build Coastguard Worker 188*8975f5c5SAndroid Build Coastguard Worker 189*8975f5c5SAndroid Build Coastguard Workerdef gn_path_to_blueprint_path(source): 190*8975f5c5SAndroid Build Coastguard Worker # gn uses '//' to indicate the root directory, blueprint uses the .bp file's location 191*8975f5c5SAndroid Build Coastguard Worker return remap_gn_path(re.sub(r'^//?', '', source)) 192*8975f5c5SAndroid Build Coastguard Worker 193*8975f5c5SAndroid Build Coastguard Worker 194*8975f5c5SAndroid Build Coastguard Workerdef gn_paths_to_blueprint_paths(paths): 195*8975f5c5SAndroid Build Coastguard Worker rebased_paths = [] 196*8975f5c5SAndroid Build Coastguard Worker for path in paths: 197*8975f5c5SAndroid Build Coastguard Worker rebased_paths.append(gn_path_to_blueprint_path(path)) 198*8975f5c5SAndroid Build Coastguard Worker return rebased_paths 199*8975f5c5SAndroid Build Coastguard Worker 200*8975f5c5SAndroid Build Coastguard Worker 201*8975f5c5SAndroid Build Coastguard Workerdef gn_sources_to_blueprint_sources(sources): 202*8975f5c5SAndroid Build Coastguard Worker # Blueprints only list source files in the sources list. Headers are only referenced though 203*8975f5c5SAndroid Build Coastguard Worker # include paths. 204*8975f5c5SAndroid Build Coastguard Worker file_extension_allowlist = [ 205*8975f5c5SAndroid Build Coastguard Worker '.c', 206*8975f5c5SAndroid Build Coastguard Worker '.cc', 207*8975f5c5SAndroid Build Coastguard Worker '.cpp', 208*8975f5c5SAndroid Build Coastguard Worker ] 209*8975f5c5SAndroid Build Coastguard Worker 210*8975f5c5SAndroid Build Coastguard Worker rebased_sources = [] 211*8975f5c5SAndroid Build Coastguard Worker for source in sources: 212*8975f5c5SAndroid Build Coastguard Worker if os.path.splitext(source)[1] in file_extension_allowlist: 213*8975f5c5SAndroid Build Coastguard Worker rebased_sources.append(gn_path_to_blueprint_path(source)) 214*8975f5c5SAndroid Build Coastguard Worker return rebased_sources 215*8975f5c5SAndroid Build Coastguard Worker 216*8975f5c5SAndroid Build Coastguard Worker 217*8975f5c5SAndroid Build Coastguard Workertarget_blockist = [ 218*8975f5c5SAndroid Build Coastguard Worker '//build/config:shared_library_deps', 219*8975f5c5SAndroid Build Coastguard Worker '//third_party/zlib:zlib', 220*8975f5c5SAndroid Build Coastguard Worker '//third_party/zlib/google:compression_utils_portable', 221*8975f5c5SAndroid Build Coastguard Worker 222*8975f5c5SAndroid Build Coastguard Worker # end2end tests: -> platform libgtest, libgmock 223*8975f5c5SAndroid Build Coastguard Worker '//testing/gtest:gtest', 224*8975f5c5SAndroid Build Coastguard Worker '//testing/gmock:gmock', 225*8975f5c5SAndroid Build Coastguard Worker '//third_party/googletest:gtest', 226*8975f5c5SAndroid Build Coastguard Worker '//third_party/googletest:gmock', 227*8975f5c5SAndroid Build Coastguard Worker] 228*8975f5c5SAndroid Build Coastguard Worker 229*8975f5c5SAndroid Build Coastguard Workerthird_party_target_allowlist = [ 230*8975f5c5SAndroid Build Coastguard Worker '//third_party/abseil-cpp', 231*8975f5c5SAndroid Build Coastguard Worker '//third_party/glslang/src', 232*8975f5c5SAndroid Build Coastguard Worker '//third_party/spirv-cross/src', 233*8975f5c5SAndroid Build Coastguard Worker '//third_party/spirv-headers/src', 234*8975f5c5SAndroid Build Coastguard Worker '//third_party/spirv-tools/src', 235*8975f5c5SAndroid Build Coastguard Worker '//third_party/vulkan-headers/src', 236*8975f5c5SAndroid Build Coastguard Worker '//third_party/vulkan-loader/src', 237*8975f5c5SAndroid Build Coastguard Worker '//third_party/vulkan-tools/src', 238*8975f5c5SAndroid Build Coastguard Worker '//third_party/vulkan-utility-libraries/src', 239*8975f5c5SAndroid Build Coastguard Worker '//third_party/vulkan-validation-layers/src', 240*8975f5c5SAndroid Build Coastguard Worker '//third_party/vulkan_memory_allocator', 241*8975f5c5SAndroid Build Coastguard Worker] 242*8975f5c5SAndroid Build Coastguard Worker 243*8975f5c5SAndroid Build Coastguard Workerinclude_blocklist = [ 244*8975f5c5SAndroid Build Coastguard Worker '//buildtools/third_party/libc++/', 245*8975f5c5SAndroid Build Coastguard Worker '//third_party/libc++/src/', 246*8975f5c5SAndroid Build Coastguard Worker '//out/Android/gen/third_party/glslang/src/include/', 247*8975f5c5SAndroid Build Coastguard Worker '//third_party/zlib/', 248*8975f5c5SAndroid Build Coastguard Worker '//third_party/zlib/google/', 249*8975f5c5SAndroid Build Coastguard Worker # end2end tests: -> platform libgtest, libgmock 250*8975f5c5SAndroid Build Coastguard Worker '//third_party/googletest/custom/', 251*8975f5c5SAndroid Build Coastguard Worker '//third_party/googletest/src/googletest/include/', 252*8975f5c5SAndroid Build Coastguard Worker '//third_party/googletest/src/googlemock/include/', 253*8975f5c5SAndroid Build Coastguard Worker] 254*8975f5c5SAndroid Build Coastguard Worker 255*8975f5c5SAndroid Build Coastguard Workertargets_using_jni = [ 256*8975f5c5SAndroid Build Coastguard Worker '//src/tests:native_test_support_android', 257*8975f5c5SAndroid Build Coastguard Worker '//util:angle_util', 258*8975f5c5SAndroid Build Coastguard Worker] 259*8975f5c5SAndroid Build Coastguard Worker 260*8975f5c5SAndroid Build Coastguard Worker 261*8975f5c5SAndroid Build Coastguard Worker@functools.lru_cache(maxsize=None) # .cache() is py3.9 http://b/246559064#comment8 262*8975f5c5SAndroid Build Coastguard Workerdef gn_deps_to_blueprint_deps(abi, target, build_info): 263*8975f5c5SAndroid Build Coastguard Worker target_info = build_info[abi][target] 264*8975f5c5SAndroid Build Coastguard Worker static_libs = [] 265*8975f5c5SAndroid Build Coastguard Worker shared_libs = [] 266*8975f5c5SAndroid Build Coastguard Worker defaults = [] 267*8975f5c5SAndroid Build Coastguard Worker generated_headers = [] 268*8975f5c5SAndroid Build Coastguard Worker header_libs = [] 269*8975f5c5SAndroid Build Coastguard Worker if target in targets_using_jni: 270*8975f5c5SAndroid Build Coastguard Worker header_libs.append('jni_headers') 271*8975f5c5SAndroid Build Coastguard Worker if 'deps' not in target_info: 272*8975f5c5SAndroid Build Coastguard Worker return static_libs, defaults 273*8975f5c5SAndroid Build Coastguard Worker 274*8975f5c5SAndroid Build Coastguard Worker for dep in target_info['deps']: 275*8975f5c5SAndroid Build Coastguard Worker if dep not in target_blockist and (not dep.startswith('//third_party') or any( 276*8975f5c5SAndroid Build Coastguard Worker dep.startswith(substring) for substring in third_party_target_allowlist)): 277*8975f5c5SAndroid Build Coastguard Worker dep_info = build_info[abi][dep] 278*8975f5c5SAndroid Build Coastguard Worker blueprint_dep_name = gn_target_to_blueprint_target(dep, dep_info) 279*8975f5c5SAndroid Build Coastguard Worker 280*8975f5c5SAndroid Build Coastguard Worker # Depending on the dep type, blueprints reference it differently. 281*8975f5c5SAndroid Build Coastguard Worker gn_dep_type = dep_info['type'] 282*8975f5c5SAndroid Build Coastguard Worker if gn_dep_type == 'static_library': 283*8975f5c5SAndroid Build Coastguard Worker static_libs.append(blueprint_dep_name) 284*8975f5c5SAndroid Build Coastguard Worker elif gn_dep_type == 'shared_library': 285*8975f5c5SAndroid Build Coastguard Worker shared_libs.append(blueprint_dep_name) 286*8975f5c5SAndroid Build Coastguard Worker elif gn_dep_type == 'source_set' or gn_dep_type == 'group': 287*8975f5c5SAndroid Build Coastguard Worker defaults.append(blueprint_dep_name) 288*8975f5c5SAndroid Build Coastguard Worker elif gn_dep_type == 'action': 289*8975f5c5SAndroid Build Coastguard Worker # ANGLE in Android repo does not depend on 290*8975f5c5SAndroid Build Coastguard Worker # angle_commit_id target to get ANGLE git has. See b/348044346. 291*8975f5c5SAndroid Build Coastguard Worker # Files include angle_commit.h will be able to find this 292*8975f5c5SAndroid Build Coastguard Worker # header file generated by roll_aosp.sh during ANGLE to 293*8975f5c5SAndroid Build Coastguard Worker # Android roll, instead of the version that is generated 294*8975f5c5SAndroid Build Coastguard Worker # by angle_commit_id build target at compile time. 295*8975f5c5SAndroid Build Coastguard Worker if blueprint_dep_name == 'angle_commit_id': 296*8975f5c5SAndroid Build Coastguard Worker continue 297*8975f5c5SAndroid Build Coastguard Worker generated_headers.append(blueprint_dep_name) 298*8975f5c5SAndroid Build Coastguard Worker 299*8975f5c5SAndroid Build Coastguard Worker # Blueprints do not chain linking of static libraries. 300*8975f5c5SAndroid Build Coastguard Worker (child_static_libs, _, _, child_generated_headers, 301*8975f5c5SAndroid Build Coastguard Worker _) = gn_deps_to_blueprint_deps(abi, dep, build_info) 302*8975f5c5SAndroid Build Coastguard Worker 303*8975f5c5SAndroid Build Coastguard Worker # Each target needs to link all child static library dependencies. 304*8975f5c5SAndroid Build Coastguard Worker static_libs += child_static_libs 305*8975f5c5SAndroid Build Coastguard Worker 306*8975f5c5SAndroid Build Coastguard Worker # Each blueprint target runs genrules in a different output directory unlike GN. If a 307*8975f5c5SAndroid Build Coastguard Worker # target depends on another's genrule, it wont find the outputs. Propogate generated 308*8975f5c5SAndroid Build Coastguard Worker # headers up the dependency stack. 309*8975f5c5SAndroid Build Coastguard Worker generated_headers += child_generated_headers 310*8975f5c5SAndroid Build Coastguard Worker elif dep == '//third_party/zlib/google:compression_utils_portable': 311*8975f5c5SAndroid Build Coastguard Worker # Replace zlib by Android's zlib, compression_utils_portable is the root dependency 312*8975f5c5SAndroid Build Coastguard Worker shared_libs.append('libz') 313*8975f5c5SAndroid Build Coastguard Worker static_libs.extend(['zlib_google_compression_utils_portable', 'cpufeatures']) 314*8975f5c5SAndroid Build Coastguard Worker elif dep == '//testing/gtest:gtest': 315*8975f5c5SAndroid Build Coastguard Worker static_libs.append('libgtest_ndk_c++') 316*8975f5c5SAndroid Build Coastguard Worker elif dep == '//testing/gmock:gmock': 317*8975f5c5SAndroid Build Coastguard Worker static_libs.append('libgmock_ndk') 318*8975f5c5SAndroid Build Coastguard Worker 319*8975f5c5SAndroid Build Coastguard Worker return static_libs, shared_libs, defaults, generated_headers, header_libs 320*8975f5c5SAndroid Build Coastguard Worker 321*8975f5c5SAndroid Build Coastguard Worker 322*8975f5c5SAndroid Build Coastguard Workerdef gn_libs_to_blueprint_shared_libraries(target_info): 323*8975f5c5SAndroid Build Coastguard Worker lib_blockist = [ 324*8975f5c5SAndroid Build Coastguard Worker 'android_support', 325*8975f5c5SAndroid Build Coastguard Worker 'unwind', 326*8975f5c5SAndroid Build Coastguard Worker ] 327*8975f5c5SAndroid Build Coastguard Worker 328*8975f5c5SAndroid Build Coastguard Worker result = [] 329*8975f5c5SAndroid Build Coastguard Worker if 'libs' in target_info: 330*8975f5c5SAndroid Build Coastguard Worker for lib in target_info['libs']: 331*8975f5c5SAndroid Build Coastguard Worker if lib not in lib_blockist and not lib.startswith('//'): 332*8975f5c5SAndroid Build Coastguard Worker android_lib = lib if '@' in lib else 'lib' + lib 333*8975f5c5SAndroid Build Coastguard Worker result.append(android_lib) 334*8975f5c5SAndroid Build Coastguard Worker return result 335*8975f5c5SAndroid Build Coastguard Worker 336*8975f5c5SAndroid Build Coastguard Worker 337*8975f5c5SAndroid Build Coastguard Workerdef gn_include_dirs_to_blueprint_include_dirs(target_info): 338*8975f5c5SAndroid Build Coastguard Worker result = [] 339*8975f5c5SAndroid Build Coastguard Worker if 'include_dirs' in target_info: 340*8975f5c5SAndroid Build Coastguard Worker for include_dir in target_info['include_dirs']: 341*8975f5c5SAndroid Build Coastguard Worker if len(include_dir) > 0 and include_dir not in include_blocklist: 342*8975f5c5SAndroid Build Coastguard Worker result.append(gn_path_to_blueprint_path(include_dir)) 343*8975f5c5SAndroid Build Coastguard Worker return result 344*8975f5c5SAndroid Build Coastguard Worker 345*8975f5c5SAndroid Build Coastguard Worker 346*8975f5c5SAndroid Build Coastguard Workerdef escape_quotes(string): 347*8975f5c5SAndroid Build Coastguard Worker return string.replace("\"", "\\\"").replace("\'", "\\\'") 348*8975f5c5SAndroid Build Coastguard Worker 349*8975f5c5SAndroid Build Coastguard Worker 350*8975f5c5SAndroid Build Coastguard Workerdef gn_cflags_to_blueprint_cflags(target_info): 351*8975f5c5SAndroid Build Coastguard Worker result = [] 352*8975f5c5SAndroid Build Coastguard Worker 353*8975f5c5SAndroid Build Coastguard Worker # regexs of allowlisted cflags 354*8975f5c5SAndroid Build Coastguard Worker cflag_allowlist = [ 355*8975f5c5SAndroid Build Coastguard Worker r'^-Wno-.*$', # forward cflags that disable warnings 356*8975f5c5SAndroid Build Coastguard Worker r'^-fvisibility.*$', # forward visibility (https://gcc.gnu.org/wiki/Visibility) flags for better perf on x86 357*8975f5c5SAndroid Build Coastguard Worker r'-mpclmul' # forward "-mpclmul" (used by zlib) 358*8975f5c5SAndroid Build Coastguard Worker ] 359*8975f5c5SAndroid Build Coastguard Worker 360*8975f5c5SAndroid Build Coastguard Worker for cflag_type in ['cflags', 'cflags_c', 'cflags_cc']: 361*8975f5c5SAndroid Build Coastguard Worker if cflag_type in target_info: 362*8975f5c5SAndroid Build Coastguard Worker for cflag in target_info[cflag_type]: 363*8975f5c5SAndroid Build Coastguard Worker for allowlisted_cflag in cflag_allowlist: 364*8975f5c5SAndroid Build Coastguard Worker if re.search(allowlisted_cflag, cflag): 365*8975f5c5SAndroid Build Coastguard Worker result.append(cflag) 366*8975f5c5SAndroid Build Coastguard Worker 367*8975f5c5SAndroid Build Coastguard Worker if 'defines' in target_info: 368*8975f5c5SAndroid Build Coastguard Worker for define in target_info['defines']: 369*8975f5c5SAndroid Build Coastguard Worker # Don't emit ANGLE's CPU-bits define here, it will be part of the arch-specific 370*8975f5c5SAndroid Build Coastguard Worker # information later 371*8975f5c5SAndroid Build Coastguard Worker result.append('-D%s' % escape_quotes(define)) 372*8975f5c5SAndroid Build Coastguard Worker 373*8975f5c5SAndroid Build Coastguard Worker return result 374*8975f5c5SAndroid Build Coastguard Worker 375*8975f5c5SAndroid Build Coastguard Worker 376*8975f5c5SAndroid Build Coastguard Workerblueprint_library_target_types = { 377*8975f5c5SAndroid Build Coastguard Worker "static_library": "cc_library_static", 378*8975f5c5SAndroid Build Coastguard Worker "shared_library": "cc_library_shared", 379*8975f5c5SAndroid Build Coastguard Worker "source_set": "cc_defaults", 380*8975f5c5SAndroid Build Coastguard Worker "group": "cc_defaults", 381*8975f5c5SAndroid Build Coastguard Worker} 382*8975f5c5SAndroid Build Coastguard Worker 383*8975f5c5SAndroid Build Coastguard Worker 384*8975f5c5SAndroid Build Coastguard Workerdef merge_bps(bps_for_abis): 385*8975f5c5SAndroid Build Coastguard Worker common_bp = {} 386*8975f5c5SAndroid Build Coastguard Worker for abi in ABI_TARGETS: 387*8975f5c5SAndroid Build Coastguard Worker for key, values in bps_for_abis[abi].items(): 388*8975f5c5SAndroid Build Coastguard Worker if not isinstance(values, list): 389*8975f5c5SAndroid Build Coastguard Worker # Assume everything that's not a list is common to all ABIs 390*8975f5c5SAndroid Build Coastguard Worker common_bp[key] = values 391*8975f5c5SAndroid Build Coastguard Worker continue 392*8975f5c5SAndroid Build Coastguard Worker 393*8975f5c5SAndroid Build Coastguard Worker # Find list values that are common to all ABIs 394*8975f5c5SAndroid Build Coastguard Worker values_in_all_abis = set.intersection( 395*8975f5c5SAndroid Build Coastguard Worker *[set(bps_for_abis[abi2].get(key, [])) for abi2 in ABI_TARGETS]) 396*8975f5c5SAndroid Build Coastguard Worker 397*8975f5c5SAndroid Build Coastguard Worker for value in values: 398*8975f5c5SAndroid Build Coastguard Worker if value in values_in_all_abis or key == 'defaults': # arch-specific defaults are not supported 399*8975f5c5SAndroid Build Coastguard Worker common_bp.setdefault(key, []) 400*8975f5c5SAndroid Build Coastguard Worker common_bp[key].append(value) 401*8975f5c5SAndroid Build Coastguard Worker else: 402*8975f5c5SAndroid Build Coastguard Worker common_bp.setdefault('arch', {abi3: {} for abi3 in ABI_TARGETS}) 403*8975f5c5SAndroid Build Coastguard Worker abi_specific = common_bp['arch'][abi] 404*8975f5c5SAndroid Build Coastguard Worker abi_specific.setdefault(key, []) 405*8975f5c5SAndroid Build Coastguard Worker abi_specific[key].append(value) 406*8975f5c5SAndroid Build Coastguard Worker 407*8975f5c5SAndroid Build Coastguard Worker return common_bp 408*8975f5c5SAndroid Build Coastguard Worker 409*8975f5c5SAndroid Build Coastguard Worker 410*8975f5c5SAndroid Build Coastguard Workerdef library_target_to_blueprint(target, build_info): 411*8975f5c5SAndroid Build Coastguard Worker bps_for_abis = {} 412*8975f5c5SAndroid Build Coastguard Worker blueprint_type = "" 413*8975f5c5SAndroid Build Coastguard Worker for abi in ABI_TARGETS: 414*8975f5c5SAndroid Build Coastguard Worker if target not in build_info[abi].keys(): 415*8975f5c5SAndroid Build Coastguard Worker bps_for_abis[abi] = {} 416*8975f5c5SAndroid Build Coastguard Worker continue 417*8975f5c5SAndroid Build Coastguard Worker 418*8975f5c5SAndroid Build Coastguard Worker target_info = build_info[abi][target] 419*8975f5c5SAndroid Build Coastguard Worker 420*8975f5c5SAndroid Build Coastguard Worker blueprint_type = blueprint_library_target_types[target_info['type']] 421*8975f5c5SAndroid Build Coastguard Worker 422*8975f5c5SAndroid Build Coastguard Worker bp = {'name': gn_target_to_blueprint_target(target, target_info)} 423*8975f5c5SAndroid Build Coastguard Worker 424*8975f5c5SAndroid Build Coastguard Worker if 'sources' in target_info: 425*8975f5c5SAndroid Build Coastguard Worker bp['srcs'] = gn_sources_to_blueprint_sources(target_info['sources']) 426*8975f5c5SAndroid Build Coastguard Worker 427*8975f5c5SAndroid Build Coastguard Worker (bp['static_libs'], bp['shared_libs'], bp['defaults'], bp['generated_headers'], 428*8975f5c5SAndroid Build Coastguard Worker bp['header_libs']) = gn_deps_to_blueprint_deps(abi, target, build_info) 429*8975f5c5SAndroid Build Coastguard Worker bp['shared_libs'] += gn_libs_to_blueprint_shared_libraries(target_info) 430*8975f5c5SAndroid Build Coastguard Worker 431*8975f5c5SAndroid Build Coastguard Worker bp['local_include_dirs'] = gn_include_dirs_to_blueprint_include_dirs(target_info) 432*8975f5c5SAndroid Build Coastguard Worker 433*8975f5c5SAndroid Build Coastguard Worker bp['cflags'] = gn_cflags_to_blueprint_cflags(target_info) 434*8975f5c5SAndroid Build Coastguard Worker 435*8975f5c5SAndroid Build Coastguard Worker bp['defaults'].append('angle_common_library_cflags') 436*8975f5c5SAndroid Build Coastguard Worker 437*8975f5c5SAndroid Build Coastguard Worker bp['sdk_version'] = CURRENT_SDK_VERSION 438*8975f5c5SAndroid Build Coastguard Worker 439*8975f5c5SAndroid Build Coastguard Worker bp['stl'] = STL 440*8975f5c5SAndroid Build Coastguard Worker if target in ROOT_TARGETS: 441*8975f5c5SAndroid Build Coastguard Worker bp['defaults'].append('angle_vendor_cc_defaults') 442*8975f5c5SAndroid Build Coastguard Worker bp['defaults'].append('angle_dma_buf_cc_defaults') 443*8975f5c5SAndroid Build Coastguard Worker bps_for_abis[abi] = bp 444*8975f5c5SAndroid Build Coastguard Worker 445*8975f5c5SAndroid Build Coastguard Worker common_bp = merge_bps(bps_for_abis) 446*8975f5c5SAndroid Build Coastguard Worker 447*8975f5c5SAndroid Build Coastguard Worker return blueprint_type, common_bp 448*8975f5c5SAndroid Build Coastguard Worker 449*8975f5c5SAndroid Build Coastguard Worker 450*8975f5c5SAndroid Build Coastguard Workerdef gn_action_args_to_blueprint_args(blueprint_inputs, blueprint_outputs, args): 451*8975f5c5SAndroid Build Coastguard Worker # TODO: pass the gn gen folder as an arg so we know how to get from the gen path to the root 452*8975f5c5SAndroid Build Coastguard Worker # path. b/150457277 453*8975f5c5SAndroid Build Coastguard Worker remap_folders = [ 454*8975f5c5SAndroid Build Coastguard Worker # Specific special-cases first, since the other will strip the prefixes. 455*8975f5c5SAndroid Build Coastguard Worker ('gen/third_party/glslang/src/include/glslang/build_info.h', 'glslang/build_info.h'), 456*8975f5c5SAndroid Build Coastguard Worker ('third_party/glslang/src', 'external/angle/third_party/glslang/src'), 457*8975f5c5SAndroid Build Coastguard Worker ('../../', ''), 458*8975f5c5SAndroid Build Coastguard Worker ('gen/', ''), 459*8975f5c5SAndroid Build Coastguard Worker ] 460*8975f5c5SAndroid Build Coastguard Worker 461*8975f5c5SAndroid Build Coastguard Worker result_args = [] 462*8975f5c5SAndroid Build Coastguard Worker for arg in args: 463*8975f5c5SAndroid Build Coastguard Worker # Attempt to find if this arg is a path to one of the inputs. If it is, use the blueprint 464*8975f5c5SAndroid Build Coastguard Worker # $(location <path>) argument instead so the path gets remapped properly to the location 465*8975f5c5SAndroid Build Coastguard Worker # that the script is run from 466*8975f5c5SAndroid Build Coastguard Worker remapped_path_arg = arg 467*8975f5c5SAndroid Build Coastguard Worker for (remap_source, remap_dest) in remap_folders: 468*8975f5c5SAndroid Build Coastguard Worker remapped_path_arg = remapped_path_arg.replace(remap_source, remap_dest) 469*8975f5c5SAndroid Build Coastguard Worker 470*8975f5c5SAndroid Build Coastguard Worker if remapped_path_arg in blueprint_inputs or remapped_path_arg in blueprint_outputs: 471*8975f5c5SAndroid Build Coastguard Worker result_args.append('$(location %s)' % remapped_path_arg) 472*8975f5c5SAndroid Build Coastguard Worker elif os.path.basename(remapped_path_arg) in blueprint_outputs: 473*8975f5c5SAndroid Build Coastguard Worker result_args.append('$(location %s)' % os.path.basename(remapped_path_arg)) 474*8975f5c5SAndroid Build Coastguard Worker else: 475*8975f5c5SAndroid Build Coastguard Worker result_args.append(remapped_path_arg) 476*8975f5c5SAndroid Build Coastguard Worker 477*8975f5c5SAndroid Build Coastguard Worker return result_args 478*8975f5c5SAndroid Build Coastguard Worker 479*8975f5c5SAndroid Build Coastguard Worker 480*8975f5c5SAndroid Build Coastguard Workerblueprint_gen_types = { 481*8975f5c5SAndroid Build Coastguard Worker "action": "cc_genrule", 482*8975f5c5SAndroid Build Coastguard Worker} 483*8975f5c5SAndroid Build Coastguard Worker 484*8975f5c5SAndroid Build Coastguard Worker 485*8975f5c5SAndroid Build Coastguard Workerinputs_blocklist = [ 486*8975f5c5SAndroid Build Coastguard Worker '//.git/HEAD', 487*8975f5c5SAndroid Build Coastguard Worker] 488*8975f5c5SAndroid Build Coastguard Worker 489*8975f5c5SAndroid Build Coastguard Workeroutputs_remap = { 490*8975f5c5SAndroid Build Coastguard Worker 'build_info.h': 'glslang/build_info.h', 491*8975f5c5SAndroid Build Coastguard Worker} 492*8975f5c5SAndroid Build Coastguard Worker 493*8975f5c5SAndroid Build Coastguard Worker 494*8975f5c5SAndroid Build Coastguard Workerdef is_input_in_tool_files(tool_files, input): 495*8975f5c5SAndroid Build Coastguard Worker return input in tool_files 496*8975f5c5SAndroid Build Coastguard Worker 497*8975f5c5SAndroid Build Coastguard Worker 498*8975f5c5SAndroid Build Coastguard Worker# special handling the {{response_file_name}} args in GN: 499*8975f5c5SAndroid Build Coastguard Worker# see https://gn.googlesource.com/gn/+/main/docs/reference.md#var_response_file_contents 500*8975f5c5SAndroid Build Coastguard Worker# in GN, if we use response_file_contents, the GN build system will automatically 501*8975f5c5SAndroid Build Coastguard Worker# write contents specified in response_file_contents arg into a temporary file 502*8975f5c5SAndroid Build Coastguard Worker# identified by {{response_file_name}}. However, Android blueprint does not have 503*8975f5c5SAndroid Build Coastguard Worker# the matching machanism. Android blueprint does automatically generate the 504*8975f5c5SAndroid Build Coastguard Worker# temporary file and does not recognize '{{response_file_name}}'. 505*8975f5c5SAndroid Build Coastguard Worker# To solve the problem: 506*8975f5c5SAndroid Build Coastguard Worker# 1) replace the '{{response_file_name}}' in command argument with the new 507*8975f5c5SAndroid Build Coastguard Worker# temporary file name. 508*8975f5c5SAndroid Build Coastguard Worker# 2) write the content specified in 'response_file_contents' to the new temporary 509*8975f5c5SAndroid Build Coastguard Worker# file 510*8975f5c5SAndroid Build Coastguard Worker# This function completes step 1) above. It checks if there are 511*8975f5c5SAndroid Build Coastguard Worker# '{{response_file_name}}' used in the command arguments. If there are, 512*8975f5c5SAndroid Build Coastguard Worker# the function replaces the '{{response_file_name}}' with the new temp file 513*8975f5c5SAndroid Build Coastguard Worker# named 'gn_response_file', and returns the new temp file to indicate 514*8975f5c5SAndroid Build Coastguard Worker# we need to complete step 2) 515*8975f5c5SAndroid Build Coastguard Workerdef handle_gn_build_arg_response_file_name(command_arg_list): 516*8975f5c5SAndroid Build Coastguard Worker new_temp_file_name = None 517*8975f5c5SAndroid Build Coastguard Worker updated_args = command_arg_list[:] 518*8975f5c5SAndroid Build Coastguard Worker for index, arg in enumerate(updated_args): 519*8975f5c5SAndroid Build Coastguard Worker if arg == '{{response_file_name}}': 520*8975f5c5SAndroid Build Coastguard Worker new_temp_file_name = '$(genDir)/gn_response_file' 521*8975f5c5SAndroid Build Coastguard Worker updated_args[index] = new_temp_file_name 522*8975f5c5SAndroid Build Coastguard Worker return new_temp_file_name, updated_args 523*8975f5c5SAndroid Build Coastguard Worker 524*8975f5c5SAndroid Build Coastguard Worker 525*8975f5c5SAndroid Build Coastguard Workerdef action_target_to_blueprint(abi, target, build_info): 526*8975f5c5SAndroid Build Coastguard Worker target_info = build_info[abi][target] 527*8975f5c5SAndroid Build Coastguard Worker blueprint_type = blueprint_gen_types[target_info['type']] 528*8975f5c5SAndroid Build Coastguard Worker 529*8975f5c5SAndroid Build Coastguard Worker bp = {'name': gn_target_to_blueprint_target(target, target_info)} 530*8975f5c5SAndroid Build Coastguard Worker 531*8975f5c5SAndroid Build Coastguard Worker # Blueprints use only one 'srcs', merge all gn inputs into one list. 532*8975f5c5SAndroid Build Coastguard Worker gn_inputs = [] 533*8975f5c5SAndroid Build Coastguard Worker if 'inputs' in target_info: 534*8975f5c5SAndroid Build Coastguard Worker for input in target_info['inputs']: 535*8975f5c5SAndroid Build Coastguard Worker if input not in inputs_blocklist: 536*8975f5c5SAndroid Build Coastguard Worker gn_inputs.append(input) 537*8975f5c5SAndroid Build Coastguard Worker if 'sources' in target_info: 538*8975f5c5SAndroid Build Coastguard Worker gn_inputs += target_info['sources'] 539*8975f5c5SAndroid Build Coastguard Worker # Filter out the 'script' entry since Android.bp doesn't like the duplicate entries 540*8975f5c5SAndroid Build Coastguard Worker if 'script' in target_info: 541*8975f5c5SAndroid Build Coastguard Worker gn_inputs = [ 542*8975f5c5SAndroid Build Coastguard Worker input for input in gn_inputs 543*8975f5c5SAndroid Build Coastguard Worker if not is_input_in_tool_files(target_info['script'], input) 544*8975f5c5SAndroid Build Coastguard Worker ] 545*8975f5c5SAndroid Build Coastguard Worker 546*8975f5c5SAndroid Build Coastguard Worker bp_srcs = gn_paths_to_blueprint_paths(gn_inputs) 547*8975f5c5SAndroid Build Coastguard Worker 548*8975f5c5SAndroid Build Coastguard Worker bp['srcs'] = bp_srcs 549*8975f5c5SAndroid Build Coastguard Worker 550*8975f5c5SAndroid Build Coastguard Worker # genrules generate the output right into the 'root' directory. Strip any path before the 551*8975f5c5SAndroid Build Coastguard Worker # file name. 552*8975f5c5SAndroid Build Coastguard Worker bp_outputs = [] 553*8975f5c5SAndroid Build Coastguard Worker for gn_output in target_info['outputs']: 554*8975f5c5SAndroid Build Coastguard Worker output = os.path.basename(gn_output) 555*8975f5c5SAndroid Build Coastguard Worker if output in outputs_remap.keys(): 556*8975f5c5SAndroid Build Coastguard Worker output = outputs_remap[output] 557*8975f5c5SAndroid Build Coastguard Worker bp_outputs.append(output) 558*8975f5c5SAndroid Build Coastguard Worker 559*8975f5c5SAndroid Build Coastguard Worker bp['out'] = bp_outputs 560*8975f5c5SAndroid Build Coastguard Worker 561*8975f5c5SAndroid Build Coastguard Worker bp['tool_files'] = [gn_path_to_blueprint_path(target_info['script'])] 562*8975f5c5SAndroid Build Coastguard Worker 563*8975f5c5SAndroid Build Coastguard Worker new_temporary_gn_response_file, updated_args = handle_gn_build_arg_response_file_name( 564*8975f5c5SAndroid Build Coastguard Worker target_info['args']) 565*8975f5c5SAndroid Build Coastguard Worker 566*8975f5c5SAndroid Build Coastguard Worker if new_temporary_gn_response_file: 567*8975f5c5SAndroid Build Coastguard Worker # add the command 'echo $(in) > $(genDir)/gn_response_file' to 568*8975f5c5SAndroid Build Coastguard Worker # write $response_file_contents into the new_temporary_gn_response_file. 569*8975f5c5SAndroid Build Coastguard Worker cmd = ['echo $(in) >', new_temporary_gn_response_file, '&&', '$(location)' 570*8975f5c5SAndroid Build Coastguard Worker ] + gn_action_args_to_blueprint_args(bp_srcs, bp_outputs, updated_args) 571*8975f5c5SAndroid Build Coastguard Worker else: 572*8975f5c5SAndroid Build Coastguard Worker cmd = ['$(location)'] + gn_action_args_to_blueprint_args(bp_srcs, bp_outputs, 573*8975f5c5SAndroid Build Coastguard Worker target_info['args']) 574*8975f5c5SAndroid Build Coastguard Worker 575*8975f5c5SAndroid Build Coastguard Worker bp['cmd'] = ' '.join(cmd) 576*8975f5c5SAndroid Build Coastguard Worker 577*8975f5c5SAndroid Build Coastguard Worker bp['sdk_version'] = CURRENT_SDK_VERSION 578*8975f5c5SAndroid Build Coastguard Worker 579*8975f5c5SAndroid Build Coastguard Worker return blueprint_type, bp 580*8975f5c5SAndroid Build Coastguard Worker 581*8975f5c5SAndroid Build Coastguard Worker 582*8975f5c5SAndroid Build Coastguard Workerdef gn_target_to_blueprint(target, build_info): 583*8975f5c5SAndroid Build Coastguard Worker for abi in ABI_TARGETS: 584*8975f5c5SAndroid Build Coastguard Worker gn_type = build_info[abi][target]['type'] 585*8975f5c5SAndroid Build Coastguard Worker if gn_type in blueprint_library_target_types: 586*8975f5c5SAndroid Build Coastguard Worker return library_target_to_blueprint(target, build_info) 587*8975f5c5SAndroid Build Coastguard Worker elif gn_type in blueprint_gen_types: 588*8975f5c5SAndroid Build Coastguard Worker return action_target_to_blueprint(abi, target, build_info) 589*8975f5c5SAndroid Build Coastguard Worker else: 590*8975f5c5SAndroid Build Coastguard Worker # Target is not used by this ABI 591*8975f5c5SAndroid Build Coastguard Worker continue 592*8975f5c5SAndroid Build Coastguard Worker 593*8975f5c5SAndroid Build Coastguard Worker 594*8975f5c5SAndroid Build Coastguard Worker@functools.lru_cache(maxsize=None) 595*8975f5c5SAndroid Build Coastguard Workerdef get_gn_target_dependencies(abi, target, build_info): 596*8975f5c5SAndroid Build Coastguard Worker result = collections.OrderedDict() 597*8975f5c5SAndroid Build Coastguard Worker result[target] = 1 598*8975f5c5SAndroid Build Coastguard Worker 599*8975f5c5SAndroid Build Coastguard Worker for dep in build_info[abi][target]['deps']: 600*8975f5c5SAndroid Build Coastguard Worker if dep in target_blockist: 601*8975f5c5SAndroid Build Coastguard Worker # Blocklisted dep 602*8975f5c5SAndroid Build Coastguard Worker continue 603*8975f5c5SAndroid Build Coastguard Worker if dep not in build_info[abi]: 604*8975f5c5SAndroid Build Coastguard Worker # No info for this dep, skip it 605*8975f5c5SAndroid Build Coastguard Worker continue 606*8975f5c5SAndroid Build Coastguard Worker 607*8975f5c5SAndroid Build Coastguard Worker # Recurse 608*8975f5c5SAndroid Build Coastguard Worker result.update(get_gn_target_dependencies(abi, dep, build_info)) 609*8975f5c5SAndroid Build Coastguard Worker 610*8975f5c5SAndroid Build Coastguard Worker return result 611*8975f5c5SAndroid Build Coastguard Worker 612*8975f5c5SAndroid Build Coastguard Worker 613*8975f5c5SAndroid Build Coastguard Workerdef get_angle_in_vendor_flag_config(): 614*8975f5c5SAndroid Build Coastguard Worker blueprint_results = [] 615*8975f5c5SAndroid Build Coastguard Worker 616*8975f5c5SAndroid Build Coastguard Worker blueprint_results.append(('soong_config_module_type', { 617*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_config_cc_defaults', 618*8975f5c5SAndroid Build Coastguard Worker 'module_type': 'cc_defaults', 619*8975f5c5SAndroid Build Coastguard Worker 'config_namespace': 'angle', 620*8975f5c5SAndroid Build Coastguard Worker 'bool_variables': ['angle_in_vendor',], 621*8975f5c5SAndroid Build Coastguard Worker 'properties': [ 622*8975f5c5SAndroid Build Coastguard Worker 'target.android.relative_install_path', 623*8975f5c5SAndroid Build Coastguard Worker 'vendor', 624*8975f5c5SAndroid Build Coastguard Worker ], 625*8975f5c5SAndroid Build Coastguard Worker })) 626*8975f5c5SAndroid Build Coastguard Worker 627*8975f5c5SAndroid Build Coastguard Worker blueprint_results.append(('soong_config_bool_variable', { 628*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_in_vendor', 629*8975f5c5SAndroid Build Coastguard Worker })) 630*8975f5c5SAndroid Build Coastguard Worker 631*8975f5c5SAndroid Build Coastguard Worker blueprint_results.append(( 632*8975f5c5SAndroid Build Coastguard Worker 'angle_config_cc_defaults', 633*8975f5c5SAndroid Build Coastguard Worker { 634*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_vendor_cc_defaults', 635*8975f5c5SAndroid Build Coastguard Worker 'vendor': False, 636*8975f5c5SAndroid Build Coastguard Worker 'target': { 637*8975f5c5SAndroid Build Coastguard Worker 'android': { 638*8975f5c5SAndroid Build Coastguard Worker # Android EGL loader can not load from /system/egl/${LIB} 639*8975f5c5SAndroid Build Coastguard Worker # path and hence don't set the relative path so that ANGLE 640*8975f5c5SAndroid Build Coastguard Worker # libraries get built into /system/${LIB} 641*8975f5c5SAndroid Build Coastguard Worker 'relative_install_path': '', 642*8975f5c5SAndroid Build Coastguard Worker }, 643*8975f5c5SAndroid Build Coastguard Worker }, 644*8975f5c5SAndroid Build Coastguard Worker 'soong_config_variables': { 645*8975f5c5SAndroid Build Coastguard Worker 'angle_in_vendor': { 646*8975f5c5SAndroid Build Coastguard Worker 'vendor': True, 647*8975f5c5SAndroid Build Coastguard Worker 'target': { 648*8975f5c5SAndroid Build Coastguard Worker 'android': { 649*8975f5c5SAndroid Build Coastguard Worker 'relative_install_path': 'egl', 650*8975f5c5SAndroid Build Coastguard Worker }, 651*8975f5c5SAndroid Build Coastguard Worker }, 652*8975f5c5SAndroid Build Coastguard Worker }, 653*8975f5c5SAndroid Build Coastguard Worker }, 654*8975f5c5SAndroid Build Coastguard Worker })) 655*8975f5c5SAndroid Build Coastguard Worker 656*8975f5c5SAndroid Build Coastguard Worker return blueprint_results 657*8975f5c5SAndroid Build Coastguard Worker 658*8975f5c5SAndroid Build Coastguard Worker 659*8975f5c5SAndroid Build Coastguard Workerdef get_angle_android_dma_buf_flag_config(build_info): 660*8975f5c5SAndroid Build Coastguard Worker """ 661*8975f5c5SAndroid Build Coastguard Worker Generates a list of Android.bp definitions for angle_android_dma_buf flag. 662*8975f5c5SAndroid Build Coastguard Worker """ 663*8975f5c5SAndroid Build Coastguard Worker 664*8975f5c5SAndroid Build Coastguard Worker blueprint_results = [] 665*8975f5c5SAndroid Build Coastguard Worker 666*8975f5c5SAndroid Build Coastguard Worker blueprint_results.append(('soong_config_module_type', { 667*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_dma_buf_config_cc_defaults', 668*8975f5c5SAndroid Build Coastguard Worker 'module_type': 'cc_defaults', 669*8975f5c5SAndroid Build Coastguard Worker 'config_namespace': 'angle', 670*8975f5c5SAndroid Build Coastguard Worker 'bool_variables': ['angle_android_dma_buf'], 671*8975f5c5SAndroid Build Coastguard Worker 'properties': ['defaults'] 672*8975f5c5SAndroid Build Coastguard Worker })) 673*8975f5c5SAndroid Build Coastguard Worker 674*8975f5c5SAndroid Build Coastguard Worker blueprint_results.append(('soong_config_bool_variable', { 675*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_android_dma_buf', 676*8975f5c5SAndroid Build Coastguard Worker })) 677*8975f5c5SAndroid Build Coastguard Worker 678*8975f5c5SAndroid Build Coastguard Worker blueprint_results.append(('angle_dma_buf_config_cc_defaults', { 679*8975f5c5SAndroid Build Coastguard Worker BLUEPRINT_COMMENT_PROPERTY: 680*8975f5c5SAndroid Build Coastguard Worker ('Note: this is a no-op for most builds, only applies to products that explicitly ' 681*8975f5c5SAndroid Build Coastguard Worker 'enable the angle_android_dma_buf config flag. See b/353262025 for details of the ' 682*8975f5c5SAndroid Build Coastguard Worker 'products that use it.'), 683*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_dma_buf_cc_defaults', 684*8975f5c5SAndroid Build Coastguard Worker 'soong_config_variables': { 685*8975f5c5SAndroid Build Coastguard Worker 'angle_android_dma_buf': { 686*8975f5c5SAndroid Build Coastguard Worker 'defaults': [gn_target_to_blueprint_target(DMA_BUF_TARGET, {})], 687*8975f5c5SAndroid Build Coastguard Worker } 688*8975f5c5SAndroid Build Coastguard Worker }, 689*8975f5c5SAndroid Build Coastguard Worker })) 690*8975f5c5SAndroid Build Coastguard Worker 691*8975f5c5SAndroid Build Coastguard Worker return blueprint_results 692*8975f5c5SAndroid Build Coastguard Worker 693*8975f5c5SAndroid Build Coastguard Worker 694*8975f5c5SAndroid Build Coastguard Worker# returns list of (blueprint module type, dict with contents) 695*8975f5c5SAndroid Build Coastguard Workerdef get_blueprint_targets_from_build_info(build_info: BuildInfo) -> List[Tuple[str, dict]]: 696*8975f5c5SAndroid Build Coastguard Worker targets_to_write = collections.OrderedDict() 697*8975f5c5SAndroid Build Coastguard Worker for abi in ABI_TARGETS: 698*8975f5c5SAndroid Build Coastguard Worker for root_target in ROOT_TARGETS + [END2END_TEST_TARGET, DMA_BUF_TARGET]: 699*8975f5c5SAndroid Build Coastguard Worker 700*8975f5c5SAndroid Build Coastguard Worker targets_to_write.update(get_gn_target_dependencies(abi, root_target, build_info)) 701*8975f5c5SAndroid Build Coastguard Worker 702*8975f5c5SAndroid Build Coastguard Worker generated_targets = [] 703*8975f5c5SAndroid Build Coastguard Worker for target in reversed(targets_to_write.keys()): 704*8975f5c5SAndroid Build Coastguard Worker # Do not export angle_commit_id target in Android.bp, because the script 705*8975f5c5SAndroid Build Coastguard Worker # src/commit_id.py invoked by this target can't guarantee to generate a 706*8975f5c5SAndroid Build Coastguard Worker # meaningful ANGLE git hash during compile time, see b/348044346. 707*8975f5c5SAndroid Build Coastguard Worker # The script src/commit_id.py will be invoked by roll_aosp.h during 708*8975f5c5SAndroid Build Coastguard Worker # ANGLE to Android roll time, and the ANGLE git hash will be output in 709*8975f5c5SAndroid Build Coastguard Worker # {AndroidANGLERoot}/angle_commmit.h. 710*8975f5c5SAndroid Build Coastguard Worker if target == '//:angle_commit_id': 711*8975f5c5SAndroid Build Coastguard Worker continue 712*8975f5c5SAndroid Build Coastguard Worker generated_targets.append(gn_target_to_blueprint(target, build_info)) 713*8975f5c5SAndroid Build Coastguard Worker 714*8975f5c5SAndroid Build Coastguard Worker return generated_targets 715*8975f5c5SAndroid Build Coastguard Worker 716*8975f5c5SAndroid Build Coastguard Worker 717*8975f5c5SAndroid Build Coastguard Workerdef handle_angle_non_conformant_extensions_and_versions( 718*8975f5c5SAndroid Build Coastguard Worker generated_targets: List[Tuple[str, dict]], 719*8975f5c5SAndroid Build Coastguard Worker blueprint_targets: List[dict], 720*8975f5c5SAndroid Build Coastguard Worker): 721*8975f5c5SAndroid Build Coastguard Worker """Replace the non conformant cflags with a separate cc_defaults. 722*8975f5c5SAndroid Build Coastguard Worker 723*8975f5c5SAndroid Build Coastguard Worker The downstream can custom the cflags easier. 724*8975f5c5SAndroid Build Coastguard Worker """ 725*8975f5c5SAndroid Build Coastguard Worker non_conform_cflag = '-DANGLE_EXPOSE_NON_CONFORMANT_EXTENSIONS_AND_VERSIONS' 726*8975f5c5SAndroid Build Coastguard Worker non_conform_defaults = 'angle_non_conformant_extensions_and_versions_cflags' 727*8975f5c5SAndroid Build Coastguard Worker 728*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('cc_defaults', { 729*8975f5c5SAndroid Build Coastguard Worker 'name': non_conform_defaults, 730*8975f5c5SAndroid Build Coastguard Worker 'cflags': [non_conform_cflag], 731*8975f5c5SAndroid Build Coastguard Worker })) 732*8975f5c5SAndroid Build Coastguard Worker 733*8975f5c5SAndroid Build Coastguard Worker for _, bp in generated_targets: 734*8975f5c5SAndroid Build Coastguard Worker if 'cflags' in bp and non_conform_cflag in bp['cflags']: 735*8975f5c5SAndroid Build Coastguard Worker bp['cflags'] = list(set(bp['cflags']) - {non_conform_cflag}) 736*8975f5c5SAndroid Build Coastguard Worker bp['defaults'].append(non_conform_defaults) 737*8975f5c5SAndroid Build Coastguard Worker 738*8975f5c5SAndroid Build Coastguard Worker 739*8975f5c5SAndroid Build Coastguard Workerdef fix_fortify_source_cflags(cflags): 740*8975f5c5SAndroid Build Coastguard Worker # search if there is any cflag starts with '-D_FORTIFY_SOURCE' 741*8975f5c5SAndroid Build Coastguard Worker d_fortify_source_flag = [cflag for cflag in cflags if '-D_FORTIFY_SOURCE' in cflag] 742*8975f5c5SAndroid Build Coastguard Worker # Insert -U_FORTIFY_SOURCE before the first -D_FORTIFY_SOURCE flag. 743*8975f5c5SAndroid Build Coastguard Worker # In case a default mode for FORTIFY_SOURCE is predefined for a compiler, 744*8975f5c5SAndroid Build Coastguard Worker # and the -D_FORTIFY_SOURCE mode we set is different from the default mode, 745*8975f5c5SAndroid Build Coastguard Worker # the compiler will warn about "redefining FORTIFY_SOURCE macro". 746*8975f5c5SAndroid Build Coastguard Worker # To fix this compiler warning, we unset the default mode with 747*8975f5c5SAndroid Build Coastguard Worker # -U_FORTIFY_SOURCE before setting the desired FORTIFY_SOURCE mode in our 748*8975f5c5SAndroid Build Coastguard Worker # cflags. 749*8975f5c5SAndroid Build Coastguard Worker # reference: 750*8975f5c5SAndroid Build Coastguard Worker # https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++#tldr-what-compiler-options-should-i-use 751*8975f5c5SAndroid Build Coastguard Worker if d_fortify_source_flag: 752*8975f5c5SAndroid Build Coastguard Worker cflags.insert(cflags.index(d_fortify_source_flag[0]), '-U_FORTIFY_SOURCE') 753*8975f5c5SAndroid Build Coastguard Worker 754*8975f5c5SAndroid Build Coastguard Worker 755*8975f5c5SAndroid Build Coastguard Workerdef main(): 756*8975f5c5SAndroid Build Coastguard Worker parser = argparse.ArgumentParser( 757*8975f5c5SAndroid Build Coastguard Worker description='Generate Android blueprints from gn descriptions.') 758*8975f5c5SAndroid Build Coastguard Worker 759*8975f5c5SAndroid Build Coastguard Worker for abi in ABI_TARGETS: 760*8975f5c5SAndroid Build Coastguard Worker parser.add_argument( 761*8975f5c5SAndroid Build Coastguard Worker '--gn_json_' + gn_abi(abi), 762*8975f5c5SAndroid Build Coastguard Worker help=gn_abi(abi) + 763*8975f5c5SAndroid Build Coastguard Worker ' gn desc file in json format. Generated with \'gn desc <out_dir> --format=json "*"\'.', 764*8975f5c5SAndroid Build Coastguard Worker required=True) 765*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--output', help='output file (e.g. Android.bp)') 766*8975f5c5SAndroid Build Coastguard Worker args = vars(parser.parse_args()) 767*8975f5c5SAndroid Build Coastguard Worker 768*8975f5c5SAndroid Build Coastguard Worker infos = {} 769*8975f5c5SAndroid Build Coastguard Worker for abi in ABI_TARGETS: 770*8975f5c5SAndroid Build Coastguard Worker with open(args['gn_json_' + gn_abi(abi)], 'r') as f: 771*8975f5c5SAndroid Build Coastguard Worker infos[abi] = json.load(f) 772*8975f5c5SAndroid Build Coastguard Worker 773*8975f5c5SAndroid Build Coastguard Worker build_info = BuildInfo(infos) 774*8975f5c5SAndroid Build Coastguard Worker 775*8975f5c5SAndroid Build Coastguard Worker blueprint_targets = [] 776*8975f5c5SAndroid Build Coastguard Worker 777*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.extend(get_angle_in_vendor_flag_config()) 778*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.extend(get_angle_android_dma_buf_flag_config(build_info)) 779*8975f5c5SAndroid Build Coastguard Worker 780*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(( 781*8975f5c5SAndroid Build Coastguard Worker 'cc_defaults', 782*8975f5c5SAndroid Build Coastguard Worker { 783*8975f5c5SAndroid Build Coastguard Worker 'name': 784*8975f5c5SAndroid Build Coastguard Worker 'angle_common_library_cflags', 785*8975f5c5SAndroid Build Coastguard Worker 'cpp_std': 786*8975f5c5SAndroid Build Coastguard Worker 'gnu++17', # TODO(b/330910097): std::popcount missing from external/libcxx 787*8975f5c5SAndroid Build Coastguard Worker 'cflags': [ 788*8975f5c5SAndroid Build Coastguard Worker # Chrome and Android use different versions of Clang which support differnt warning options. 789*8975f5c5SAndroid Build Coastguard Worker # Ignore errors about unrecognized warning flags. 790*8975f5c5SAndroid Build Coastguard Worker '-Wno-unknown-warning-option', 791*8975f5c5SAndroid Build Coastguard Worker '-O2', 792*8975f5c5SAndroid Build Coastguard Worker # Override AOSP build flags to match ANGLE's CQ testing and reduce binary size 793*8975f5c5SAndroid Build Coastguard Worker '-fno-unwind-tables', 794*8975f5c5SAndroid Build Coastguard Worker # Disable stack protector to reduce cpu overhead. 795*8975f5c5SAndroid Build Coastguard Worker '-fno-stack-protector', 796*8975f5c5SAndroid Build Coastguard Worker ], 797*8975f5c5SAndroid Build Coastguard Worker })) 798*8975f5c5SAndroid Build Coastguard Worker 799*8975f5c5SAndroid Build Coastguard Worker generated_targets = get_blueprint_targets_from_build_info(build_info) 800*8975f5c5SAndroid Build Coastguard Worker 801*8975f5c5SAndroid Build Coastguard Worker # Will modify generated_targets and blueprint_targets in-place to handle the 802*8975f5c5SAndroid Build Coastguard Worker # angle_expose_non_conformant_extensions_and_versions gn argument. 803*8975f5c5SAndroid Build Coastguard Worker handle_angle_non_conformant_extensions_and_versions(generated_targets, blueprint_targets) 804*8975f5c5SAndroid Build Coastguard Worker 805*8975f5c5SAndroid Build Coastguard Worker # Move cflags that are repeated in each target to cc_defaults 806*8975f5c5SAndroid Build Coastguard Worker all_cflags = [set(bp['cflags']) for _, bp in generated_targets if 'cflags' in bp] 807*8975f5c5SAndroid Build Coastguard Worker all_target_cflags = set.intersection(*all_cflags) 808*8975f5c5SAndroid Build Coastguard Worker 809*8975f5c5SAndroid Build Coastguard Worker for _, bp in generated_targets: 810*8975f5c5SAndroid Build Coastguard Worker if 'cflags' in bp: 811*8975f5c5SAndroid Build Coastguard Worker bp['cflags'] = list(set(bp['cflags']) - all_target_cflags) 812*8975f5c5SAndroid Build Coastguard Worker bp['defaults'].append('angle_common_auto_cflags') 813*8975f5c5SAndroid Build Coastguard Worker 814*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('cc_defaults', { 815*8975f5c5SAndroid Build Coastguard Worker 'name': 'angle_common_auto_cflags', 816*8975f5c5SAndroid Build Coastguard Worker 'cflags': list(all_target_cflags), 817*8975f5c5SAndroid Build Coastguard Worker })) 818*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.extend(generated_targets) 819*8975f5c5SAndroid Build Coastguard Worker 820*8975f5c5SAndroid Build Coastguard Worker # Add license build rules 821*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('package', { 822*8975f5c5SAndroid Build Coastguard Worker 'default_applicable_licenses': ['external_angle_license'], 823*8975f5c5SAndroid Build Coastguard Worker })) 824*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('license', { 825*8975f5c5SAndroid Build Coastguard Worker 'name': 826*8975f5c5SAndroid Build Coastguard Worker 'external_angle_license', 827*8975f5c5SAndroid Build Coastguard Worker 'visibility': [':__subpackages__'], 828*8975f5c5SAndroid Build Coastguard Worker 'license_kinds': [ 829*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-Apache-2.0', 830*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-BSD', 831*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-GPL', 832*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-GPL-2.0', 833*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-GPL-3.0', 834*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-LGPL', 835*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-MIT', 836*8975f5c5SAndroid Build Coastguard Worker 'SPDX-license-identifier-Zlib', 837*8975f5c5SAndroid Build Coastguard Worker 'legacy_unencumbered', 838*8975f5c5SAndroid Build Coastguard Worker ], 839*8975f5c5SAndroid Build Coastguard Worker 'license_text': [ 840*8975f5c5SAndroid Build Coastguard Worker 'LICENSE', 841*8975f5c5SAndroid Build Coastguard Worker 'src/common/third_party/xxhash/LICENSE', 842*8975f5c5SAndroid Build Coastguard Worker 'src/libANGLE/renderer/vulkan/shaders/src/third_party/ffx_spd/LICENSE', 843*8975f5c5SAndroid Build Coastguard Worker 'src/tests/test_utils/third_party/LICENSE', 844*8975f5c5SAndroid Build Coastguard Worker 'src/third_party/libXNVCtrl/LICENSE', 845*8975f5c5SAndroid Build Coastguard Worker 'src/third_party/volk/LICENSE.md', 846*8975f5c5SAndroid Build Coastguard Worker 'third_party/abseil-cpp/LICENSE', 847*8975f5c5SAndroid Build Coastguard Worker 'third_party/android_system_sdk/LICENSE', 848*8975f5c5SAndroid Build Coastguard Worker 'third_party/bazel/LICENSE', 849*8975f5c5SAndroid Build Coastguard Worker 'third_party/colorama/LICENSE', 850*8975f5c5SAndroid Build Coastguard Worker 'third_party/proguard/LICENSE', 851*8975f5c5SAndroid Build Coastguard Worker 'third_party/r8/LICENSE', 852*8975f5c5SAndroid Build Coastguard Worker 'third_party/turbine/LICENSE', 853*8975f5c5SAndroid Build Coastguard Worker 'third_party/glslang/LICENSE', 854*8975f5c5SAndroid Build Coastguard Worker 'third_party/glslang/src/LICENSE.txt', 855*8975f5c5SAndroid Build Coastguard Worker 'third_party/spirv-headers/LICENSE', 856*8975f5c5SAndroid Build Coastguard Worker 'third_party/spirv-headers/src/LICENSE', 857*8975f5c5SAndroid Build Coastguard Worker 'third_party/spirv-tools/LICENSE', 858*8975f5c5SAndroid Build Coastguard Worker 'third_party/spirv-tools/src/LICENSE', 859*8975f5c5SAndroid Build Coastguard Worker 'third_party/spirv-tools/src/utils/vscode/src/lsp/LICENSE', 860*8975f5c5SAndroid Build Coastguard Worker 'third_party/vulkan-headers/LICENSE.txt', 861*8975f5c5SAndroid Build Coastguard Worker 'third_party/vulkan-headers/src/LICENSE.md', 862*8975f5c5SAndroid Build Coastguard Worker 'third_party/vulkan_memory_allocator/LICENSE.txt', 863*8975f5c5SAndroid Build Coastguard Worker 'tools/flex-bison/third_party/m4sugar/LICENSE', 864*8975f5c5SAndroid Build Coastguard Worker 'tools/flex-bison/third_party/skeletons/LICENSE', 865*8975f5c5SAndroid Build Coastguard Worker 'util/windows/third_party/StackWalker/LICENSE', 866*8975f5c5SAndroid Build Coastguard Worker ], 867*8975f5c5SAndroid Build Coastguard Worker })) 868*8975f5c5SAndroid Build Coastguard Worker 869*8975f5c5SAndroid Build Coastguard Worker # Add APKs with all of the root libraries and permissions xml 870*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(( 871*8975f5c5SAndroid Build Coastguard Worker 'filegroup', 872*8975f5c5SAndroid Build Coastguard Worker { 873*8975f5c5SAndroid Build Coastguard Worker 'name': 874*8975f5c5SAndroid Build Coastguard Worker 'ANGLE_srcs', 875*8975f5c5SAndroid Build Coastguard Worker # We only need EmptyMainActivity.java since we just need to be able to reply to the intent 876*8975f5c5SAndroid Build Coastguard Worker # android.app.action.ANGLE_FOR_ANDROID to indicate ANGLE is present on the device. 877*8975f5c5SAndroid Build Coastguard Worker # However, the internal branch currently uses these files with patches in that branch. 878*8975f5c5SAndroid Build Coastguard Worker 'srcs': [ 879*8975f5c5SAndroid Build Coastguard Worker 'src/android_system_settings/src/com/android/angle/MainActivity.java', 880*8975f5c5SAndroid Build Coastguard Worker 'src/android_system_settings/src/com/android/angle/common/AngleRuleHelper.java', 881*8975f5c5SAndroid Build Coastguard Worker 'src/android_system_settings/src/com/android/angle/common/GlobalSettings.java', 882*8975f5c5SAndroid Build Coastguard Worker 'src/android_system_settings/src/com/android/angle/common/MainFragment.java', 883*8975f5c5SAndroid Build Coastguard Worker 'src/android_system_settings/src/com/android/angle/common/Receiver.java', 884*8975f5c5SAndroid Build Coastguard Worker 'src/android_system_settings/src/com/android/angle/common/SearchProvider.java', 885*8975f5c5SAndroid Build Coastguard Worker ], 886*8975f5c5SAndroid Build Coastguard Worker })) 887*8975f5c5SAndroid Build Coastguard Worker 888*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('prebuilt_etc', { 889*8975f5c5SAndroid Build Coastguard Worker 'name': 'android.software.angle.xml', 890*8975f5c5SAndroid Build Coastguard Worker 'src': 'android/android.software.angle.xml', 891*8975f5c5SAndroid Build Coastguard Worker 'product_specific': True, 892*8975f5c5SAndroid Build Coastguard Worker 'sub_dir': 'permissions', 893*8975f5c5SAndroid Build Coastguard Worker })) 894*8975f5c5SAndroid Build Coastguard Worker 895*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(( 896*8975f5c5SAndroid Build Coastguard Worker 'java_defaults', 897*8975f5c5SAndroid Build Coastguard Worker { 898*8975f5c5SAndroid Build Coastguard Worker 'name': 'ANGLE_java_defaults', 899*8975f5c5SAndroid Build Coastguard Worker 'sdk_version': 'system_current', 900*8975f5c5SAndroid Build Coastguard Worker 'target_sdk_version': TARGET_SDK_VERSION, 901*8975f5c5SAndroid Build Coastguard Worker 'min_sdk_version': MIN_SDK_VERSION, 902*8975f5c5SAndroid Build Coastguard Worker 'compile_multilib': 'both', 903*8975f5c5SAndroid Build Coastguard Worker 'use_embedded_native_libs': True, 904*8975f5c5SAndroid Build Coastguard Worker 'jni_libs': [ 905*8975f5c5SAndroid Build Coastguard Worker # hack: assume ABI_ARM 906*8975f5c5SAndroid Build Coastguard Worker gn_target_to_blueprint_target(target, build_info[ABI_ARM][target]) 907*8975f5c5SAndroid Build Coastguard Worker for target in ROOT_TARGETS 908*8975f5c5SAndroid Build Coastguard Worker ], 909*8975f5c5SAndroid Build Coastguard Worker 'aaptflags': [ 910*8975f5c5SAndroid Build Coastguard Worker '-0 .json', # Don't compress *.json files 911*8975f5c5SAndroid Build Coastguard Worker "--extra-packages com.android.angle.common", 912*8975f5c5SAndroid Build Coastguard Worker ], 913*8975f5c5SAndroid Build Coastguard Worker 'srcs': [':ANGLE_srcs'], 914*8975f5c5SAndroid Build Coastguard Worker 'privileged': True, 915*8975f5c5SAndroid Build Coastguard Worker 'product_specific': True, 916*8975f5c5SAndroid Build Coastguard Worker 'owner': 'google', 917*8975f5c5SAndroid Build Coastguard Worker 'required': ['android.software.angle.xml'], 918*8975f5c5SAndroid Build Coastguard Worker })) 919*8975f5c5SAndroid Build Coastguard Worker 920*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('android_library', { 921*8975f5c5SAndroid Build Coastguard Worker 'name': 'ANGLE_library', 922*8975f5c5SAndroid Build Coastguard Worker 'sdk_version': 'system_current', 923*8975f5c5SAndroid Build Coastguard Worker 'target_sdk_version': TARGET_SDK_VERSION, 924*8975f5c5SAndroid Build Coastguard Worker 'min_sdk_version': MIN_SDK_VERSION, 925*8975f5c5SAndroid Build Coastguard Worker 'resource_dirs': ['src/android_system_settings/res',], 926*8975f5c5SAndroid Build Coastguard Worker 'asset_dirs': ['src/android_system_settings/assets',], 927*8975f5c5SAndroid Build Coastguard Worker 'aaptflags': ['-0 .json',], 928*8975f5c5SAndroid Build Coastguard Worker 'manifest': 'src/android_system_settings/src/com/android/angle/AndroidManifest.xml', 929*8975f5c5SAndroid Build Coastguard Worker 'static_libs': ['androidx.preference_preference',], 930*8975f5c5SAndroid Build Coastguard Worker })) 931*8975f5c5SAndroid Build Coastguard Worker 932*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('android_app', { 933*8975f5c5SAndroid Build Coastguard Worker 'name': 'ANGLE', 934*8975f5c5SAndroid Build Coastguard Worker 'defaults': ['ANGLE_java_defaults'], 935*8975f5c5SAndroid Build Coastguard Worker 'manifest': 'src/android_system_settings/src/com/android/angle/AndroidManifest.xml', 936*8975f5c5SAndroid Build Coastguard Worker 'static_libs': ['ANGLE_library'], 937*8975f5c5SAndroid Build Coastguard Worker 'optimize': { 938*8975f5c5SAndroid Build Coastguard Worker 'enabled': True, 939*8975f5c5SAndroid Build Coastguard Worker 'shrink': True, 940*8975f5c5SAndroid Build Coastguard Worker 'proguard_compatibility': False, 941*8975f5c5SAndroid Build Coastguard Worker }, 942*8975f5c5SAndroid Build Coastguard Worker 'asset_dirs': ['src/android_system_settings/assets',], 943*8975f5c5SAndroid Build Coastguard Worker })) 944*8975f5c5SAndroid Build Coastguard Worker 945*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(( 946*8975f5c5SAndroid Build Coastguard Worker 'java_defaults', 947*8975f5c5SAndroid Build Coastguard Worker { 948*8975f5c5SAndroid Build Coastguard Worker 'name': 'ANGLE_java_settings_defaults', 949*8975f5c5SAndroid Build Coastguard Worker 'sdk_version': 'system_current', 950*8975f5c5SAndroid Build Coastguard Worker 'target_sdk_version': TARGET_SDK_VERSION, 951*8975f5c5SAndroid Build Coastguard Worker 'min_sdk_version': MIN_SDK_VERSION, 952*8975f5c5SAndroid Build Coastguard Worker 'compile_multilib': 'both', 953*8975f5c5SAndroid Build Coastguard Worker 'use_embedded_native_libs': True, 954*8975f5c5SAndroid Build Coastguard Worker 'aaptflags': [ 955*8975f5c5SAndroid Build Coastguard Worker '-0 .json', # Don't compress *.json files 956*8975f5c5SAndroid Build Coastguard Worker "--extra-packages com.android.angle.common", 957*8975f5c5SAndroid Build Coastguard Worker ], 958*8975f5c5SAndroid Build Coastguard Worker 'srcs': [':ANGLE_srcs'], 959*8975f5c5SAndroid Build Coastguard Worker 'privileged': True, 960*8975f5c5SAndroid Build Coastguard Worker 'product_specific': True, 961*8975f5c5SAndroid Build Coastguard Worker 'owner': 'google', 962*8975f5c5SAndroid Build Coastguard Worker 'required': ['android.software.angle.xml'], 963*8975f5c5SAndroid Build Coastguard Worker })) 964*8975f5c5SAndroid Build Coastguard Worker 965*8975f5c5SAndroid Build Coastguard Worker blueprint_targets.append(('android_app', { 966*8975f5c5SAndroid Build Coastguard Worker 'name': 'ANGLE_settings', 967*8975f5c5SAndroid Build Coastguard Worker 'defaults': ['ANGLE_java_settings_defaults'], 968*8975f5c5SAndroid Build Coastguard Worker 'manifest': 'src/android_system_settings/src/com/android/angle/AndroidManifest.xml', 969*8975f5c5SAndroid Build Coastguard Worker 'static_libs': ['ANGLE_library'], 970*8975f5c5SAndroid Build Coastguard Worker 'optimize': { 971*8975f5c5SAndroid Build Coastguard Worker 'enabled': True, 972*8975f5c5SAndroid Build Coastguard Worker 'shrink': True, 973*8975f5c5SAndroid Build Coastguard Worker 'proguard_compatibility': False, 974*8975f5c5SAndroid Build Coastguard Worker }, 975*8975f5c5SAndroid Build Coastguard Worker 'asset_dirs': ['src/android_system_settings/assets',], 976*8975f5c5SAndroid Build Coastguard Worker })) 977*8975f5c5SAndroid Build Coastguard Worker 978*8975f5c5SAndroid Build Coastguard Worker output = [ 979*8975f5c5SAndroid Build Coastguard Worker """// GENERATED FILE - DO NOT EDIT. 980*8975f5c5SAndroid Build Coastguard Worker// Generated by %s 981*8975f5c5SAndroid Build Coastguard Worker// 982*8975f5c5SAndroid Build Coastguard Worker// Copyright 2020 The ANGLE Project Authors. All rights reserved. 983*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 984*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file. 985*8975f5c5SAndroid Build Coastguard Worker//""" % sys.argv[0] 986*8975f5c5SAndroid Build Coastguard Worker ] 987*8975f5c5SAndroid Build Coastguard Worker for (blueprint_type, blueprint_data) in blueprint_targets: 988*8975f5c5SAndroid Build Coastguard Worker write_blueprint(output, blueprint_type, blueprint_data) 989*8975f5c5SAndroid Build Coastguard Worker 990*8975f5c5SAndroid Build Coastguard Worker with open(args['output'], 'w') as f: 991*8975f5c5SAndroid Build Coastguard Worker f.write('\n'.join(output) + '\n') 992*8975f5c5SAndroid Build Coastguard Worker 993*8975f5c5SAndroid Build Coastguard Worker 994*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__': 995*8975f5c5SAndroid Build Coastguard Worker sys.exit(main()) 996