diff options
author | Picca Frédéric-Emmanuel <picca@debian.org> | 2024-02-05 16:30:07 +0100 |
---|---|---|
committer | Picca Frédéric-Emmanuel <picca@debian.org> | 2024-02-05 16:30:07 +0100 |
commit | 04095a69f18767d222b16fae5b40f2b712cd6f7e (patch) | |
tree | d20abd3ee2f237319443e9dfd7500ad55d29a33d /setup.py | |
parent | 3427caf0e96690e56aac6231a91df8f0f7a64fc2 (diff) |
New upstream version 2.0.0+dfsg
Diffstat (limited to 'setup.py')
-rw-r--r-- | setup.py | 749 |
1 files changed, 177 insertions, 572 deletions
@@ -1,7 +1,7 @@ #!/usr/bin/env python3 # /*########################################################################## # -# Copyright (c) 2015-2022 European Synchrotron Radiation Facility +# Copyright (c) 2015-2023 European Synchrotron Radiation Facility # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,24 +24,20 @@ # ###########################################################################*/ __authors__ = ["Jérôme Kieffer", "Thomas Vincent"] -__date__ = "29/08/2022" +__date__ = "07/11/2022" __license__ = "MIT" import sys import os import platform import logging +from typing import Optional logging.basicConfig(level=logging.INFO) logger = logging.getLogger("silx.setup") -try: # setuptools >=62.4.0 - from setuptools.command.build import build as _build -except ImportError: - from distutils.command.build import build as _build -from setuptools import Command, Extension, find_packages -from setuptools.command.sdist import sdist +from setuptools import Extension from setuptools.command.build_ext import build_ext try: @@ -49,7 +45,8 @@ try: except ImportError: raise ImportError( "To install this package, you must install numpy first\n" - "(See https://pypi.org/project/numpy)") + "(See https://pypi.org/project/numpy)" + ) PROJECT = "silx" @@ -57,359 +54,95 @@ if sys.version_info.major < 3: logger.error(PROJECT + " no longer supports Python2") if "LANG" not in os.environ and sys.platform == "darwin": - print("""WARNING: the LANG environment variable is not defined, + print( + """WARNING: the LANG environment variable is not defined, an utf-8 LANG is mandatory to use setup.py, you may face unexpected UnicodeError. export LANG=en_US.utf-8 export LC_ALL=en_US.utf-8 -""") - - -def get_version(debian=False): - """Returns current version number from _version.py file""" - dirname = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "src", PROJECT) - sys.path.insert(0, dirname) - import _version - sys.path = sys.path[1:] - return _version.debianversion if debian else _version.strictversion - - -def get_readme(): - """Returns content of README.rst file""" - dirname = os.path.dirname(os.path.abspath(__file__)) - filename = os.path.join(dirname, "README.rst") - with open(filename, "r", encoding="utf-8") as fp: - long_description = fp.read() - return long_description - - -classifiers = ["Development Status :: 5 - Production/Stable", - "Environment :: Console", - "Environment :: MacOS X", - "Environment :: Win32 (MS Windows)", - "Environment :: X11 Applications :: Qt", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: MIT License", - "Natural Language :: English", - "Operating System :: MacOS", - "Operating System :: Microsoft :: Windows", - "Operating System :: POSIX", - "Programming Language :: Cython", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: Implementation :: CPython", - "Topic :: Scientific/Engineering :: Physics", - "Topic :: Software Development :: Libraries :: Python Modules", - ] - - -class BuildMan(Command): - """Command to build man pages""" - - description = "Build man pages of the provided entry points" - - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def entry_points_iterator(self): - """Iterate other entry points available on the project.""" - entry_points = self.distribution.entry_points - console_scripts = entry_points.get('console_scripts', []) - gui_scripts = entry_points.get('gui_scripts', []) - scripts = [] - scripts.extend(console_scripts) - scripts.extend(gui_scripts) - for script in scripts: - # Remove ending extra dependencies - script = script.split("[")[0] - elements = script.split("=") - target_name = elements[0].strip() - elements = elements[1].split(":") - module_name = elements[0].strip() - function_name = elements[1].strip() - yield target_name, module_name, function_name - - def run_targeted_script(self, target_name, script_name, env, log_output=False): - """Execute targeted script using --help and --version to help checking - errors. help2man is not very helpful to do it for us. - - :return: True is both return code are equal to 0 - :rtype: bool - """ - import subprocess - - if log_output: - extra_args = {} - else: - try: - # Python 3 - from subprocess import DEVNULL - except ImportError: - # Python 2 - import os - DEVNULL = open(os.devnull, 'wb') - extra_args = {'stdout': DEVNULL, 'stderr': DEVNULL} - - succeeded = True - command_line = [sys.executable, script_name, "--help"] - if log_output: - logger.info("See the following execution of: %s", " ".join(command_line)) - p = subprocess.Popen(command_line, env=env, **extra_args) - status = p.wait() - if log_output: - logger.info("Return code: %s", status) - succeeded = succeeded and status == 0 - command_line = [sys.executable, script_name, "--version"] - if log_output: - logger.info("See the following execution of: %s", " ".join(command_line)) - p = subprocess.Popen(command_line, env=env, **extra_args) - status = p.wait() - if log_output: - logger.info("Return code: %s", status) - succeeded = succeeded and status == 0 - return succeeded - - @staticmethod - def _write_script(target_name, lst_lines=None): - """Write a script to a temporary file and return its name - :paran target_name: base of the script name - :param lst_lines: list of lines to be written in the script - :return: the actual filename of the script (for execution or removal) - """ - import tempfile - import stat - script_fid, script_name = tempfile.mkstemp(prefix="%s_" % target_name, text=True) - with os.fdopen(script_fid, 'wt') as script: - for line in lst_lines: - if not line.endswith("\n"): - line += "\n" - script.write(line) - # make it executable - mode = os.stat(script_name).st_mode - os.chmod(script_name, mode + stat.S_IEXEC) - return script_name - - def get_synopsis(self, module_name, env, log_output=False): - """Execute a script to retrieve the synopsis for help2man - :return: synopsis - :rtype: single line string - """ - import subprocess - script_name = None - synopsis = None - script = ["#!%s\n" % sys.executable, - "import logging", - "logging.basicConfig(level=logging.ERROR)", - "import %s as app" % module_name, - "print(app.__doc__)"] - try: - script_name = self._write_script(module_name, script) - command_line = [sys.executable, script_name] - p = subprocess.Popen(command_line, env=env, stdout=subprocess.PIPE) - status = p.wait() - if status != 0: - logger.warning("Error while getting synopsis for module '%s'.", module_name) - synopsis = p.stdout.read().decode("utf-8").strip() - if synopsis == 'None': - synopsis = None - finally: - # clean up the script - if script_name is not None: - os.remove(script_name) - return synopsis - - def run(self): - build = self.get_finalized_command('build') - path = sys.path - path.insert(0, os.path.abspath(build.build_lib)) - - env = dict((str(k), str(v)) for k, v in os.environ.items()) - env["PYTHONPATH"] = os.pathsep.join(path) - if not os.path.isdir("build/man"): - os.makedirs("build/man") - import subprocess - import tempfile - import stat - script_name = None - workdir = tempfile.mkdtemp() - - entry_points = self.entry_points_iterator() - for target_name, module_name, function_name in entry_points: - logger.info("Build man for entry-point target '%s'" % target_name) - # help2man expect a single executable file to extract the help - # we create it, execute it, and delete it at the end - - try: - # create a launcher using the right python interpreter - script_name = os.path.join(workdir, target_name) - with open(script_name, "wt") as script: - script.write("#!%s\n" % sys.executable) - script.write("import %s as app\n" % module_name) - script.write("app.%s()\n" % function_name) - # make it executable - mode = os.stat(script_name).st_mode - os.chmod(script_name, mode + stat.S_IEXEC) - - # execute help2man - man_file = "build/man/%s.1" % target_name - command_line = ["help2man", "-N", script_name, "-o", man_file] - - synopsis = self.get_synopsis(module_name, env) - if synopsis: - command_line += ["-n", synopsis] - - p = subprocess.Popen(command_line, env=env) - status = p.wait() - if status != 0: - logger.info("Error while generating man file for target '%s'.", target_name) - self.run_targeted_script(target_name, script_name, env, True) - raise RuntimeError("Fail to generate '%s' man documentation" % target_name) - finally: - # clean up the script - if script_name is not None: - os.remove(script_name) - os.rmdir(workdir) +""" + ) + # ############## # # Compiler flags # # ############## # -class Build(_build): - """Command to support more user options for the build.""" +def parse_env_as_bool(key: str, default: Optional[bool] = None) -> Optional[bool]: + """Parse `key` env. var. and convert its value to a boolean or None. - user_options = [ - ('no-openmp', None, - "DEPRECATED: Instead, set the environment variable SILX_WITH_OPENMP to False"), - ('openmp', None, - "DEPRECATED: Instead, set the environment variable SILX_WITH_OPENMP to True"), - ('force-cython', None, - "DEPRECATED: Instead, set the environment variable SILX_FORCE_CYTHON to True"), - ] - user_options.extend(_build.user_options) - - boolean_options = ['no-openmp', 'openmp', 'force-cython'] - boolean_options.extend(_build.boolean_options) - - def initialize_options(self): - _build.initialize_options(self) - self.no_openmp = None - self.openmp = None - self.force_cython = None - - def finalize_options(self): - _build.finalize_options(self) - if self.no_openmp is not None: - logger.warning("--no-openmp is deprecated: Instead, set the environment variable SILX_WITH_OPENMP to False") - if self.openmp is not None: - logger.warning("--openmp is deprecated: Instead, set the environment variable SILX_WITH_OPENMP to True") - if self.force_cython is not None: - logger.warning("--force-cython is deprecated: Instead, set the environment variable SILX_FORCE_CYTHON to True") - if not self.force_cython: - self.force_cython = self._parse_env_as_bool("SILX_FORCE_CYTHON") is True - self.finalize_openmp_options() - - def _parse_env_as_bool(self, key): - content = os.environ.get(key, "") - value = content.lower() - if value in ["1", "true", "yes", "y"]: - return True - if value in ["0", "false", "no", "n"]: - return False - if value in ["none", ""]: - return None - msg = "Env variable '%s' contains '%s'. But a boolean or an empty \ - string was expected. Variable ignored." - logger.warning(msg, key, content) - return None - - def finalize_openmp_options(self): - """Check if extensions must be compiled with OpenMP. - - The result is stored into the object. - """ - if self.openmp: - use_openmp = True - elif self.no_openmp: - use_openmp = False - else: - env_with_openmp = self._parse_env_as_bool("SILX_WITH_OPENMP") - if env_with_openmp is not None: - use_openmp = env_with_openmp - else: - # Use it by default - use_openmp = True + If it cannot parse it or if None, `default` is returned. + """ + content = os.environ.get(key, "") + value = content.lower() + if value in ["1", "true", "yes", "y"]: + return True + if value in ["0", "false", "no", "n"]: + return False + if value in ["none", ""]: + return default + msg = "Env variable '%s' contains '%s'. But a boolean or an empty \ + string was expected. Variable ignored." + logger.warning(msg, key, content) + return default + + +def get_use_openmp_from_env_var() -> bool: + """Returns whether or not to build with OpenMP""" + use_openmp = parse_env_as_bool("SILX_WITH_OPENMP", default=True) + if use_openmp and platform.system() == "Darwin": + logger.warning("OpenMP support ignored. Your platform does not support it.") + return False + return use_openmp - if use_openmp and platform.system() == "Darwin": - logger.warning("OpenMP support ignored. Your platform does not support it.") - use_openmp = False - # Remove attributes used by distutils parsing - # use 'use_openmp' instead - del self.no_openmp - del self.openmp - self.use_openmp = use_openmp +USE_OPENMP = get_use_openmp_from_env_var() +FORCE_CYTHON = parse_env_as_bool("SILX_FORCE_CYTHON", default=False) class BuildExt(build_ext): """Handle extension compilation. - Command-line argument and environment can custom: + Environment variables can custom the build of extensions, see the install documentation. - - The use of cython to cythonize files, else a default version is used - - Build extension with support of OpenMP (by default it is enabled) - - If building with MSVC, compiler flags are converted from gcc flags. + If building with MSVC, compiler flags are converted from gcc flags. """ - COMPILE_ARGS_CONVERTER = {'-fopenmp': '/openmp'} + COMPILE_ARGS_CONVERTER = {"-fopenmp": "/openmp"} - LINK_ARGS_CONVERTER = {'-fopenmp': ''} + LINK_ARGS_CONVERTER = {"-fopenmp": ""} - description = 'Build extensions' + description = "Build extensions" - def finalize_options(self): - build_ext.finalize_options(self) - build_obj = self.distribution.get_command_obj("build") - self.use_openmp = build_obj.use_openmp - self.force_cython = build_obj.force_cython - - def patch_extension(self, ext): - """ - Patch an extension according to requested Cython and OpenMP usage. - - :param Extension ext: An extension - """ - # Cytonize + def patch_extension(self, ext: Extension): + """Patch an extension according to requested Cython and OpenMP usage.""" from Cython.Build import cythonize + patched_exts = cythonize( - [ext], - compiler_directives={'embedsignature': True, - 'language_level': 3}, - force=self.force_cython + [ext], + compiler_directives={"embedsignature": True, "language_level": 3}, + force=FORCE_CYTHON, ) ext.sources = patched_exts[0].sources # Remove OpenMP flags if OpenMP is disabled - if not self.use_openmp: + if not USE_OPENMP: ext.extra_compile_args = [ - f for f in ext.extra_compile_args if f != '-fopenmp'] - ext.extra_link_args = [ - f for f in ext.extra_link_args if f != '-fopenmp'] + f for f in ext.extra_compile_args if f != "-fopenmp" + ] + ext.extra_link_args = [f for f in ext.extra_link_args if f != "-fopenmp"] # Convert flags from gcc to MSVC if required - if self.compiler.compiler_type == 'msvc': - extra_compile_args = [self.COMPILE_ARGS_CONVERTER.get(f, f) - for f in ext.extra_compile_args] + if self.compiler.compiler_type == "msvc": + extra_compile_args = [ + self.COMPILE_ARGS_CONVERTER.get(f, f) for f in ext.extra_compile_args + ] # Avoid empty arg ext.extra_compile_args = [arg for arg in extra_compile_args if arg] - extra_link_args = [self.LINK_ARGS_CONVERTER.get(f, f) - for f in ext.extra_link_args] + extra_link_args = [ + self.LINK_ARGS_CONVERTER.get(f, f) for f in ext.extra_link_args + ] # Avoid empty arg ext.extra_link_args = [arg for arg in extra_link_args if arg] @@ -419,68 +152,6 @@ class BuildExt(build_ext): build_ext.build_extensions(self) -################################################################################ -# Debian source tree -################################################################################ - - -class sdist_debian(sdist): - """ - Tailor made sdist for debian - * remove auto-generated doc - * remove cython generated .c files - * remove cython generated .cpp files - * remove .bat files - * include .l man files - """ - - description = "Create a source distribution for Debian (tarball, zip file, etc.)" - - @staticmethod - def get_debian_name(): - name = "%s_%s" % (PROJECT, get_version(debian=True)) - return name - - def prune_file_list(self): - sdist.prune_file_list(self) - to_remove = ["doc/build", "doc/pdf", "doc/html", "pylint", "epydoc"] - print("Removing files for debian") - for rm in to_remove: - self.filelist.exclude_pattern(pattern="*", anchor=False, prefix=rm) - - # this is for Cython files specifically: remove C & html files - search_root = os.path.dirname(os.path.abspath(__file__)) - for root, _, files in os.walk(search_root): - for afile in files: - if os.path.splitext(afile)[1].lower() == ".pyx": - base_file = os.path.join(root, afile)[len(search_root) + 1:-4] - self.filelist.exclude_pattern(pattern=base_file + ".c") - self.filelist.exclude_pattern(pattern=base_file + ".cpp") - self.filelist.exclude_pattern(pattern=base_file + ".html") - - # do not include third_party/_local files - self.filelist.exclude_pattern(pattern="*", prefix="silx/third_party/_local") - - def make_distribution(self): - self.prune_file_list() - sdist.make_distribution(self) - dest = self.archive_files[0] - dirname, basename = os.path.split(dest) - base, ext = os.path.splitext(basename) - while ext in [".zip", ".tar", ".bz2", ".gz", ".Z", ".lz", ".orig"]: - base, ext = os.path.splitext(base) - # if ext: - # dest = "".join((base, ext)) - # else: - # dest = base - # sp = dest.split("-") - # base = sp[:-1] - # nr = sp[-1] - debian_arch = os.path.join(dirname, self.get_debian_name() + ".orig.tar.gz") - os.rename(self.archive_files[0], debian_arch) - self.archive_files = [debian_arch] - print("Building debian .orig.tar.gz in %s" % self.archive_files[0]) - # ##### # # setup # # ##### # @@ -496,301 +167,235 @@ def get_project_configuration(): install_requires = [ # for most of the computation "numpy%s" % numpy_requested_version, - # for the script launcher and pkg_resources - "setuptools", + # for version parsing + "packaging", # for io support "h5py", "fabio>=0.9", - ] + ] + if sys.version_info < (3, 9): + install_requires.append("setuptools") # For pkg_resources # extras requirements: target 'full' to install all dependencies at once full_requires = [ # opencl - 'pyopencl', - 'Mako', + "pyopencl", + "Mako", # gui - 'qtconsole', - 'matplotlib>=1.2.0', - 'PyOpenGL', - 'python-dateutil', - 'PyQt5', + "qtconsole", + "matplotlib>=3.1.0", + "PyOpenGL", + "python-dateutil", + "PyQt5", # extra - 'hdf5plugin', - 'scipy', - 'Pillow'] - - test_requires = [ - "pytest", - "pytest-xvfb", - "pytest-mock", + "hdf5plugin", + "scipy", + "Pillow", + "bitshuffle", ] + test_requires = ["pytest", "pytest-xvfb", "pytest-mock", "bitshuffle"] + + doc_requires = { + "nbsphinx", + "pandoc", + "pillow", + "pydata_sphinx_theme", + "sphinx", + "sphinx-autodoc-typehints", + "sphinx-panels", + } + extras_require = { - 'full': full_requires, - 'test': test_requires, + "full": full_requires, + "doc": doc_requires, + "test": test_requires, } # Here for packaging purpose only # Setting the SILX_FULL_INSTALL_REQUIRES environment variable # put all dependencies as install_requires - if os.environ.get('SILX_FULL_INSTALL_REQUIRES') is not None: + if os.environ.get("SILX_FULL_INSTALL_REQUIRES") is not None: install_requires += full_requires # Set the SILX_INSTALL_REQUIRES_STRIP env. var. to a comma-separated # list of package names to remove them from install_requires - install_requires_strip = os.environ.get('SILX_INSTALL_REQUIRES_STRIP') + install_requires_strip = os.environ.get("SILX_INSTALL_REQUIRES_STRIP") if install_requires_strip is not None: - for package_name in install_requires_strip.split(','): + for package_name in install_requires_strip.split(","): install_requires.remove(package_name) - - package_data = { - # Resources files for silx - 'silx.resources': [ - 'gui/logo/*.png', - 'gui/logo/*.svg', - 'gui/icons/*.png', - 'gui/icons/*.svg', - 'gui/icons/*.mng', - 'gui/icons/*.gif', - 'gui/icons/*/*.png', - 'opencl/*.cl', - 'opencl/image/*.cl', - 'opencl/sift/*.cl', - 'opencl/codec/*.cl', - 'gui/colormaps/*.npy'], - 'silx.examples': ['*.png'], - } - - entry_points = { - 'console_scripts': ['silx = silx.__main__:main'], - # 'gui_scripts': [], - } - - cmdclass = dict( - build=Build, - build_ext=BuildExt, - build_man=BuildMan, - debian_src=sdist_debian) - def silx_io_specfile_define_macros(): # Locale and platform management if sys.platform == "win32": - return [('WIN32', None), ('SPECFILE_POSIX', None)] - elif os.name.lower().startswith('posix'): + return [("WIN32", None), ("SPECFILE_POSIX", None)] + elif os.name.lower().startswith("posix"): # the best choice is to have _GNU_SOURCE defined # as a compilation flag because that allows the # use of strtod_l use_gnu_source = os.environ.get("SPECFILE_USE_GNU_SOURCE", "False") if use_gnu_source in ("True", "1"): # 1 was the initially supported value - return [('_GNU_SOURCE', 1)] - return [('SPECFILE_POSIX', None)] + return [("_GNU_SOURCE", 1)] + return [("SPECFILE_POSIX", None)] else: return [] ext_modules = [ - # silx.image - Extension( - name='silx.image.bilinear', + name="silx.image.bilinear", sources=["src/silx/image/bilinear.pyx"], - language='c', + language="c", ), Extension( - name='silx.image.marchingsquares._mergeimpl', - sources=['src/silx/image/marchingsquares/_mergeimpl.pyx'], + name="silx.image.marchingsquares._mergeimpl", + sources=["src/silx/image/marchingsquares/_mergeimpl.pyx"], include_dirs=[ numpy.get_include(), - os.path.join(os.path.dirname(__file__), "src", "silx", "utils", "include") + os.path.join( + os.path.dirname(__file__), "src", "silx", "utils", "include" + ), ], - language='c++', - extra_link_args=['-fopenmp'], - extra_compile_args=['-fopenmp'], + language="c++", + extra_link_args=["-fopenmp"], + extra_compile_args=["-fopenmp"], ), Extension( - name='silx.image.shapes', + name="silx.image.shapes", sources=["src/silx/image/shapes.pyx"], - language='c', + language="c", ), - # silx.io - Extension( - name='silx.io.specfile', + name="silx.io.specfile", sources=[ - 'src/silx/io/specfile/src/sfheader.c', - 'src/silx/io/specfile/src/sfinit.c', - 'src/silx/io/specfile/src/sflists.c', - 'src/silx/io/specfile/src/sfdata.c', - 'src/silx/io/specfile/src/sfindex.c', - 'src/silx/io/specfile/src/sflabel.c', - 'src/silx/io/specfile/src/sfmca.c', - 'src/silx/io/specfile/src/sftools.c', - 'src/silx/io/specfile/src/locale_management.c', - 'src/silx/io/specfile.pyx', + "src/silx/io/specfile/src/sfheader.c", + "src/silx/io/specfile/src/sfinit.c", + "src/silx/io/specfile/src/sflists.c", + "src/silx/io/specfile/src/sfdata.c", + "src/silx/io/specfile/src/sfindex.c", + "src/silx/io/specfile/src/sflabel.c", + "src/silx/io/specfile/src/sfmca.c", + "src/silx/io/specfile/src/sftools.c", + "src/silx/io/specfile/src/locale_management.c", + "src/silx/io/specfile.pyx", ], define_macros=silx_io_specfile_define_macros(), - include_dirs=['src/silx/io/specfile/include'], - language='c', + include_dirs=["src/silx/io/specfile/include"], + language="c", ), - # silx.math - Extension( - name='silx.math._colormap', + name="silx.math._colormap", sources=["src/silx/math/_colormap.pyx"], - language='c', + language="c", include_dirs=[ - 'src/silx/math/include', + "src/silx/math/include", numpy.get_include(), ], - extra_link_args=['-fopenmp'], - extra_compile_args=['-fopenmp'], + extra_link_args=["-fopenmp"], + extra_compile_args=["-fopenmp"], ), Extension( - name='silx.math.chistogramnd', + name="silx.math.chistogramnd", sources=[ - 'src/silx/math/histogramnd/src/histogramnd_c.c', - 'src/silx/math/chistogramnd.pyx', + "src/silx/math/histogramnd/src/histogramnd_c.c", + "src/silx/math/chistogramnd.pyx", ], include_dirs=[ - 'src/silx/math/histogramnd/include', + "src/silx/math/histogramnd/include", numpy.get_include(), ], - language='c', + language="c", ), Extension( - name='silx.math.chistogramnd_lut', - sources=['src/silx/math/chistogramnd_lut.pyx'], + name="silx.math.chistogramnd_lut", + sources=["src/silx/math/chistogramnd_lut.pyx"], include_dirs=[ - 'src/silx/math/histogramnd/include', + "src/silx/math/histogramnd/include", numpy.get_include(), ], - language='c', + language="c", ), Extension( - name='silx.math.combo', - sources=['src/silx/math/combo.pyx'], - include_dirs=['src/silx/math/include'], - language='c', + name="silx.math.combo", + sources=["src/silx/math/combo.pyx"], + include_dirs=["src/silx/math/include"], + language="c", ), Extension( - name='silx.math.interpolate', + name="silx.math.interpolate", sources=["src/silx/math/interpolate.pyx"], - language='c', + language="c", include_dirs=[ - 'src/silx/math/include', + "src/silx/math/include", numpy.get_include(), ], - extra_link_args=['-fopenmp'], - extra_compile_args=['-fopenmp'], + extra_link_args=["-fopenmp"], + extra_compile_args=["-fopenmp"], ), Extension( - name='silx.math.marchingcubes', + name="silx.math.marchingcubes", sources=[ - 'src/silx/math/marchingcubes/mc_lut.cpp', - 'src/silx/math/marchingcubes.pyx', + "src/silx/math/marchingcubes/mc_lut.cpp", + "src/silx/math/marchingcubes.pyx", ], include_dirs=[ - 'src/silx/math/marchingcubes', + "src/silx/math/marchingcubes", numpy.get_include(), ], - language='c++', + language="c++", ), Extension( - name='silx.math.medianfilter.medianfilter', - sources=['src/silx/math/medianfilter/medianfilter.pyx'], + name="silx.math.medianfilter.medianfilter", + sources=["src/silx/math/medianfilter/medianfilter.pyx"], include_dirs=[ - 'src/silx/math/medianfilter/include', + "src/silx/math/medianfilter/include", numpy.get_include(), ], - language='c++', - extra_link_args=['-fopenmp'], - extra_compile_args=['-fopenmp'], + language="c++", + extra_link_args=["-fopenmp"], + extra_compile_args=["-fopenmp"], ), - # silx.math.fit - Extension( - name='silx.math.fit.filters', + name="silx.math.fit.filters", sources=[ - 'src/silx/math/fit/filters/src/smoothnd.c', - 'src/silx/math/fit/filters/src/snip1d.c', - 'src/silx/math/fit/filters/src/snip2d.c', - 'src/silx/math/fit/filters/src/snip3d.c', - 'src/silx/math/fit/filters/src/strip.c', - 'src/silx/math/fit/filters.pyx', + "src/silx/math/fit/filters/src/smoothnd.c", + "src/silx/math/fit/filters/src/snip1d.c", + "src/silx/math/fit/filters/src/snip2d.c", + "src/silx/math/fit/filters/src/snip3d.c", + "src/silx/math/fit/filters/src/strip.c", + "src/silx/math/fit/filters.pyx", ], - include_dirs=['src/silx/math/fit/filters/include'], - language='c', + include_dirs=["src/silx/math/fit/filters/include"], + language="c", ), Extension( - name='silx.math.fit.functions', + name="silx.math.fit.functions", sources=[ - 'src/silx/math/fit/functions/src/funs.c', - 'src/silx/math/fit/functions.pyx', + "src/silx/math/fit/functions/src/funs.c", + "src/silx/math/fit/functions.pyx", ], - include_dirs=['src/silx/math/fit/functions/include'], - language='c', + include_dirs=["src/silx/math/fit/functions/include"], + language="c", ), Extension( - name='silx.math.fit.peaks', + name="silx.math.fit.peaks", sources=[ - 'src/silx/math/fit/peaks/src/peaks.c', - 'src/silx/math/fit/peaks.pyx', + "src/silx/math/fit/peaks/src/peaks.c", + "src/silx/math/fit/peaks.pyx", ], - include_dirs=['src/silx/math/fit/peaks/include'], - language='c', + include_dirs=["src/silx/math/fit/peaks/include"], + language="c", ), ] - # silx.third_party - - if os.path.exists(os.path.join( - os.path.dirname(__file__), "src", "silx", "third_party", "_local") - ): - ext_modules.append( - Extension( - name='silx.third_party._local.scipy_spatial.qhull', - sources=[ - 'src/silx/third_party/_local/scipy_spatial/qhull/src/' + fname for fname in ( - 'geom2_r.c', 'geom_r.c', 'global_r.c', 'io_r.c', 'libqhull_r.c', 'mem_r.c', - 'merge_r.c', 'poly2_r.c', 'poly_r.c', 'qset_r.c', 'random_r.c', 'rboxlib_r.c', - 'stat_r.c', 'usermem_r.c', 'userprintf_rbox_r.c', 'userprintf_r.c', 'user_r.c' - )] + [ - 'src/silx/third_party/_local/scipy_spatial/qhull.pyx', - ], - include_dirs=[numpy.get_include()], - ) - ) - return dict( - name=PROJECT, - version=get_version(), - license="MIT", - url="http://www.silx.org/", - author="data analysis unit", - author_email="silx@esrf.fr", - classifiers=classifiers, - description="Software library for X-ray data analysis", - long_description=get_readme(), install_requires=install_requires, extras_require=extras_require, - python_requires='>=3.5', - cmdclass=cmdclass, - zip_safe=False, - entry_points=entry_points, - packages=find_packages(where='src', include=['silx*']) + ['silx.examples'], - package_dir={ - "": "src", - "silx.examples": "examples", - }, + cmdclass=dict(build_ext=BuildExt), ext_modules=ext_modules, - package_data=package_data, - data_files=[ - ('silx/third_party/_local/scipy_spatial/qhull', ['src/silx/third_party/_local/scipy_spatial/qhull/COPYING.txt']) - ], ) |