xref: /aosp_15_r20/frameworks/rs/update-prebuilts.py (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker#!/usr/bin/env python
2*e1eccf28SAndroid Build Coastguard Worker#
3*e1eccf28SAndroid Build Coastguard Worker# Copyright (C) 2016 The Android Open Source Project
4*e1eccf28SAndroid Build Coastguard Worker#
5*e1eccf28SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*e1eccf28SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*e1eccf28SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*e1eccf28SAndroid Build Coastguard Worker#
9*e1eccf28SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*e1eccf28SAndroid Build Coastguard Worker#
11*e1eccf28SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*e1eccf28SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*e1eccf28SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*e1eccf28SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*e1eccf28SAndroid Build Coastguard Worker# limitations under the License.
16*e1eccf28SAndroid Build Coastguard Worker#
17*e1eccf28SAndroid Build Coastguard Worker
18*e1eccf28SAndroid Build Coastguard Worker"""Update the prebuilt RenderScript from the build server."""
19*e1eccf28SAndroid Build Coastguard Workerfrom __future__ import print_function
20*e1eccf28SAndroid Build Coastguard Worker
21*e1eccf28SAndroid Build Coastguard Workerimport argparse
22*e1eccf28SAndroid Build Coastguard Workerimport inspect
23*e1eccf28SAndroid Build Coastguard Workerimport os
24*e1eccf28SAndroid Build Coastguard Workerimport shutil
25*e1eccf28SAndroid Build Coastguard Workerimport subprocess
26*e1eccf28SAndroid Build Coastguard Workerimport sys
27*e1eccf28SAndroid Build Coastguard Worker
28*e1eccf28SAndroid Build Coastguard Worker
29*e1eccf28SAndroid Build Coastguard WorkerTHIS_DIR = os.path.realpath(os.path.dirname(__name__))
30*e1eccf28SAndroid Build Coastguard WorkerANDROID_DIR = os.path.realpath(os.path.join(THIS_DIR, '../..'))
31*e1eccf28SAndroid Build Coastguard Worker
32*e1eccf28SAndroid Build Coastguard WorkerBRANCH = 'aosp-master'
33*e1eccf28SAndroid Build Coastguard Worker
34*e1eccf28SAndroid Build Coastguard Worker
35*e1eccf28SAndroid Build Coastguard Workerdef android_path(*args):
36*e1eccf28SAndroid Build Coastguard Worker    return os.path.join(ANDROID_DIR, *args)
37*e1eccf28SAndroid Build Coastguard Worker
38*e1eccf28SAndroid Build Coastguard Worker
39*e1eccf28SAndroid Build Coastguard Workerclass ArgParser(argparse.ArgumentParser):
40*e1eccf28SAndroid Build Coastguard Worker    def __init__(self):
41*e1eccf28SAndroid Build Coastguard Worker        super(ArgParser, self).__init__(
42*e1eccf28SAndroid Build Coastguard Worker            description=inspect.getdoc(sys.modules[__name__]))
43*e1eccf28SAndroid Build Coastguard Worker
44*e1eccf28SAndroid Build Coastguard Worker        self.add_argument(
45*e1eccf28SAndroid Build Coastguard Worker            'build_number', metavar='BUILD',
46*e1eccf28SAndroid Build Coastguard Worker            help='Build number to pull from the build server.')
47*e1eccf28SAndroid Build Coastguard Worker
48*e1eccf28SAndroid Build Coastguard Worker        self.add_argument(
49*e1eccf28SAndroid Build Coastguard Worker            '-a', '--android_branch', default=BRANCH,
50*e1eccf28SAndroid Build Coastguard Worker            help='The Android branch to pull from build server, default: ' + BRANCH + '.')
51*e1eccf28SAndroid Build Coastguard Worker
52*e1eccf28SAndroid Build Coastguard Worker        self.add_argument(
53*e1eccf28SAndroid Build Coastguard Worker            '-b', '--bug', type=int,
54*e1eccf28SAndroid Build Coastguard Worker            help='Bug to reference in commit message.')
55*e1eccf28SAndroid Build Coastguard Worker
56*e1eccf28SAndroid Build Coastguard Worker        self.add_argument(
57*e1eccf28SAndroid Build Coastguard Worker            '--use-current-branch', action='store_true',
58*e1eccf28SAndroid Build Coastguard Worker            help='Do not repo start a new branch for the update.')
59*e1eccf28SAndroid Build Coastguard Worker
60*e1eccf28SAndroid Build Coastguard Worker
61*e1eccf28SAndroid Build Coastguard Workerdef host_to_build_host(host):
62*e1eccf28SAndroid Build Coastguard Worker    """Gets the build host name for an NDK host tag.
63*e1eccf28SAndroid Build Coastguard Worker
64*e1eccf28SAndroid Build Coastguard Worker    The Windows builds are done from Linux.
65*e1eccf28SAndroid Build Coastguard Worker    """
66*e1eccf28SAndroid Build Coastguard Worker    return {
67*e1eccf28SAndroid Build Coastguard Worker        'darwin': 'mac',
68*e1eccf28SAndroid Build Coastguard Worker        'linux': 'linux',
69*e1eccf28SAndroid Build Coastguard Worker        'windows': 'linux',
70*e1eccf28SAndroid Build Coastguard Worker    }[host]
71*e1eccf28SAndroid Build Coastguard Worker
72*e1eccf28SAndroid Build Coastguard Worker
73*e1eccf28SAndroid Build Coastguard Workerdef build_name(host):
74*e1eccf28SAndroid Build Coastguard Worker    """Gets the build name for a given host.
75*e1eccf28SAndroid Build Coastguard Worker
76*e1eccf28SAndroid Build Coastguard Worker    The build name is either "linux" or "darwin", with any Windows builds
77*e1eccf28SAndroid Build Coastguard Worker    coming from "linux".
78*e1eccf28SAndroid Build Coastguard Worker    """
79*e1eccf28SAndroid Build Coastguard Worker    return {
80*e1eccf28SAndroid Build Coastguard Worker        'darwin': 'darwin',
81*e1eccf28SAndroid Build Coastguard Worker        'linux': 'linux',
82*e1eccf28SAndroid Build Coastguard Worker        'windows': 'linux',
83*e1eccf28SAndroid Build Coastguard Worker    }[host]
84*e1eccf28SAndroid Build Coastguard Worker
85*e1eccf28SAndroid Build Coastguard Worker
86*e1eccf28SAndroid Build Coastguard Workerdef manifest_name(build_number):
87*e1eccf28SAndroid Build Coastguard Worker    """Returns the manifest file name for a given build.
88*e1eccf28SAndroid Build Coastguard Worker
89*e1eccf28SAndroid Build Coastguard Worker    >>> manifest_name('1234')
90*e1eccf28SAndroid Build Coastguard Worker    'manifest_1234.xml'
91*e1eccf28SAndroid Build Coastguard Worker    """
92*e1eccf28SAndroid Build Coastguard Worker    return 'manifest_{}.xml'.format(build_number)
93*e1eccf28SAndroid Build Coastguard Worker
94*e1eccf28SAndroid Build Coastguard Worker
95*e1eccf28SAndroid Build Coastguard Workerdef package_name(build_number, host):
96*e1eccf28SAndroid Build Coastguard Worker    """Returns the file name for a given package configuration.
97*e1eccf28SAndroid Build Coastguard Worker
98*e1eccf28SAndroid Build Coastguard Worker    >>> package_name('1234', 'linux')
99*e1eccf28SAndroid Build Coastguard Worker    'renderscript-1234-linux-x86.tar.bz2'
100*e1eccf28SAndroid Build Coastguard Worker    """
101*e1eccf28SAndroid Build Coastguard Worker    return 'renderscript-{}-{}-x86.tar.bz2'.format(build_number, host)
102*e1eccf28SAndroid Build Coastguard Worker
103*e1eccf28SAndroid Build Coastguard Worker
104*e1eccf28SAndroid Build Coastguard Workerdef download_build(host, build_number, android_branch, download_dir):
105*e1eccf28SAndroid Build Coastguard Worker    filename = package_name(build_number, host)
106*e1eccf28SAndroid Build Coastguard Worker    return download_file(host, build_number, android_branch, filename, download_dir)
107*e1eccf28SAndroid Build Coastguard Worker
108*e1eccf28SAndroid Build Coastguard Worker
109*e1eccf28SAndroid Build Coastguard Workerdef download_manifest(host, build_number, android_branch, download_dir):
110*e1eccf28SAndroid Build Coastguard Worker    filename = manifest_name(build_number)
111*e1eccf28SAndroid Build Coastguard Worker    return download_file(host, build_number, android_branch, filename, download_dir)
112*e1eccf28SAndroid Build Coastguard Worker
113*e1eccf28SAndroid Build Coastguard Worker
114*e1eccf28SAndroid Build Coastguard Workerdef download_file(host, build_number, android_branch, pkg_name, download_dir):
115*e1eccf28SAndroid Build Coastguard Worker    url_base = 'https://android-build-uber.corp.google.com'
116*e1eccf28SAndroid Build Coastguard Worker    path = 'builds/{build_branch}-{build_host}-{build_name}/{build_num}'.format(
117*e1eccf28SAndroid Build Coastguard Worker        build_branch=android_branch,
118*e1eccf28SAndroid Build Coastguard Worker        build_host=host_to_build_host(host),
119*e1eccf28SAndroid Build Coastguard Worker        build_name='renderscript',
120*e1eccf28SAndroid Build Coastguard Worker        build_num=build_number)
121*e1eccf28SAndroid Build Coastguard Worker
122*e1eccf28SAndroid Build Coastguard Worker    url = '{}/{}/{}'.format(url_base, path, pkg_name)
123*e1eccf28SAndroid Build Coastguard Worker
124*e1eccf28SAndroid Build Coastguard Worker    TIMEOUT = '60'  # In seconds.
125*e1eccf28SAndroid Build Coastguard Worker    out_file_path = os.path.join(download_dir, pkg_name)
126*e1eccf28SAndroid Build Coastguard Worker    with open(out_file_path, 'w') as out_file:
127*e1eccf28SAndroid Build Coastguard Worker        print('Downloading {} to {}'.format(url, out_file_path))
128*e1eccf28SAndroid Build Coastguard Worker        subprocess.check_call(
129*e1eccf28SAndroid Build Coastguard Worker            ['sso_client', '--location', '--request_timeout', TIMEOUT, url],
130*e1eccf28SAndroid Build Coastguard Worker            stdout=out_file)
131*e1eccf28SAndroid Build Coastguard Worker    return out_file_path
132*e1eccf28SAndroid Build Coastguard Worker
133*e1eccf28SAndroid Build Coastguard Worker
134*e1eccf28SAndroid Build Coastguard Workerdef extract_package(package, install_dir):
135*e1eccf28SAndroid Build Coastguard Worker    cmd = ['tar', 'xf', package, '-C', install_dir]
136*e1eccf28SAndroid Build Coastguard Worker    print('Extracting {}...'.format(package))
137*e1eccf28SAndroid Build Coastguard Worker    subprocess.check_call(cmd)
138*e1eccf28SAndroid Build Coastguard Worker
139*e1eccf28SAndroid Build Coastguard Worker
140*e1eccf28SAndroid Build Coastguard Workerdef update_renderscript(host, build_number, android_branch, use_current_branch, download_dir, bug):
141*e1eccf28SAndroid Build Coastguard Worker    host_tag = host + '-x86'
142*e1eccf28SAndroid Build Coastguard Worker    prebuilt_dir = android_path('prebuilts/renderscript/host', host_tag)
143*e1eccf28SAndroid Build Coastguard Worker    os.chdir(prebuilt_dir)
144*e1eccf28SAndroid Build Coastguard Worker
145*e1eccf28SAndroid Build Coastguard Worker    if not use_current_branch:
146*e1eccf28SAndroid Build Coastguard Worker        subprocess.check_call(
147*e1eccf28SAndroid Build Coastguard Worker            ['repo', 'start', 'update-renderscript-{}'.format(build_number), '.'])
148*e1eccf28SAndroid Build Coastguard Worker
149*e1eccf28SAndroid Build Coastguard Worker    package = download_build(host, build_number, android_branch, download_dir)
150*e1eccf28SAndroid Build Coastguard Worker    manifest = download_manifest(host, build_number, android_branch, download_dir)
151*e1eccf28SAndroid Build Coastguard Worker
152*e1eccf28SAndroid Build Coastguard Worker    install_subdir = 'current'
153*e1eccf28SAndroid Build Coastguard Worker    extract_package(package, prebuilt_dir)
154*e1eccf28SAndroid Build Coastguard Worker    shutil.rmtree(install_subdir)
155*e1eccf28SAndroid Build Coastguard Worker    shutil.move('renderscript-{}'.format(build_number), install_subdir)
156*e1eccf28SAndroid Build Coastguard Worker    shutil.copy(manifest, install_subdir)
157*e1eccf28SAndroid Build Coastguard Worker
158*e1eccf28SAndroid Build Coastguard Worker    print('Adding files to index...')
159*e1eccf28SAndroid Build Coastguard Worker    subprocess.check_call(['git', 'add', install_subdir])
160*e1eccf28SAndroid Build Coastguard Worker
161*e1eccf28SAndroid Build Coastguard Worker    print('Committing update...')
162*e1eccf28SAndroid Build Coastguard Worker    message_lines = [
163*e1eccf28SAndroid Build Coastguard Worker        'Update prebuilt RenderScript to build {}.'.format(build_number),
164*e1eccf28SAndroid Build Coastguard Worker        '',
165*e1eccf28SAndroid Build Coastguard Worker        'Built from {build_branch}, build {build_number}.'.format(
166*e1eccf28SAndroid Build Coastguard Worker            build_branch=android_branch,
167*e1eccf28SAndroid Build Coastguard Worker            build_number=build_number),
168*e1eccf28SAndroid Build Coastguard Worker    ]
169*e1eccf28SAndroid Build Coastguard Worker    if bug is not None:
170*e1eccf28SAndroid Build Coastguard Worker        message_lines.append('')
171*e1eccf28SAndroid Build Coastguard Worker        message_lines.append('Bug: http://b/{}'.format(bug))
172*e1eccf28SAndroid Build Coastguard Worker    message = '\n'.join(message_lines)
173*e1eccf28SAndroid Build Coastguard Worker    subprocess.check_call(['git', 'commit', '-m', message])
174*e1eccf28SAndroid Build Coastguard Worker
175*e1eccf28SAndroid Build Coastguard Worker
176*e1eccf28SAndroid Build Coastguard Workerdef main():
177*e1eccf28SAndroid Build Coastguard Worker    args = ArgParser().parse_args()
178*e1eccf28SAndroid Build Coastguard Worker
179*e1eccf28SAndroid Build Coastguard Worker    download_dir = os.path.realpath('.download')
180*e1eccf28SAndroid Build Coastguard Worker    if os.path.isdir(download_dir):
181*e1eccf28SAndroid Build Coastguard Worker        shutil.rmtree(download_dir)
182*e1eccf28SAndroid Build Coastguard Worker    os.makedirs(download_dir)
183*e1eccf28SAndroid Build Coastguard Worker
184*e1eccf28SAndroid Build Coastguard Worker    try:
185*e1eccf28SAndroid Build Coastguard Worker        hosts = ('darwin', 'linux', 'windows')
186*e1eccf28SAndroid Build Coastguard Worker        for host in hosts:
187*e1eccf28SAndroid Build Coastguard Worker            update_renderscript(host, args.build_number, args.android_branch,
188*e1eccf28SAndroid Build Coastguard Worker                                args.use_current_branch, download_dir, args.bug)
189*e1eccf28SAndroid Build Coastguard Worker    finally:
190*e1eccf28SAndroid Build Coastguard Worker        shutil.rmtree(download_dir)
191*e1eccf28SAndroid Build Coastguard Worker
192*e1eccf28SAndroid Build Coastguard Worker
193*e1eccf28SAndroid Build Coastguard Workerif __name__ == '__main__':
194*e1eccf28SAndroid Build Coastguard Worker    main()
195