setup.py 2.79 KB
import distutils.cmd
import distutils.log
import os
import pathlib
import subprocess
import sys
from distutils.core import setup
from distutils.extension import Extension

import numpy
from Cython.Build import cythonize
from Cython.Distutils import build_ext

if sys.platform == "darwin":
    unix_copt = ["-Xpreprocessor", "-fopenmp", "-lomp"]
    unix_lopt = ["-Xpreprocessor", "-fopenmp", "-lomp"]
else:
    unix_copt = [
        "-fopenmp",
    ]
    unix_lopt = [
        "-fopenmp",
    ]


copt = {"msvc": ["/openmp"], "mingw32": ["-fopenmp"], "unix": unix_copt}

lopt = {"mingw32": ["-fopenmp"], "unix": unix_lopt}


class build_ext_subclass(build_ext):
    def build_extensions(self):
        c = self.compiler.compiler_type
        print("Compiler", c)
        if c in copt:
            for e in self.extensions:
                e.extra_compile_args = copt[c]
        if c in lopt:
            for e in self.extensions:
                e.extra_link_args = lopt[c]
        for e in self.extensions:
            e.include_dirs = [numpy.get_include()]
        build_ext.build_extensions(self)


class BuildPluginsCommand(distutils.cmd.Command):
    """
    A custom command to build all plugins with cython code.
    """

    description = "Build all plugins with cython code"
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        compilable_plugins = ["porous_creation", "remove_tiny_objects"]
        inv_folder = pathlib.Path(__file__).parent.resolve()
        plugins_folder = inv_folder.joinpath("plugins")
        for p in compilable_plugins:
            plugin_folder = plugins_folder.joinpath(p)
            self.announce("Compiling plugin: {}".format(p), level=distutils.log.INFO)
            os.chdir(plugin_folder)
            subprocess.check_call(
                [sys.executable, "setup.py", "build_ext", "--inplace"]
            )
            os.chdir(inv_folder)


setup(
    cmdclass={
        "build_ext": build_ext_subclass,
        "build_plugins": BuildPluginsCommand,
    },
    ext_modules=cythonize(
        [
            Extension(
                "invesalius_cy.mips",
                ["invesalius_cy/mips.pyx"],
            ),
            Extension(
                "invesalius_cy.interpolation",
                ["invesalius_cy/interpolation.pyx"],
            ),
            Extension(
                "invesalius_cy.transforms",
                ["invesalius_cy/transforms.pyx"],
            ),
            Extension(
                "invesalius_cy.floodfill",
                ["invesalius_cy/floodfill.pyx"],
                language="c++",
            ),
            Extension(
                "invesalius_cy.cy_mesh",
                ["invesalius_cy/cy_mesh.pyx"],
                language="c++",
            ),
        ]
    ),
)