1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*90c8c64dSAndroid Build Coastguard Worker# 3*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 4*90c8c64dSAndroid Build Coastguard Worker# 5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*90c8c64dSAndroid Build Coastguard Worker# 9*90c8c64dSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*90c8c64dSAndroid Build Coastguard Worker# 11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License. 16*90c8c64dSAndroid Build Coastguard Worker# 17*90c8c64dSAndroid Build Coastguard Worker 18*90c8c64dSAndroid Build Coastguard Workerimport argparse 19*90c8c64dSAndroid Build Coastguard Workerfrom collections import defaultdict 20*90c8c64dSAndroid Build Coastguard Workerimport glob 21*90c8c64dSAndroid Build Coastguard Workerimport json 22*90c8c64dSAndroid Build Coastguard Workerimport logging 23*90c8c64dSAndroid Build Coastguard Workerimport os 24*90c8c64dSAndroid Build Coastguard Workerimport sys 25*90c8c64dSAndroid Build Coastguard Worker 26*90c8c64dSAndroid Build Coastguard Workerimport collect_licenses 27*90c8c64dSAndroid Build Coastguard Workerimport utils 28*90c8c64dSAndroid Build Coastguard Worker 29*90c8c64dSAndroid Build Coastguard Worker 30*90c8c64dSAndroid Build Coastguard Workerclass GenBuildFile(object): 31*90c8c64dSAndroid Build Coastguard Worker """Generates Android.bp for VNDK snapshot. 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Worker VNDK snapshot directory structure under prebuilts/vndk/v{version}: 34*90c8c64dSAndroid Build Coastguard Worker Android.bp 35*90c8c64dSAndroid Build Coastguard Worker {SNAPSHOT_ARCH}/ 36*90c8c64dSAndroid Build Coastguard Worker Android.bp 37*90c8c64dSAndroid Build Coastguard Worker arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/ 38*90c8c64dSAndroid Build Coastguard Worker shared/ 39*90c8c64dSAndroid Build Coastguard Worker vndk-core/ 40*90c8c64dSAndroid Build Coastguard Worker (VNDK-core libraries, e.g. libbinder.so) 41*90c8c64dSAndroid Build Coastguard Worker vndk-sp/ 42*90c8c64dSAndroid Build Coastguard Worker (VNDK-SP libraries, e.g. libc++.so) 43*90c8c64dSAndroid Build Coastguard Worker arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/ 44*90c8c64dSAndroid Build Coastguard Worker shared/ 45*90c8c64dSAndroid Build Coastguard Worker vndk-core/ 46*90c8c64dSAndroid Build Coastguard Worker (VNDK-core libraries, e.g. libbinder.so) 47*90c8c64dSAndroid Build Coastguard Worker vndk-sp/ 48*90c8c64dSAndroid Build Coastguard Worker (VNDK-SP libraries, e.g. libc++.so) 49*90c8c64dSAndroid Build Coastguard Worker binder32/ 50*90c8c64dSAndroid Build Coastguard Worker (This directory is newly introduced in v28 (Android P) to hold 51*90c8c64dSAndroid Build Coastguard Worker prebuilts built for 32-bit binder interface.) 52*90c8c64dSAndroid Build Coastguard Worker Android.bp 53*90c8c64dSAndroid Build Coastguard Worker arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/ 54*90c8c64dSAndroid Build Coastguard Worker ... 55*90c8c64dSAndroid Build Coastguard Worker configs/ 56*90c8c64dSAndroid Build Coastguard Worker (various *.txt configuration files, e.g. ld.config.*.txt) 57*90c8c64dSAndroid Build Coastguard Worker ... (other {SNAPSHOT_ARCH}/ directories) 58*90c8c64dSAndroid Build Coastguard Worker common/ 59*90c8c64dSAndroid Build Coastguard Worker Android.bp 60*90c8c64dSAndroid Build Coastguard Worker NOTICE_FILES/ 61*90c8c64dSAndroid Build Coastguard Worker (license files, e.g. libfoo.so.txt) 62*90c8c64dSAndroid Build Coastguard Worker """ 63*90c8c64dSAndroid Build Coastguard Worker INDENT = ' ' 64*90c8c64dSAndroid Build Coastguard Worker ETC_MODULES = [ 65*90c8c64dSAndroid Build Coastguard Worker 'llndk.libraries.txt', 66*90c8c64dSAndroid Build Coastguard Worker 'vndksp.libraries.txt', 67*90c8c64dSAndroid Build Coastguard Worker 'vndkcore.libraries.txt', 68*90c8c64dSAndroid Build Coastguard Worker 'vndkprivate.libraries.txt', 69*90c8c64dSAndroid Build Coastguard Worker 'vndkproduct.libraries.txt', 70*90c8c64dSAndroid Build Coastguard Worker ] 71*90c8c64dSAndroid Build Coastguard Worker 72*90c8c64dSAndroid Build Coastguard Worker def __init__(self, install_dir, vndk_version): 73*90c8c64dSAndroid Build Coastguard Worker """GenBuildFile constructor. 74*90c8c64dSAndroid Build Coastguard Worker 75*90c8c64dSAndroid Build Coastguard Worker Args: 76*90c8c64dSAndroid Build Coastguard Worker install_dir: string, absolute path to the prebuilts/vndk/v{version} 77*90c8c64dSAndroid Build Coastguard Worker directory where the build files will be generated. 78*90c8c64dSAndroid Build Coastguard Worker vndk_version: int, VNDK snapshot version (e.g. 30) 79*90c8c64dSAndroid Build Coastguard Worker """ 80*90c8c64dSAndroid Build Coastguard Worker self._install_dir = install_dir 81*90c8c64dSAndroid Build Coastguard Worker self._vndk_version = vndk_version 82*90c8c64dSAndroid Build Coastguard Worker self._etc_paths = self._get_etc_paths() 83*90c8c64dSAndroid Build Coastguard Worker self._snapshot_archs = utils.get_snapshot_archs(install_dir) 84*90c8c64dSAndroid Build Coastguard Worker self._root_bpfile = os.path.join(install_dir, utils.ROOT_BP_PATH) 85*90c8c64dSAndroid Build Coastguard Worker self._common_bpfile = os.path.join(install_dir, utils.COMMON_BP_PATH) 86*90c8c64dSAndroid Build Coastguard Worker self._llndk = self._parse_lib_list( 87*90c8c64dSAndroid Build Coastguard Worker os.path.basename(self._etc_paths['llndk.libraries.txt'])) 88*90c8c64dSAndroid Build Coastguard Worker self._vndk_core = self._parse_lib_list( 89*90c8c64dSAndroid Build Coastguard Worker os.path.basename(self._etc_paths['vndkcore.libraries.txt'])) 90*90c8c64dSAndroid Build Coastguard Worker self._vndk_sp = self._parse_lib_list( 91*90c8c64dSAndroid Build Coastguard Worker os.path.basename(self._etc_paths['vndksp.libraries.txt'])) 92*90c8c64dSAndroid Build Coastguard Worker self._vndk_private = self._parse_lib_list( 93*90c8c64dSAndroid Build Coastguard Worker os.path.basename(self._etc_paths['vndkprivate.libraries.txt'])) 94*90c8c64dSAndroid Build Coastguard Worker self._vndk_product = self._parse_lib_list( 95*90c8c64dSAndroid Build Coastguard Worker os.path.basename(self._etc_paths['vndkproduct.libraries.txt'])) 96*90c8c64dSAndroid Build Coastguard Worker self._modules_with_notice = self._get_modules_with_notice() 97*90c8c64dSAndroid Build Coastguard Worker self._license_in_json = not self._modules_with_notice 98*90c8c64dSAndroid Build Coastguard Worker self._license_kinds_map = defaultdict(set) 99*90c8c64dSAndroid Build Coastguard Worker self._license_texts_map = defaultdict(set) 100*90c8c64dSAndroid Build Coastguard Worker self.modules_with_restricted_lic = set() 101*90c8c64dSAndroid Build Coastguard Worker 102*90c8c64dSAndroid Build Coastguard Worker def _get_etc_paths(self): 103*90c8c64dSAndroid Build Coastguard Worker """Returns a map of relative file paths for each ETC module.""" 104*90c8c64dSAndroid Build Coastguard Worker 105*90c8c64dSAndroid Build Coastguard Worker etc_paths = dict() 106*90c8c64dSAndroid Build Coastguard Worker for etc_module in self.ETC_MODULES: 107*90c8c64dSAndroid Build Coastguard Worker etc_pattern = '{}*'.format(os.path.splitext(etc_module)[0]) 108*90c8c64dSAndroid Build Coastguard Worker globbed = glob.glob( 109*90c8c64dSAndroid Build Coastguard Worker os.path.join(self._install_dir, utils.CONFIG_DIR_PATH_PATTERN, 110*90c8c64dSAndroid Build Coastguard Worker etc_pattern)) 111*90c8c64dSAndroid Build Coastguard Worker if len(globbed) > 0: 112*90c8c64dSAndroid Build Coastguard Worker rel_etc_path = globbed[0].replace(self._install_dir, '')[1:] 113*90c8c64dSAndroid Build Coastguard Worker etc_paths[etc_module] = rel_etc_path 114*90c8c64dSAndroid Build Coastguard Worker return etc_paths 115*90c8c64dSAndroid Build Coastguard Worker 116*90c8c64dSAndroid Build Coastguard Worker def _parse_lib_list(self, txt_filename): 117*90c8c64dSAndroid Build Coastguard Worker """Returns a map of VNDK library lists per VNDK snapshot arch. 118*90c8c64dSAndroid Build Coastguard Worker 119*90c8c64dSAndroid Build Coastguard Worker Args: 120*90c8c64dSAndroid Build Coastguard Worker txt_filename: string, name of snapshot config file 121*90c8c64dSAndroid Build Coastguard Worker 122*90c8c64dSAndroid Build Coastguard Worker Returns: 123*90c8c64dSAndroid Build Coastguard Worker dict, e.g. {'arm64': ['libfoo.so', 'libbar.so', ...], ...} 124*90c8c64dSAndroid Build Coastguard Worker """ 125*90c8c64dSAndroid Build Coastguard Worker lib_map = dict() 126*90c8c64dSAndroid Build Coastguard Worker for txt_path in utils.find(self._install_dir, [txt_filename]): 127*90c8c64dSAndroid Build Coastguard Worker arch = utils.snapshot_arch_from_path(txt_path) 128*90c8c64dSAndroid Build Coastguard Worker abs_path_of_txt = os.path.join(self._install_dir, txt_path) 129*90c8c64dSAndroid Build Coastguard Worker with open(abs_path_of_txt, 'r') as f: 130*90c8c64dSAndroid Build Coastguard Worker lib_map[arch] = f.read().strip().split('\n') 131*90c8c64dSAndroid Build Coastguard Worker if lib_map[arch] == ['']: 132*90c8c64dSAndroid Build Coastguard Worker lib_map[arch].clear() 133*90c8c64dSAndroid Build Coastguard Worker return lib_map 134*90c8c64dSAndroid Build Coastguard Worker 135*90c8c64dSAndroid Build Coastguard Worker def _get_modules_with_notice(self): 136*90c8c64dSAndroid Build Coastguard Worker """Returns a list of modules that have associated notice files. """ 137*90c8c64dSAndroid Build Coastguard Worker notice_paths = glob.glob( 138*90c8c64dSAndroid Build Coastguard Worker os.path.join(self._install_dir, utils.NOTICE_FILES_DIR_PATH, 139*90c8c64dSAndroid Build Coastguard Worker '*.txt')) 140*90c8c64dSAndroid Build Coastguard Worker return sorted(os.path.splitext(os.path.basename(p))[0] for p in notice_paths) 141*90c8c64dSAndroid Build Coastguard Worker 142*90c8c64dSAndroid Build Coastguard Worker def generate_root_android_bp(self): 143*90c8c64dSAndroid Build Coastguard Worker """Autogenerates Android.bp.""" 144*90c8c64dSAndroid Build Coastguard Worker 145*90c8c64dSAndroid Build Coastguard Worker logging.info('Generating Android.bp for snapshot v{}'.format( 146*90c8c64dSAndroid Build Coastguard Worker self._vndk_version)) 147*90c8c64dSAndroid Build Coastguard Worker prebuilt_buildrules = [] 148*90c8c64dSAndroid Build Coastguard Worker for prebuilt in self.ETC_MODULES: 149*90c8c64dSAndroid Build Coastguard Worker prebuilt_buildrules.append(self._gen_etc_prebuilt(prebuilt)) 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker with open(self._root_bpfile, 'w') as bpfile: 152*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_autogen_msg('/')) 153*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 154*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_license_package()) 155*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 156*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_license()) 157*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 158*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n'.join(prebuilt_buildrules)) 159*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 160*90c8c64dSAndroid Build Coastguard Worker 161*90c8c64dSAndroid Build Coastguard Worker logging.info('Successfully generated {}'.format(self._root_bpfile)) 162*90c8c64dSAndroid Build Coastguard Worker 163*90c8c64dSAndroid Build Coastguard Worker def generate_common_android_bp(self): 164*90c8c64dSAndroid Build Coastguard Worker """Autogenerates common/Android.bp.""" 165*90c8c64dSAndroid Build Coastguard Worker 166*90c8c64dSAndroid Build Coastguard Worker logging.info('Generating common/Android.bp for snapshot v{}'.format( 167*90c8c64dSAndroid Build Coastguard Worker self._vndk_version)) 168*90c8c64dSAndroid Build Coastguard Worker with open(self._common_bpfile, 'w') as bpfile: 169*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_autogen_msg('/')) 170*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 171*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_license_package()) 172*90c8c64dSAndroid Build Coastguard Worker if self._license_in_json: 173*90c8c64dSAndroid Build Coastguard Worker for name in self._license_kinds_map: 174*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 175*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_notice_license(name)) 176*90c8c64dSAndroid Build Coastguard Worker else: 177*90c8c64dSAndroid Build Coastguard Worker for module in self._modules_with_notice: 178*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 179*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_notice_license(module)) 180*90c8c64dSAndroid Build Coastguard Worker 181*90c8c64dSAndroid Build Coastguard Worker def generate_android_bp(self): 182*90c8c64dSAndroid Build Coastguard Worker """Autogenerates Android.bp.""" 183*90c8c64dSAndroid Build Coastguard Worker 184*90c8c64dSAndroid Build Coastguard Worker def gen_for_variant(arch, is_binder32=False): 185*90c8c64dSAndroid Build Coastguard Worker """Generates Android.bp file for specified VNDK snapshot variant. 186*90c8c64dSAndroid Build Coastguard Worker 187*90c8c64dSAndroid Build Coastguard Worker A VNDK snapshot variant is defined by the TARGET_ARCH and binder 188*90c8c64dSAndroid Build Coastguard Worker bitness. Example snapshot variants: 189*90c8c64dSAndroid Build Coastguard Worker vndk_v{ver}_arm: {arch: arm, binder: 64-bit} 190*90c8c64dSAndroid Build Coastguard Worker vndk_v{ver}_arm_binder32: {arch: arm, binder: 32-bit} 191*90c8c64dSAndroid Build Coastguard Worker 192*90c8c64dSAndroid Build Coastguard Worker Args: 193*90c8c64dSAndroid Build Coastguard Worker arch: string, VNDK snapshot arch (e.g. 'arm64') 194*90c8c64dSAndroid Build Coastguard Worker is_binder32: bool, True if binder interface is 32-bit 195*90c8c64dSAndroid Build Coastguard Worker """ 196*90c8c64dSAndroid Build Coastguard Worker binder32_suffix = '_{}'.format( 197*90c8c64dSAndroid Build Coastguard Worker utils.BINDER32) if is_binder32 else '' 198*90c8c64dSAndroid Build Coastguard Worker logging.info('Generating Android.bp for vndk_v{}_{}{}'.format( 199*90c8c64dSAndroid Build Coastguard Worker self._vndk_version, arch, binder32_suffix)) 200*90c8c64dSAndroid Build Coastguard Worker 201*90c8c64dSAndroid Build Coastguard Worker src_root = os.path.join(self._install_dir, arch) 202*90c8c64dSAndroid Build Coastguard Worker module_names_txt = os.path.join( 203*90c8c64dSAndroid Build Coastguard Worker src_root, "configs", "module_names.txt") 204*90c8c64dSAndroid Build Coastguard Worker module_names = dict() 205*90c8c64dSAndroid Build Coastguard Worker try: 206*90c8c64dSAndroid Build Coastguard Worker with open(module_names_txt, 'r') as f: 207*90c8c64dSAndroid Build Coastguard Worker # Remove empty lines from module_names_txt 208*90c8c64dSAndroid Build Coastguard Worker module_list = filter(None, f.read().split('\n')) 209*90c8c64dSAndroid Build Coastguard Worker for module in module_list: 210*90c8c64dSAndroid Build Coastguard Worker lib, name = module.split(' ') 211*90c8c64dSAndroid Build Coastguard Worker module_names[lib] = name 212*90c8c64dSAndroid Build Coastguard Worker except IOError: 213*90c8c64dSAndroid Build Coastguard Worker # If module_names.txt doesn't exist, ignore it and parse 214*90c8c64dSAndroid Build Coastguard Worker # module names out from .so filenames. (old snapshot) 215*90c8c64dSAndroid Build Coastguard Worker pass 216*90c8c64dSAndroid Build Coastguard Worker 217*90c8c64dSAndroid Build Coastguard Worker variant_subpath = arch 218*90c8c64dSAndroid Build Coastguard Worker if is_binder32: 219*90c8c64dSAndroid Build Coastguard Worker variant_subpath = os.path.join(arch, utils.BINDER32) 220*90c8c64dSAndroid Build Coastguard Worker variant_path = os.path.join(self._install_dir, variant_subpath) 221*90c8c64dSAndroid Build Coastguard Worker bpfile_path = os.path.join(variant_path, 'Android.bp') 222*90c8c64dSAndroid Build Coastguard Worker 223*90c8c64dSAndroid Build Coastguard Worker vndk_core_buildrules = self._gen_vndk_shared_prebuilts( 224*90c8c64dSAndroid Build Coastguard Worker self._vndk_core[arch], 225*90c8c64dSAndroid Build Coastguard Worker arch, 226*90c8c64dSAndroid Build Coastguard Worker is_llndk=False, 227*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp=False, 228*90c8c64dSAndroid Build Coastguard Worker is_binder32=is_binder32, 229*90c8c64dSAndroid Build Coastguard Worker module_names=module_names) 230*90c8c64dSAndroid Build Coastguard Worker vndk_sp_buildrules = self._gen_vndk_shared_prebuilts( 231*90c8c64dSAndroid Build Coastguard Worker self._vndk_sp[arch], 232*90c8c64dSAndroid Build Coastguard Worker arch, 233*90c8c64dSAndroid Build Coastguard Worker is_llndk=False, 234*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp=True, 235*90c8c64dSAndroid Build Coastguard Worker is_binder32=is_binder32, 236*90c8c64dSAndroid Build Coastguard Worker module_names=module_names) 237*90c8c64dSAndroid Build Coastguard Worker include_llndk = self._vndk_version > 30 238*90c8c64dSAndroid Build Coastguard Worker if include_llndk: 239*90c8c64dSAndroid Build Coastguard Worker llndk_buildrules = self._gen_vndk_shared_prebuilts( 240*90c8c64dSAndroid Build Coastguard Worker self._llndk[arch], 241*90c8c64dSAndroid Build Coastguard Worker arch, 242*90c8c64dSAndroid Build Coastguard Worker is_llndk=True, 243*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp=False, 244*90c8c64dSAndroid Build Coastguard Worker is_binder32=is_binder32, 245*90c8c64dSAndroid Build Coastguard Worker module_names=module_names) 246*90c8c64dSAndroid Build Coastguard Worker 247*90c8c64dSAndroid Build Coastguard Worker with open(bpfile_path, 'w') as bpfile: 248*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_autogen_msg('/')) 249*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 250*90c8c64dSAndroid Build Coastguard Worker bpfile.write(self._gen_license_package()) 251*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 252*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n'.join(vndk_core_buildrules)) 253*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 254*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n'.join(vndk_sp_buildrules)) 255*90c8c64dSAndroid Build Coastguard Worker if include_llndk: 256*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n') 257*90c8c64dSAndroid Build Coastguard Worker bpfile.write('\n'.join(llndk_buildrules)) 258*90c8c64dSAndroid Build Coastguard Worker 259*90c8c64dSAndroid Build Coastguard Worker variant_include_path = os.path.join(variant_path, 'include') 260*90c8c64dSAndroid Build Coastguard Worker include_path = os.path.join(self._install_dir, arch, 'include') 261*90c8c64dSAndroid Build Coastguard Worker if os.path.isdir(include_path) and variant_include_path != include_path: 262*90c8c64dSAndroid Build Coastguard Worker os.symlink(os.path.relpath(include_path, variant_path), 263*90c8c64dSAndroid Build Coastguard Worker variant_include_path) 264*90c8c64dSAndroid Build Coastguard Worker 265*90c8c64dSAndroid Build Coastguard Worker logging.info('Successfully generated {}'.format(bpfile_path)) 266*90c8c64dSAndroid Build Coastguard Worker 267*90c8c64dSAndroid Build Coastguard Worker for arch in self._snapshot_archs: 268*90c8c64dSAndroid Build Coastguard Worker if os.path.isdir( 269*90c8c64dSAndroid Build Coastguard Worker os.path.join(self._install_dir, arch, utils.BINDER32)): 270*90c8c64dSAndroid Build Coastguard Worker gen_for_variant(arch, is_binder32=True) 271*90c8c64dSAndroid Build Coastguard Worker gen_for_variant(arch) 272*90c8c64dSAndroid Build Coastguard Worker 273*90c8c64dSAndroid Build Coastguard Worker def _gen_autogen_msg(self, comment_char): 274*90c8c64dSAndroid Build Coastguard Worker return ('{0}{0} THIS FILE IS AUTOGENERATED BY ' 275*90c8c64dSAndroid Build Coastguard Worker 'development/vndk/snapshot/gen_buildfiles.py\n' 276*90c8c64dSAndroid Build Coastguard Worker '{0}{0} DO NOT EDIT\n'.format(comment_char)) 277*90c8c64dSAndroid Build Coastguard Worker 278*90c8c64dSAndroid Build Coastguard Worker def _gen_license_package(self): 279*90c8c64dSAndroid Build Coastguard Worker """ Generates license package for VNDK snapshot libs """ 280*90c8c64dSAndroid Build Coastguard Worker return ('package {{\n' 281*90c8c64dSAndroid Build Coastguard Worker '{ind}default_applicable_licenses: ["prebuilts_vndk_v{version}_license"],\n' 282*90c8c64dSAndroid Build Coastguard Worker '}}\n'.format( 283*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 284*90c8c64dSAndroid Build Coastguard Worker version=self._vndk_version)) 285*90c8c64dSAndroid Build Coastguard Worker 286*90c8c64dSAndroid Build Coastguard Worker def _get_license_kinds(self, module=''): 287*90c8c64dSAndroid Build Coastguard Worker """ Returns a set of license kinds 288*90c8c64dSAndroid Build Coastguard Worker 289*90c8c64dSAndroid Build Coastguard Worker Args: 290*90c8c64dSAndroid Build Coastguard Worker module: module name to find the license kind. 291*90c8c64dSAndroid Build Coastguard Worker If empty, check all license files. 292*90c8c64dSAndroid Build Coastguard Worker """ 293*90c8c64dSAndroid Build Coastguard Worker if self._license_in_json: 294*90c8c64dSAndroid Build Coastguard Worker license_kinds = set() 295*90c8c64dSAndroid Build Coastguard Worker if module == '': 296*90c8c64dSAndroid Build Coastguard Worker # collect all license kinds 297*90c8c64dSAndroid Build Coastguard Worker for kinds in self._license_kinds_map.values(): 298*90c8c64dSAndroid Build Coastguard Worker license_kinds.update(kinds) 299*90c8c64dSAndroid Build Coastguard Worker return license_kinds 300*90c8c64dSAndroid Build Coastguard Worker else: 301*90c8c64dSAndroid Build Coastguard Worker return self._license_kinds_map[module] 302*90c8c64dSAndroid Build Coastguard Worker 303*90c8c64dSAndroid Build Coastguard Worker license_collector = collect_licenses.LicenseCollector(self._install_dir) 304*90c8c64dSAndroid Build Coastguard Worker license_collector.run(module) 305*90c8c64dSAndroid Build Coastguard Worker return license_collector.license_kinds 306*90c8c64dSAndroid Build Coastguard Worker 307*90c8c64dSAndroid Build Coastguard Worker def _get_license_texts(self, module): 308*90c8c64dSAndroid Build Coastguard Worker if self._license_in_json: 309*90c8c64dSAndroid Build Coastguard Worker return {'{notice_dir}/{license_text}'.format( 310*90c8c64dSAndroid Build Coastguard Worker notice_dir=utils.NOTICE_FILES_DIR_NAME, 311*90c8c64dSAndroid Build Coastguard Worker license_text=license_text) 312*90c8c64dSAndroid Build Coastguard Worker for license_text in self._license_texts_map[module]} 313*90c8c64dSAndroid Build Coastguard Worker else: 314*90c8c64dSAndroid Build Coastguard Worker return {'{notice_dir}/{module}.txt'.format( 315*90c8c64dSAndroid Build Coastguard Worker notice_dir=utils.NOTICE_FILES_DIR_NAME, 316*90c8c64dSAndroid Build Coastguard Worker module=module)} 317*90c8c64dSAndroid Build Coastguard Worker 318*90c8c64dSAndroid Build Coastguard Worker def _gen_license(self): 319*90c8c64dSAndroid Build Coastguard Worker """ Generates license module. 320*90c8c64dSAndroid Build Coastguard Worker 321*90c8c64dSAndroid Build Coastguard Worker It uses license files for all VNDK snapshot libraries in common/NOTICE_FILES directory. 322*90c8c64dSAndroid Build Coastguard Worker """ 323*90c8c64dSAndroid Build Coastguard Worker license_kinds = self._get_license_kinds() 324*90c8c64dSAndroid Build Coastguard Worker license_kinds_string = '' 325*90c8c64dSAndroid Build Coastguard Worker for license_kind in sorted(license_kinds): 326*90c8c64dSAndroid Build Coastguard Worker license_kinds_string += '{ind}{ind}"{license_kind}",\n'.format( 327*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, license_kind=license_kind) 328*90c8c64dSAndroid Build Coastguard Worker return ('license {{\n' 329*90c8c64dSAndroid Build Coastguard Worker '{ind}name: "prebuilts_vndk_v{version}_license",\n' 330*90c8c64dSAndroid Build Coastguard Worker '{ind}visibility: [":__subpackages__"],\n' 331*90c8c64dSAndroid Build Coastguard Worker '{ind}license_kinds: [\n' 332*90c8c64dSAndroid Build Coastguard Worker '{license_kinds}' 333*90c8c64dSAndroid Build Coastguard Worker '{ind}],\n' 334*90c8c64dSAndroid Build Coastguard Worker '{ind}license_text: ["{notice_files}"],\n' 335*90c8c64dSAndroid Build Coastguard Worker '}}\n'.format( 336*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 337*90c8c64dSAndroid Build Coastguard Worker version=self._vndk_version, 338*90c8c64dSAndroid Build Coastguard Worker license_kinds=license_kinds_string, 339*90c8c64dSAndroid Build Coastguard Worker notice_files=os.path.join(utils.NOTICE_FILES_DIR_PATH, '**', '*'))) 340*90c8c64dSAndroid Build Coastguard Worker 341*90c8c64dSAndroid Build Coastguard Worker def _get_versioned_name(self, 342*90c8c64dSAndroid Build Coastguard Worker prebuilt, 343*90c8c64dSAndroid Build Coastguard Worker arch, 344*90c8c64dSAndroid Build Coastguard Worker is_etc=False, 345*90c8c64dSAndroid Build Coastguard Worker is_binder32=False, 346*90c8c64dSAndroid Build Coastguard Worker module_names=None): 347*90c8c64dSAndroid Build Coastguard Worker """Returns the VNDK version-specific module name for a given prebuilt. 348*90c8c64dSAndroid Build Coastguard Worker 349*90c8c64dSAndroid Build Coastguard Worker The VNDK version-specific module name is defined as follows: 350*90c8c64dSAndroid Build Coastguard Worker For a VNDK shared lib: 'libfoo.so' 351*90c8c64dSAndroid Build Coastguard Worker if binder is 32-bit: 352*90c8c64dSAndroid Build Coastguard Worker 'libfoo.vndk.{version}.{arch}.binder32.vendor' 353*90c8c64dSAndroid Build Coastguard Worker else: 354*90c8c64dSAndroid Build Coastguard Worker 'libfoo.vndk.{version}.{arch}.vendor' 355*90c8c64dSAndroid Build Coastguard Worker For an ETC module: 'foo.txt' -> 'foo.{version}.txt' 356*90c8c64dSAndroid Build Coastguard Worker 357*90c8c64dSAndroid Build Coastguard Worker Args: 358*90c8c64dSAndroid Build Coastguard Worker prebuilt: string, name of the prebuilt object 359*90c8c64dSAndroid Build Coastguard Worker arch: string, VNDK snapshot arch (e.g. 'arm64') 360*90c8c64dSAndroid Build Coastguard Worker is_etc: bool, True if the LOCAL_MODULE_CLASS of prebuilt is 'ETC' 361*90c8c64dSAndroid Build Coastguard Worker is_binder32: bool, True if binder interface is 32-bit 362*90c8c64dSAndroid Build Coastguard Worker module_names: dict, module names for given prebuilts 363*90c8c64dSAndroid Build Coastguard Worker """ 364*90c8c64dSAndroid Build Coastguard Worker if is_etc: 365*90c8c64dSAndroid Build Coastguard Worker name, ext = os.path.splitext(prebuilt) 366*90c8c64dSAndroid Build Coastguard Worker versioned_name = '{}.{}{}'.format(name, self._vndk_version, ext) 367*90c8c64dSAndroid Build Coastguard Worker else: 368*90c8c64dSAndroid Build Coastguard Worker module_names = module_names or dict() 369*90c8c64dSAndroid Build Coastguard Worker if prebuilt in module_names: 370*90c8c64dSAndroid Build Coastguard Worker name = module_names[prebuilt] 371*90c8c64dSAndroid Build Coastguard Worker else: 372*90c8c64dSAndroid Build Coastguard Worker name = os.path.splitext(prebuilt)[0] 373*90c8c64dSAndroid Build Coastguard Worker binder_suffix = '.{}'.format(utils.BINDER32) if is_binder32 else '' 374*90c8c64dSAndroid Build Coastguard Worker versioned_name = '{}.vndk.{}.{}{}.vendor'.format( 375*90c8c64dSAndroid Build Coastguard Worker name, self._vndk_version, arch, binder_suffix) 376*90c8c64dSAndroid Build Coastguard Worker 377*90c8c64dSAndroid Build Coastguard Worker return versioned_name 378*90c8c64dSAndroid Build Coastguard Worker 379*90c8c64dSAndroid Build Coastguard Worker def _gen_etc_prebuilt(self, prebuilt): 380*90c8c64dSAndroid Build Coastguard Worker """Generates build rule for an ETC prebuilt. 381*90c8c64dSAndroid Build Coastguard Worker 382*90c8c64dSAndroid Build Coastguard Worker Args: 383*90c8c64dSAndroid Build Coastguard Worker prebuilt: string, name of ETC prebuilt object 384*90c8c64dSAndroid Build Coastguard Worker """ 385*90c8c64dSAndroid Build Coastguard Worker etc_path = self._etc_paths[prebuilt] 386*90c8c64dSAndroid Build Coastguard Worker etc_sub_path = etc_path[etc_path.index('/') + 1:] 387*90c8c64dSAndroid Build Coastguard Worker 388*90c8c64dSAndroid Build Coastguard Worker prebuilt_etc = ('prebuilt_etc {{\n' 389*90c8c64dSAndroid Build Coastguard Worker '{ind}name: "{versioned_name}",\n' 390*90c8c64dSAndroid Build Coastguard Worker '{ind}target: {{\n'.format( 391*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 392*90c8c64dSAndroid Build Coastguard Worker versioned_name=self._get_versioned_name( 393*90c8c64dSAndroid Build Coastguard Worker prebuilt, None, is_etc=True))) 394*90c8c64dSAndroid Build Coastguard Worker for arch in self._snapshot_archs: 395*90c8c64dSAndroid Build Coastguard Worker prebuilt_etc += ('{ind}{ind}android_{arch}: {{\n' 396*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}{ind}src: "{arch}/{etc_sub_path}",\n' 397*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}}},\n'.format( 398*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 399*90c8c64dSAndroid Build Coastguard Worker arch=arch, 400*90c8c64dSAndroid Build Coastguard Worker etc_sub_path=etc_sub_path)) 401*90c8c64dSAndroid Build Coastguard Worker prebuilt_etc += ('{ind}}},\n' 402*90c8c64dSAndroid Build Coastguard Worker '}}\n'.format(ind=self.INDENT)) 403*90c8c64dSAndroid Build Coastguard Worker return prebuilt_etc 404*90c8c64dSAndroid Build Coastguard Worker 405*90c8c64dSAndroid Build Coastguard Worker def _gen_prebuilt_library_shared(self, prebuilt_lib_info): 406*90c8c64dSAndroid Build Coastguard Worker """Generates cc_prebuilt_library_shared modules for the old vendor 407*90c8c64dSAndroid Build Coastguard Worker compatibility. 408*90c8c64dSAndroid Build Coastguard Worker 409*90c8c64dSAndroid Build Coastguard Worker Some vendor modules still require old version of libraries that is not 410*90c8c64dSAndroid Build Coastguard Worker available from the current source tree. To provide the old copy of the 411*90c8c64dSAndroid Build Coastguard Worker libraries, use the vndk snapshot. 412*90c8c64dSAndroid Build Coastguard Worker 413*90c8c64dSAndroid Build Coastguard Worker Args: 414*90c8c64dSAndroid Build Coastguard Worker prebuilt_lib_info: pair of (string, list of strings), name of the 415*90c8c64dSAndroid Build Coastguard Worker prebuilt library and the list of shared libs for it. 416*90c8c64dSAndroid Build Coastguard Worker """ 417*90c8c64dSAndroid Build Coastguard Worker lib_name = prebuilt_lib_info[0] 418*90c8c64dSAndroid Build Coastguard Worker shared_libs = prebuilt_lib_info[1] 419*90c8c64dSAndroid Build Coastguard Worker 420*90c8c64dSAndroid Build Coastguard Worker shared_libs_prop = '' 421*90c8c64dSAndroid Build Coastguard Worker if shared_libs: 422*90c8c64dSAndroid Build Coastguard Worker shared_libs_prop = ('{ind}shared_libs: [\n'.format(ind=self.INDENT)) 423*90c8c64dSAndroid Build Coastguard Worker for lib in shared_libs: 424*90c8c64dSAndroid Build Coastguard Worker shared_libs_prop += ('{ind}{ind}"{lib}",\n'.format( 425*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, lib=lib)) 426*90c8c64dSAndroid Build Coastguard Worker shared_libs_prop += ('{ind}],\n'.format(ind=self.INDENT)) 427*90c8c64dSAndroid Build Coastguard Worker 428*90c8c64dSAndroid Build Coastguard Worker cc_prebuilt_libraries = ('cc_prebuilt_library_shared {{\n' 429*90c8c64dSAndroid Build Coastguard Worker '{ind}name: "{name}-vendorcompat",\n' 430*90c8c64dSAndroid Build Coastguard Worker '{ind}stem: "{name}",\n' 431*90c8c64dSAndroid Build Coastguard Worker '{ind}vendor: true,\n' 432*90c8c64dSAndroid Build Coastguard Worker '{ind}// These are already stripped, and ' 433*90c8c64dSAndroid Build Coastguard Worker 'restripping them just issues diagnostics.\n' 434*90c8c64dSAndroid Build Coastguard Worker '{ind}strip: {{\n' 435*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}none: true,\n' 436*90c8c64dSAndroid Build Coastguard Worker '{ind}}},\n' 437*90c8c64dSAndroid Build Coastguard Worker '{shared_libs}' 438*90c8c64dSAndroid Build Coastguard Worker '{ind}target: {{\n'.format( 439*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 440*90c8c64dSAndroid Build Coastguard Worker name=lib_name, 441*90c8c64dSAndroid Build Coastguard Worker shared_libs=shared_libs_prop)) 442*90c8c64dSAndroid Build Coastguard Worker src_paths = utils.find(self._install_dir, [lib_name+'.so']) 443*90c8c64dSAndroid Build Coastguard Worker for src in src_paths: 444*90c8c64dSAndroid Build Coastguard Worker dirs = src.split(os.path.sep) 445*90c8c64dSAndroid Build Coastguard Worker if len(dirs) < 3 or not dirs[1].startswith('arch-{}-'.format(dirs[0])): 446*90c8c64dSAndroid Build Coastguard Worker continue 447*90c8c64dSAndroid Build Coastguard Worker cc_prebuilt_libraries += ('{ind}{ind}android_{arch}: {{\n' 448*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}{ind}srcs: ["{src}"],\n' 449*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}}},\n'.format( 450*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, arch=dirs[0], src=src)) 451*90c8c64dSAndroid Build Coastguard Worker cc_prebuilt_libraries += ('{ind}}},\n' 452*90c8c64dSAndroid Build Coastguard Worker '}}\n'.format(ind=self.INDENT)) 453*90c8c64dSAndroid Build Coastguard Worker return cc_prebuilt_libraries 454*90c8c64dSAndroid Build Coastguard Worker 455*90c8c64dSAndroid Build Coastguard Worker def _gen_notice_license(self, module): 456*90c8c64dSAndroid Build Coastguard Worker """Generates a notice license build rule for a given module. 457*90c8c64dSAndroid Build Coastguard Worker When genererating each notice license, collect 458*90c8c64dSAndroid Build Coastguard Worker modules_with_restricted_lic, the list of modules that are under the GPL. 459*90c8c64dSAndroid Build Coastguard Worker 460*90c8c64dSAndroid Build Coastguard Worker Args: 461*90c8c64dSAndroid Build Coastguard Worker module: string, module name 462*90c8c64dSAndroid Build Coastguard Worker """ 463*90c8c64dSAndroid Build Coastguard Worker def has_restricted_license(license_kinds): 464*90c8c64dSAndroid Build Coastguard Worker for lic in license_kinds: 465*90c8c64dSAndroid Build Coastguard Worker if 'GPL' in lic: 466*90c8c64dSAndroid Build Coastguard Worker return True 467*90c8c64dSAndroid Build Coastguard Worker return False 468*90c8c64dSAndroid Build Coastguard Worker 469*90c8c64dSAndroid Build Coastguard Worker license_kinds = self._get_license_kinds(module) 470*90c8c64dSAndroid Build Coastguard Worker if has_restricted_license(license_kinds): 471*90c8c64dSAndroid Build Coastguard Worker self.modules_with_restricted_lic.add(module) 472*90c8c64dSAndroid Build Coastguard Worker license_kinds_string = '' 473*90c8c64dSAndroid Build Coastguard Worker for license_kind in sorted(license_kinds): 474*90c8c64dSAndroid Build Coastguard Worker license_kinds_string += '{ind}{ind}"{license_kind}",\n'.format( 475*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, license_kind=license_kind) 476*90c8c64dSAndroid Build Coastguard Worker license_texts = self._get_license_texts(module) 477*90c8c64dSAndroid Build Coastguard Worker license_texts_string = '' 478*90c8c64dSAndroid Build Coastguard Worker for license_text in sorted(license_texts): 479*90c8c64dSAndroid Build Coastguard Worker license_texts_string += '{ind}{ind}"{license_text}",\n'.format( 480*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, license_text=license_text) 481*90c8c64dSAndroid Build Coastguard Worker return ('license {{\n' 482*90c8c64dSAndroid Build Coastguard Worker '{ind}name: "{license_name}",\n' 483*90c8c64dSAndroid Build Coastguard Worker '{ind}license_kinds: [\n' 484*90c8c64dSAndroid Build Coastguard Worker '{license_kinds}' 485*90c8c64dSAndroid Build Coastguard Worker '{ind}],\n' 486*90c8c64dSAndroid Build Coastguard Worker '{ind}license_text: [\n' 487*90c8c64dSAndroid Build Coastguard Worker '{license_texts}' 488*90c8c64dSAndroid Build Coastguard Worker '{ind}],\n' 489*90c8c64dSAndroid Build Coastguard Worker '}}\n'.format( 490*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 491*90c8c64dSAndroid Build Coastguard Worker license_name=self._get_notice_license_name(module), 492*90c8c64dSAndroid Build Coastguard Worker license_kinds=license_kinds_string, 493*90c8c64dSAndroid Build Coastguard Worker license_texts=license_texts_string)) 494*90c8c64dSAndroid Build Coastguard Worker 495*90c8c64dSAndroid Build Coastguard Worker def _get_notice_license_name(self, module): 496*90c8c64dSAndroid Build Coastguard Worker """ Gets a notice license module name for a given module. 497*90c8c64dSAndroid Build Coastguard Worker 498*90c8c64dSAndroid Build Coastguard Worker Args: 499*90c8c64dSAndroid Build Coastguard Worker notice: string, module name. 500*90c8c64dSAndroid Build Coastguard Worker """ 501*90c8c64dSAndroid Build Coastguard Worker return 'vndk-v{ver}-{module}-license'.format( 502*90c8c64dSAndroid Build Coastguard Worker ver=self._vndk_version, module=module) 503*90c8c64dSAndroid Build Coastguard Worker 504*90c8c64dSAndroid Build Coastguard Worker def _gen_vndk_shared_prebuilts(self, 505*90c8c64dSAndroid Build Coastguard Worker prebuilts, 506*90c8c64dSAndroid Build Coastguard Worker arch, 507*90c8c64dSAndroid Build Coastguard Worker is_llndk, 508*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp, 509*90c8c64dSAndroid Build Coastguard Worker is_binder32, 510*90c8c64dSAndroid Build Coastguard Worker module_names): 511*90c8c64dSAndroid Build Coastguard Worker """Returns list of build rules for given prebuilts. 512*90c8c64dSAndroid Build Coastguard Worker 513*90c8c64dSAndroid Build Coastguard Worker Args: 514*90c8c64dSAndroid Build Coastguard Worker prebuilts: list of VNDK shared prebuilts 515*90c8c64dSAndroid Build Coastguard Worker arch: string, VNDK snapshot arch (e.g. 'arm64') 516*90c8c64dSAndroid Build Coastguard Worker is_llndk: bool, True if the prebuilts are LLNDK stubs 517*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp: bool, True if prebuilts are VNDK_SP libs 518*90c8c64dSAndroid Build Coastguard Worker is_binder32: bool, True if binder interface is 32-bit 519*90c8c64dSAndroid Build Coastguard Worker module_names: dict, module names for given prebuilts 520*90c8c64dSAndroid Build Coastguard Worker """ 521*90c8c64dSAndroid Build Coastguard Worker 522*90c8c64dSAndroid Build Coastguard Worker module_prebuilts = dict() 523*90c8c64dSAndroid Build Coastguard Worker for prebuilt in prebuilts: 524*90c8c64dSAndroid Build Coastguard Worker if prebuilt in module_names: 525*90c8c64dSAndroid Build Coastguard Worker name = module_names[prebuilt] 526*90c8c64dSAndroid Build Coastguard Worker else: 527*90c8c64dSAndroid Build Coastguard Worker name = os.path.splitext(prebuilt)[0] 528*90c8c64dSAndroid Build Coastguard Worker 529*90c8c64dSAndroid Build Coastguard Worker if name not in module_prebuilts: 530*90c8c64dSAndroid Build Coastguard Worker module_prebuilts[name] = list() 531*90c8c64dSAndroid Build Coastguard Worker module_prebuilts[name].append(prebuilt) 532*90c8c64dSAndroid Build Coastguard Worker 533*90c8c64dSAndroid Build Coastguard Worker build_rules = [] 534*90c8c64dSAndroid Build Coastguard Worker for name in module_prebuilts: 535*90c8c64dSAndroid Build Coastguard Worker bp_module = self._gen_vndk_shared_prebuilt( 536*90c8c64dSAndroid Build Coastguard Worker name, 537*90c8c64dSAndroid Build Coastguard Worker arch, 538*90c8c64dSAndroid Build Coastguard Worker srcs=module_prebuilts[name], 539*90c8c64dSAndroid Build Coastguard Worker is_llndk=is_llndk, 540*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp=is_vndk_sp, 541*90c8c64dSAndroid Build Coastguard Worker is_binder32=is_binder32) 542*90c8c64dSAndroid Build Coastguard Worker if bp_module: 543*90c8c64dSAndroid Build Coastguard Worker build_rules.append(bp_module) 544*90c8c64dSAndroid Build Coastguard Worker return build_rules 545*90c8c64dSAndroid Build Coastguard Worker 546*90c8c64dSAndroid Build Coastguard Worker def _gen_vndk_shared_prebuilt(self, 547*90c8c64dSAndroid Build Coastguard Worker name, 548*90c8c64dSAndroid Build Coastguard Worker arch, 549*90c8c64dSAndroid Build Coastguard Worker srcs, 550*90c8c64dSAndroid Build Coastguard Worker is_llndk, 551*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp, 552*90c8c64dSAndroid Build Coastguard Worker is_binder32): 553*90c8c64dSAndroid Build Coastguard Worker """Returns build rule for given prebuilt module, or an empty 554*90c8c64dSAndroid Build Coastguard Worker string if the module is invalid (e.g. srcs doesn't exist). 555*90c8c64dSAndroid Build Coastguard Worker 556*90c8c64dSAndroid Build Coastguard Worker Args: 557*90c8c64dSAndroid Build Coastguard Worker name: string, name of prebuilt module 558*90c8c64dSAndroid Build Coastguard Worker arch: string, VNDK snapshot arch (e.g. 'arm64') 559*90c8c64dSAndroid Build Coastguard Worker srcs: list, prebuilt source file names of this module 560*90c8c64dSAndroid Build Coastguard Worker is_llndk: bool, True if prebuilt is a LLNDK stub 561*90c8c64dSAndroid Build Coastguard Worker is_vndk_sp: bool, True if prebuilt is a VNDK_SP lib 562*90c8c64dSAndroid Build Coastguard Worker is_binder32: bool, True if binder interface is 32-bit 563*90c8c64dSAndroid Build Coastguard Worker """ 564*90c8c64dSAndroid Build Coastguard Worker 565*90c8c64dSAndroid Build Coastguard Worker def is_prebuilts_in_list(prebuilts, vndk_list): 566*90c8c64dSAndroid Build Coastguard Worker for prebuilt in prebuilts: 567*90c8c64dSAndroid Build Coastguard Worker if prebuilt in vndk_list: 568*90c8c64dSAndroid Build Coastguard Worker return True 569*90c8c64dSAndroid Build Coastguard Worker return False 570*90c8c64dSAndroid Build Coastguard Worker 571*90c8c64dSAndroid Build Coastguard Worker def get_license_prop(name): 572*90c8c64dSAndroid Build Coastguard Worker """Returns the license prop build rule. 573*90c8c64dSAndroid Build Coastguard Worker 574*90c8c64dSAndroid Build Coastguard Worker Args: 575*90c8c64dSAndroid Build Coastguard Worker name: string, name of the module 576*90c8c64dSAndroid Build Coastguard Worker """ 577*90c8c64dSAndroid Build Coastguard Worker if name in self._license_kinds_map: 578*90c8c64dSAndroid Build Coastguard Worker return '{ind}licenses: ["{license}"],\n'.format( 579*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 580*90c8c64dSAndroid Build Coastguard Worker license=self._get_notice_license_name(name)) 581*90c8c64dSAndroid Build Coastguard Worker return '' 582*90c8c64dSAndroid Build Coastguard Worker 583*90c8c64dSAndroid Build Coastguard Worker def get_notice_file(prebuilts): 584*90c8c64dSAndroid Build Coastguard Worker """Returns build rule for notice file (attribute 'licenses'). 585*90c8c64dSAndroid Build Coastguard Worker 586*90c8c64dSAndroid Build Coastguard Worker Args: 587*90c8c64dSAndroid Build Coastguard Worker prebuilts: list, names of prebuilt objects 588*90c8c64dSAndroid Build Coastguard Worker """ 589*90c8c64dSAndroid Build Coastguard Worker notice = '' 590*90c8c64dSAndroid Build Coastguard Worker for prebuilt in prebuilts: 591*90c8c64dSAndroid Build Coastguard Worker if prebuilt in self._modules_with_notice: 592*90c8c64dSAndroid Build Coastguard Worker notice = '{ind}licenses: ["{notice_license}"],\n'.format( 593*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 594*90c8c64dSAndroid Build Coastguard Worker notice_license=self._get_notice_license_name(prebuilt)) 595*90c8c64dSAndroid Build Coastguard Worker break 596*90c8c64dSAndroid Build Coastguard Worker return notice 597*90c8c64dSAndroid Build Coastguard Worker 598*90c8c64dSAndroid Build Coastguard Worker def get_arch_props(name, arch, srcs_props): 599*90c8c64dSAndroid Build Coastguard Worker """Returns build rule for arch specific srcs. 600*90c8c64dSAndroid Build Coastguard Worker 601*90c8c64dSAndroid Build Coastguard Worker e.g., 602*90c8c64dSAndroid Build Coastguard Worker arch: { 603*90c8c64dSAndroid Build Coastguard Worker arm: { 604*90c8c64dSAndroid Build Coastguard Worker export_include_dirs: ["..."], 605*90c8c64dSAndroid Build Coastguard Worker export_system_include_dirs: ["..."], 606*90c8c64dSAndroid Build Coastguard Worker export_flags: ["..."], 607*90c8c64dSAndroid Build Coastguard Worker relative_install_path: "...", 608*90c8c64dSAndroid Build Coastguard Worker srcs: ["..."] 609*90c8c64dSAndroid Build Coastguard Worker }, 610*90c8c64dSAndroid Build Coastguard Worker arm64: { 611*90c8c64dSAndroid Build Coastguard Worker export_include_dirs: ["..."], 612*90c8c64dSAndroid Build Coastguard Worker export_system_include_dirs: ["..."], 613*90c8c64dSAndroid Build Coastguard Worker export_flags: ["..."], 614*90c8c64dSAndroid Build Coastguard Worker relative_install_path: "...", 615*90c8c64dSAndroid Build Coastguard Worker srcs: ["..."] 616*90c8c64dSAndroid Build Coastguard Worker }, 617*90c8c64dSAndroid Build Coastguard Worker } 618*90c8c64dSAndroid Build Coastguard Worker 619*90c8c64dSAndroid Build Coastguard Worker Args: 620*90c8c64dSAndroid Build Coastguard Worker name: string, name of prebuilt module 621*90c8c64dSAndroid Build Coastguard Worker arch: string, VNDK snapshot arch (e.g. 'arm64') 622*90c8c64dSAndroid Build Coastguard Worker srcs_props: dict, prebuilt source paths and corresponding flags 623*90c8c64dSAndroid Build Coastguard Worker """ 624*90c8c64dSAndroid Build Coastguard Worker arch_props = '{ind}arch: {{\n'.format(ind=self.INDENT) 625*90c8c64dSAndroid Build Coastguard Worker 626*90c8c64dSAndroid Build Coastguard Worker def list_to_prop_value(l, name): 627*90c8c64dSAndroid Build Coastguard Worker if len(l) == 0: 628*90c8c64dSAndroid Build Coastguard Worker return '' 629*90c8c64dSAndroid Build Coastguard Worker dirs=',\n{ind}{ind}{ind}{ind}'.format( 630*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT).join(['"%s"' % d for d in l]) 631*90c8c64dSAndroid Build Coastguard Worker return ('{ind}{ind}{ind}{name}: [\n' 632*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}{ind}{ind}{dirs},\n' 633*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}{ind}],\n'.format( 634*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 635*90c8c64dSAndroid Build Coastguard Worker dirs=dirs, 636*90c8c64dSAndroid Build Coastguard Worker name=name)) 637*90c8c64dSAndroid Build Coastguard Worker 638*90c8c64dSAndroid Build Coastguard Worker def rename_generated_dirs(dirs): 639*90c8c64dSAndroid Build Coastguard Worker # Rename out/soong/.intermediates to generated-headers for better readability. 640*90c8c64dSAndroid Build Coastguard Worker return [d.replace(utils.SOONG_INTERMEDIATES_DIR, utils.GENERATED_HEADERS_DIR, 1) for d in dirs] 641*90c8c64dSAndroid Build Coastguard Worker 642*90c8c64dSAndroid Build Coastguard Worker for src in sorted(srcs_props.keys()): 643*90c8c64dSAndroid Build Coastguard Worker include_dirs = '' 644*90c8c64dSAndroid Build Coastguard Worker system_include_dirs = '' 645*90c8c64dSAndroid Build Coastguard Worker flags = '' 646*90c8c64dSAndroid Build Coastguard Worker relative_install_path = '' 647*90c8c64dSAndroid Build Coastguard Worker props = srcs_props[src] 648*90c8c64dSAndroid Build Coastguard Worker if 'ExportedDirs' in props: 649*90c8c64dSAndroid Build Coastguard Worker dirs = rename_generated_dirs(props['ExportedDirs']) 650*90c8c64dSAndroid Build Coastguard Worker l = ['include/%s' % d for d in dirs] 651*90c8c64dSAndroid Build Coastguard Worker include_dirs = list_to_prop_value(l, 'export_include_dirs') 652*90c8c64dSAndroid Build Coastguard Worker if 'ExportedSystemDirs' in props: 653*90c8c64dSAndroid Build Coastguard Worker dirs = rename_generated_dirs(props['ExportedSystemDirs']) 654*90c8c64dSAndroid Build Coastguard Worker l = ['include/%s' % d for d in dirs] 655*90c8c64dSAndroid Build Coastguard Worker system_include_dirs = list_to_prop_value(l, 'export_system_include_dirs') 656*90c8c64dSAndroid Build Coastguard Worker if 'ExportedFlags' in props: 657*90c8c64dSAndroid Build Coastguard Worker flags = list_to_prop_value(props['ExportedFlags'], 'export_flags') 658*90c8c64dSAndroid Build Coastguard Worker if 'RelativeInstallPath' in props: 659*90c8c64dSAndroid Build Coastguard Worker relative_install_path = ('{ind}{ind}{ind}' 660*90c8c64dSAndroid Build Coastguard Worker 'relative_install_path: "{path}",\n').format( 661*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 662*90c8c64dSAndroid Build Coastguard Worker path=props['RelativeInstallPath']) 663*90c8c64dSAndroid Build Coastguard Worker if 'LicenseKinds' in props: 664*90c8c64dSAndroid Build Coastguard Worker self._license_kinds_map[name].update(props['LicenseKinds']) 665*90c8c64dSAndroid Build Coastguard Worker if 'LicenseTexts' in props: 666*90c8c64dSAndroid Build Coastguard Worker self._license_texts_map[name].update(props['LicenseTexts']) 667*90c8c64dSAndroid Build Coastguard Worker 668*90c8c64dSAndroid Build Coastguard Worker arch_props += ('{ind}{ind}{arch}: {{\n' 669*90c8c64dSAndroid Build Coastguard Worker '{include_dirs}' 670*90c8c64dSAndroid Build Coastguard Worker '{system_include_dirs}' 671*90c8c64dSAndroid Build Coastguard Worker '{flags}' 672*90c8c64dSAndroid Build Coastguard Worker '{relative_install_path}' 673*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}{ind}srcs: ["{src}"],\n' 674*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}}},\n').format( 675*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 676*90c8c64dSAndroid Build Coastguard Worker arch=utils.prebuilt_arch_from_path( 677*90c8c64dSAndroid Build Coastguard Worker os.path.join(arch, src)), 678*90c8c64dSAndroid Build Coastguard Worker include_dirs=include_dirs, 679*90c8c64dSAndroid Build Coastguard Worker system_include_dirs=system_include_dirs, 680*90c8c64dSAndroid Build Coastguard Worker flags=flags, 681*90c8c64dSAndroid Build Coastguard Worker relative_install_path=relative_install_path, 682*90c8c64dSAndroid Build Coastguard Worker src=src) 683*90c8c64dSAndroid Build Coastguard Worker arch_props += '{ind}}},\n'.format(ind=self.INDENT) 684*90c8c64dSAndroid Build Coastguard Worker return arch_props 685*90c8c64dSAndroid Build Coastguard Worker 686*90c8c64dSAndroid Build Coastguard Worker src_root = os.path.join(self._install_dir, arch) 687*90c8c64dSAndroid Build Coastguard Worker if is_binder32: 688*90c8c64dSAndroid Build Coastguard Worker src_root = os.path.join(src_root, utils.BINDER32) 689*90c8c64dSAndroid Build Coastguard Worker 690*90c8c64dSAndroid Build Coastguard Worker src_paths = utils.find(src_root, srcs) 691*90c8c64dSAndroid Build Coastguard Worker # filter out paths under 'binder32' subdirectory 692*90c8c64dSAndroid Build Coastguard Worker src_paths = list(filter(lambda src: not src.startswith(utils.BINDER32), 693*90c8c64dSAndroid Build Coastguard Worker src_paths)) 694*90c8c64dSAndroid Build Coastguard Worker # This module is invalid if no srcs are found. 695*90c8c64dSAndroid Build Coastguard Worker if not src_paths: 696*90c8c64dSAndroid Build Coastguard Worker logging.info('No srcs found for {}; skipping'.format(name)) 697*90c8c64dSAndroid Build Coastguard Worker return "" 698*90c8c64dSAndroid Build Coastguard Worker 699*90c8c64dSAndroid Build Coastguard Worker product_available = '' 700*90c8c64dSAndroid Build Coastguard Worker # if vndkproduct.libraries.txt is empty, make the VNDKs available to product by default. 701*90c8c64dSAndroid Build Coastguard Worker if is_llndk or not self._vndk_product[arch] or is_prebuilts_in_list(srcs, self._vndk_product[arch]): 702*90c8c64dSAndroid Build Coastguard Worker product_available = '{ind}product_available: true,\n'.format( 703*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT) 704*90c8c64dSAndroid Build Coastguard Worker 705*90c8c64dSAndroid Build Coastguard Worker vndk_props = '' 706*90c8c64dSAndroid Build Coastguard Worker if not is_llndk: 707*90c8c64dSAndroid Build Coastguard Worker vndk_sp = '' 708*90c8c64dSAndroid Build Coastguard Worker if is_vndk_sp: 709*90c8c64dSAndroid Build Coastguard Worker vndk_sp = '{ind}{ind}support_system_process: true,\n'.format( 710*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT) 711*90c8c64dSAndroid Build Coastguard Worker 712*90c8c64dSAndroid Build Coastguard Worker vndk_private = '' 713*90c8c64dSAndroid Build Coastguard Worker if is_prebuilts_in_list(srcs, self._vndk_private[arch]): 714*90c8c64dSAndroid Build Coastguard Worker vndk_private = '{ind}{ind}private: true,\n'.format( 715*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT) 716*90c8c64dSAndroid Build Coastguard Worker 717*90c8c64dSAndroid Build Coastguard Worker vndk_props = ('{ind}vndk: {{\n' 718*90c8c64dSAndroid Build Coastguard Worker '{ind}{ind}enabled: true,\n' 719*90c8c64dSAndroid Build Coastguard Worker '{vndk_sp}' 720*90c8c64dSAndroid Build Coastguard Worker '{vndk_private}' 721*90c8c64dSAndroid Build Coastguard Worker '{ind}}},\n'.format( 722*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 723*90c8c64dSAndroid Build Coastguard Worker product_available=product_available, 724*90c8c64dSAndroid Build Coastguard Worker vndk_sp=vndk_sp, 725*90c8c64dSAndroid Build Coastguard Worker vndk_private=vndk_private)) 726*90c8c64dSAndroid Build Coastguard Worker 727*90c8c64dSAndroid Build Coastguard Worker srcs_props = dict() 728*90c8c64dSAndroid Build Coastguard Worker for src in src_paths: 729*90c8c64dSAndroid Build Coastguard Worker props = dict() 730*90c8c64dSAndroid Build Coastguard Worker prop_path = os.path.join(src_root, src+'.json') 731*90c8c64dSAndroid Build Coastguard Worker try: 732*90c8c64dSAndroid Build Coastguard Worker with open(prop_path, 'r') as f: 733*90c8c64dSAndroid Build Coastguard Worker props = json.loads(f.read()) 734*90c8c64dSAndroid Build Coastguard Worker os.unlink(prop_path) 735*90c8c64dSAndroid Build Coastguard Worker except: 736*90c8c64dSAndroid Build Coastguard Worker # TODO(b/70312118): Parse from soong build system 737*90c8c64dSAndroid Build Coastguard Worker if name == '[email protected]': 738*90c8c64dSAndroid Build Coastguard Worker props['RelativeInstallPath'] = 'hw' 739*90c8c64dSAndroid Build Coastguard Worker srcs_props[src] = props 740*90c8c64dSAndroid Build Coastguard Worker arch_props = get_arch_props(name, arch, srcs_props) 741*90c8c64dSAndroid Build Coastguard Worker 742*90c8c64dSAndroid Build Coastguard Worker if self._license_in_json: 743*90c8c64dSAndroid Build Coastguard Worker license = get_license_prop(name) 744*90c8c64dSAndroid Build Coastguard Worker else: 745*90c8c64dSAndroid Build Coastguard Worker license = get_notice_file(srcs) 746*90c8c64dSAndroid Build Coastguard Worker 747*90c8c64dSAndroid Build Coastguard Worker binder32bit = '' 748*90c8c64dSAndroid Build Coastguard Worker if is_binder32: 749*90c8c64dSAndroid Build Coastguard Worker binder32bit = '{ind}binder32bit: true,\n'.format(ind=self.INDENT) 750*90c8c64dSAndroid Build Coastguard Worker 751*90c8c64dSAndroid Build Coastguard Worker min_sdk_version = '' 752*90c8c64dSAndroid Build Coastguard Worker for src, props in srcs_props.items(): 753*90c8c64dSAndroid Build Coastguard Worker if 'MinSdkVersion' in props: 754*90c8c64dSAndroid Build Coastguard Worker min_sdk_version = '{ind}min_sdk_version: "{ver}",\n'.format( 755*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 756*90c8c64dSAndroid Build Coastguard Worker ver=props['MinSdkVersion']) 757*90c8c64dSAndroid Build Coastguard Worker break 758*90c8c64dSAndroid Build Coastguard Worker 759*90c8c64dSAndroid Build Coastguard Worker return ('vndk_prebuilt_shared {{\n' 760*90c8c64dSAndroid Build Coastguard Worker '{ind}name: "{name}",\n' 761*90c8c64dSAndroid Build Coastguard Worker '{ind}version: "{ver}",\n' 762*90c8c64dSAndroid Build Coastguard Worker '{ind}target_arch: "{target_arch}",\n' 763*90c8c64dSAndroid Build Coastguard Worker '{binder32bit}' 764*90c8c64dSAndroid Build Coastguard Worker '{ind}vendor_available: true,\n' 765*90c8c64dSAndroid Build Coastguard Worker '{product_available}' 766*90c8c64dSAndroid Build Coastguard Worker '{vndk_props}' 767*90c8c64dSAndroid Build Coastguard Worker '{min_sdk_version}' 768*90c8c64dSAndroid Build Coastguard Worker '{license}' 769*90c8c64dSAndroid Build Coastguard Worker '{arch_props}' 770*90c8c64dSAndroid Build Coastguard Worker '}}\n'.format( 771*90c8c64dSAndroid Build Coastguard Worker ind=self.INDENT, 772*90c8c64dSAndroid Build Coastguard Worker name=name, 773*90c8c64dSAndroid Build Coastguard Worker ver=self._vndk_version, 774*90c8c64dSAndroid Build Coastguard Worker target_arch=arch, 775*90c8c64dSAndroid Build Coastguard Worker binder32bit=binder32bit, 776*90c8c64dSAndroid Build Coastguard Worker product_available=product_available, 777*90c8c64dSAndroid Build Coastguard Worker vndk_props=vndk_props, 778*90c8c64dSAndroid Build Coastguard Worker min_sdk_version=min_sdk_version, 779*90c8c64dSAndroid Build Coastguard Worker license=license, 780*90c8c64dSAndroid Build Coastguard Worker arch_props=arch_props)) 781*90c8c64dSAndroid Build Coastguard Worker 782*90c8c64dSAndroid Build Coastguard Worker 783*90c8c64dSAndroid Build Coastguard Workerdef get_args(): 784*90c8c64dSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 785*90c8c64dSAndroid Build Coastguard Worker parser.add_argument( 786*90c8c64dSAndroid Build Coastguard Worker 'vndk_version', 787*90c8c64dSAndroid Build Coastguard Worker type=utils.vndk_version_int, 788*90c8c64dSAndroid Build Coastguard Worker help='VNDK snapshot version to install, e.g. "{}".'.format( 789*90c8c64dSAndroid Build Coastguard Worker utils.MINIMUM_VNDK_VERSION)) 790*90c8c64dSAndroid Build Coastguard Worker parser.add_argument( 791*90c8c64dSAndroid Build Coastguard Worker '-v', 792*90c8c64dSAndroid Build Coastguard Worker '--verbose', 793*90c8c64dSAndroid Build Coastguard Worker action='count', 794*90c8c64dSAndroid Build Coastguard Worker default=0, 795*90c8c64dSAndroid Build Coastguard Worker help='Increase output verbosity, e.g. "-v", "-vv".') 796*90c8c64dSAndroid Build Coastguard Worker return parser.parse_args() 797*90c8c64dSAndroid Build Coastguard Worker 798*90c8c64dSAndroid Build Coastguard Worker 799*90c8c64dSAndroid Build Coastguard Workerdef main(): 800*90c8c64dSAndroid Build Coastguard Worker """For local testing purposes. 801*90c8c64dSAndroid Build Coastguard Worker 802*90c8c64dSAndroid Build Coastguard Worker Note: VNDK snapshot must be already installed under 803*90c8c64dSAndroid Build Coastguard Worker prebuilts/vndk/v{version}. 804*90c8c64dSAndroid Build Coastguard Worker """ 805*90c8c64dSAndroid Build Coastguard Worker ANDROID_BUILD_TOP = utils.get_android_build_top() 806*90c8c64dSAndroid Build Coastguard Worker PREBUILTS_VNDK_DIR = utils.join_realpath(ANDROID_BUILD_TOP, 807*90c8c64dSAndroid Build Coastguard Worker 'prebuilts/vndk') 808*90c8c64dSAndroid Build Coastguard Worker 809*90c8c64dSAndroid Build Coastguard Worker args = get_args() 810*90c8c64dSAndroid Build Coastguard Worker vndk_version = args.vndk_version 811*90c8c64dSAndroid Build Coastguard Worker install_dir = os.path.join(PREBUILTS_VNDK_DIR, 'v{}'.format(vndk_version)) 812*90c8c64dSAndroid Build Coastguard Worker if not os.path.isdir(install_dir): 813*90c8c64dSAndroid Build Coastguard Worker raise ValueError( 814*90c8c64dSAndroid Build Coastguard Worker 'Please provide valid VNDK version. {} does not exist.' 815*90c8c64dSAndroid Build Coastguard Worker .format(install_dir)) 816*90c8c64dSAndroid Build Coastguard Worker utils.set_logging_config(args.verbose) 817*90c8c64dSAndroid Build Coastguard Worker 818*90c8c64dSAndroid Build Coastguard Worker buildfile_generator = GenBuildFile(install_dir, vndk_version) 819*90c8c64dSAndroid Build Coastguard Worker # To parse json information, read and generate arch android.bp using 820*90c8c64dSAndroid Build Coastguard Worker # generate_android_bp() first. 821*90c8c64dSAndroid Build Coastguard Worker buildfile_generator.generate_android_bp() 822*90c8c64dSAndroid Build Coastguard Worker buildfile_generator.generate_root_android_bp() 823*90c8c64dSAndroid Build Coastguard Worker buildfile_generator.generate_common_android_bp() 824*90c8c64dSAndroid Build Coastguard Worker 825*90c8c64dSAndroid Build Coastguard Worker logging.info('Done.') 826*90c8c64dSAndroid Build Coastguard Worker 827*90c8c64dSAndroid Build Coastguard Worker 828*90c8c64dSAndroid Build Coastguard Workerif __name__ == '__main__': 829*90c8c64dSAndroid Build Coastguard Worker main() 830