-
Notifications
You must be signed in to change notification settings - Fork 1
/
setup.py
142 lines (118 loc) · 4.81 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
import os
import re
import sys
import subprocess
import pkgutil
from sysconfig import get_platform
from subprocess import CalledProcessError, check_output, check_call
from distutils.version import LooseVersion
from setuptools import setup, Extension, find_packages
from setuptools.command.build_ext import build_ext
import versioneer
# We can use cmake provided from pip which (normally) gets installed at /bin
# Except that in the manylinux builds it's placed at /opt/python/[version]/bin/
# (as a symlink at least) which is *not* on the path.
# If cmake is a known module, import it and use it tell us its binary directory
if pkgutil.find_loader('cmake') is not None:
import cmake
CMAKE_BIN = cmake.CMAKE_BIN_DIR + os.path.sep + 'cmake'
else:
CMAKE_BIN = 'cmake'
def get_cmake():
return CMAKE_BIN
def is_vsc():
platform = get_platform()
return platform.startswith("win")
def is_mingw():
platform = get_platform()
return platform.startswith("mingw")
class CMakeExtension(Extension):
def __init__(self, name, sourcedir=''):
Extension.__init__(self, name, sources=[])
self.sourcedir = os.path.abspath(sourcedir)
class CMakeBuild(build_ext):
def run(self):
try:
out = check_output([get_cmake(), '--version'])
except OSError:
raise RuntimeError("CMake must be installed to build" +
" the following extensions: " +
", ".join(e.name for e in self.extensions))
rex = r'version\s*([\d.]+)'
cmake_version = LooseVersion(re.search(rex, out.decode()).group(1))
if cmake_version < '3.13.0':
raise RuntimeError("CMake >= 3.13.0 is required")
for ext in self.extensions:
self.build_extension(ext)
def build_extension(self, ext):
extdir = os.path.dirname(self.get_ext_fullpath(ext.name))
extdir = os.path.abspath(extdir)
cmake_args = []
if is_vsc():
if sys.maxsize > 2**32:
cmake_args += ['-A', 'x64']
else:
cmake_args += ['-A', 'Win32']
if is_mingw():
cmake_args += ['-G','Unix Makefiles'] # Must be two entries to work
cmake_args += ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir,
'-DPYTHON_EXECUTABLE=' + sys.executable]
cfg = 'RelWithDebInfo' if self.debug else 'Release'
build_args = ['--config', cfg]
# make sure all library files end up in one place
cmake_args += ["-DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE"]
cmake_args += ["-DCMAKE_INSTALL_RPATH={}".format("$ORIGIN")]
if is_vsc():
cmake_lib_out_dir = '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'
cmake_args += [cmake_lib_out_dir.format(cfg.upper(), extdir)]
cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg]
build_args += ['--', '/m:4']
else:
cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg]
build_args += ['--', '-j']
env = os.environ.copy()
cxxflags = '{} -DVERSION_INFO=\\"{}\\"'.format(
env.get('CXXFLAGS', ''), self.distribution.get_version())
env['CXXFLAGS'] = cxxflags
if not os.path.exists(self.build_temp):
os.makedirs(self.build_temp)
check_call(
[get_cmake(), ext.sourcedir] + cmake_args,
cwd=self.build_temp, env=env)
check_call(
[get_cmake(), '--build', '.', '--target', "libmcphase"] + build_args,
cwd=self.build_temp)
with open("README.md", "r") as fh:
LONG_DESCRIPTION = fh.read()
cmdclass = versioneer.get_cmdclass()
cmdclass['build_ext'] = CMakeBuild
KEYWORDARGS = dict(
name='libmcphase',
version=versioneer.get_version(),
author='Duc Le, Martin Rotter',
author_email='[email protected]',
description='A mean-field Monte Carlo simulation program for magnetic phase diagrams and excitations.',
long_description=LONG_DESCRIPTION,
long_description_content_type="text/markdown",
ext_modules=[CMakeExtension('libmcphase.libmcphase')],
packages=find_packages(),
install_requires = ['numpy'],
extras_require = {'interactive':['matplotlib>=2.2.0',],},
cmdclass=cmdclass,
url="https://github.com/mducle/libmcphase",
zip_safe=False,
classifiers=[
"Development Status :: 2 - Pre-Alpha",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
"Operating System :: Microsoft :: Windows :: Windows 10",
"Operating System :: POSIX :: Linux",
"Programming Language :: C++",
"Programming Language :: Python :: 3",
"Topic :: Scientific/Engineering :: Physics",
]
)
try:
setup(**KEYWORDARGS)
except CalledProcessError:
print("Failed to build the extension!")