| #!/usr/bin/env vpython3 |
| # Copyright 2023 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # [VPYTHON:BEGIN] |
| # python_version: "3.8" |
| # [VPYTHON:END] |
| """Bazel launcher wrapper. |
| |
| This script starts Bazel appropriate for the project you're working in. It's |
| currently used by ChromiumOS, but is intended for use and to be updated by any |
| depot_tools users who are using Bazel. |
| |
| In the case this script is not able to detect which project you're working in, |
| it will fall back to using the next "bazel" executable in your PATH. |
| """ |
| |
| import itertools |
| import os |
| from pathlib import Path |
| import shutil |
| import sys |
| from typing import List, Optional |
| |
| |
| def _find_bazel_cros() -> Optional[Path]: |
| """Find the bazel launcher for ChromiumOS.""" |
| cwd = Path.cwd() |
| for parent in itertools.chain([cwd], cwd.parents): |
| bazel_launcher = parent / "chromite" / "bin" / "bazel" |
| if bazel_launcher.exists(): |
| return bazel_launcher |
| return None |
| |
| |
| def _find_next_bazel_in_path() -> Optional[Path]: |
| """The fallback method: search the remainder of PATH for bazel.""" |
| # Remove depot_tools from PATH if present. |
| depot_tools = Path(__file__).resolve().parent |
| path_env = os.environ.get("PATH", os.defpath) |
| search_paths = [] |
| for path in path_env.split(os.pathsep): |
| if Path(path).resolve() != depot_tools: |
| search_paths.append(path) |
| new_path_env = os.pathsep.join(search_paths) |
| bazel = shutil.which("bazel", path=new_path_env) |
| if bazel: |
| return Path(bazel) |
| return None |
| |
| |
| # All functions used to search for Bazel (in order of search). |
| _SEARCH_FUNCTIONS = ( |
| _find_bazel_cros, |
| _find_next_bazel_in_path, |
| ) |
| |
| _FIND_FAILURE_MSG = """\ |
| ERROR: The depot_tools bazel launcher was unable to find an appropriate bazel |
| executable to use. |
| |
| For ChromiumOS developers: |
| Make sure your current directory is inside a ChromiumOS checkout (e.g., |
| ~/chromiumos). If you're already in a ChromiumOS checkout, it may be because |
| you're working on a branch that's too old (i.e., prior to Bazel). |
| |
| If you're not working on any of the above listed projects, this launcher assumes |
| that you have Bazel installed on your system somewhere else in PATH. Check that |
| it's actually installed.""" |
| |
| |
| def main(argv: List[str]) -> int: |
| """Main.""" |
| for search_func in _SEARCH_FUNCTIONS: |
| bazel = search_func() |
| if bazel: |
| os.execv(bazel, [str(bazel), *argv]) |
| |
| print(_FIND_FAILURE_MSG, file=sys.stderr) |
| return 1 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main(sys.argv[1:])) |