-
Notifications
You must be signed in to change notification settings - Fork 8
/
setup.py
118 lines (100 loc) · 4.18 KB
/
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env python
# encoding: utf-8
# setup.py
# only if building in place: ``python setup.py build_ext --inplace``
import os
import re
import shutil
import platform
import subprocess
import setuptools
#######
# This forces wheels to be platform specific
from setuptools.dist import Distribution
from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
class bdist_wheel(_bdist_wheel):
def finalize_options(self):
_bdist_wheel.finalize_options(self)
self.root_is_pure = False
class BinaryDistribution(Distribution):
"""Distribution which always forces a binary package with platform name"""
def has_ext_modules(foo):
return True
#######
def run_meson_build(staging_dir):
prefix = os.path.join(os.getcwd(), staging_dir)
purelibdir = "."
# check if meson extra args are specified
meson_args = ""
if "MESON_ARGS" in os.environ:
meson_args = os.environ["MESON_ARGS"]
if platform.system() == "Windows":
if "FC" not in os.environ:
os.environ["FC"] = "gfortran"
if "CC" not in os.environ:
os.environ["CC"] = "gcc"
# configure
meson_path = shutil.which("meson")
if meson_path is None:
raise OSError("The meson command cannot be found on the system")
meson_call = [meson_path, "setup", staging_dir, "--wipe",
f"--prefix={prefix}", f"-Dpython.purelibdir={purelibdir}",
f"-Dpython.platlibdir={purelibdir}"] + meson_args.split()
meson_call = [m for m in meson_call if m.strip() != ""]
print(meson_call)
p1 = subprocess.run(meson_call, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
os.makedirs(staging_dir, exist_ok=True)
setup_log = os.path.join(staging_dir, "setup.log")
with open(setup_log, "wb") as f:
f.write(p1.stdout)
if p1.returncode != 0:
with open(setup_log, "r") as f:
print(f.read())
raise OSError(meson_call, f"The meson setup command failed! Check the log at {setup_log} for more information.")
# build
meson_call = [meson_path, "compile", "-vC", staging_dir]
meson_call = [m for m in meson_call if m != ""]
print(meson_call)
p2 = subprocess.run(meson_call, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
compile_log = os.path.join(staging_dir, "compile.log")
with open(compile_log, "wb") as f:
f.write(p2.stdout)
if p2.returncode != 0:
with open(compile_log, "r") as f:
print(f.read())
raise OSError(meson_call, f"The meson compile command failed! Check the log at {compile_log} for more information.")
def copy_shared_libraries():
build_path = os.path.join(staging_dir, "pyhams")
for root, _dirs, files in os.walk(build_path):
for file in files:
# move pyhams libraries to just under staging_dir
if file.endswith((".so", ".lib", ".pyd", ".pdb", ".dylib", ".dll")):
if ".so.p" in root or ".pyd.p" in root: # excludes intermediate object files
continue
file_path = os.path.join(root, file)
new_path = str(file_path)
match = re.search(staging_dir, new_path)
new_path = new_path[match.span()[1] + 1 :]
print(f"Copying build file {file_path} -> {new_path}")
shutil.copy(file_path, new_path)
if __name__ == "__main__":
# This is where the meson build system will install to, it is then
# used as the sources for setuptools
staging_dir = "meson_build"
# this keeps the meson build system from running more than once
if "dist" not in str(os.path.abspath(__file__)):
cwd = os.getcwd()
run_meson_build(staging_dir)
os.chdir(cwd)
copy_shared_libraries()
# docs_require = ""
# req_txt = os.path.join("doc", "requirements.txt")
# if os.path.isfile(req_txt):
# with open(req_txt) as f:
# docs_require = f.read().splitlines()
#init_file = os.path.join("wisdem", "__init__.py")
# __version__ = re.findall(
# r"""__version__ = ["']+([0-9\.]*)["']+""",
# open(init_file).read(),
# )[0]
setuptools.setup(cmdclass={'bdist_wheel': bdist_wheel}, distclass=BinaryDistribution)