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"""Utility functions for VNDK snapshot.""" 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Workerimport argparse 20*90c8c64dSAndroid Build Coastguard Workerimport glob 21*90c8c64dSAndroid Build Coastguard Workerimport logging 22*90c8c64dSAndroid Build Coastguard Workerimport os 23*90c8c64dSAndroid Build Coastguard Workerimport re 24*90c8c64dSAndroid Build Coastguard Workerimport subprocess 25*90c8c64dSAndroid Build Coastguard Workerimport sys 26*90c8c64dSAndroid Build Coastguard Worker 27*90c8c64dSAndroid Build Coastguard Worker# Global Keys 28*90c8c64dSAndroid Build Coastguard Worker# All paths are relative to install_dir: prebuilts/vndk/v{version} 29*90c8c64dSAndroid Build Coastguard WorkerROOT_BP_PATH = 'Android.bp' 30*90c8c64dSAndroid Build Coastguard WorkerCOMMON_DIR_NAME = 'common' 31*90c8c64dSAndroid Build Coastguard WorkerCOMMON_DIR_PATH = COMMON_DIR_NAME 32*90c8c64dSAndroid Build Coastguard WorkerCOMMON_BP_PATH = os.path.join(COMMON_DIR_PATH, 'Android.bp') 33*90c8c64dSAndroid Build Coastguard WorkerCONFIG_DIR_PATH_PATTERN = '*/configs' 34*90c8c64dSAndroid Build Coastguard WorkerMANIFEST_FILE_NAME = 'manifest.xml' 35*90c8c64dSAndroid Build Coastguard WorkerMODULE_PATHS_FILE_NAME = 'module_paths.txt' 36*90c8c64dSAndroid Build Coastguard WorkerNOTICE_FILES_DIR_NAME = 'NOTICE_FILES' 37*90c8c64dSAndroid Build Coastguard WorkerNOTICE_FILES_DIR_PATH = os.path.join(COMMON_DIR_PATH, NOTICE_FILES_DIR_NAME) 38*90c8c64dSAndroid Build Coastguard WorkerBINDER32 = 'binder32' 39*90c8c64dSAndroid Build Coastguard WorkerMINIMUM_VNDK_VERSION = 28 40*90c8c64dSAndroid Build Coastguard WorkerSOONG_INTERMEDIATES_DIR = 'out/soong/.intermediates' 41*90c8c64dSAndroid Build Coastguard WorkerGENERATED_HEADERS_DIR = 'generated-headers' 42*90c8c64dSAndroid Build Coastguard Worker 43*90c8c64dSAndroid Build Coastguard Workerdef set_logging_config(verbose_level): 44*90c8c64dSAndroid Build Coastguard Worker verbose_map = (logging.WARNING, logging.INFO, logging.DEBUG) 45*90c8c64dSAndroid Build Coastguard Worker verbosity = min(verbose_level, 2) 46*90c8c64dSAndroid Build Coastguard Worker logging.basicConfig( 47*90c8c64dSAndroid Build Coastguard Worker format='%(levelname)-8s [%(filename)s:%(lineno)d] %(message)s', 48*90c8c64dSAndroid Build Coastguard Worker level=verbose_map[verbosity]) 49*90c8c64dSAndroid Build Coastguard Worker 50*90c8c64dSAndroid Build Coastguard Worker 51*90c8c64dSAndroid Build Coastguard Workerdef check_call(cmd): 52*90c8c64dSAndroid Build Coastguard Worker logging.debug('Running `{}`'.format(' '.join(cmd))) 53*90c8c64dSAndroid Build Coastguard Worker subprocess.check_call(cmd) 54*90c8c64dSAndroid Build Coastguard Worker 55*90c8c64dSAndroid Build Coastguard Worker 56*90c8c64dSAndroid Build Coastguard Workerdef check_output(cmd): 57*90c8c64dSAndroid Build Coastguard Worker logging.debug('Running `{}`'.format(' '.join(cmd))) 58*90c8c64dSAndroid Build Coastguard Worker output = subprocess.check_output(cmd, encoding='utf-8') 59*90c8c64dSAndroid Build Coastguard Worker logging.debug('Output: `{}`'.format(output)) 60*90c8c64dSAndroid Build Coastguard Worker return output 61*90c8c64dSAndroid Build Coastguard Worker 62*90c8c64dSAndroid Build Coastguard Worker 63*90c8c64dSAndroid Build Coastguard Workerdef vndk_version_int(vndk_version): 64*90c8c64dSAndroid Build Coastguard Worker """Used for a type keyword argument in the argparse. 65*90c8c64dSAndroid Build Coastguard Worker It checks if vndk version is in the supported versions. 66*90c8c64dSAndroid Build Coastguard Worker """ 67*90c8c64dSAndroid Build Coastguard Worker version_int = int(vndk_version) 68*90c8c64dSAndroid Build Coastguard Worker if version_int < MINIMUM_VNDK_VERSION: 69*90c8c64dSAndroid Build Coastguard Worker raise argparse.ArgumentTypeError( 70*90c8c64dSAndroid Build Coastguard Worker 'The VNDK version {input} is not supported. ' 71*90c8c64dSAndroid Build Coastguard Worker 'It must be no smaller than {min_vndk}.'.format( 72*90c8c64dSAndroid Build Coastguard Worker input=version_int, min_vndk=MINIMUM_VNDK_VERSION)) 73*90c8c64dSAndroid Build Coastguard Worker return version_int 74*90c8c64dSAndroid Build Coastguard Worker 75*90c8c64dSAndroid Build Coastguard Worker 76*90c8c64dSAndroid Build Coastguard Workerdef get_android_build_top(): 77*90c8c64dSAndroid Build Coastguard Worker ANDROID_BUILD_TOP = os.getenv('ANDROID_BUILD_TOP') 78*90c8c64dSAndroid Build Coastguard Worker if not ANDROID_BUILD_TOP: 79*90c8c64dSAndroid Build Coastguard Worker print('Error: Missing ANDROID_BUILD_TOP env variable. Please run ' 80*90c8c64dSAndroid Build Coastguard Worker '\'. build/envsetup.sh; lunch <build target>\'. Exiting script.') 81*90c8c64dSAndroid Build Coastguard Worker sys.exit(1) 82*90c8c64dSAndroid Build Coastguard Worker return ANDROID_BUILD_TOP 83*90c8c64dSAndroid Build Coastguard Worker 84*90c8c64dSAndroid Build Coastguard Worker 85*90c8c64dSAndroid Build Coastguard Workerdef join_realpath(root, *args): 86*90c8c64dSAndroid Build Coastguard Worker return os.path.realpath(os.path.join(root, *args)) 87*90c8c64dSAndroid Build Coastguard Worker 88*90c8c64dSAndroid Build Coastguard Worker 89*90c8c64dSAndroid Build Coastguard Workerdef _get_dir_from_env(env_var, default): 90*90c8c64dSAndroid Build Coastguard Worker return os.path.realpath(os.getenv(env_var, default)) 91*90c8c64dSAndroid Build Coastguard Worker 92*90c8c64dSAndroid Build Coastguard Worker 93*90c8c64dSAndroid Build Coastguard Workerdef get_out_dir(android_build_top): 94*90c8c64dSAndroid Build Coastguard Worker return _get_dir_from_env('OUT_DIR', join_realpath(android_build_top, 95*90c8c64dSAndroid Build Coastguard Worker 'out')) 96*90c8c64dSAndroid Build Coastguard Worker 97*90c8c64dSAndroid Build Coastguard Worker 98*90c8c64dSAndroid Build Coastguard Workerdef get_dist_dir(out_dir): 99*90c8c64dSAndroid Build Coastguard Worker return _get_dir_from_env('DIST_DIR', join_realpath(out_dir, 'dist')) 100*90c8c64dSAndroid Build Coastguard Worker 101*90c8c64dSAndroid Build Coastguard Worker 102*90c8c64dSAndroid Build Coastguard Workerdef get_snapshot_archs(install_dir): 103*90c8c64dSAndroid Build Coastguard Worker """Returns a list of VNDK snapshot arch flavors under install_dir. 104*90c8c64dSAndroid Build Coastguard Worker 105*90c8c64dSAndroid Build Coastguard Worker Args: 106*90c8c64dSAndroid Build Coastguard Worker install_dir: string, absolute path of prebuilts/vndk/v{version} 107*90c8c64dSAndroid Build Coastguard Worker """ 108*90c8c64dSAndroid Build Coastguard Worker archs = [] 109*90c8c64dSAndroid Build Coastguard Worker for file in glob.glob('{}/*'.format(install_dir)): 110*90c8c64dSAndroid Build Coastguard Worker basename = os.path.basename(file) 111*90c8c64dSAndroid Build Coastguard Worker if os.path.isdir(file) and basename != COMMON_DIR_NAME: 112*90c8c64dSAndroid Build Coastguard Worker archs.append(basename) 113*90c8c64dSAndroid Build Coastguard Worker return sorted(archs) 114*90c8c64dSAndroid Build Coastguard Worker 115*90c8c64dSAndroid Build Coastguard Worker 116*90c8c64dSAndroid Build Coastguard Workerdef prebuilt_arch_from_path(path): 117*90c8c64dSAndroid Build Coastguard Worker """Extracts arch of prebuilts from path relative to install_dir. 118*90c8c64dSAndroid Build Coastguard Worker 119*90c8c64dSAndroid Build Coastguard Worker Args: 120*90c8c64dSAndroid Build Coastguard Worker path: string, path relative to prebuilts/vndk/v{version} 121*90c8c64dSAndroid Build Coastguard Worker 122*90c8c64dSAndroid Build Coastguard Worker Returns: 123*90c8c64dSAndroid Build Coastguard Worker string, arch of prebuilt (e.g., 'arm' or 'arm64' or 'x86' or 'x86_64') 124*90c8c64dSAndroid Build Coastguard Worker """ 125*90c8c64dSAndroid Build Coastguard Worker return path.split('/')[1].split('-')[1] 126*90c8c64dSAndroid Build Coastguard Worker 127*90c8c64dSAndroid Build Coastguard Worker 128*90c8c64dSAndroid Build Coastguard Workerdef snapshot_arch_from_path(path): 129*90c8c64dSAndroid Build Coastguard Worker """Extracts VNDK snapshot arch from path relative to install_dir. 130*90c8c64dSAndroid Build Coastguard Worker 131*90c8c64dSAndroid Build Coastguard Worker Args: 132*90c8c64dSAndroid Build Coastguard Worker path: string, path relative to prebuilts/vndk/v{version} 133*90c8c64dSAndroid Build Coastguard Worker 134*90c8c64dSAndroid Build Coastguard Worker Returns: 135*90c8c64dSAndroid Build Coastguard Worker string, VNDK snapshot arch (e.g. 'arm64') 136*90c8c64dSAndroid Build Coastguard Worker """ 137*90c8c64dSAndroid Build Coastguard Worker return path.split('/')[0] 138*90c8c64dSAndroid Build Coastguard Worker 139*90c8c64dSAndroid Build Coastguard Worker 140*90c8c64dSAndroid Build Coastguard Workerdef find(path, names): 141*90c8c64dSAndroid Build Coastguard Worker """Returns a list of files in a directory that match the given names. 142*90c8c64dSAndroid Build Coastguard Worker 143*90c8c64dSAndroid Build Coastguard Worker Args: 144*90c8c64dSAndroid Build Coastguard Worker path: string, absolute path of directory from which to find files 145*90c8c64dSAndroid Build Coastguard Worker names: list of strings, names of the files to find 146*90c8c64dSAndroid Build Coastguard Worker """ 147*90c8c64dSAndroid Build Coastguard Worker found = [] 148*90c8c64dSAndroid Build Coastguard Worker for root, _, files in os.walk(path): 149*90c8c64dSAndroid Build Coastguard Worker for file_name in sorted(files): 150*90c8c64dSAndroid Build Coastguard Worker if file_name in names: 151*90c8c64dSAndroid Build Coastguard Worker abspath = os.path.abspath(os.path.join(root, file_name)) 152*90c8c64dSAndroid Build Coastguard Worker rel_to_root = abspath.replace(os.path.abspath(path), '') 153*90c8c64dSAndroid Build Coastguard Worker found.append(rel_to_root[1:]) # strip leading / 154*90c8c64dSAndroid Build Coastguard Worker return found 155*90c8c64dSAndroid Build Coastguard Worker 156*90c8c64dSAndroid Build Coastguard Worker 157*90c8c64dSAndroid Build Coastguard Workerdef fetch_artifact(branch, build, pattern, destination='.'): 158*90c8c64dSAndroid Build Coastguard Worker """Fetches build artifacts from Android Build server. 159*90c8c64dSAndroid Build Coastguard Worker 160*90c8c64dSAndroid Build Coastguard Worker Args: 161*90c8c64dSAndroid Build Coastguard Worker branch: string, branch to pull build artifacts from 162*90c8c64dSAndroid Build Coastguard Worker build: string, build number to pull build artifacts from 163*90c8c64dSAndroid Build Coastguard Worker pattern: string, pattern of build artifact file name 164*90c8c64dSAndroid Build Coastguard Worker destination: string, destination to pull build artifact to 165*90c8c64dSAndroid Build Coastguard Worker """ 166*90c8c64dSAndroid Build Coastguard Worker fetch_artifact_path = '/google/data/ro/projects/android/fetch_artifact' 167*90c8c64dSAndroid Build Coastguard Worker cmd = [ 168*90c8c64dSAndroid Build Coastguard Worker fetch_artifact_path, '--branch', branch, '--target=vndk', '--bid', 169*90c8c64dSAndroid Build Coastguard Worker build, pattern, destination 170*90c8c64dSAndroid Build Coastguard Worker ] 171*90c8c64dSAndroid Build Coastguard Worker check_call(cmd) 172*90c8c64dSAndroid Build Coastguard Worker 173*90c8c64dSAndroid Build Coastguard Worker 174*90c8c64dSAndroid Build Coastguard Workerdef get_latest_vndk_bid(branch): 175*90c8c64dSAndroid Build Coastguard Worker """Get the build id of the latest green build of the vndk target 176*90c8c64dSAndroid Build Coastguard Worker from the Android Build Server. 177*90c8c64dSAndroid Build Coastguard Worker 178*90c8c64dSAndroid Build Coastguard Worker Args: 179*90c8c64dSAndroid Build Coastguard Worker branch: string, branch to pull build artifacts from 180*90c8c64dSAndroid Build Coastguard Worker 181*90c8c64dSAndroid Build Coastguard Worker Returns: 182*90c8c64dSAndroid Build Coastguard Worker string: bid of the latest green build 183*90c8c64dSAndroid Build Coastguard Worker """ 184*90c8c64dSAndroid Build Coastguard Worker ab_tool_path = '/google/bin/releases/android/ab/ab.par' 185*90c8c64dSAndroid Build Coastguard Worker cmd = [ 186*90c8c64dSAndroid Build Coastguard Worker ab_tool_path, 'lkgb', '--branch', branch, '--target', 'vndk' 187*90c8c64dSAndroid Build Coastguard Worker ] 188*90c8c64dSAndroid Build Coastguard Worker 189*90c8c64dSAndroid Build Coastguard Worker # output will be 'branch target build_id status successful' 190*90c8c64dSAndroid Build Coastguard Worker output = check_output(cmd).strip() 191*90c8c64dSAndroid Build Coastguard Worker 192*90c8c64dSAndroid Build Coastguard Worker # return build_id from the output 193*90c8c64dSAndroid Build Coastguard Worker return output.split()[2] 194