1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python 2*c8dee2aaSAndroid Build Coastguard Worker 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2019 Google LLC. 4*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Worker""" 8*c8dee2aaSAndroid Build Coastguard Workerupdate_fuchsia_sdk 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker Downloads both the Fuchsia SDK and Fuchsia-compatible clang 11*c8dee2aaSAndroid Build Coastguard Worker zip archives from chrome infra (CIPD) and extracts them to 12*c8dee2aaSAndroid Build Coastguard Worker the arg-provide |sdk_dir| and |clang_dir| respectively. This 13*c8dee2aaSAndroid Build Coastguard Worker provides the complete toolchain required to build Fuchsia binaries 14*c8dee2aaSAndroid Build Coastguard Worker from the Fuchsia SDK. 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker""" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Workerimport argparse 19*c8dee2aaSAndroid Build Coastguard Workerimport errno 20*c8dee2aaSAndroid Build Coastguard Workerimport logging 21*c8dee2aaSAndroid Build Coastguard Workerimport os 22*c8dee2aaSAndroid Build Coastguard Workerimport platform 23*c8dee2aaSAndroid Build Coastguard Workerimport shutil 24*c8dee2aaSAndroid Build Coastguard Workerimport subprocess 25*c8dee2aaSAndroid Build Coastguard Workerimport tempfile 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Workerdef MessageExit(message): 28*c8dee2aaSAndroid Build Coastguard Worker logging.error(message) 29*c8dee2aaSAndroid Build Coastguard Worker sys.exit(1) 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker# Verify that "cipd" tool is readily available. 32*c8dee2aaSAndroid Build Coastguard Workerdef CipdLives(): 33*c8dee2aaSAndroid Build Coastguard Worker err_msg = "Cipd not found, please install. See: " + \ 34*c8dee2aaSAndroid Build Coastguard Worker "https://commondatastorage.googleapis.com/chrome-infra-docs/flat" + \ 35*c8dee2aaSAndroid Build Coastguard Worker "/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up" 36*c8dee2aaSAndroid Build Coastguard Worker try: 37*c8dee2aaSAndroid Build Coastguard Worker subprocess.call(["cipd", "--version"]) 38*c8dee2aaSAndroid Build Coastguard Worker except OSError as e: 39*c8dee2aaSAndroid Build Coastguard Worker if e.errno == errno.ENOENT: 40*c8dee2aaSAndroid Build Coastguard Worker MessageExit(err_msg) 41*c8dee2aaSAndroid Build Coastguard Worker else: 42*c8dee2aaSAndroid Build Coastguard Worker MessageExit("cipd command execution failed.") 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker# Download and unzip CIPD package archive. 45*c8dee2aaSAndroid Build Coastguard Workerdef DownloadAndUnzip(pkg_name, version, cipd_cache_dir, output_dir): 46*c8dee2aaSAndroid Build Coastguard Worker pkg_suffix = pkg_name.replace('/', '-') + ".zip" 47*c8dee2aaSAndroid Build Coastguard Worker zip_file = tempfile.NamedTemporaryFile(suffix=pkg_suffix, delete=False) 48*c8dee2aaSAndroid Build Coastguard Worker cipd_cmd = "cipd pkg-fetch " + pkg_name + " -version \"" + version + "\" -out " + \ 49*c8dee2aaSAndroid Build Coastguard Worker zip_file.name + " -cache-dir " + cipd_cache_dir 50*c8dee2aaSAndroid Build Coastguard Worker unzip_cmd = "unzip -q " + zip_file.name + " -d " + output_dir 51*c8dee2aaSAndroid Build Coastguard Worker os.system(cipd_cmd) 52*c8dee2aaSAndroid Build Coastguard Worker os.system(unzip_cmd) 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Workerdef Main(): 55*c8dee2aaSAndroid Build Coastguard Worker CipdLives() 56*c8dee2aaSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 57*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument("-sdk_dir", type=str, 58*c8dee2aaSAndroid Build Coastguard Worker help="Destination directory for the fuchsia SDK.") 59*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument("-clang_dir", type=str, 60*c8dee2aaSAndroid Build Coastguard Worker help="Destination directory for the fuchsia toolchain.") 61*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument("-overwrite_dirs", type=bool, default=False, 62*c8dee2aaSAndroid Build Coastguard Worker help="REMOVES existing sdk and clang dirs and makes new ones. When false " + 63*c8dee2aaSAndroid Build Coastguard Worker " the unzip command issue will require file overwrite confirmation.") 64*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument("-cipd_cache_dir", type=str, default="/tmp", required=False, 65*c8dee2aaSAndroid Build Coastguard Worker help="Cache directory for CIPD downloads to prevent redundant downloads.") 66*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument("-cipd_sdk_version", type=str, default="latest", required=False, 67*c8dee2aaSAndroid Build Coastguard Worker help="CIPD sdk version to download, e.g.: git_revision:fce11c6904c888e6d39f71e03806a540852dec41") 68*c8dee2aaSAndroid Build Coastguard Worker parser.add_argument("-cipd_clang_version", type=str, default="latest", required=False, 69*c8dee2aaSAndroid Build Coastguard Worker help="CIPD clang version to download, e.g.: git_revision:fce11c6904c888e6d39f71e03806a540852dec41") 70*c8dee2aaSAndroid Build Coastguard Worker args = parser.parse_args() 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker sdk_dir = args.sdk_dir 73*c8dee2aaSAndroid Build Coastguard Worker clang_dir = args.clang_dir 74*c8dee2aaSAndroid Build Coastguard Worker cipd_sdk_version = args.cipd_sdk_version 75*c8dee2aaSAndroid Build Coastguard Worker cipd_clang_version = args.cipd_clang_version 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker if args.overwrite_dirs: 78*c8dee2aaSAndroid Build Coastguard Worker dirs = [sdk_dir, clang_dir] 79*c8dee2aaSAndroid Build Coastguard Worker for curr_dir in dirs: 80*c8dee2aaSAndroid Build Coastguard Worker try: 81*c8dee2aaSAndroid Build Coastguard Worker if os.path.exists(curr_dir): 82*c8dee2aaSAndroid Build Coastguard Worker shutil.rmtree(curr_dir) 83*c8dee2aaSAndroid Build Coastguard Worker os.makedirs(curr_dir) 84*c8dee2aaSAndroid Build Coastguard Worker except OSError: 85*c8dee2aaSAndroid Build Coastguard Worker MessageExit("Creation of the directory %s failed" % curr_dir) 86*c8dee2aaSAndroid Build Coastguard Worker else: 87*c8dee2aaSAndroid Build Coastguard Worker # Make dirs for sdk and clang. 88*c8dee2aaSAndroid Build Coastguard Worker if not os.path.exists(sdk_dir): 89*c8dee2aaSAndroid Build Coastguard Worker os.makedirs(sdk_dir) 90*c8dee2aaSAndroid Build Coastguard Worker if not os.path.exists(clang_dir): 91*c8dee2aaSAndroid Build Coastguard Worker os.makedirs(clang_dir) 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker # Verify that existing dirs are writable. 94*c8dee2aaSAndroid Build Coastguard Worker if (not os.access(sdk_dir, os.W_OK)) or (not os.path.isdir(sdk_dir)): 95*c8dee2aaSAndroid Build Coastguard Worker MessageExit("Can't write to sdk dir " + sdk_dir) 96*c8dee2aaSAndroid Build Coastguard Worker if (not os.access(clang_dir, os.W_OK)) or (not os.path.isdir(clang_dir)): 97*c8dee2aaSAndroid Build Coastguard Worker MessageExit("Can't write to clang dir " + clang_dir) 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker ostype = platform.system() 100*c8dee2aaSAndroid Build Coastguard Worker if ostype == "Linux": 101*c8dee2aaSAndroid Build Coastguard Worker os_string = "linux-amd64" 102*c8dee2aaSAndroid Build Coastguard Worker elif ostype == "Darwin": 103*c8dee2aaSAndroid Build Coastguard Worker os_string = "mac-amd64" 104*c8dee2aaSAndroid Build Coastguard Worker else: 105*c8dee2aaSAndroid Build Coastguard Worker MessageExit("Unknown host " + ostype) 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker # |sdk_pkg| and |clang_pkg| below are prescribed paths defined by chrome-infra. 108*c8dee2aaSAndroid Build Coastguard Worker sdk_pkg = "fuchsia/sdk/core/" + os_string 109*c8dee2aaSAndroid Build Coastguard Worker DownloadAndUnzip(sdk_pkg, cipd_sdk_version, args.cipd_cache_dir, sdk_dir) 110*c8dee2aaSAndroid Build Coastguard Worker clang_pkg = "fuchsia/clang/" + os_string 111*c8dee2aaSAndroid Build Coastguard Worker DownloadAndUnzip(clang_pkg, cipd_clang_version, args.cipd_cache_dir, clang_dir) 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Workerif __name__ == "__main__": 114*c8dee2aaSAndroid Build Coastguard Worker import sys 115*c8dee2aaSAndroid Build Coastguard Worker Main() 116