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()
 |