faster linux build
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
"""Every third-party import in src/orisys must be excluded from the Nuitka compile.
|
||||
|
||||
Omitting one means Nuitka tries to follow it into the compiled extension: compile
|
||||
time explodes, and the wheel's contents start depending on whatever happens to be
|
||||
installed in the *build* environment rather than on what is declared. ``torch``,
|
||||
``torchvision`` and ``pyvkfft`` were imported by the package but missing from the
|
||||
exclusion list; this test keeps that list complete.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import ast
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||||
BUILD_ROOT = REPO_ROOT / "build"
|
||||
if str(BUILD_ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(BUILD_ROOT))
|
||||
|
||||
from wheel.compile import NUITKA_INCLUDE_PACKAGES, NUITKA_NOFOLLOW_IMPORTS # noqa: E402
|
||||
|
||||
PACKAGE_ROOT = REPO_ROOT / "src" / "orisys"
|
||||
FIRST_PARTY = {"orisys", "orisys_blend"}
|
||||
|
||||
|
||||
def _third_party_imports() -> dict[str, set[str]]:
|
||||
"""Top-level third-party import names -> the files that import them."""
|
||||
stdlib = set(sys.stdlib_module_names)
|
||||
found: dict[str, set[str]] = {}
|
||||
|
||||
for path in sorted(PACKAGE_ROOT.rglob("*.py")):
|
||||
try:
|
||||
tree = ast.parse(path.read_text(encoding="utf-8", errors="ignore"))
|
||||
except SyntaxError:
|
||||
continue
|
||||
for node in ast.walk(tree):
|
||||
names: list[str] = []
|
||||
if isinstance(node, ast.Import):
|
||||
names = [alias.name for alias in node.names]
|
||||
elif isinstance(node, ast.ImportFrom) and node.module and node.level == 0:
|
||||
names = [node.module]
|
||||
for name in names:
|
||||
top = name.split(".")[0]
|
||||
if top in stdlib or top in FIRST_PARTY:
|
||||
continue
|
||||
found.setdefault(top, set()).add(path.relative_to(REPO_ROOT).as_posix())
|
||||
return found
|
||||
|
||||
|
||||
def test_every_third_party_import_is_nofollowed():
|
||||
found = _third_party_imports()
|
||||
assert found, "expected to find third-party imports in src/orisys"
|
||||
|
||||
missing = sorted(set(found) - set(NUITKA_NOFOLLOW_IMPORTS))
|
||||
assert not missing, (
|
||||
"these third-party modules are imported by src/orisys but missing from "
|
||||
"build/wheel/compile.py::NUITKA_NOFOLLOW_IMPORTS:\n "
|
||||
+ "\n ".join(f"{name} (imported by {sorted(found[name])})" for name in missing)
|
||||
+ "\nNuitka will try to follow them into the compiled module; add them to "
|
||||
"the exclusion list so they resolve from the user's environment at runtime."
|
||||
)
|
||||
|
||||
|
||||
def test_included_packages_are_first_party_or_subpackages():
|
||||
assert "orisys" in NUITKA_INCLUDE_PACKAGES
|
||||
for name in NUITKA_INCLUDE_PACKAGES:
|
||||
assert name == "orisys" or name.startswith("orisys."), name
|
||||
|
||||
|
||||
def test_nofollow_list_has_no_duplicates():
|
||||
assert len(NUITKA_NOFOLLOW_IMPORTS) == len(set(NUITKA_NOFOLLOW_IMPORTS))
|
||||
Reference in New Issue
Block a user