diff --git a/build_tools/build_ext.py b/build_tools/build_ext.py index cbb8838b00..2aa68b5b66 100644 --- a/build_tools/build_ext.py +++ b/build_tools/build_ext.py @@ -4,11 +4,12 @@ """Installation script.""" +import copy import os import subprocess import sys import sysconfig -import copy +import tempfile import time from pathlib import Path @@ -111,23 +112,33 @@ def run(self) -> None: for ext in self.extensions: package_path = Path(self.get_ext_fullpath(ext.name)) install_dir = package_path.resolve().parent - if isinstance(ext, CMakeExtension): - print(f"Building CMake extension {ext.name}") - # Set up incremental builds for CMake extensions - build_dir = os.getenv("NVTE_CMAKE_BUILD_DIR") - if build_dir: - build_dir = Path(build_dir).resolve() - else: - root_dir = Path(__file__).resolve().parent.parent - build_dir = root_dir / "build" / "cmake" - - # Ensure the directory exists + if not isinstance(ext, CMakeExtension): + continue + + print(f"Building CMake extension {ext.name}") + configured_build_dir = os.getenv("NVTE_CMAKE_BUILD_DIR") + if configured_build_dir: + # An explicit build directory enables incremental builds. + build_dir = Path(configured_build_dir).resolve() build_dir.mkdir(parents=True, exist_ok=True) - ext._build_cmake( build_dir=build_dir, install_dir=install_dir, ) + continue + + # Isolate CMake state between concurrent and successive builds. + build_temp = Path(self.build_temp) + build_temp.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory( + prefix=f"cmake-build-{ext.name}-", + dir=build_temp, + ) as build_dir: + print(f"Building CMake extension {ext.name} in temporary directory {build_dir}") + ext._build_cmake( + build_dir=Path(build_dir), + install_dir=install_dir, + ) # Build non-CMake extensions as usual all_extensions = self.extensions