xref: /aosp_15_r20/external/cronet/build/fuchsia/update_sdk.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker# Copyright 2022 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker"""Check out the Fuchsia SDK from a given GCS path. Should be used in a
6*6777b538SAndroid Build Coastguard Worker'hooks_os' entry so that it only runs when .gclient's custom_vars includes
7*6777b538SAndroid Build Coastguard Worker'fuchsia'."""
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Workerimport argparse
10*6777b538SAndroid Build Coastguard Workerimport json
11*6777b538SAndroid Build Coastguard Workerimport logging
12*6777b538SAndroid Build Coastguard Workerimport os
13*6777b538SAndroid Build Coastguard Workerimport platform
14*6777b538SAndroid Build Coastguard Workerimport subprocess
15*6777b538SAndroid Build Coastguard Workerimport sys
16*6777b538SAndroid Build Coastguard Workerfrom typing import Optional
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Workerfrom gcs_download import DownloadAndUnpackFromCloudStorage
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Workersys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
21*6777b538SAndroid Build Coastguard Worker                                             'test')))
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Workerfrom common import SDK_ROOT, get_host_os, make_clean_directory
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker_VERSION_FILE = os.path.join(SDK_ROOT, 'meta', 'manifest.json')
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Workerdef _GetHostArch():
29*6777b538SAndroid Build Coastguard Worker  host_arch = platform.machine()
30*6777b538SAndroid Build Coastguard Worker  # platform.machine() returns AMD64 on 64-bit Windows.
31*6777b538SAndroid Build Coastguard Worker  if host_arch in ['x86_64', 'AMD64']:
32*6777b538SAndroid Build Coastguard Worker    return 'amd64'
33*6777b538SAndroid Build Coastguard Worker  elif host_arch == 'aarch64':
34*6777b538SAndroid Build Coastguard Worker    return 'arm64'
35*6777b538SAndroid Build Coastguard Worker  raise Exception('Unsupported host architecture: %s' % host_arch)
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Workerdef GetSDKOverrideGCSPath() -> Optional[str]:
39*6777b538SAndroid Build Coastguard Worker  """Fetches the sdk override path from a file or an environment variable.
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker  Returns:
42*6777b538SAndroid Build Coastguard Worker    The override sdk location, stripped of white space.
43*6777b538SAndroid Build Coastguard Worker      Example: gs://fuchsia-artifacts/development/some-id/sdk
44*6777b538SAndroid Build Coastguard Worker  """
45*6777b538SAndroid Build Coastguard Worker  if os.getenv('FUCHSIA_SDK_OVERRIDE'):
46*6777b538SAndroid Build Coastguard Worker    return os.environ['FUCHSIA_SDK_OVERRIDE'].strip()
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker  path = os.path.join(os.path.dirname(__file__), 'sdk_override.txt')
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker  if os.path.isfile(path):
51*6777b538SAndroid Build Coastguard Worker    with open(path, 'r') as f:
52*6777b538SAndroid Build Coastguard Worker      return f.read().strip()
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker  return None
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Workerdef _GetTarballPath(gcs_tarball_prefix: str) -> str:
58*6777b538SAndroid Build Coastguard Worker  """Get the full path to the sdk tarball on GCS"""
59*6777b538SAndroid Build Coastguard Worker  platform = get_host_os()
60*6777b538SAndroid Build Coastguard Worker  arch = _GetHostArch()
61*6777b538SAndroid Build Coastguard Worker  return f'{gcs_tarball_prefix}/{platform}-{arch}/core.tar.gz'
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Workerdef _GetCurrentVersionFromManifest() -> Optional[str]:
65*6777b538SAndroid Build Coastguard Worker  if not os.path.exists(_VERSION_FILE):
66*6777b538SAndroid Build Coastguard Worker    return None
67*6777b538SAndroid Build Coastguard Worker  with open(_VERSION_FILE) as f:
68*6777b538SAndroid Build Coastguard Worker    return json.load(f)['id']
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Workerdef main():
72*6777b538SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
73*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--cipd-prefix', help='CIPD base directory for the SDK.')
74*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--version', help='Specifies the SDK version.')
75*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--verbose',
76*6777b538SAndroid Build Coastguard Worker                      '-v',
77*6777b538SAndroid Build Coastguard Worker                      action='store_true',
78*6777b538SAndroid Build Coastguard Worker                      help='Enable debug-level logging.')
79*6777b538SAndroid Build Coastguard Worker  args = parser.parse_args()
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker  logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO)
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker  # Exit if there's no SDK support for this platform.
84*6777b538SAndroid Build Coastguard Worker  try:
85*6777b538SAndroid Build Coastguard Worker    host_plat = get_host_os()
86*6777b538SAndroid Build Coastguard Worker  except:
87*6777b538SAndroid Build Coastguard Worker    logging.warning('Fuchsia SDK is not supported on this platform.')
88*6777b538SAndroid Build Coastguard Worker    return 0
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker  # TODO(crbug.com/326004432): Remove this once DEPS have been fixed not to
91*6777b538SAndroid Build Coastguard Worker  # include the "version:" prefix.
92*6777b538SAndroid Build Coastguard Worker  if args.version.startswith('version:'):
93*6777b538SAndroid Build Coastguard Worker    args.version = args.version[len('version:'):]
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker  gcs_tarball_prefix = GetSDKOverrideGCSPath()
96*6777b538SAndroid Build Coastguard Worker  if not gcs_tarball_prefix:
97*6777b538SAndroid Build Coastguard Worker    # sdk_override contains the full path but not only the version id. But since
98*6777b538SAndroid Build Coastguard Worker    # the scenario is limited to dry-run, it's not worth complexity to extract
99*6777b538SAndroid Build Coastguard Worker    # the version id.
100*6777b538SAndroid Build Coastguard Worker    if args.version == _GetCurrentVersionFromManifest():
101*6777b538SAndroid Build Coastguard Worker      return 0
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker  make_clean_directory(SDK_ROOT)
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker  # Download from CIPD if there is no override file.
106*6777b538SAndroid Build Coastguard Worker  if not gcs_tarball_prefix:
107*6777b538SAndroid Build Coastguard Worker    if not args.cipd_prefix:
108*6777b538SAndroid Build Coastguard Worker      parser.exit(1, '--cipd-prefix must be specified.')
109*6777b538SAndroid Build Coastguard Worker    if not args.version:
110*6777b538SAndroid Build Coastguard Worker      parser.exit(2, '--version must be specified.')
111*6777b538SAndroid Build Coastguard Worker    logging.info('Downloading SDK from CIPD...')
112*6777b538SAndroid Build Coastguard Worker    ensure_file = '%s%s-%s version:%s' % (args.cipd_prefix, host_plat,
113*6777b538SAndroid Build Coastguard Worker                                          _GetHostArch(), args.version)
114*6777b538SAndroid Build Coastguard Worker    subprocess.run(('cipd', 'ensure', '-ensure-file', '-', '-root', SDK_ROOT,
115*6777b538SAndroid Build Coastguard Worker                    '-log-level', 'warning'),
116*6777b538SAndroid Build Coastguard Worker                   check=True,
117*6777b538SAndroid Build Coastguard Worker                   text=True,
118*6777b538SAndroid Build Coastguard Worker                   input=ensure_file)
119*6777b538SAndroid Build Coastguard Worker
120*6777b538SAndroid Build Coastguard Worker    # Verify that the downloaded version matches the expected one.
121*6777b538SAndroid Build Coastguard Worker    downloaded_version = _GetCurrentVersionFromManifest()
122*6777b538SAndroid Build Coastguard Worker    if downloaded_version != args.version:
123*6777b538SAndroid Build Coastguard Worker      logging.error(
124*6777b538SAndroid Build Coastguard Worker          'SDK version after download does not match expected (downloaded:%s '
125*6777b538SAndroid Build Coastguard Worker          'vs expected:%s)', downloaded_version, args.version)
126*6777b538SAndroid Build Coastguard Worker      return 3
127*6777b538SAndroid Build Coastguard Worker  else:
128*6777b538SAndroid Build Coastguard Worker    logging.info('Downloading SDK from GCS...')
129*6777b538SAndroid Build Coastguard Worker    DownloadAndUnpackFromCloudStorage(_GetTarballPath(gcs_tarball_prefix),
130*6777b538SAndroid Build Coastguard Worker                                      SDK_ROOT)
131*6777b538SAndroid Build Coastguard Worker
132*6777b538SAndroid Build Coastguard Worker  # Build rules (e.g. fidl_library()) depend on updates to the top-level
133*6777b538SAndroid Build Coastguard Worker  # manifest to spot when to rebuild for an SDK update. Ensure that ninja
134*6777b538SAndroid Build Coastguard Worker  # sees that the SDK manifest has changed, regardless of the mtime set by
135*6777b538SAndroid Build Coastguard Worker  # the download & unpack steps above, by setting mtime to now.
136*6777b538SAndroid Build Coastguard Worker  # See crbug.com/1457463
137*6777b538SAndroid Build Coastguard Worker  os.utime(os.path.join(SDK_ROOT, 'meta', 'manifest.json'), None)
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker  root_dir = os.path.dirname(os.path.realpath(__file__))
140*6777b538SAndroid Build Coastguard Worker  build_def_cmd = [
141*6777b538SAndroid Build Coastguard Worker      os.path.join(root_dir, 'gen_build_defs.py'),
142*6777b538SAndroid Build Coastguard Worker  ]
143*6777b538SAndroid Build Coastguard Worker  subprocess.run(build_def_cmd, check=True)
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker  return 0
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker
148*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
149*6777b538SAndroid Build Coastguard Worker  sys.exit(main())
150