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.5 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.5 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:]))
 |