|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | import os | 
|  |  | 
|  |  | 
|  | def find_tool(tool_name: str) -> str: | 
|  | '''Return a string describing how to invoke the given RISC-V tool | 
|  |  | 
|  | Try to resolve the tool in the following way, stopping after the first | 
|  | match: | 
|  |  | 
|  | 1. Use the path set in the RV32_TOOL_<tool_name> environment variable. | 
|  | 2. Use the path set in $TOOLCHAIN_PATH/bin/riscv32-unknown-elf-<tool_name>. | 
|  | 3. Look for riscv32-unknown-elf-<tool_name> in the system PATH. | 
|  | 4. Look in the default toolchain install location, /tools/riscv/bin. | 
|  |  | 
|  | For methods (1) and (2), if the expected environment variable is set but | 
|  | the tool isn't found, an error is printed. An error is also printed if | 
|  | neither environment variables is set and methods (3) and (4) fail. | 
|  | ''' | 
|  | tool_env_var = 'RV32_TOOL_' + tool_name.upper() | 
|  | configured_tool_path = os.environ.get(tool_env_var) | 
|  | if configured_tool_path is not None: | 
|  | if not os.path.exists(configured_tool_path): | 
|  | raise RuntimeError('No such file: {!r} (derived from the ' | 
|  | '{!r} environment variable when trying ' | 
|  | 'to find the {!r} tool).'.format( | 
|  | configured_tool_path, tool_env_var, | 
|  | tool_name)) | 
|  | return configured_tool_path | 
|  |  | 
|  | expanded = 'riscv32-unknown-elf-' + tool_name | 
|  | toolchain_path = os.environ.get('TOOLCHAIN_PATH') | 
|  | if toolchain_path is not None: | 
|  | tool_path = os.path.join(toolchain_path, 'bin', expanded) | 
|  | if not os.path.exists(tool_path): | 
|  | raise RuntimeError('No such file: {!r} (derived from the ' | 
|  | 'TOOLCHAIN_PATH environment variable when trying ' | 
|  | 'to find the {!r} tool).' | 
|  | .format(tool_path, tool_name)) | 
|  | return tool_path | 
|  |  | 
|  | default_location = '/tools/riscv/bin' | 
|  | paths = os.get_exec_path() + [default_location] | 
|  | for exec_path in paths: | 
|  | tool_path = os.path.join(exec_path, expanded) | 
|  | if os.path.exists(tool_path): | 
|  | return tool_path | 
|  |  | 
|  | raise RuntimeError('Unable to find {!r} in PATH or in {!r}. Set the {!r} ' | 
|  | 'or TOOLCHAIN_PATH environment variable if you ' | 
|  | 'installed your RISC-V toolchain in an alternate ' | 
|  | 'location.' | 
|  | .format(expanded, default_location, tool_env_var)) |