Skip to content
Snippets Groups Projects
setup.py 2.9 KiB
Newer Older
#!/usr/bin/python3
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
import os
import re
import sys
import sysconfig
import platform
import subprocess

from distutils.version import LooseVersion
from setuptools import setup, Extension
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
from setuptools.command.build_ext import build_ext
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
class CMakeExtension(Extension):
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    def __init__(self, name, sourcedir=''):
        Extension.__init__(self, name, sources=[])
        self.sourcedir = os.path.abspath(sourcedir)
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed


Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
class CMakeBuild(build_ext):
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    def run(self):
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
        try:
            out = subprocess.check_output(['cmake', '--version'])
        except OSError:
            raise RuntimeError(
                "CMake must be installed to build the following extensions: " +
                ", ".join(e.name for e in self.extensions))

        if platform.system() == "Windows":
            cmake_version = LooseVersion(re.search(r'version\s*([\d.]+)',
                                         out.decode()).group(1))
            if cmake_version < '3.1.0':
                raise RuntimeError("CMake >= 3.1.0 is required on Windows")

        for ext in self.extensions:
            self.build_extension(ext)

    def build_extension(self, ext):
        extdir = os.path.abspath(
            os.path.dirname(self.get_ext_fullpath(ext.name)))
        cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir,
                      '-DPYTHON_EXECUTABLE=' + sys.executable]

        cfg = 'Debug' if self.debug else 'Release'
        build_args = ['--config', cfg]

        if platform.system() == "Windows":
            cmake_args += ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'.format(
                cfg.upper(),
                extdir)]
Sergei Rashitov's avatar
Sergei Rashitov committed
            cmake_args += ['-G', 'MinGW Makefiles']
            #if sys.maxsize > 2**32:
            #    cmake_args += ['-A', 'x64']
            #build_args += ['--', '/m']
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
        else:
            cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg]
            build_args += ['--', '-j4']
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed

        env = os.environ.copy()
        env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format(
            env.get('CXXFLAGS', ''),
            self.distribution.get_version())
        if not os.path.exists(self.build_temp):
            os.makedirs(self.build_temp)
        subprocess.check_call(['cmake', ext.sourcedir] + cmake_args,
                              cwd=self.build_temp, env=env)
        subprocess.check_call(['cmake', '--build', '.'] + build_args,
                              cwd=self.build_temp)
        print()  # Add an empty line for cleaner outputimport sys
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    version="0.13-post0",
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    description="CellFrame SDK",
dmitriy.gerasimov's avatar
dmitriy.gerasimov committed
    author='Demlabs (2007-2021)',
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    license="GNU GPLv3",
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    packages=['CellFrame'],
    ext_modules=[CMakeExtension('CellFrame/libCellFrame')],
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    # add custom build_ext command
    cmdclass={
        'build_ext': CMakeBuild
    },
#    cmdclass=dict(build_ext=CMakeBuild),
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    zip_safe=False,
#    tests_require=['pytest'],
#    setup_requires=setup_requires
)