spaCy/setup.py

202 lines
5.8 KiB
Python
Raw Normal View History

2014-07-05 22:49:34 +04:00
#!/usr/bin/env python
2016-01-15 20:57:01 +03:00
from __future__ import print_function
2015-12-13 13:49:17 +03:00
import os
2015-03-09 08:46:35 +03:00
import shutil
2015-12-13 13:49:17 +03:00
import subprocess
2014-07-05 22:49:34 +04:00
import sys
2015-12-14 01:32:23 +03:00
import contextlib
from distutils.command.build_ext import build_ext
2015-12-13 13:49:17 +03:00
from distutils.sysconfig import get_python_inc
2015-12-13 13:49:17 +03:00
try:
from setuptools import Extension, setup
except ImportError:
from distutils.core import Extension, setup
PACKAGES = [
'spacy',
'spacy.tokens',
'spacy.en',
'spacy.serialize',
'spacy.syntax',
'spacy.munge',
'spacy.tests',
'spacy.tests.matcher',
'spacy.tests.morphology',
'spacy.tests.munge',
'spacy.tests.parser',
'spacy.tests.serialize',
'spacy.tests.spans',
'spacy.tests.tagger',
'spacy.tests.tokenizer',
'spacy.tests.tokens',
'spacy.tests.vectors',
'spacy.tests.vocab']
MOD_NAMES = [
'spacy.parts_of_speech',
'spacy.strings',
'spacy.lexeme',
'spacy.vocab',
'spacy.attrs',
'spacy.morphology',
'spacy.tagger',
'spacy.syntax.stateclass',
2016-02-01 05:00:53 +03:00
'spacy.syntax._state',
2015-12-13 13:49:17 +03:00
'spacy.tokenizer',
'spacy.syntax.parser',
'spacy.syntax.nonproj',
2015-12-13 13:49:17 +03:00
'spacy.syntax.transition_system',
'spacy.syntax.arc_eager',
'spacy.syntax._parse_features',
'spacy.gold',
'spacy.orth',
'spacy.tokens.doc',
'spacy.tokens.span',
'spacy.tokens.token',
'spacy.serialize.packer',
'spacy.serialize.huffman',
'spacy.serialize.bits',
'spacy.cfile',
'spacy.matcher',
'spacy.syntax.ner',
'spacy.symbols']
2016-02-05 16:43:52 +03:00
# By subclassing build_extensions we have the actual compiler that will be used
# which is really known only after finalize_options
# http://stackoverflow.com/questions/724664/python-distutils-how-to-get-a-compiler-that-is-going-to-be-used
2016-02-05 16:43:52 +03:00
compile_options = {
'msvc': ['/Ox', '/EHsc'],
'mingw32' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function'],
'other' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function']
}
2016-02-05 16:43:52 +03:00
link_options = {
'msvc' : [],
'mingw32': [],
'other' : []
}
if not sys.platform.startswith('darwin'):
compile_options['other'].append('-fopenmp')
link_options['other'].append('-fopenmp')
2015-12-13 13:49:17 +03:00
class build_ext_options:
def build_options(self):
for e in self.extensions:
e.extra_compile_args = compile_options.get(
self.compiler.compiler_type, compile_options['other'])
for e in self.extensions:
e.extra_link_args = link_options.get(
self.compiler.compiler_type, link_options['other'])
2015-01-17 08:19:54 +03:00
2015-12-13 13:49:17 +03:00
class build_ext_subclass(build_ext, build_ext_options):
def build_extensions(self):
build_ext_options.build_options(self)
build_ext.build_extensions(self)
2015-01-17 08:19:54 +03:00
2015-12-14 01:32:23 +03:00
def generate_cython(root, source):
2015-12-13 13:49:17 +03:00
print('Cythonizing sources')
2015-12-13 14:51:23 +03:00
p = subprocess.call([sys.executable,
2015-12-14 01:32:23 +03:00
os.path.join(root, 'bin', 'cythonize.py'),
source])
2015-12-13 13:49:17 +03:00
if p != 0:
raise RuntimeError('Running cythonize failed')
2015-12-14 01:32:23 +03:00
def is_source_release(path):
return os.path.exists(os.path.join(path, 'PKG-INFO'))
def clean(path):
2015-12-13 13:49:17 +03:00
for name in MOD_NAMES:
name = name.replace('.', '/')
for ext in ['.so', '.html', '.cpp', '.c']:
2015-12-14 01:32:23 +03:00
file_path = os.path.join(path, name + ext)
if os.path.exists(file_path):
os.unlink(file_path)
2015-01-25 06:49:10 +03:00
2015-12-14 01:32:23 +03:00
@contextlib.contextmanager
def chdir(new_dir):
old_dir = os.getcwd()
2015-12-13 13:49:17 +03:00
try:
2015-12-14 01:32:23 +03:00
os.chdir(new_dir)
sys.path.insert(0, new_dir)
yield
2015-12-13 13:49:17 +03:00
finally:
del sys.path[0]
2015-12-14 01:32:23 +03:00
os.chdir(old_dir)
def setup_package():
root = os.path.abspath(os.path.dirname(__file__))
if len(sys.argv) > 1 and sys.argv[1] == 'clean':
return clean(root)
with chdir(root):
2016-01-15 20:57:01 +03:00
about = {}
with open(os.path.join(root, "spacy", "about.py")) as f:
exec(f.read(), about)
2015-12-14 01:32:23 +03:00
include_dirs = [
get_python_inc(plat_specific=True),
os.path.join(root, 'include')]
ext_modules = []
for mod_name in MOD_NAMES:
mod_path = mod_name.replace('.', '/') + '.cpp'
ext_modules.append(
Extension(mod_name, [mod_path],
language='c++', include_dirs=include_dirs))
if not is_source_release(root):
generate_cython(root, 'spacy')
setup(
2016-02-15 03:33:39 +03:00
name=about['__title__'],
zip_safe=False,
2015-12-14 01:32:23 +03:00
packages=PACKAGES,
2016-02-09 18:42:55 +03:00
package_data={'': ['*.pyx', '*.pxd', '*.txt', '*.tokens']},
2016-01-15 20:57:01 +03:00
description=about['__summary__'],
author=about['__author__'],
author_email=about['__email__'],
version=about['__version__'],
url=about['__uri__'],
license=about['__license__'],
2015-12-14 01:32:23 +03:00
ext_modules=ext_modules,
2016-01-30 22:29:24 +03:00
install_requires=['numpy', 'murmurhash>=0.26,<0.27', 'cymem>=1.30,<1.32.0', 'preshed>=0.46.1,<0.47',
2016-02-24 10:01:59 +03:00
'thinc>=5.0.0,<5.1.0', 'plac', 'six',
2016-03-08 17:30:17 +03:00
'ujson', 'cloudpickle', 'sputnik>=0.9.2,<0.10.0'],
2016-03-12 15:47:10 +03:00
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Console',
'Intended Audience :: Developers',
'Intended Audience :: Science/Research',
'License :: OSI Approved :: MIT License',
'Operating System :: POSIX :: Linux',
'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Topic :: Scientific/Engineering'],
2015-12-14 01:32:23 +03:00
cmdclass = {
'build_ext': build_ext_subclass},
)
2015-01-04 21:30:56 +03:00
if __name__ == '__main__':
2015-12-14 01:32:23 +03:00
setup_package()