xref: /aosp_15_r20/external/cronet/build/fuchsia/gen_build_defs.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env vpython3
2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker#
6*6777b538SAndroid Build Coastguard Worker# Generates a single BUILD.gn file with build targets generated using the
7*6777b538SAndroid Build Coastguard Worker# manifest files in the SDK.
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker# TODO(b/40935282): Likely this file should belong to the
10*6777b538SAndroid Build Coastguard Worker# //third_party/fuchsia-gn-sdk/ instead of //build/fuchsia/.
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Workerimport json
13*6777b538SAndroid Build Coastguard Workerimport logging
14*6777b538SAndroid Build Coastguard Workerimport os
15*6777b538SAndroid Build Coastguard Workerimport sys
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Workersys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
18*6777b538SAndroid Build Coastguard Worker                                             'test')))
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Workerfrom common import DIR_SRC_ROOT, SDK_ROOT, GN_SDK_ROOT, get_host_os
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Workerassert GN_SDK_ROOT.startswith(DIR_SRC_ROOT)
23*6777b538SAndroid Build Coastguard Workerassert GN_SDK_ROOT[-1] != '/'
24*6777b538SAndroid Build Coastguard WorkerGN_SDK_GN_ROOT = GN_SDK_ROOT[len(DIR_SRC_ROOT):]
25*6777b538SAndroid Build Coastguard Workerassert GN_SDK_GN_ROOT.startswith('/')
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker# Inserted at the top of the generated BUILD.gn file.
28*6777b538SAndroid Build Coastguard Worker_GENERATED_PREAMBLE = f"""# DO NOT EDIT! This file was generated by
29*6777b538SAndroid Build Coastguard Worker# //build/fuchsia/gen_build_def.py.
30*6777b538SAndroid Build Coastguard Worker# Any changes made to this file will be discarded.
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Workerimport("/{GN_SDK_GN_ROOT}/fidl_library.gni")
33*6777b538SAndroid Build Coastguard Workerimport("/{GN_SDK_GN_ROOT}/fuchsia_sdk_package.gni")
34*6777b538SAndroid Build Coastguard Workerimport("/{GN_SDK_GN_ROOT}/fuchsia_sdk_pkg.gni")
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker"""
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Workerdef ReformatTargetName(dep_name):
40*6777b538SAndroid Build Coastguard Worker  """"Substitutes characters in |dep_name| which are not valid in GN target
41*6777b538SAndroid Build Coastguard Worker  names (e.g. dots become hyphens)."""
42*6777b538SAndroid Build Coastguard Worker  return dep_name
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Workerdef FormatGNTarget(fields):
46*6777b538SAndroid Build Coastguard Worker  """Returns a GN target definition as a string.
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker  |fields|: The GN fields to include in the target body.
49*6777b538SAndroid Build Coastguard Worker            'target_name' and 'type' are mandatory."""
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker  output = '%s("%s") {\n' % (fields['type'], fields['target_name'])
52*6777b538SAndroid Build Coastguard Worker  del fields['target_name']
53*6777b538SAndroid Build Coastguard Worker  del fields['type']
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker  # Ensure that fields with no ordering requirement are sorted.
56*6777b538SAndroid Build Coastguard Worker  for field in ['sources', 'public_deps']:
57*6777b538SAndroid Build Coastguard Worker    if field in fields:
58*6777b538SAndroid Build Coastguard Worker      fields[field].sort()
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker  for key, val in fields.items():
61*6777b538SAndroid Build Coastguard Worker    if isinstance(val, str):
62*6777b538SAndroid Build Coastguard Worker      val_serialized = '\"%s\"' % val
63*6777b538SAndroid Build Coastguard Worker    elif isinstance(val, list):
64*6777b538SAndroid Build Coastguard Worker      # Serialize a list of strings in the prettiest possible manner.
65*6777b538SAndroid Build Coastguard Worker      if len(val) == 0:
66*6777b538SAndroid Build Coastguard Worker        val_serialized = '[]'
67*6777b538SAndroid Build Coastguard Worker      elif len(val) == 1:
68*6777b538SAndroid Build Coastguard Worker        val_serialized = '[ \"%s\" ]' % val[0]
69*6777b538SAndroid Build Coastguard Worker      else:
70*6777b538SAndroid Build Coastguard Worker        val_serialized = '[\n    ' + ',\n    '.join(['\"%s\"' % x
71*6777b538SAndroid Build Coastguard Worker                                                     for x in val]) + '\n  ]'
72*6777b538SAndroid Build Coastguard Worker    else:
73*6777b538SAndroid Build Coastguard Worker      raise Exception('Could not serialize %r' % val)
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker    output += '  %s = %s\n' % (key, val_serialized)
76*6777b538SAndroid Build Coastguard Worker  output += '}'
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker  return output
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Workerdef MetaRootRelativePaths(sdk_relative_paths, meta_root):
82*6777b538SAndroid Build Coastguard Worker  return [os.path.relpath(path, meta_root) for path in sdk_relative_paths]
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Workerdef ConvertCommonFields(json):
86*6777b538SAndroid Build Coastguard Worker  """Extracts fields from JSON manifest data which are used across all
87*6777b538SAndroid Build Coastguard Worker  target types. Note that FIDL packages do their own processing."""
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker  meta_root = json['root']
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker  converted = {'target_name': ReformatTargetName(json['name'])}
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker  if 'deps' in json:
94*6777b538SAndroid Build Coastguard Worker    converted['public_deps'] = MetaRootRelativePaths(json['deps'],
95*6777b538SAndroid Build Coastguard Worker                                                     os.path.dirname(meta_root))
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker  # FIDL bindings dependencies are relative to the "fidl" sub-directory.
98*6777b538SAndroid Build Coastguard Worker  if 'fidl_binding_deps' in json:
99*6777b538SAndroid Build Coastguard Worker    for entry in json['fidl_binding_deps']:
100*6777b538SAndroid Build Coastguard Worker      converted['public_deps'] += MetaRootRelativePaths([
101*6777b538SAndroid Build Coastguard Worker          'fidl/' + dep + ':' + os.path.basename(dep) + '_' +
102*6777b538SAndroid Build Coastguard Worker          entry['binding_type'] for dep in entry['deps']
103*6777b538SAndroid Build Coastguard Worker      ], meta_root)
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker  return converted
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard Workerdef ConvertFidlLibrary(json):
109*6777b538SAndroid Build Coastguard Worker  """Converts a fidl_library manifest entry to a GN target.
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker  Arguments:
112*6777b538SAndroid Build Coastguard Worker    json: The parsed manifest JSON.
113*6777b538SAndroid Build Coastguard Worker  Returns:
114*6777b538SAndroid Build Coastguard Worker    The GN target definition, represented as a string."""
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker  meta_root = json['root']
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker  converted = ConvertCommonFields(json)
119*6777b538SAndroid Build Coastguard Worker  converted['type'] = 'fidl_library'
120*6777b538SAndroid Build Coastguard Worker  converted['sources'] = MetaRootRelativePaths(json['sources'], meta_root)
121*6777b538SAndroid Build Coastguard Worker  converted['library_name'] = json['name']
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker  return converted
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Workerdef ConvertCcPrebuiltLibrary(json):
127*6777b538SAndroid Build Coastguard Worker  """Converts a cc_prebuilt_library manifest entry to a GN target.
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker  Arguments:
130*6777b538SAndroid Build Coastguard Worker    json: The parsed manifest JSON.
131*6777b538SAndroid Build Coastguard Worker  Returns:
132*6777b538SAndroid Build Coastguard Worker    The GN target definition, represented as a string."""
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard Worker  meta_root = json['root']
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker  converted = ConvertCommonFields(json)
137*6777b538SAndroid Build Coastguard Worker  converted['type'] = 'fuchsia_sdk_pkg'
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker  converted['sources'] = MetaRootRelativePaths(json['headers'], meta_root)
140*6777b538SAndroid Build Coastguard Worker
141*6777b538SAndroid Build Coastguard Worker  converted['include_dirs'] = MetaRootRelativePaths([json['include_dir']],
142*6777b538SAndroid Build Coastguard Worker                                                    meta_root)
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker  if json['format'] == 'shared':
145*6777b538SAndroid Build Coastguard Worker    converted['shared_libs'] = [json['name']]
146*6777b538SAndroid Build Coastguard Worker  else:
147*6777b538SAndroid Build Coastguard Worker    converted['static_libs'] = [json['name']]
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker  return converted
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Workerdef ConvertCcSourceLibrary(json):
153*6777b538SAndroid Build Coastguard Worker  """Converts a cc_source_library manifest entry to a GN target.
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker  Arguments:
156*6777b538SAndroid Build Coastguard Worker    json: The parsed manifest JSON.
157*6777b538SAndroid Build Coastguard Worker  Returns:
158*6777b538SAndroid Build Coastguard Worker    The GN target definition, represented as a string."""
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker  meta_root = json['root']
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker  converted = ConvertCommonFields(json)
163*6777b538SAndroid Build Coastguard Worker  converted['type'] = 'fuchsia_sdk_pkg'
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker  # Headers and source file paths can be scattered across "sources", "headers",
166*6777b538SAndroid Build Coastguard Worker  # and "files". Merge them together into one source list.
167*6777b538SAndroid Build Coastguard Worker  converted['sources'] = MetaRootRelativePaths(json['sources'], meta_root)
168*6777b538SAndroid Build Coastguard Worker  if 'headers' in json:
169*6777b538SAndroid Build Coastguard Worker    converted['sources'] += MetaRootRelativePaths(json['headers'], meta_root)
170*6777b538SAndroid Build Coastguard Worker  if 'files' in json:
171*6777b538SAndroid Build Coastguard Worker    converted['sources'] += MetaRootRelativePaths(json['files'], meta_root)
172*6777b538SAndroid Build Coastguard Worker  converted['sources'] = list(set(converted['sources']))
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard Worker  converted['include_dirs'] = MetaRootRelativePaths([json['include_dir']],
175*6777b538SAndroid Build Coastguard Worker                                                    meta_root)
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker  return converted
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Workerdef ConvertLoadableModule(json):
181*6777b538SAndroid Build Coastguard Worker  """Converts a loadable module manifest entry to GN targets.
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker  Arguments:
184*6777b538SAndroid Build Coastguard Worker    json: The parsed manifest JSON.
185*6777b538SAndroid Build Coastguard Worker  Returns:
186*6777b538SAndroid Build Coastguard Worker    A list of GN target definitions."""
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker  name = json['name']
189*6777b538SAndroid Build Coastguard Worker  if name != 'vulkan_layers':
190*6777b538SAndroid Build Coastguard Worker    raise RuntimeError('Unsupported loadable_module: %s' % name)
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Worker  # Copy resources and binaries
193*6777b538SAndroid Build Coastguard Worker  resources = json['resources']
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker  binaries = json['binaries']
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker  def _filename_no_ext(name):
198*6777b538SAndroid Build Coastguard Worker    return os.path.splitext(os.path.basename(name))[0]
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker  # Pair each json resource with its corresponding binary. Each such pair
201*6777b538SAndroid Build Coastguard Worker  # is a "layer". We only need to check one arch because each arch has the
202*6777b538SAndroid Build Coastguard Worker  # same list of binaries.
203*6777b538SAndroid Build Coastguard Worker  arch = next(iter(binaries))
204*6777b538SAndroid Build Coastguard Worker  binary_names = binaries[arch]
205*6777b538SAndroid Build Coastguard Worker  local_pkg = json['root']
206*6777b538SAndroid Build Coastguard Worker  vulkan_targets = []
207*6777b538SAndroid Build Coastguard Worker
208*6777b538SAndroid Build Coastguard Worker  for res in resources:
209*6777b538SAndroid Build Coastguard Worker    layer_name = _filename_no_ext(res)
210*6777b538SAndroid Build Coastguard Worker
211*6777b538SAndroid Build Coastguard Worker    # Filter binaries for a matching name.
212*6777b538SAndroid Build Coastguard Worker    filtered = [n for n in binary_names if _filename_no_ext(n) == layer_name]
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker    if not filtered:
215*6777b538SAndroid Build Coastguard Worker      # If the binary could not be found then do not generate a
216*6777b538SAndroid Build Coastguard Worker      # target for this layer. The missing targets will cause a
217*6777b538SAndroid Build Coastguard Worker      # mismatch with the "golden" outputs.
218*6777b538SAndroid Build Coastguard Worker      continue
219*6777b538SAndroid Build Coastguard Worker
220*6777b538SAndroid Build Coastguard Worker    # Replace hardcoded arch in the found binary filename.
221*6777b538SAndroid Build Coastguard Worker    binary = filtered[0].replace('/' + arch + '/', "/${target_cpu}/")
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker    target = {}
224*6777b538SAndroid Build Coastguard Worker    target['name'] = layer_name
225*6777b538SAndroid Build Coastguard Worker    target['config'] = os.path.relpath(res, start=local_pkg)
226*6777b538SAndroid Build Coastguard Worker    target['binary'] = os.path.relpath(binary, start=local_pkg)
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker    vulkan_targets.append(target)
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker  converted = []
231*6777b538SAndroid Build Coastguard Worker  all_target = {}
232*6777b538SAndroid Build Coastguard Worker  all_target['target_name'] = 'all'
233*6777b538SAndroid Build Coastguard Worker  all_target['type'] = 'group'
234*6777b538SAndroid Build Coastguard Worker  all_target['data_deps'] = []
235*6777b538SAndroid Build Coastguard Worker  for target in vulkan_targets:
236*6777b538SAndroid Build Coastguard Worker    config_target = {}
237*6777b538SAndroid Build Coastguard Worker    config_target['target_name'] = target['name'] + '_config'
238*6777b538SAndroid Build Coastguard Worker    config_target['type'] = 'copy'
239*6777b538SAndroid Build Coastguard Worker    config_target['sources'] = [target['config']]
240*6777b538SAndroid Build Coastguard Worker    config_target['outputs'] = ['${root_gen_dir}/' + target['config']]
241*6777b538SAndroid Build Coastguard Worker    converted.append(config_target)
242*6777b538SAndroid Build Coastguard Worker    lib_target = {}
243*6777b538SAndroid Build Coastguard Worker    lib_target['target_name'] = target['name'] + '_lib'
244*6777b538SAndroid Build Coastguard Worker    lib_target['type'] = 'copy'
245*6777b538SAndroid Build Coastguard Worker    lib_target['sources'] = [target['binary']]
246*6777b538SAndroid Build Coastguard Worker    lib_target['outputs'] = ['${root_out_dir}/lib/{{source_file_part}}']
247*6777b538SAndroid Build Coastguard Worker    converted.append(lib_target)
248*6777b538SAndroid Build Coastguard Worker    group_target = {}
249*6777b538SAndroid Build Coastguard Worker    group_target['target_name'] = target['name']
250*6777b538SAndroid Build Coastguard Worker    group_target['type'] = 'group'
251*6777b538SAndroid Build Coastguard Worker    group_target['data_deps'] = [
252*6777b538SAndroid Build Coastguard Worker        ':' + target['name'] + '_config', ':' + target['name'] + '_lib'
253*6777b538SAndroid Build Coastguard Worker    ]
254*6777b538SAndroid Build Coastguard Worker    converted.append(group_target)
255*6777b538SAndroid Build Coastguard Worker    all_target['data_deps'].append(':' + target['name'])
256*6777b538SAndroid Build Coastguard Worker  converted.append(all_target)
257*6777b538SAndroid Build Coastguard Worker  return converted
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker
260*6777b538SAndroid Build Coastguard Workerdef ConvertPackage(json):
261*6777b538SAndroid Build Coastguard Worker  """Converts a package manifest entry to a GN target.
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker  Arguments:
264*6777b538SAndroid Build Coastguard Worker    json: The parsed manifest JSON.
265*6777b538SAndroid Build Coastguard Worker  Returns:
266*6777b538SAndroid Build Coastguard Worker    The GN target definition."""
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Worker  converted = {
269*6777b538SAndroid Build Coastguard Worker      'target_name': ReformatTargetName(json['name']),
270*6777b538SAndroid Build Coastguard Worker      'type': 'fuchsia_sdk_package',
271*6777b538SAndroid Build Coastguard Worker  }
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker  # Extrapolate the manifest_file's path from the first variant, assuming that
274*6777b538SAndroid Build Coastguard Worker  # they all follow the same format.
275*6777b538SAndroid Build Coastguard Worker  variant = json['variants'][0]
276*6777b538SAndroid Build Coastguard Worker  replace_pattern = '/%s-api-%d/' % (variant['arch'], variant['api_level'])
277*6777b538SAndroid Build Coastguard Worker  segments = variant['manifest_file'].split(replace_pattern)
278*6777b538SAndroid Build Coastguard Worker  if len(segments) != 2:
279*6777b538SAndroid Build Coastguard Worker    raise RuntimeError('Unsupported pattern: %s' % variant['manifest_file'])
280*6777b538SAndroid Build Coastguard Worker  converted['manifest_file'] = \
281*6777b538SAndroid Build Coastguard Worker      '/${target_cpu}-api-${fuchsia_target_api_level}/'.join(segments)
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker  return converted
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Workerdef ConvertNoOp(json):
287*6777b538SAndroid Build Coastguard Worker  """Null implementation of a conversion function. No output is generated."""
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker  return None
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker
292*6777b538SAndroid Build Coastguard Worker"""Maps manifest types to conversion functions."""
293*6777b538SAndroid Build Coastguard Worker_CONVERSION_FUNCTION_MAP = {
294*6777b538SAndroid Build Coastguard Worker    'fidl_library': ConvertFidlLibrary,
295*6777b538SAndroid Build Coastguard Worker    'cc_source_library': ConvertCcSourceLibrary,
296*6777b538SAndroid Build Coastguard Worker    'cc_prebuilt_library': ConvertCcPrebuiltLibrary,
297*6777b538SAndroid Build Coastguard Worker    'loadable_module': ConvertLoadableModule,
298*6777b538SAndroid Build Coastguard Worker    'package': ConvertPackage,
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker    # No need to build targets for these types yet.
301*6777b538SAndroid Build Coastguard Worker    'bind_library': ConvertNoOp,
302*6777b538SAndroid Build Coastguard Worker    'companion_host_tool': ConvertNoOp,
303*6777b538SAndroid Build Coastguard Worker    'component_manifest': ConvertNoOp,
304*6777b538SAndroid Build Coastguard Worker    'config': ConvertNoOp,
305*6777b538SAndroid Build Coastguard Worker    'dart_library': ConvertNoOp,
306*6777b538SAndroid Build Coastguard Worker    'data': ConvertNoOp,
307*6777b538SAndroid Build Coastguard Worker    'device_profile': ConvertNoOp,
308*6777b538SAndroid Build Coastguard Worker    'documentation': ConvertNoOp,
309*6777b538SAndroid Build Coastguard Worker    'ffx_tool': ConvertNoOp,
310*6777b538SAndroid Build Coastguard Worker    'host_tool': ConvertNoOp,
311*6777b538SAndroid Build Coastguard Worker    'image': ConvertNoOp,
312*6777b538SAndroid Build Coastguard Worker    'sysroot': ConvertNoOp,
313*6777b538SAndroid Build Coastguard Worker}
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Workerdef ConvertMeta(meta_path):
317*6777b538SAndroid Build Coastguard Worker  parsed = json.load(open(meta_path))
318*6777b538SAndroid Build Coastguard Worker  if 'type' not in parsed:
319*6777b538SAndroid Build Coastguard Worker    return
320*6777b538SAndroid Build Coastguard Worker
321*6777b538SAndroid Build Coastguard Worker  convert_function = _CONVERSION_FUNCTION_MAP.get(parsed['type'])
322*6777b538SAndroid Build Coastguard Worker  if convert_function is None:
323*6777b538SAndroid Build Coastguard Worker    logging.warning('Unexpected SDK artifact type %s in %s.' %
324*6777b538SAndroid Build Coastguard Worker                    (parsed['type'], meta_path))
325*6777b538SAndroid Build Coastguard Worker    return
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker  converted = convert_function(parsed)
328*6777b538SAndroid Build Coastguard Worker  if not converted:
329*6777b538SAndroid Build Coastguard Worker    return
330*6777b538SAndroid Build Coastguard Worker  output_path = os.path.join(os.path.dirname(meta_path), 'BUILD.gn')
331*6777b538SAndroid Build Coastguard Worker  if os.path.exists(output_path):
332*6777b538SAndroid Build Coastguard Worker    os.unlink(output_path)
333*6777b538SAndroid Build Coastguard Worker  with open(output_path, 'w') as buildfile:
334*6777b538SAndroid Build Coastguard Worker    buildfile.write(_GENERATED_PREAMBLE)
335*6777b538SAndroid Build Coastguard Worker
336*6777b538SAndroid Build Coastguard Worker    # Loadable modules have multiple targets
337*6777b538SAndroid Build Coastguard Worker    if convert_function != ConvertLoadableModule:
338*6777b538SAndroid Build Coastguard Worker      buildfile.write(FormatGNTarget(converted) + '\n\n')
339*6777b538SAndroid Build Coastguard Worker    else:
340*6777b538SAndroid Build Coastguard Worker      for target in converted:
341*6777b538SAndroid Build Coastguard Worker        buildfile.write(FormatGNTarget(target) + '\n\n')
342*6777b538SAndroid Build Coastguard Worker
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Workerdef ProcessSdkManifest():
345*6777b538SAndroid Build Coastguard Worker  toplevel_meta = json.load(
346*6777b538SAndroid Build Coastguard Worker      open(os.path.join(SDK_ROOT, 'meta', 'manifest.json')))
347*6777b538SAndroid Build Coastguard Worker
348*6777b538SAndroid Build Coastguard Worker  for part in toplevel_meta['parts']:
349*6777b538SAndroid Build Coastguard Worker    meta_path = os.path.join(SDK_ROOT, part['meta'])
350*6777b538SAndroid Build Coastguard Worker    ConvertMeta(meta_path)
351*6777b538SAndroid Build Coastguard Worker
352*6777b538SAndroid Build Coastguard Worker
353*6777b538SAndroid Build Coastguard Workerdef main():
354*6777b538SAndroid Build Coastguard Worker
355*6777b538SAndroid Build Coastguard Worker  # Exit if there's no Fuchsia support for this platform.
356*6777b538SAndroid Build Coastguard Worker  try:
357*6777b538SAndroid Build Coastguard Worker    get_host_os()
358*6777b538SAndroid Build Coastguard Worker  except:
359*6777b538SAndroid Build Coastguard Worker    logging.warning('Fuchsia SDK is not supported on this platform.')
360*6777b538SAndroid Build Coastguard Worker    return 0
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker  # TODO(crbug/1432399): Remove this when links to these files inside the sdk
363*6777b538SAndroid Build Coastguard Worker  # directory have been redirected.
364*6777b538SAndroid Build Coastguard Worker  build_path = os.path.join(SDK_ROOT, 'build')
365*6777b538SAndroid Build Coastguard Worker  os.makedirs(build_path, exist_ok=True)
366*6777b538SAndroid Build Coastguard Worker  for gn_file in ['component.gni', 'package.gni']:
367*6777b538SAndroid Build Coastguard Worker    open(os.path.join(build_path, gn_file),
368*6777b538SAndroid Build Coastguard Worker         "w").write("""# DO NOT EDIT! This file was generated by
369*6777b538SAndroid Build Coastguard Worker# //build/fuchsia/gen_build_def.py.
370*6777b538SAndroid Build Coastguard Worker# Any changes made to this file will be discarded.
371*6777b538SAndroid Build Coastguard Worker
372*6777b538SAndroid Build Coastguard Workerimport("/%s/%s")
373*6777b538SAndroid Build Coastguard Worker      """ % (GN_SDK_GN_ROOT, gn_file))
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Worker  ProcessSdkManifest()
376*6777b538SAndroid Build Coastguard Worker
377*6777b538SAndroid Build Coastguard Worker
378*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
379*6777b538SAndroid Build Coastguard Worker  sys.exit(main())
380