Skip to content

Commit 01aca2e

Browse files
committed
Update.
1 parent b359a17 commit 01aca2e

File tree

1 file changed

+61
-14
lines changed

1 file changed

+61
-14
lines changed

setup.py

+61-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import os
2+
import shutil
23
import platform
34
from pathlib import Path
4-
from setuptools import setup, Extension
5+
from setuptools import setup, Extension, Command
56
from warnings import warn
67

78
FORCE_BINARIES = "NOVA_FORCE" in os.environ and os.environ["NOVA_FORCE"].lower() == "binaries"
@@ -27,19 +28,62 @@
2728

2829
REAL_PACKAGE = PACKAGE_DIR / "nova"
2930

30-
if FORCE_BINARIES:
31-
if not PREBUILT_OS_DIR.exists():
32-
raise RuntimeError(f"No binary distribution found for {platform.system()} operating system.")
33-
elif not LOCAL_BINARIES.exists():
34-
raise RuntimeError(f"Not supported {platform.machine()} architecture for binaries.")
3531

36-
if len(list(NOVA_PHYSICS.iterdir())) == 0 or len(list(NOVA_PYTHON.iterdir())) == 0:
37-
warn("Submodules not initialized, performing additional cloning.")
38-
if platform.system() == "Windows":
39-
os.system("git.exe submodule init")
40-
os.system("git.exe submodule update")
41-
else:
42-
os.system("git submodule init && git submodule update")
32+
def create_if_none(path: Path):
33+
if not path.exists():
34+
path.mkdir()
35+
36+
37+
class UpdateBinariesCommand(Command):
38+
rebuild_binaries: bool
39+
40+
user_options = [("rebuild-binaries=", None, "Whether to build nova-physics from scratch.")]
41+
description = "Update binaries for distribution"
42+
43+
def finalize_options(self) -> None:
44+
if isinstance(self.rebuild_binaries, str):
45+
if self.rebuild_binaries.lower() == "false":
46+
self.rebuild_binaries = False
47+
else:
48+
self.rebuild_binaries = True
49+
50+
def run(self) -> None:
51+
if self.rebuild_binaries:
52+
build_nova_physics()
53+
54+
create_if_none(PREBUILT_OS_DIR)
55+
56+
create_if_none(BINARIES_DIR)
57+
58+
for path in NOVA_BUILD_DIRECTORY.iterdir():
59+
if path.is_dir() and path.name.startswith("libnova_"):
60+
dir_name = BINARIES_DIR / path.name.split("_", 1)[1]
61+
create_if_none(dir_name)
62+
63+
for to_copy in path.iterdir():
64+
if to_copy.is_dir():
65+
shutil.copytree(to_copy, dir_name)
66+
else:
67+
shutil.copy(to_copy, dir_name)
68+
69+
def initialize_options(self) -> None:
70+
self.rebuild_binaries = True
71+
72+
73+
def innit_checks():
74+
if FORCE_BINARIES:
75+
if not PREBUILT_OS_DIR.exists():
76+
raise RuntimeError(f"No binary distribution found for {platform.system()} operating system.")
77+
elif not LOCAL_BINARIES.exists():
78+
raise RuntimeError(f"Not supported {platform.machine()} architecture for binaries.")
79+
80+
if len(list(NOVA_PHYSICS.iterdir())) == 0 or len(list(NOVA_PYTHON.iterdir())) == 0:
81+
warn("Submodules not initialized, performing additional cloning.")
82+
if platform.system() == "Windows":
83+
os.system("git.exe submodule init")
84+
os.system("git.exe submodule update")
85+
else:
86+
os.system("git submodule init && git submodule update")
4387

4488

4589
def use_binaries():
@@ -111,6 +155,8 @@ def get_nova_sources():
111155

112156

113157
def main():
158+
innit_checks()
159+
114160
nova_to_link = str(get_nova_to_link().relative_to(PACKAGE_DIR))
115161
stubs_to_override = {REAL_PACKAGE / "__init__.pyi": NOVA_PYTHON_STUB, REAL_PACKAGE / "_nova.pyi": NOVA_PYTHON_STUB}
116162

@@ -143,7 +189,8 @@ def main():
143189
package_data={
144190
"nova": ["*.pyi"]
145191
},
146-
packages=["nova"]
192+
packages=["nova"],
193+
cmdclass={"update_binaries": UpdateBinariesCommand}
147194
)
148195

149196

0 commit comments

Comments
 (0)