blob: e996ff2a20d6a4b16454109098cea45d15fc56bb [file] [log] [blame]
# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A series of utilities for working with paths in ChromeOS."""
import functools
from pathlib import Path
import sys
from typing import Optional
# Paths to often-used directories from a CrOS root.
THIRD_PARTY_DIR = Path("src") / "third_party"
CHROMIUMOS_OVERLAY = THIRD_PARTY_DIR / "chromiumos-overlay"
LLVM_PROJECT = THIRD_PARTY_DIR / "llvm-project"
TOOLCHAINS_OVERLAY = THIRD_PARTY_DIR / "toolchains-overlay"
TOOLCHAIN_UTILS = THIRD_PARTY_DIR / "toolchain-utils"
TOOLCHAIN_UTILS_PYBIN = TOOLCHAIN_UTILS / "py" / "bin"
CHROOT_SOURCE_ROOT = Path("/mnt") / "host" / "source"
DEFAULT_LLVM_PKG_PATH = CHROMIUMOS_OVERLAY / "sys-devel" / "llvm"
DEFAULT_PATCHES_PATH = DEFAULT_LLVM_PKG_PATH / "files" / "PATCHES.json"
# Don't bind absolute paths to variables; functions are easier to mock.
#
# Functions that perform filesystem ops have results cached, since doing so is
# very cheap & the results should never change in production.
@functools.lru_cache(1)
def _script_path() -> Path:
return Path(__file__).resolve()
def script_toolchain_utils_root() -> Path:
"""Returns the absolute path to the root of toolchain-utils/."""
return _script_path().parent.parent
@functools.lru_cache(1)
def script_chromiumos_checkout() -> Optional[Path]:
"""Returns the absolute path to the CrOS checkout this script resides in.
Returns None if this toolchain-utils checkout isn't part of a CrOS repo.
"""
# toolchain-utils resides in src/third_party/toolchain-utils.
result = script_toolchain_utils_root().parent.parent.parent
if (result / ".repo").is_dir():
return result
return None
def script_chromiumos_checkout_or_exit() -> Path:
"""Returns the absolute path to the CrOS checkout this script resides in.
Returns None if this toolchain-utils checkout isn't part of a CrOS repo.
"""
result = script_chromiumos_checkout()
if not result:
sys.exit(
"This script must be invoked from a toolchain-utils checkout "
"residing in a ChromiumOS checkout."
)
return result