setup.py 2.43 KB
Newer Older
Kai Chen's avatar
Kai Chen committed
1
2
import os.path as osp
from distutils.core import setup, Extension
Kai Chen's avatar
Kai Chen committed
3
4
5
6
7
8
9

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

# extensions
ext_args = dict(
Kai Chen's avatar
Kai Chen committed
10
    include_dirs=[np.get_include()],
Kai Chen's avatar
Kai Chen committed
11
12
    language='c++',
    extra_compile_args={
Kai Chen's avatar
Kai Chen committed
13
14
        'cc': ['-Wno-unused-function', '-Wno-write-strings'],
        'nvcc': ['-c', '--compiler-options', '-fPIC'],
Kai Chen's avatar
Kai Chen committed
15
16
17
18
19
20
    },
)

extensions = [
    Extension('cpu_nms', ['cpu_nms.pyx'], **ext_args),
    Extension('cpu_soft_nms', ['cpu_soft_nms.pyx'], **ext_args),
Kai Chen's avatar
Kai Chen committed
21
    Extension('gpu_nms', ['gpu_nms.pyx', 'nms_kernel.cu'], **ext_args),
Kai Chen's avatar
Kai Chen committed
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
]


def customize_compiler_for_nvcc(self):
    """inject deep into distutils to customize how the dispatch
    to cc/nvcc works.
    If you subclass UnixCCompiler, it's not trivial to get your subclass
    injected in, and still have the right customizations (i.e.
    distutils.sysconfig.customize_compiler) run on it. So instead of going
    the OO route, I have this. Note, it's kindof like a wierd functional
    subclassing going on."""

    # tell the compiler it can processes .cu
    self.src_extensions.append('.cu')

    # save references to the default compiler_so and _comple methods
    default_compiler_so = self.compiler_so
    super = self._compile

    # now redefine the _compile method. This gets executed for each
    # object but distutils doesn't have the ability to change compilers
    # based on source extension: we add it.
    def _compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
Kai Chen's avatar
Kai Chen committed
45
        if osp.splitext(src)[1] == '.cu':
Kai Chen's avatar
Kai Chen committed
46
            # use the cuda for .cu files
Kai Chen's avatar
Kai Chen committed
47
            self.set_executable('compiler_so', 'nvcc')
Kai Chen's avatar
Kai Chen committed
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
            # use only a subset of the extra_postargs, which are 1-1 translated
            # from the extra_compile_args in the Extension class
            postargs = extra_postargs['nvcc']
        else:
            postargs = extra_postargs['cc']

        super(obj, src, ext, cc_args, postargs, pp_opts)
        # reset the default compiler_so, which we might have changed for cuda
        self.compiler_so = default_compiler_so

    # inject our redefined _compile method into the class
    self._compile = _compile


# run the customize_compiler
class custom_build_ext(build_ext):

    def build_extensions(self):
        customize_compiler_for_nvcc(self.compiler)
        build_ext.build_extensions(self)


setup(
    name='nms',
    cmdclass={'build_ext': custom_build_ext},
    ext_modules=cythonize(extensions),
)