-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsetup.py
More file actions
136 lines (109 loc) · 4.69 KB
/
Copy pathsetup.py
File metadata and controls
136 lines (109 loc) · 4.69 KB
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
136
'''
pyMilk setup.py
'''
import os
import sys
import platform
import subprocess
from distutils.version import LooseVersion
from setuptools import setup, Extension
from setuptools.command.build_ext import build_ext
import shlex
import pathlib
class CMakeExtension(Extension):
def __init__(self, name, package, sourcedir=''):
Extension.__init__(self, name, sources=[])
self.sourcedir = os.path.abspath(sourcedir) + '/' + self.name
self.package = package
class CMakeBuildExt(build_ext):
def run(self):
self.inplace = True
try:
import pybind11 # Will raise ModuleNotFoundError
if pybind11.version_info < (2, 11):
raise ModuleNotFoundError('pybind version nok')
out = subprocess.check_output(['cmake', '--version'
]) # Will raise FileNotFoundError
except:
raise RuntimeError(
"CMake and pybind11 must be installed to build the following extensions: "
+ ", ".join(e.name for e in self.extensions) +
"\n and pybind must be > 2.11 (pip install --upgrade pybind11)"
)
for ext in self.extensions:
self.build_extension(ext)
def build_extension(self, ext):
self.announce("Preparing the build environment", level=3)
extdir = os.path.abspath(
os.path.dirname(self.get_ext_fullpath(ext.name)))
build_temp_subdir = self.build_temp + '/' + ext.name
if self.editable_mode:
# extdir = $HOME/src/pyMilk/
# drop lib in $HOME/src/pyMilk/pyMilk
lib_drop_in_directory = extdir + '/' + ext.package
else:
# self.build_temp is: build/temp.linux-x86_64-cpython-310
# build_temp_subdir is: build/temp.linux-x86_64-cpython-310/ImageStreamIO
# drop lib in:
# build/lib.linux-x86_64-cpython/pyMilk
build_temp_path = pathlib.Path(os.path.abspath(self.build_temp))
lib_drop_in_directory = str(build_temp_path.parent /
build_temp_path.name.replace(
'temp', 'lib', 1) /
ext.package)
os.makedirs(build_temp_subdir, exist_ok=True)
cmake_args = [
'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + lib_drop_in_directory,
'-DPYTHON_EXECUTABLE=' + sys.executable,
]
cfg = 'Debug' if self.debug else 'Release'
build_args = ['--config', cfg]
if platform.system() == "Windows":
cmake_args += [
'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'.format(
cfg.upper(), extdir)
]
if sys.maxsize > 2**32:
cmake_args += ['-A', 'x64']
build_args += ['--', '/m']
else:
cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg]
build_args += ['--', '-j%d' % os.cpu_count()] #, 'VERBOSE=1']
if "CUDA_ROOT" in os.environ:
if os.path.isfile('{}/bin/gcc'.format(os.environ["CUDA_ROOT"])):
cmake_args += [
'-DCMAKE_C_COMPILER={}/bin/gcc'.format(
os.environ["CUDA_ROOT"])
]
if os.path.isfile('{}/bin/g++'.format(os.environ["CUDA_ROOT"])):
cmake_args += [
'-DCMAKE_CXX_COMPILER={}/bin/g++'.format(
os.environ["CUDA_ROOT"])
]
cmake_args += ['-DUSE_CUDA=ON']
else:
cmake_args += ['-DUSE_CUDA=OFF']
cmake_args += ['-Dbuild_python_module=ON']
self.announce("Configuring cmake project", level=3)
command_a = f'cmake {ext.sourcedir} ' + ' '.join(cmake_args)
command_b = f'cmake --build . ' + ' '.join(build_args)
# Great way to locate a print-debug quickly in the pip build stack.
'''
raise ValueError(
f'{ext} | {ext.name} | {ext.sourcedir} | command_a = "{command_a}"'
f' | command _b = "{command_b}" | cmake cwd = {build_temp_subdir}'
)
'''
subprocess.check_call(shlex.split(command_a), cwd=build_temp_subdir)
subprocess.check_call(shlex.split(command_b), cwd=build_temp_subdir)
with open("README.md", 'r') as f:
long_description = f.read()
#import sys
#raise ValueError(sys.argv)
setup(
packages=['pyMilk'], # same as name
ext_modules=[
CMakeExtension('ImageStreamIO', package='pyMilk'),
],
cmdclass=dict(build_ext=CMakeBuildExt),
long_description=long_description)