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