in src/coreclr/scripts/superpmi.py [0:0]
def setup_args(args):
""" Setup the args for SuperPMI to use.
Args:
args (ArgParse): args parsed by arg parser
Returns:
args (CoreclrArguments)
"""
# Start setting up logging.
# Set up the console logger immediately. Later, after we've parsed some arguments, we'll add the file logger and
# change the console logger level to the one parsed by the arguments. We need to do this initial setup before the first
# logging command is executed.
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("[%(asctime)s] %(message)s", datefmt="%H:%M:%S")
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(logging.DEBUG)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
# Parse the arguments
coreclr_args = CoreclrArguments(args, require_built_core_root=False, require_built_product_dir=False, require_built_test_dir=False, default_build_type="Checked")
coreclr_args.verify(args,
"mode", # "mode" is from the `parser.add_subparsers(dest='mode')` call
lambda unused: True,
"Unable to set mode")
coreclr_args.verify(args,
"log_level",
lambda arg: any(arg.upper() == level for level in [ "CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG" ]),
"Unable to set log_level {}".format,
modify_arg=lambda arg: "INFO" if arg is None else arg.upper())
coreclr_args.verify(args,
"log_file",
lambda unused: True,
"Unable to set log_file.")
def setup_spmi_location_arg(spmi_location):
if spmi_location is None:
if "SUPERPMI_CACHE_DIRECTORY" in os.environ:
spmi_location = os.environ["SUPERPMI_CACHE_DIRECTORY"]
spmi_location = os.path.abspath(spmi_location)
else:
spmi_location = os.path.abspath(os.path.join(coreclr_args.artifacts_location, "spmi"))
return spmi_location
coreclr_args.verify(args,
"spmi_location",
lambda unused: True,
"Unable to set spmi_location",
modify_arg=setup_spmi_location_arg)
coreclr_args.verify(args,
"no_progress",
lambda unused: True,
"Unable to set no_progress")
# Finish setting up logging.
# The spmi_location is the root directory where we put the log file.
# Log everything to the log file and only the specified verbosity to the console logger.
# Now, change the stream handler output level.
stream_handler.setLevel(coreclr_args.log_level)
log_file = None
if coreclr_args.log_file is None:
if hasattr(coreclr_args, "spmi_location"):
log_file = create_unique_file_name(coreclr_args.spmi_location, "superpmi", "log")
if not os.path.isdir(coreclr_args.spmi_location):
os.makedirs(coreclr_args.spmi_location)
else:
log_file = coreclr_args.log_file
log_dir = os.path.dirname(log_file)
if not os.path.isdir(log_dir):
print("Creating log directory {} for log file {}".format(log_dir, log_file))
os.makedirs(log_dir)
if log_file is not None:
# If the log file exists, we could use the default behavior and simply append.
# For now, though, just delete it and warn. We can change behavior later if there's user feedback on it.
if os.path.isfile(log_file):
logging.critical("Warning: deleting existing log file %s", log_file)
os.remove(log_file)
file_handler = logging.FileHandler(log_file, encoding='utf8')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logging.critical("================ Logging to %s", log_file)
# Finish verifying the arguments
def setup_jit_ee_version_arg(jit_ee_version):
if jit_ee_version is not None:
# The user passed a specific jit_ee_version on the command-line, so use that
return jit_ee_version
return determine_jit_ee_version(coreclr_args)
def setup_jit_path_arg(jit_path):
if jit_path is not None:
return os.path.abspath(jit_path)
return find_tool(coreclr_args, get_jit_name(coreclr_args), search_path=False) # It doesn't make sense to search PATH for the JIT dll.
def setup_error_limit(error_limit):
if error_limit is None:
return None
elif not error_limit.isnumeric():
return None
return error_limit
def verify_jit_ee_version_arg():
coreclr_args.verify(args,
"jit_ee_version",
lambda unused: True,
"Invalid JIT-EE Version.",
modify_arg=setup_jit_ee_version_arg)
def verify_target_args():
coreclr_args.verify(args,
"target_os",
lambda target_os: check_target_os(coreclr_args, target_os),
lambda target_os: "Unknown target_os {}\nSupported OS: {}".format(target_os, (", ".join(coreclr_args.valid_host_os))),
modify_arg=lambda target_os: target_os if target_os is not None else coreclr_args.host_os) # Default to `host_os`
coreclr_args.verify(args,
"target_arch",
lambda target_arch: check_target_arch(coreclr_args, target_arch),
lambda target_arch: "Unknown target_arch {}\nSupported architectures: {}".format(target_arch, (", ".join(coreclr_args.valid_arches))),
modify_arg=lambda target_arch: target_arch if target_arch is not None else coreclr_args.arch) # Default to `arch`
coreclr_args.verify(args,
"mch_arch",
lambda mch_arch: check_mch_arch(coreclr_args, mch_arch),
lambda mch_arch: "Unknown mch_arch {}\nSupported architectures: {}".format(mch_arch, (", ".join(coreclr_args.valid_arches))),
modify_arg=lambda mch_arch: mch_arch if mch_arch is not None else coreclr_args.target_arch) # Default to `target_arch`
def verify_superpmi_common_args():
coreclr_args.verify(args,
"break_on_assert",
lambda unused: True,
"Unable to set break_on_assert")
coreclr_args.verify(args,
"break_on_error",
lambda unused: True,
"Unable to set break_on_error")
coreclr_args.verify(args,
"skip_cleanup",
lambda unused: True,
"Unable to set skip_cleanup")
coreclr_args.verify(args,
"sequential",
lambda unused: True,
"Unable to set sequential.")
coreclr_args.verify(args,
"error_limit",
lambda unused: True,
"Unable to set error_limit",
modify_arg=setup_error_limit)
coreclr_args.verify(args,
"spmi_log_file",
lambda unused: True,
"Unable to set spmi_log_file.")
if coreclr_args.spmi_log_file is not None and not coreclr_args.sequential:
print("-spmi_log_file requires --sequential")
sys.exit(1)
def verify_replay_common_args():
verify_jit_ee_version_arg()
coreclr_args.verify(args,
"force_download",
lambda unused: True,
"Unable to set force_download")
coreclr_args.verify(args,
"jit_name",
lambda unused: True,
"Unable to set jit_name.")
coreclr_args.verify(args,
"altjit", # Must be set before `jit_path` (get_jit_name() depends on it)
lambda unused: True,
"Unable to set altjit.")
coreclr_args.verify(args,
"filter",
lambda unused: True,
"Unable to set filter.")
coreclr_args.verify(args,
"mch_files",
lambda unused: True,
"Unable to set mch_files")
coreclr_args.verify(args,
"compile",
lambda unused: True,
"Method context not valid")
coreclr_args.verify(args,
"produce_repro",
lambda unused: True,
"Unable to set produce_repro")
coreclr_args.verify(args,
"private_store",
lambda item: True,
"Specify private_store or set environment variable SUPERPMI_PRIVATE_STORE to use a private store.",
modify_arg=lambda arg: os.environ["SUPERPMI_PRIVATE_STORE"].split(";") if arg is None and "SUPERPMI_PRIVATE_STORE" in os.environ else arg)
def verify_base_diff_args():
coreclr_args.verify(args,
"base_jit_path",
lambda unused: True,
"Unable to set base_jit_path")
coreclr_args.verify(args,
"diff_jit_path",
os.path.isfile,
"Error: JIT not found at diff_jit_path {}".format,
modify_arg=setup_jit_path_arg)
coreclr_args.verify(args,
"git_hash",
lambda unused: True,
"Unable to set git_hash")
coreclr_args.verify(args,
"base_git_hash",
lambda unused: True,
"Unable to set base_git_hash")
coreclr_args.verify(args,
"jitoption",
lambda unused: True,
"Unable to set jitoption")
coreclr_args.verify(args,
"base_jit_option",
lambda unused: True,
"Unable to set base_jit_option.")
coreclr_args.verify(args,
"diff_jit_option",
lambda unused: True,
"Unable to set diff_jit_option.")
if coreclr_args.jitoption:
for o in coreclr_args.jitoption:
if o.startswith("DOTNET_"):
logging.warning("")
logging.warning("WARNING: `-jitoption` starts with DOTNET_ : " + o)
logging.warning("")
if coreclr_args.base_jit_option:
for o in coreclr_args.base_jit_option:
if o.startswith("DOTNET_"):
logging.warning("")
logging.warning("WARNING: `-base_jit_option` starts with DOTNET_ : " + o)
logging.warning("")
if coreclr_args.diff_jit_option:
for o in coreclr_args.diff_jit_option:
if o.startswith("DOTNET_"):
logging.warning("")
logging.warning("WARNING: `-diff_jit_option` starts with DOTNET_ : " + o)
logging.warning("")
if coreclr_args.mode == "collect":
verify_target_args()
verify_superpmi_common_args()
coreclr_args.verify(args,
"jit_name", # The replay code checks this, so make sure it's set
lambda unused: True,
"Unable to set jit_name.")
coreclr_args.verify(args,
"altjit", # The replay code checks this, so make sure it's set
lambda unused: True,
"Unable to set altjit.")
coreclr_args.verify(args,
"jitoption", # The replay code checks this, so make sure it's set
lambda unused: True,
"Unable to set jitoption")
coreclr_args.verify(args,
"compile", # The replay code checks this, so make sure it's set
lambda unused: True,
"Method context not valid")
coreclr_args.verify(args,
"produce_repro", # The replay code checks this, so make sure it's set
lambda unused: True,
"Unable to set produce_repro")
coreclr_args.verify(args,
"collection_command",
lambda unused: True,
"Unable to set collection_command.")
coreclr_args.verify(args,
"collection_args",
lambda unused: True,
"Unable to set collection_args",
modify_arg=lambda collection_args: collection_args.split(" ") if collection_args is not None else [])
coreclr_args.verify(args,
"pmi",
lambda unused: True,
"Unable to set pmi")
coreclr_args.verify(args,
"crossgen2",
lambda unused: True,
"Unable to set crossgen2")
coreclr_args.verify(args,
"nativeaot",
lambda unused: True,
"Unable to set nativeaot")
coreclr_args.verify(args,
"assemblies",
lambda unused: True,
"Unable to set assemblies",
modify_arg=lambda items: [item for item in items if os.path.isdir(item) or os.path.isfile(item)])
coreclr_args.verify(args,
"ilc_rsps",
lambda unused: True,
"Unable to set ilc_rsps",
modify_arg=lambda items: [item for item in items if os.path.isdir(item) or os.path.isfile(item)])
coreclr_args.verify(args,
"exclude",
lambda unused: True,
"Unable to set exclude")
coreclr_args.verify(args,
"pmi_location",
lambda unused: True,
"Unable to set pmi_location")
coreclr_args.verify(args,
"output_mch_path",
lambda output_mch_path: output_mch_path is None or (not os.path.isdir(os.path.abspath(output_mch_path)) and not os.path.isfile(os.path.abspath(output_mch_path))),
"Invalid output_mch_path \"{}\"; is it an existing directory or file?".format,
modify_arg=lambda output_mch_path: None if output_mch_path is None else os.path.abspath(output_mch_path))
coreclr_args.verify(args,
"merge_mch_files",
lambda unused: True,
"Unable to set merge_mch_files.")
coreclr_args.verify(args,
"mch_files",
lambda items: items is None or len(items) > 0,
"Unable to set mch_files.")
coreclr_args.verify(args,
"skip_collect_mc_files",
lambda unused: True,
"Unable to set skip_collect_mc_files")
coreclr_args.verify(args,
"temp_dir",
lambda unused: True,
"Unable to set temp_dir.")
coreclr_args.verify(args,
"skip_collection_step",
lambda unused: True,
"Unable to set skip_collection_step.")
coreclr_args.verify(args,
"skip_merge_step",
lambda unused: True,
"Unable to set skip_merge_step.")
coreclr_args.verify(args,
"skip_toc_step",
lambda unused: True,
"Unable to set skip_toc_step.")
coreclr_args.verify(args,
"ci",
lambda unused: True,
"Unable to set ci.")
coreclr_args.verify(args,
"clean",
lambda unused: True,
"Unable to set clean.")
coreclr_args.verify(args,
"disable_r2r",
lambda unused: True,
"Unable to set disable_r2r")
coreclr_args.verify(args,
"tiered_compilation",
lambda unused: True,
"Unable to set tiered_compilation")
coreclr_args.verify(args,
"tiered_pgo",
lambda unused: True,
"Unable to set tiered_pgo")
coreclr_args.verify(args,
"pmi_path",
lambda unused: True,
"Unable to set pmi_path")
if (args.collection_command is None) and (args.pmi is False) and (args.crossgen2 is False) and (args.nativeaot is False) and not coreclr_args.skip_collection_step:
print("Either a collection command or `--pmi` or `--crossgen2` or `--nativeaot` or `--skip_collection_step` must be specified")
sys.exit(1)
if (args.collection_command is not None) and (len(args.assemblies) > 0):
print("Don't specify `-assemblies` if a collection command is given")
sys.exit(1)
if (args.collection_command is not None) and (len(args.ilc_rsps) > 0):
print("Don't specify `-ilc_rsps` if a collection command is given")
sys.exit(1)
if (args.collection_command is not None) and (len(args.exclude) > 0):
print("Don't specify `-exclude` if a collection command is given")
sys.exit(1)
if ((args.pmi is True) or (args.crossgen2 is True)) and (len(args.assemblies) == 0):
print("Specify `-assemblies` if `--pmi` or `--crossgen2` is given")
sys.exit(1)
if ((args.nativeaot is True)) and (len(args.ilc_rsps) == 0):
print("Specify `-ilc_rsps` if `--nativeaot` is given")
sys.exit(1)
if not args.pmi:
if args.pmi_path is not None:
logging.warning("Warning: -pmi_path is set but --pmi is not.")
if args.pmi_location is not None:
logging.warning("Warning: -pmi_location is set but --pmi is not.")
if args.collection_command is None and args.merge_mch_files is not True and not coreclr_args.skip_collection_step:
assert args.collection_args is None
if args.nativeaot:
assert len(args.ilc_rsps) > 0
else:
assert (args.pmi is True) or (args.crossgen2 is True)
assert len(args.assemblies) > 0
if coreclr_args.merge_mch_files:
assert len(coreclr_args.mch_files) > 0
coreclr_args.skip_collection_step = True
if coreclr_args.crossgen2:
# Can we find crossgen2?
crossgen2_tool_name = "crossgen2.dll"
crossgen2_tool_path = os.path.abspath(os.path.join(coreclr_args.core_root, "crossgen2", crossgen2_tool_name))
if not os.path.exists(crossgen2_tool_path):
print("`--crossgen2` is specified, but couldn't find " + crossgen2_tool_path + ". (Is it built?)")
sys.exit(1)
# Which dotnet will we use to run it?
dotnet_script_name = "dotnet.cmd" if platform.system() == "Windows" else "dotnet.sh"
dotnet_tool_path = os.path.abspath(os.path.join(coreclr_args.runtime_repo_location, dotnet_script_name))
if not os.path.exists(dotnet_tool_path):
dotnet_tool_name = determine_dotnet_tool_name(coreclr_args)
dotnet_tool_path = find_tool(coreclr_args, dotnet_tool_name, search_core_root=False, search_product_location=False, search_path=True, throw_on_not_found=False) # Only search path
coreclr_args.crossgen2_tool_path = crossgen2_tool_path
coreclr_args.dotnet_tool_path = dotnet_tool_path
logging.debug("Using crossgen2 tool %s", coreclr_args.crossgen2_tool_path)
if coreclr_args.dotnet_tool_path is not None:
logging.debug("Using dotnet tool %s", coreclr_args.dotnet_tool_path)
if coreclr_args.nativeaot:
# Can we find nativeaot?
nativeaot_tool_name = "ilc.exe" if platform.system() == "Windows" else "ilc"
nativeaot_tool_path = os.path.abspath(os.path.join(coreclr_args.core_root, "ilc-published", nativeaot_tool_name))
nativeaot_aotsdk_path = os.path.abspath(os.path.join(coreclr_args.core_root, "aotsdk"))
if not os.path.exists(nativeaot_tool_path):
print("`--nativeaot` is specified, but couldn't find " + nativeaot_tool_path + ". (Is it built?)")
sys.exit(1)
if not os.path.exists(nativeaot_aotsdk_path):
print("`--nativeaot` is specified, but couldn't find directory " + nativeaot_aotsdk_path + ". (Is it built?)")
sys.exit(1)
# dotnet will not be used to run ilc.exe, but we need to establish the dotnet tool path regardless
dotnet_script_name = "dotnet.cmd" if platform.system() == "Windows" else "dotnet.sh"
dotnet_tool_path = os.path.abspath(os.path.join(coreclr_args.runtime_repo_location, dotnet_script_name))
if not os.path.exists(dotnet_tool_path):
dotnet_tool_name = determine_dotnet_tool_name(coreclr_args)
dotnet_tool_path = find_tool(coreclr_args, dotnet_tool_name, search_core_root=False, search_product_location=False, search_path=True, throw_on_not_found=False) # Only search path
coreclr_args.nativeaot_tool_path = nativeaot_tool_path
coreclr_args.nativeaot_aotsdk_path = nativeaot_aotsdk_path
coreclr_args.dotnet_tool_path = dotnet_tool_path
logging.debug("Using nativeaot tool %s", coreclr_args.nativeaot_tool_path)
if coreclr_args.dotnet_tool_path is not None:
logging.debug("Using dotnet tool %s", coreclr_args.dotnet_tool_path)
if coreclr_args.temp_dir is not None:
coreclr_args.temp_dir = os.path.abspath(coreclr_args.temp_dir)
logging.debug("Using temp_dir %s", coreclr_args.temp_dir)
if coreclr_args.collection_command is not None:
if os.path.isfile(coreclr_args.collection_command):
coreclr_args.collection_command = os.path.abspath(coreclr_args.collection_command)
else:
# Look on path and in Core_Root. Searching Core_Root is useful so you can just specify "corerun.exe" as the collection command in it can be found.
collection_tool_path = find_tool(coreclr_args, coreclr_args.collection_command, search_core_root=True, search_product_location=False, search_path=True, throw_on_not_found=False)
if collection_tool_path is None:
print("Couldn't find collection command \"{}\"".format(coreclr_args.collection_command))
sys.exit(1)
coreclr_args.collection_command = collection_tool_path
logging.info("Using collection command from PATH: \"%s\"", coreclr_args.collection_command)
elif coreclr_args.mode == "replay":
verify_target_args()
verify_superpmi_common_args()
verify_replay_common_args()
coreclr_args.verify(args,
"jit_path",
os.path.isfile,
"Error: JIT not found at jit_path {}".format,
modify_arg=setup_jit_path_arg)
coreclr_args.verify(args,
"jitoption",
lambda unused: True,
"Unable to set jitoption")
jit_in_product_location = False
if coreclr_args.product_location.lower() in coreclr_args.jit_path.lower():
jit_in_product_location = True
determined_arch = None
determined_build_type = None
if jit_in_product_location:
# Get os/arch/flavor directory, e.g. split "F:\gh\runtime\artifacts\bin\coreclr\windows.x64.Checked" with "F:\gh\runtime\artifacts\bin\coreclr"
# yielding
# [0]: ""
# [1]: "\windows.x64.Checked"
standard_location_split = os.path.dirname(coreclr_args.jit_path).split(os.path.dirname(coreclr_args.product_location))
assert coreclr_args.host_os in standard_location_split[1]
# Get arch/flavor. Remove leading slash.
specialized_path = standard_location_split[1].split(os.path.sep)[1]
# Split components: "windows.x64.Checked" into:
# [0]: "windows"
# [1]: "x64"
# [2]: "Checked"
determined_split = specialized_path.split(".")
determined_arch = determined_split[1]
determined_build_type = determined_split[2]
# Make a more intelligent decision about the arch and build type
# based on the path of the jit passed
if jit_in_product_location and coreclr_args.build_type not in coreclr_args.jit_path:
coreclr_args.verify(determined_arch.lower(),
"arch",
lambda unused: True,
"Unable to set arch")
coreclr_args.verify(determined_build_type,
"build_type",
coreclr_args.check_build_type,
"Invalid build_type")
if coreclr_args.jitoption:
for o in coreclr_args.jitoption:
if o.startswith("DOTNET_"):
logging.warning("")
logging.warning("WARNING: `-jitoption` starts with DOTNET_ : " + o)
logging.warning("")
elif coreclr_args.mode == "asmdiffs":
verify_target_args()
verify_superpmi_common_args()
verify_replay_common_args()
verify_base_diff_args()
coreclr_args.verify(args,
"gcinfo",
lambda unused: True,
"Unable to set gcinfo.")
coreclr_args.verify(args,
"debuginfo",
lambda unused: True,
"Unable to set debuginfo.")
coreclr_args.verify(args,
"alignloops",
lambda unused: True,
"Unable to set alignloops.")
coreclr_args.verify(args,
"diff_jit_dump",
lambda unused: True,
"Unable to set diff_jit_dump.")
coreclr_args.verify(args,
"tag",
lambda unused: True,
"Unable to set tag.",
modify_arg=lambda arg: make_safe_filename(arg) if arg is not None else arg)
coreclr_args.verify(args,
"metrics",
lambda unused: True,
"Unable to set metrics.")
coreclr_args.verify(args,
"diff_with_release",
lambda unused: True,
"Unable to set diff_with_release.")
coreclr_args.verify(args,
"git_diff",
lambda unused: True,
"Unable to set git_diff.")
process_base_jit_path_arg(coreclr_args)
jit_in_product_location = False
if coreclr_args.product_location.lower() in coreclr_args.base_jit_path.lower():
jit_in_product_location = True
determined_arch = None
determined_build_type = None
if jit_in_product_location:
# Get os/arch/flavor directory, e.g. split "F:\gh\runtime\artifacts\bin\coreclr\windows.x64.Checked" with "F:\gh\runtime\artifacts\bin\coreclr"
# yielding
# [0]: ""
# [1]: "\windows.x64.Checked"
standard_location_split = os.path.dirname(coreclr_args.base_jit_path).split(os.path.dirname(coreclr_args.product_location))
assert coreclr_args.host_os in standard_location_split[1]
# Get arch/flavor. Remove leading slash.
specialized_path = standard_location_split[1].split(os.path.sep)[1]
# Split components: "windows.x64.Checked" into:
# [0]: "windows"
# [1]: "x64"
# [2]: "Checked"
determined_split = specialized_path.split(".")
determined_arch = determined_split[1]
determined_build_type = determined_split[2]
# Make a more intelligent decision about the arch and build type
# based on the path of the jit passed
if jit_in_product_location and coreclr_args.build_type not in coreclr_args.base_jit_path:
coreclr_args.verify(determined_build_type,
"build_type",
coreclr_args.check_build_type,
"Invalid build_type")
if jit_in_product_location and coreclr_args.arch not in coreclr_args.base_jit_path:
coreclr_args.verify(determined_arch.lower(),
"arch",
lambda unused: True,
"Unable to set arch")
coreclr_args.verify(determine_coredis_tools(coreclr_args),
"coredistools_location",
os.path.isfile,
"Unable to find coredistools.")
elif coreclr_args.mode == "tpdiff":
verify_target_args()
verify_superpmi_common_args()
verify_replay_common_args()
verify_base_diff_args()
coreclr_args.verify(coreclr_args.arch,
"arch",
lambda arch: arch == "x86" or arch == "x64",
"Throughput measurements not supported on platform {}".format(coreclr_args.arch))
coreclr_args.verify(determine_coredis_tools(coreclr_args),
"coredistools_location",
os.path.isfile,
"Unable to find coredistools.")
process_base_jit_path_arg(coreclr_args)
download_clrjit_pintool(coreclr_args)
elif coreclr_args.mode == "upload":
verify_target_args()
verify_jit_ee_version_arg()
coreclr_args.verify(args,
"az_storage_key",
lambda item: item is not None,
"Specify az_storage_key or set environment variable CLRJIT_AZ_KEY to the key to use.",
modify_arg=lambda arg: os.environ["CLRJIT_AZ_KEY"] if arg is None and "CLRJIT_AZ_KEY" in os.environ else arg)
coreclr_args.verify(args,
"mch_files",
lambda unused: True,
"Unable to set mch_files")
elif coreclr_args.mode == "upload-private":
verify_target_args()
verify_jit_ee_version_arg()
coreclr_args.verify(args,
"mch_files",
lambda unused: True,
"Unable to set mch_files")
coreclr_args.verify(args,
"private_store",
lambda unused: True,
"Unable to set private_store")
if not os.path.isdir(coreclr_args.private_store):
print("Error: private store directory '" + coreclr_args.private_store + "' not found.")
sys.exit(1)
# Safety measure: don't allow CLRJIT_AZ_KEY to be set if we are uploading to a private store.
# Note that this should be safe anyway, since we're publishing something private, not public.
if "CLRJIT_AZ_KEY" in os.environ:
print("Error: environment variable CLRJIT_AZ_KEY is set, but command is `upload-private`, not `upload`. That is not allowed.")
sys.exit(1)
elif coreclr_args.mode == "download":
verify_target_args()
verify_jit_ee_version_arg()
coreclr_args.verify(args,
"force_download",
lambda unused: True,
"Unable to set force_download")
coreclr_args.verify(args,
"filter",
lambda unused: True,
"Unable to set filter.")
coreclr_args.verify(args,
"mch_files",
lambda unused: True,
"Unable to set mch_files")
coreclr_args.verify(args,
"private_store",
lambda item: True,
"Specify private_store or set environment variable SUPERPMI_PRIVATE_STORE to use a private store.",
modify_arg=lambda arg: os.environ["SUPERPMI_PRIVATE_STORE"].split(";") if arg is None and "SUPERPMI_PRIVATE_STORE" in os.environ else arg)
elif coreclr_args.mode == "list-collections":
verify_target_args()
verify_jit_ee_version_arg()
coreclr_args.verify(args,
"all",
lambda unused: True,
"Unable to set all")
coreclr_args.verify(args,
"local",
lambda unused: True,
"Unable to set local")
elif coreclr_args.mode == "merge-mch":
coreclr_args.verify(args,
"output_mch_path",
lambda output_mch_path: not os.path.isdir(os.path.abspath(output_mch_path)) and not os.path.isfile(os.path.abspath(output_mch_path)),
"Invalid output_mch_path \"{}\"; is it an existing directory or file?".format,
modify_arg=lambda output_mch_path: os.path.abspath(output_mch_path))
coreclr_args.verify(args,
"pattern",
lambda unused: True,
"Unable to set pattern")
coreclr_args.verify(args,
"ci",
lambda unused: True,
"Unable to set ci.")
if coreclr_args.mode == "replay" or coreclr_args.mode == "asmdiffs" or coreclr_args.mode == "tpdiff" or coreclr_args.mode == "download":
if hasattr(coreclr_args, "private_store") and coreclr_args.private_store is not None:
logging.info("Using private stores:")
for path in coreclr_args.private_store:
logging.info(" %s", path)
return coreclr_args