-
Notifications
You must be signed in to change notification settings - Fork 12
/
setup.py
135 lines (108 loc) · 3.8 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import os
import subprocess
import sys
from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext
MIN_CPU_CORES = 2
def get_cpu_count():
try:
return len(os.sched_getaffinity(0)) # linux only
except:
pass
try:
return os.cpu_count() # python 3.4+
except:
return 1 # default
class CMakeExtension(Extension):
def __init__(self, name, sourcedir=""):
Extension.__init__(self, name, sources=[])
self.sourcedir = os.path.abspath(sourcedir)
class CMakeBuild(build_ext):
user_options = build_ext.user_options + [
('target=', None, "specify the CMake target to build")
]
def initialize_options(self):
self.target = "sonata_python"
super(CMakeBuild, self).initialize_options()
def run(self):
try:
subprocess.check_output(["cmake", "--version"])
except OSError:
raise RuntimeError(
"CMake must be installed to build the following extensions: "
+ ", ".join(e.name for e in self.extensions)
)
for ext in self.extensions:
self.build_extension(ext)
def build_extension(self, ext):
extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name)))
build_type = os.environ.get("SONATA_BUILD_TYPE", "Release")
if self.debug:
build_type = "Debug"
cmake_args = [
"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=" + extdir,
"-DSONATA_TESTS={}".format(os.environ.get("SONATA_TESTS", "OFF")),
"-DEXTLIB_FROM_SUBMODULES=ON",
"-DSONATA_PYTHON=ON",
"-DSONATA_VERSION=" + self.distribution.get_version(),
"-DCMAKE_BUILD_TYPE={}".format(build_type),
"-DSONATA_CXX_WARNINGS=OFF",
'-DPYTHON_EXECUTABLE=' + sys.executable
]
if "STATIC_HDF5" in os.environ:
cmake_args += ["-DHDF5_USE_STATIC_LIBRARIES=True", ]
build_args = ["--config", build_type,
"--target", self.target,
"--",
"-j{}".format(max(MIN_CPU_CORES, get_cpu_count())),
]
if not os.path.exists(self.build_temp):
os.makedirs(self.build_temp)
env = os.environ.copy()
env["CXXFLAGS"] = '{} -DVERSION_INFO=\\"{}\\"'.format(
env.get("CXXFLAGS", ""), self.distribution.get_version()
)
subprocess.check_call(
["cmake", ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env
)
subprocess.check_call(
["cmake", "--build", "."] + build_args, cwd=self.build_temp
)
# nearly verbatim from how h5py handles is
install_requires = [
# We only really aim to support NumPy & Python combinations for which
# there are wheels on PyPI (e.g. NumPy >=1.17.3 for Python 3.8).
"numpy>=1.17.3",
]
setup_requires = [
"setuptools_scm",
]
with open('README.rst') as f:
README = f.read()
setup(
name="libsonata",
description='SONATA files reader',
author="Blue Brain Project, EPFL",
long_description=README,
long_description_content_type='text/x-rst',
license="LGPLv3",
url='https://github.com/BlueBrain/libsonata',
classifiers=[
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
],
ext_modules=[CMakeExtension("libsonata._libsonata")],
cmdclass={'build_ext': CMakeBuild,
},
zip_safe=False,
setup_requires=setup_requires,
install_requires=install_requires,
extras_require={
'docs': ['sphinx-bluebrain-theme'],
},
python_requires=">=3.9",
use_scm_version={"local_scheme": "no-local-version",
},
package_dir={"": "python"},
packages=['libsonata',
],
)