xref: /aosp_15_r20/external/angle/scripts/generate_android_bp.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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