12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #!/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:]))
|