116 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
# Copyright 2019 Google LLC.
 | 
						|
# Use of this source code is governed by a BSD-style license that can be
 | 
						|
# found in the LICENSE file.
 | 
						|
 | 
						|
"""
 | 
						|
update_fuchsia_sdk
 | 
						|
 | 
						|
  Downloads both the Fuchsia SDK and Fuchsia-compatible clang
 | 
						|
  zip archives from chrome infra (CIPD) and extracts them to
 | 
						|
  the arg-provide |sdk_dir| and |clang_dir| respectively.  This
 | 
						|
  provides the complete toolchain required to build Fuchsia binaries
 | 
						|
  from the Fuchsia SDK.
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
import argparse
 | 
						|
import errno
 | 
						|
import logging
 | 
						|
import os
 | 
						|
import platform
 | 
						|
import shutil
 | 
						|
import subprocess
 | 
						|
import tempfile
 | 
						|
 | 
						|
def MessageExit(message):
 | 
						|
  logging.error(message)
 | 
						|
  sys.exit(1)
 | 
						|
 | 
						|
# Verify that "cipd" tool is readily available.
 | 
						|
def CipdLives():
 | 
						|
    err_msg = "Cipd not found, please install. See: " + \
 | 
						|
              "https://commondatastorage.googleapis.com/chrome-infra-docs/flat" + \
 | 
						|
              "/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up"
 | 
						|
    try:
 | 
						|
        subprocess.call(["cipd", "--version"])
 | 
						|
    except OSError as e:
 | 
						|
        if e.errno == errno.ENOENT:
 | 
						|
            MessageExit(err_msg)
 | 
						|
        else:
 | 
						|
            MessageExit("cipd command execution failed.")
 | 
						|
 | 
						|
# Download and unzip CIPD package archive.
 | 
						|
def DownloadAndUnzip(pkg_name, version, cipd_cache_dir, output_dir):
 | 
						|
  pkg_suffix = pkg_name.replace('/', '-') + ".zip"
 | 
						|
  zip_file = tempfile.NamedTemporaryFile(suffix=pkg_suffix, delete=False)
 | 
						|
  cipd_cmd = "cipd pkg-fetch " + pkg_name + " -version \"" + version + "\" -out " + \
 | 
						|
      zip_file.name + " -cache-dir " + cipd_cache_dir
 | 
						|
  unzip_cmd = "unzip -q " + zip_file.name + " -d " + output_dir
 | 
						|
  os.system(cipd_cmd)
 | 
						|
  os.system(unzip_cmd)
 | 
						|
 | 
						|
def Main():
 | 
						|
  CipdLives()
 | 
						|
  parser = argparse.ArgumentParser()
 | 
						|
  parser.add_argument("-sdk_dir", type=str,
 | 
						|
          help="Destination directory for the fuchsia SDK.")
 | 
						|
  parser.add_argument("-clang_dir", type=str,
 | 
						|
          help="Destination directory for the fuchsia toolchain.")
 | 
						|
  parser.add_argument("-overwrite_dirs", type=bool, default=False,
 | 
						|
          help="REMOVES existing sdk and clang dirs and makes new ones.  When false " +
 | 
						|
               "  the unzip command issue will require file overwrite confirmation.")
 | 
						|
  parser.add_argument("-cipd_cache_dir", type=str, default="/tmp", required=False,
 | 
						|
          help="Cache directory for CIPD downloads to prevent redundant downloads.")
 | 
						|
  parser.add_argument("-cipd_sdk_version", type=str, default="latest", required=False,
 | 
						|
          help="CIPD sdk version to download, e.g.: git_revision:fce11c6904c888e6d39f71e03806a540852dec41")
 | 
						|
  parser.add_argument("-cipd_clang_version", type=str, default="latest", required=False,
 | 
						|
          help="CIPD clang version to download, e.g.: git_revision:fce11c6904c888e6d39f71e03806a540852dec41")
 | 
						|
  args = parser.parse_args()
 | 
						|
 | 
						|
  sdk_dir = args.sdk_dir
 | 
						|
  clang_dir = args.clang_dir
 | 
						|
  cipd_sdk_version = args.cipd_sdk_version
 | 
						|
  cipd_clang_version = args.cipd_clang_version
 | 
						|
 | 
						|
  if args.overwrite_dirs:
 | 
						|
    dirs = [sdk_dir, clang_dir]
 | 
						|
    for curr_dir in dirs:
 | 
						|
      try:
 | 
						|
        if os.path.exists(curr_dir):
 | 
						|
            shutil.rmtree(curr_dir)
 | 
						|
        os.makedirs(curr_dir)
 | 
						|
      except OSError:
 | 
						|
        MessageExit("Creation of the directory %s failed" % curr_dir)
 | 
						|
  else:
 | 
						|
    # Make dirs for sdk and clang.
 | 
						|
    if not os.path.exists(sdk_dir):
 | 
						|
        os.makedirs(sdk_dir)
 | 
						|
    if not os.path.exists(clang_dir):
 | 
						|
        os.makedirs(clang_dir)
 | 
						|
 | 
						|
    # Verify that existing dirs are writable.
 | 
						|
    if (not os.access(sdk_dir, os.W_OK)) or (not os.path.isdir(sdk_dir)):
 | 
						|
      MessageExit("Can't write to sdk dir " + sdk_dir)
 | 
						|
    if (not os.access(clang_dir, os.W_OK)) or (not os.path.isdir(clang_dir)):
 | 
						|
      MessageExit("Can't write to clang dir " + clang_dir)
 | 
						|
 
 | 
						|
  ostype = platform.system()
 | 
						|
  if ostype == "Linux":
 | 
						|
    os_string = "linux-amd64"
 | 
						|
  elif ostype == "Darwin":
 | 
						|
    os_string = "mac-amd64"
 | 
						|
  else:
 | 
						|
    MessageExit("Unknown host " + ostype)
 | 
						|
 | 
						|
  # |sdk_pkg| and |clang_pkg| below are prescribed paths defined by chrome-infra.
 | 
						|
  sdk_pkg = "fuchsia/sdk/core/" + os_string
 | 
						|
  DownloadAndUnzip(sdk_pkg, cipd_sdk_version, args.cipd_cache_dir, sdk_dir)
 | 
						|
  clang_pkg = "fuchsia/clang/" + os_string
 | 
						|
  DownloadAndUnzip(clang_pkg, cipd_clang_version, args.cipd_cache_dir, clang_dir)
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
  import sys
 | 
						|
  Main()
 |