xref: /aosp_15_r20/development/vndk/snapshot/utils.py (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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