Build the CMake extension. Args: ext (CMakeExtension): The extension to build.
(self, ext: CMakeExtension)
| 81 | return ext_name.split(".")[0] + ".so" |
| 82 | |
| 83 | def build_extension(self, ext: CMakeExtension) -> None: |
| 84 | """ |
| 85 | Build the CMake extension. |
| 86 | |
| 87 | Args: |
| 88 | ext (CMakeExtension): The extension to build. |
| 89 | """ |
| 90 | ext_fullpath = Path.cwd() / self.get_ext_fullpath(ext.name) |
| 91 | extdir = ext_fullpath.parent.resolve() |
| 92 | cfg = "Debug" if int(os.environ.get("DEBUG", 0)) else "Release" |
| 93 | |
| 94 | cmake_args = [ |
| 95 | f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}{os.sep}", |
| 96 | f"-DPYTHON_EXECUTABLE={sys.executable}", |
| 97 | f"-DCMAKE_BUILD_TYPE={cfg}", |
| 98 | "-DVERSION_INFO=", |
| 99 | "-DPYBIND11_PYTHON_VERSION=", |
| 100 | "-DPYTHON_VERSION=", |
| 101 | f"-DPYTHON_INCLUDE_DIR={sys.prefix}/include/python{sys.version_info.major}.{sys.version_info.minor}", |
| 102 | f"-DPYTHON_LIBRARY={sys.prefix}/lib/libpython{sys.version_info.major}.{sys.version_info.minor}.so", |
| 103 | ] |
| 104 | build_args = [] |
| 105 | |
| 106 | cmake_generator = os.environ.get("CMAKE_GENERATOR", "") |
| 107 | if self.compiler.compiler_type != "msvc": |
| 108 | if not cmake_generator or cmake_generator == "Ninja": |
| 109 | try: |
| 110 | import ninja |
| 111 | |
| 112 | ninja_executable_path = Path(ninja.BIN_DIR) / "ninja" |
| 113 | cmake_args += [ |
| 114 | "-GNinja", |
| 115 | f"-DCMAKE_MAKE_PROGRAM:FILEPATH={ninja_executable_path}", |
| 116 | ] |
| 117 | except ImportError: |
| 118 | pass |
| 119 | else: |
| 120 | if "NMake" not in cmake_generator and "Ninja" not in cmake_generator: |
| 121 | cmake_args += ["-A", PLAT_TO_CMAKE[self.plat_name]] |
| 122 | if "NMake" not in cmake_generator and "Ninja" not in cmake_generator: |
| 123 | cmake_args += [f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{cfg.upper()}={extdir}"] |
| 124 | build_args += ["--config", cfg] |
| 125 | |
| 126 | if sys.platform.startswith("darwin"): |
| 127 | archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", "")) |
| 128 | if archs: |
| 129 | cmake_args += ["-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))] |
| 130 | |
| 131 | if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ and hasattr(self, "parallel") and self.parallel: |
| 132 | build_args += [f"-j{self.parallel}"] |
| 133 | |
| 134 | build_temp = Path(self.build_temp) / ext.name |
| 135 | build_temp.mkdir(parents=True, exist_ok=True) |
| 136 | |
| 137 | subprocess.run(["cmake", ext.sourcedir, *cmake_args], cwd=build_temp, check=True) |
| 138 | subprocess.run(["cmake", "--build", ".", *build_args], cwd=build_temp, check=True) |
| 139 | |
| 140 |