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
|
|
|
|
import subprocess
|
2014-07-05 22:49:34 +04:00
|
|
|
import sys
|
2020-11-23 13:15:11 +03:00
|
|
|
import numpy
|
2022-10-18 17:05:58 +03:00
|
|
|
from pathlib import Path
|
2015-10-13 01:31:59 +03:00
|
|
|
from distutils.command.build_ext import build_ext
|
2015-12-13 13:49:17 +03:00
|
|
|
from distutils.sysconfig import get_python_inc
|
2018-12-04 02:06:42 +03:00
|
|
|
import distutils.util
|
2016-04-28 23:10:43 +03:00
|
|
|
from distutils import ccompiler, msvccompiler
|
2017-05-03 21:10:59 +03:00
|
|
|
from setuptools import Extension, setup, find_packages
|
2022-10-18 17:05:58 +03:00
|
|
|
from Cython.Build import cythonize
|
|
|
|
from Cython.Compiler import Options
|
2015-12-13 13:49:17 +03:00
|
|
|
|
|
|
|
|
2018-12-04 02:06:42 +03:00
|
|
|
def is_new_osx():
|
2018-12-08 13:49:43 +03:00
|
|
|
"""Check whether we're on OSX >= 10.10"""
|
2018-12-04 02:06:42 +03:00
|
|
|
name = distutils.util.get_platform()
|
2018-12-08 13:49:43 +03:00
|
|
|
if sys.platform != "darwin":
|
2018-12-04 02:06:42 +03:00
|
|
|
return False
|
2018-12-08 13:49:43 +03:00
|
|
|
elif name.startswith("macosx-10"):
|
|
|
|
minor_version = int(name.split("-")[1].split(".")[1])
|
2018-12-04 02:06:42 +03:00
|
|
|
if minor_version >= 7:
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
2022-10-18 17:05:58 +03:00
|
|
|
# Preserve `__doc__` on functions and classes
|
|
|
|
# http://docs.cython.org/en/latest/src/userguide/source_files_and_compilation.html#compiler-options
|
|
|
|
Options.docstrings = True
|
|
|
|
|
2017-05-03 21:10:59 +03:00
|
|
|
PACKAGES = find_packages()
|
2015-12-13 13:49:17 +03:00
|
|
|
|
|
|
|
|
|
|
|
MOD_NAMES = [
|
2018-11-27 00:04:35 +03:00
|
|
|
"spacy.parts_of_speech",
|
|
|
|
"spacy.strings",
|
|
|
|
"spacy.lexeme",
|
|
|
|
"spacy.vocab",
|
|
|
|
"spacy.attrs",
|
2019-03-18 19:27:51 +03:00
|
|
|
"spacy.kb",
|
2018-11-27 00:04:35 +03:00
|
|
|
"spacy.morphology",
|
2019-02-10 14:14:51 +03:00
|
|
|
"spacy.pipeline.pipes",
|
2019-03-07 12:45:55 +03:00
|
|
|
"spacy.pipeline.morphologizer",
|
2018-11-27 00:04:35 +03:00
|
|
|
"spacy.syntax.stateclass",
|
|
|
|
"spacy.syntax._state",
|
|
|
|
"spacy.tokenizer",
|
|
|
|
"spacy.syntax.nn_parser",
|
|
|
|
"spacy.syntax._parser_model",
|
|
|
|
"spacy.syntax._beam_utils",
|
|
|
|
"spacy.syntax.nonproj",
|
|
|
|
"spacy.syntax.transition_system",
|
|
|
|
"spacy.syntax.arc_eager",
|
|
|
|
"spacy.gold",
|
|
|
|
"spacy.tokens.doc",
|
|
|
|
"spacy.tokens.span",
|
|
|
|
"spacy.tokens.token",
|
2019-03-07 16:34:54 +03:00
|
|
|
"spacy.tokens.morphanalysis",
|
2018-11-27 00:04:35 +03:00
|
|
|
"spacy.tokens._retokenize",
|
2019-02-07 11:42:25 +03:00
|
|
|
"spacy.matcher.matcher",
|
|
|
|
"spacy.matcher.phrasematcher",
|
|
|
|
"spacy.matcher.dependencymatcher",
|
2018-11-27 00:04:35 +03:00
|
|
|
"spacy.syntax.ner",
|
|
|
|
"spacy.symbols",
|
|
|
|
"spacy.vectors",
|
2017-06-05 13:45:29 +03:00
|
|
|
]
|
2015-12-13 13:49:17 +03:00
|
|
|
|
|
|
|
|
2018-11-27 00:04:35 +03:00
|
|
|
COMPILE_OPTIONS = {
|
|
|
|
"msvc": ["/Ox", "/EHsc"],
|
|
|
|
"mingw32": ["-O2", "-Wno-strict-prototypes", "-Wno-unused-function"],
|
|
|
|
"other": ["-O2", "-Wno-strict-prototypes", "-Wno-unused-function"],
|
2016-02-05 16:43:52 +03:00
|
|
|
}
|
2015-10-13 01:31:59 +03:00
|
|
|
|
2016-02-05 16:43:52 +03:00
|
|
|
|
2018-11-27 00:04:35 +03:00
|
|
|
LINK_OPTIONS = {"msvc": [], "mingw32": [], "other": []}
|
2016-02-05 16:43:52 +03:00
|
|
|
|
2022-10-18 17:05:58 +03:00
|
|
|
COMPILER_DIRECTIVES = {
|
|
|
|
"language_level": -3,
|
|
|
|
"embedsignature": True,
|
|
|
|
"annotation_typing": False,
|
|
|
|
}
|
|
|
|
|
2016-12-20 13:05:06 +03:00
|
|
|
|
2018-12-04 02:06:42 +03:00
|
|
|
if is_new_osx():
|
|
|
|
# On Mac, use libc++ because Apple deprecated use of
|
|
|
|
# libstdc
|
|
|
|
COMPILE_OPTIONS["other"].append("-stdlib=libc++")
|
|
|
|
LINK_OPTIONS["other"].append("-lc++")
|
|
|
|
# g++ (used by unix compiler on mac) links to libstdc++ as a default lib.
|
|
|
|
# See: https://stackoverflow.com/questions/1653047/avoid-linking-to-libstdc
|
|
|
|
LINK_OPTIONS["other"].append("-nodefaultlibs")
|
2016-02-05 16:43:52 +03:00
|
|
|
|
2016-12-20 13:05:06 +03:00
|
|
|
|
2016-04-19 20:50:42 +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
|
2015-12-13 13:49:17 +03:00
|
|
|
class build_ext_options:
|
|
|
|
def build_options(self):
|
|
|
|
for e in self.extensions:
|
2016-11-06 13:58:26 +03:00
|
|
|
e.extra_compile_args += COMPILE_OPTIONS.get(
|
2018-11-27 00:04:35 +03:00
|
|
|
self.compiler.compiler_type, COMPILE_OPTIONS["other"]
|
|
|
|
)
|
2015-12-13 13:49:17 +03:00
|
|
|
for e in self.extensions:
|
2016-11-06 13:58:26 +03:00
|
|
|
e.extra_link_args += LINK_OPTIONS.get(
|
2018-11-27 00:04:35 +03:00
|
|
|
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
|
|
|
|
|
|
|
|
2020-07-02 18:10:27 +03:00
|
|
|
# Include the git version in the build (adapted from NumPy)
|
|
|
|
# Copyright (c) 2005-2020, NumPy Developers.
|
|
|
|
# BSD 3-Clause license, see licenses/3rd_party_licenses.txt
|
|
|
|
def write_git_info_py(filename="spacy/git_info.py"):
|
|
|
|
def _minimal_ext_cmd(cmd):
|
|
|
|
# construct minimal environment
|
|
|
|
env = {}
|
|
|
|
for k in ["SYSTEMROOT", "PATH", "HOME"]:
|
|
|
|
v = os.environ.get(k)
|
|
|
|
if v is not None:
|
|
|
|
env[k] = v
|
|
|
|
# LANGUAGE is used on win32
|
|
|
|
env["LANGUAGE"] = "C"
|
|
|
|
env["LANG"] = "C"
|
|
|
|
env["LC_ALL"] = "C"
|
|
|
|
out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, env=env)
|
|
|
|
return out
|
|
|
|
|
|
|
|
git_version = "Unknown"
|
|
|
|
if os.path.exists(".git"):
|
|
|
|
try:
|
|
|
|
out = _minimal_ext_cmd(["git", "rev-parse", "--short", "HEAD"])
|
|
|
|
git_version = out.strip().decode("ascii")
|
2022-10-19 09:07:08 +03:00
|
|
|
except Exception:
|
2020-07-02 18:10:27 +03:00
|
|
|
pass
|
|
|
|
elif os.path.exists(filename):
|
|
|
|
# must be a source distribution, use existing version file
|
|
|
|
try:
|
|
|
|
a = open(filename, "r")
|
|
|
|
lines = a.readlines()
|
|
|
|
git_version = lines[-1].split('"')[1]
|
2022-10-19 09:07:08 +03:00
|
|
|
except Exception:
|
2020-07-02 18:10:27 +03:00
|
|
|
pass
|
|
|
|
finally:
|
|
|
|
a.close()
|
|
|
|
|
|
|
|
text = """# THIS FILE IS GENERATED FROM SPACY SETUP.PY
|
|
|
|
#
|
|
|
|
GIT_VERSION = "%(git_version)s"
|
|
|
|
"""
|
|
|
|
a = open(filename, "w")
|
|
|
|
try:
|
|
|
|
a.write(
|
|
|
|
text % {"git_version": git_version,}
|
|
|
|
)
|
|
|
|
finally:
|
|
|
|
a.close()
|
|
|
|
|
|
|
|
|
2015-12-14 01:32:23 +03:00
|
|
|
def clean(path):
|
2022-10-18 17:05:58 +03:00
|
|
|
for path in path.glob("**/*"):
|
|
|
|
if path.is_file() and path.suffix in (".so", ".cpp"):
|
2022-10-19 09:07:08 +03:00
|
|
|
print("Deleting", path.name)
|
2022-10-18 17:05:58 +03:00
|
|
|
path.unlink()
|
2015-12-14 01:32:23 +03:00
|
|
|
|
|
|
|
|
|
|
|
def setup_package():
|
2020-07-02 18:10:27 +03:00
|
|
|
write_git_info_py()
|
|
|
|
|
2022-10-18 17:05:58 +03:00
|
|
|
root = Path(__file__).parent
|
2015-12-14 01:32:23 +03:00
|
|
|
|
2020-08-20 17:30:11 +03:00
|
|
|
if hasattr(sys, "argv") and len(sys.argv) > 1 and sys.argv[1] == "clean":
|
2022-10-18 17:05:58 +03:00
|
|
|
return clean(root / "spacy")
|
|
|
|
|
|
|
|
with (root / "spacy" / "about.py").open("r") as f:
|
|
|
|
about = {}
|
|
|
|
exec(f.read(), about)
|
|
|
|
|
|
|
|
include_dirs = [
|
|
|
|
get_python_inc(plat_specific=True),
|
|
|
|
numpy.get_include(),
|
|
|
|
str(root / "include"),
|
|
|
|
]
|
|
|
|
if (
|
|
|
|
ccompiler.new_compiler().compiler_type == "msvc"
|
|
|
|
and msvccompiler.get_build_version() == 9
|
|
|
|
):
|
|
|
|
include_dirs.append(str(root / "include" / "msvc9"))
|
|
|
|
ext_modules = []
|
|
|
|
for name in MOD_NAMES:
|
|
|
|
mod_path = name.replace(".", "/") + ".pyx"
|
|
|
|
ext = Extension(name, [mod_path], language="c++")
|
|
|
|
ext_modules.append(ext)
|
|
|
|
print("Cythonizing sources")
|
|
|
|
ext_modules = cythonize(ext_modules, compiler_directives=COMPILER_DIRECTIVES)
|
|
|
|
|
|
|
|
setup(
|
|
|
|
name="spacy",
|
|
|
|
packages=PACKAGES,
|
|
|
|
version=about["__version__"],
|
|
|
|
ext_modules=ext_modules,
|
|
|
|
cmdclass={"build_ext": build_ext_subclass},
|
|
|
|
include_dirs=include_dirs,
|
2022-10-19 09:07:08 +03:00
|
|
|
package_data={"": ["*.pyx", "*.pxd", "*.pxi"]},
|
2022-10-18 17:05:58 +03:00
|
|
|
)
|
2015-01-04 21:30:56 +03:00
|
|
|
|
|
|
|
|
2018-11-27 00:04:35 +03:00
|
|
|
if __name__ == "__main__":
|
2015-12-14 01:32:23 +03:00
|
|
|
setup_package()
|