| #!/usr/bin/env python3 |
| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import argparse |
| import lzma |
| import os |
| import platform |
| import shutil |
| import subprocess |
| import sys |
| import tarfile |
| |
| THIS_DIR = os.path.dirname(__file__) |
| sys.path.append( |
| os.path.join(os.path.dirname(THIS_DIR), '..', 'clang', 'scripts')) |
| |
| from build_rust import (RUST_TOOLCHAIN_OUT_DIR, THIRD_PARTY_DIR) |
| from update_rust import (GetRustClangRevision) |
| from package import (MaybeUpload, TeeCmd, DEFAULT_GCS_BUCKET) |
| from update import (CHROMIUM_DIR) |
| |
| PACKAGE_VERSION = GetRustClangRevision() |
| BUILDLOG_NAME = f'rust-buildlog-{PACKAGE_VERSION}.txt' |
| RUST_TOOLCHAIN_PACKAGE_NAME = f'rust-toolchain-{PACKAGE_VERSION}.tar.xz' |
| |
| |
| # TODO(https://crbug.com/1329611): Use this function (after integrating Crubit |
| # into Chromium; this work is on hold right now - see also |
| # https://crbug.com/1510943#c2). |
| def BuildCrubit(build_mac_arm): |
| with open(os.path.join(THIRD_PARTY_DIR, BUILDLOG_NAME), 'w') as log: |
| build_cmd = [sys.executable, os.path.join(THIS_DIR, 'build_crubit.py')] |
| if build_mac_arm: |
| build_cmd.append('--build-mac-arm') |
| # TODO(https://crbug.com/1329611): Default to `fail_hard` once we |
| # actually depend on the build step (i.e. once we start packaging |
| # Crubit). |
| TeeCmd(build_cmd, log, fail_hard=False) |
| |
| # TODO(https://crbug.com/1329611): Rename this function to |
| # BuildAndInstallCrubit and actually install Crubit binaries into |
| # RUST_TOOLCHAIN_OUT_DIR/bin (once we gain confidence that Crubit continues |
| # to build uneventfully on the bots). |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description='build and package Rust') |
| parser.add_argument('--upload', |
| action='store_true', |
| help='upload package to GCS') |
| parser.add_argument( |
| '--bucket', |
| default=DEFAULT_GCS_BUCKET, |
| help='Google Cloud Storage bucket where the target archive is uploaded' |
| ) |
| parser.add_argument('--build-mac-arm', |
| action='store_true', |
| help='Build arm binaries. Only valid on macOS.') |
| args = parser.parse_args() |
| |
| if args.build_mac_arm and sys.platform != 'darwin': |
| print('--build-mac-arm only valid on macOS') |
| return 1 |
| if args.build_mac_arm and platform.machine() == 'arm64': |
| print('--build-mac-arm only valid on intel to cross-build arm') |
| return 1 |
| |
| # The gcs_platform logic copied from `//tools/clang/scripts/upload.sh`. |
| if sys.platform == 'darwin': |
| # The --build-mac-intel switch can be used to force the Mac build to |
| # target arm64. |
| if args.build_mac_arm or platform.machine() == 'arm64': |
| gcs_platform = 'Mac_arm64' |
| else: |
| gcs_platform = 'Mac' |
| elif sys.platform == 'win32': |
| gcs_platform = 'Win' |
| else: |
| gcs_platform = 'Linux_x64' |
| |
| # Clean build output directory. |
| if os.path.exists(RUST_TOOLCHAIN_OUT_DIR): |
| shutil.rmtree(RUST_TOOLCHAIN_OUT_DIR) |
| |
| with open(os.path.join(THIRD_PARTY_DIR, BUILDLOG_NAME), 'w') as log: |
| # Build the Rust toolchain. |
| build_cmd = [sys.executable, os.path.join(THIS_DIR, 'build_rust.py')] |
| if args.build_mac_arm: |
| build_cmd.append('--build-mac-arm') |
| TeeCmd(build_cmd, log) |
| |
| # Build bindgen. |
| build_cmd = [ |
| sys.executable, |
| os.path.join(THIS_DIR, 'build_bindgen.py') |
| ] |
| if args.build_mac_arm: |
| build_cmd.append('--build-mac-arm') |
| TeeCmd(build_cmd, log) |
| |
| # Strip everything in bin/ to reduce the package size. |
| bin_dir_path = os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'bin') |
| if sys.platform != 'win32' and os.path.exists(bin_dir_path): |
| for f in os.listdir(bin_dir_path): |
| file_path = os.path.join(bin_dir_path, f) |
| if not os.path.islink(file_path): |
| subprocess.call(['strip', file_path]) |
| |
| with tarfile.open(os.path.join(THIRD_PARTY_DIR, |
| RUST_TOOLCHAIN_PACKAGE_NAME), |
| 'w:xz', |
| preset=9 | lzma.PRESET_EXTREME) as tar: |
| tar.add(RUST_TOOLCHAIN_OUT_DIR, arcname='rust-toolchain') |
| |
| os.chdir(THIRD_PARTY_DIR) |
| MaybeUpload(args.upload, args.bucket, RUST_TOOLCHAIN_PACKAGE_NAME, |
| gcs_platform) |
| MaybeUpload(args.upload, args.bucket, BUILDLOG_NAME, gcs_platform) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |