|
from __future__ import annotations |
|
|
|
import os |
|
import subprocess |
|
import sys |
|
import sysconfig |
|
from collections.abc import Iterable |
|
from typing import NoReturn |
|
|
|
from ._version import version as __version__ |
|
from .ninja_syntax import Writer, escape, expand |
|
|
|
__all__ = ["BIN_DIR", "DATA", "Writer", "__version__", "escape", "expand", "ninja"] |
|
|
|
|
|
def __dir__() -> list[str]: |
|
return __all__ |
|
|
|
|
|
def _get_ninja_dir() -> str: |
|
ninja_exe = "ninja" + sysconfig.get_config_var("EXE") |
|
|
|
|
|
path = os.path.join(sysconfig.get_path("scripts"), ninja_exe) |
|
if os.path.isfile(path): |
|
return os.path.dirname(path) |
|
|
|
|
|
if sys.version_info >= (3, 10): |
|
user_scheme = sysconfig.get_preferred_scheme("user") |
|
elif os.name == "nt": |
|
user_scheme = "nt_user" |
|
elif sys.platform.startswith("darwin") and getattr(sys, "_framework", None): |
|
user_scheme = "osx_framework_user" |
|
else: |
|
user_scheme = "posix_user" |
|
|
|
path = sysconfig.get_path("scripts", scheme=user_scheme) |
|
|
|
if os.path.isfile(os.path.join(path, ninja_exe)): |
|
return path |
|
|
|
|
|
path = os.path.dirname(sys.executable) |
|
if os.path.isfile(os.path.join(path, ninja_exe)): |
|
return path |
|
|
|
return "" |
|
|
|
|
|
BIN_DIR = _get_ninja_dir() |
|
|
|
|
|
def _program(name: str, args: Iterable[str]) -> int: |
|
cmd = os.path.join(BIN_DIR, name) |
|
return subprocess.call([cmd, *args], close_fds=False) |
|
|
|
|
|
def ninja() -> NoReturn: |
|
raise SystemExit(_program('ninja', sys.argv[1:])) |
|
|