You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
#!/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:]))
|