-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup.py
144 lines (122 loc) · 4.93 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
136
137
138
139
140
141
142
143
144
#!/usr/bin/env python3
import os
import sys
import subprocess
from setuptools import setup, Extension, find_packages
from setuptools.command.build_ext import build_ext
from distutils.dir_util import remove_tree
PLAT_TO_CMAKE = {
"win32": "Win32",
"win-amd64": "x64",
"win-arm32": "ARM",
"win-arm64": "ARM64"
}
with open("README.md", 'r', encoding="utf-8") as fp:
long_description = fp.read()
class CMakeExtension(Extension):
def __init__(self, name, sourcedir=""):
Extension.__init__(self, name, sources=[])
self.sourcedir = os.path.abspath(sourcedir)
class CMakeBuild(build_ext):
def build_extension(self, ext):
print("building extension...")
extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name)))
if not extdir.endswith(os.path.sep):
extdir += os.path.sep
cfg = "Debug" if self.debug else "Release"
# cfg = "Debug"
conda_prefix = os.environ['CONDA_PREFIX']
cmake_generator = os.environ.get("CMAKE_GENERATOR", "")
cmake_args = [
"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={}".format(extdir),
"-DPYTHON_EXECUTABLE={}".format(sys.executable),
"-DEXAMPLE_VERSION_INFO={}".format(self.distribution.get_version()),
"-DCMAKE_BUILD_TYPE={}".format(cfg), # not used on MSVC, but no harm
"-DGTEST=OFF",
"-DDOCS=ON",
"-DGTEST_INCLUDE_DIRS={}/include/".format(conda_prefix),
"-DGTEST_LIBRARIES={}/lib/libgtest.so".format(conda_prefix),
"-DEIGEN3_INCLUDE_DIR={}/include/eigen3/".format(conda_prefix),
"-Dpybind11_DIR={}/lib/python3.8/site-packages/pybind11/share/cmake/pybind11/".format(conda_prefix),
"-DPYBIND11_FINDPYTHON=ON",
]
build_args = ['--target',ext.name]
if self.compiler.compiler_type != "msvc":
if not cmake_generator:
cmake_args += ["-GNinja"]
else:
# Single config generators are handled "normally"
single_config = any(x in cmake_generator for x in {"NMake", "Ninja"})
# CMake allows an arch-in-generator style for backward compatibility
contains_arch = any(x in cmake_generator for x in {"ARM", "Win64"})
# Specify the arch if using MSVC generator, but only if it doesn't
# contain a backward-compatibility arch spec already in the
# generator name.
if not single_config and not contains_arch:
cmake_args += ["-A", PLAT_TO_CMAKE[self.plat_name]]
# Multi-config generators have a different way to specify configs
if not single_config:
cmake_args += [
"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}".format(cfg.upper(), extdir)
]
build_args += ["--config", cfg]
# Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level
# across all generators.
if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ:
# self.parallel is a Python 3 only way to set parallel jobs by hand
# using -j in the build_ext call, not supported by pip or PyPA-build.
if hasattr(self, "parallel") and self.parallel:
print(f'building in parallel with {self.parallel} threads')
# CMake 3.12+ only.
build_args += ["-j{}".format(self.parallel)]
if not os.path.exists(self.build_temp):
os.makedirs(self.build_temp)
subprocess.check_call(
["cmake", ext.sourcedir] + cmake_args, cwd=self.build_temp
)
subprocess.check_call(
["cmake", "--build", "."] + build_args, cwd=self.build_temp
)
# # # Clean old build/ directory if it exists
try:
remove_tree("./build")
print("Removed old build directory.")
except FileNotFoundError:
print("No existing build directory found - skipping.")
setup(
name="pybrush",
version="0.0.1", # TODO: use versionstr here
author="William La Cava, Joseph D. Romano",
author_email="[email protected]", # can change to Bill
license="GNU General Public License v3.0",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/lacava/brush",
project_urls={
"Bug Tracker": "https://github.com/lacava/brush/issues",
},
package_dir={"": "."},
packages=find_packages(where="."),
#cmake_install_dir="src/",
python_requires=">=3.6",
install_requires=[
'numpy',
'scikit-learn',
'sphinx'
],
tests_require=['pytest', 'pmlb'],
extras_require={
'docs': [
'sphinx_rtd_theme',
'maisie_sphinx_theme',
'breathe'
]
},
ext_modules=[
CMakeExtension("_brush")
],
cmdclass={"build_ext": CMakeBuild},
test_suite='tests/python',
zip_safe=False,
include_package_data=True
)