| #!/usr/bin/env python3 |
| |
| # Zephyr launcher which is interoperable with: |
| # |
| # 1. "mono-repo" Zephyr installations that have 'make flash' |
| # etc. supplied by a copy of some west code in scripts/meta. |
| # |
| # 2. "multi-repo" Zephyr installations where west is provided in a |
| # separate Git repository elsewhere. |
| # |
| # This is basically a copy of the "wrapper" functionality in the west |
| # bootstrap script for the multi-repo case, plus a fallback onto the |
| # copy in scripts/meta/west for mono-repo installs. |
| |
| import os |
| import sys |
| |
| import colorama |
| |
| if sys.version_info < (3,): |
| sys.exit('fatal error: you are running Python 2') |
| |
| # Top-level west directory, containing west itself and the manifest. |
| WEST_DIR = 'west' |
| # Subdirectory to check out the west source repository into. |
| WEST = 'west' |
| # File inside of WEST_DIR which marks it as the top level of the |
| # Zephyr project installation. |
| # |
| # (The WEST_DIR name is not distinct enough to use when searching for |
| # the top level; other directories named "west" may exist elsewhere, |
| # e.g. zephyr/doc/west.) |
| WEST_MARKER = '.west_topdir' |
| |
| |
| class WestNotFound(RuntimeError): |
| '''Neither the current directory nor any parent has a West installation.''' |
| |
| |
| def find_west_topdir(start): |
| '''Find the top-level installation directory, starting at ``start``. |
| |
| If none is found, raises WestNotFound.''' |
| cur_dir = start |
| |
| while True: |
| if os.path.isfile(os.path.join(cur_dir, WEST_DIR, WEST_MARKER)): |
| return cur_dir |
| |
| parent_dir = os.path.dirname(cur_dir) |
| if cur_dir == parent_dir: |
| # At the root |
| raise WestNotFound() |
| cur_dir = parent_dir |
| |
| |
| def wrap(west_dir, argv): |
| # Pull in the west main module, after adding the directory |
| # containing the package to sys.path. |
| sys.path.append(west_dir) |
| import west.main |
| |
| # Invoke west's main with our arguments. It needs to be run from |
| # this process for 'west debug' to work properly, so don't change |
| # this code to running main in a subprocess. |
| west.main.main(sys.argv[1:]) |
| |
| |
| def main(): |
| # Figure out which west to run. If we're in a multirepo |
| # installation, prefer the standalone west. Otherwise, we're in a |
| # monorepo installation, so we need to fall back on the copy of |
| # west in the Zephyr repository's scripts/meta directory. |
| try: |
| topdir = find_west_topdir(__file__) |
| west_dir = os.path.join(topdir, 'west', 'west', 'src') |
| except WestNotFound: |
| west_dir = os.path.join(os.environ['ZEPHYR_BASE'], 'scripts', 'meta') |
| |
| try: |
| wrap(west_dir, sys.argv[1:]) |
| finally: |
| print(colorama.Fore.LIGHTRED_EX, end='') |
| print('NOTE: you just ran a copy of west from {};'. |
| format(os.path.dirname(__file__)), |
| 'this will be removed from the Zephyr repository in the future.', |
| 'West is now developed separately.') |
| print(colorama.Style.RESET_ALL, end='', flush=True) |
| |
| |
| if __name__ == '__main__': |
| main() |