diff --git a/.gitignore b/.gitignore index 6eaa0c512..425b38e00 100644 --- a/.gitignore +++ b/.gitignore @@ -101,3 +101,4 @@ tutorial/cmake-build-debug .vscode/ .idea/ site/ +*.egg-info/ diff --git a/.travis.yml b/.travis.yml index 4be93d046..072e8bffc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,11 +10,8 @@ matrix: - mkdir external/glfw/include/GL - wget --no-check-certificate -P external/glfw/include/GL http://www.opengl.org/registry/api/GL/glcorearb.h - cd python - - mkdir build - - cd build - - cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON ../ - - make -j 2 - - cd ../tutorial + - python3 setup.py develop + - cd tutorial - python3 101_FileIO.py || { cd ../; mkdir build2; cd build2; cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON - DCHECK_UNDEFINED=ON ../; make -j 2; } - cd ../../ - cd tutorial @@ -53,11 +50,8 @@ matrix: # - brew upgrade cgal - git submodule update --init --recursive - cd python - - mkdir build - - cd build - - cmake ../ - - make -j 2 - - cd ../tutorial + - python setup.py develop + - cd tutorial - python 101_FileIO.py - cd ../../ - cd tutorial diff --git a/python/setup.py b/python/setup.py new file mode 100644 index 000000000..62d84eb46 --- /dev/null +++ b/python/setup.py @@ -0,0 +1,85 @@ +import os +import re +import sys +import platform +import subprocess + +from setuptools import setup, Extension +from setuptools.command.build_ext import build_ext +from distutils.version import LooseVersion +from distutils.sysconfig import get_config_var +from distutils.sysconfig import get_python_inc + + +class CMakeExtension(Extension): + + def __init__(self, name, sourcedir=''): + Extension.__init__(self, name, sources=[]) + self.sourcedir = os.path.abspath(sourcedir) + + +class CMakeBuild(build_ext): + + def run(self): + 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))) + + python_library = str(get_config_var('LIBDIR')) + python_include_directory = str(get_python_inc()) + + cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir, + '-DPYTHON_EXECUTABLE=' + sys.executable, + '-DPYTHON_LIBRARY=' + python_library, + '-DPYTHON_INCLUDE_DIR=' + python_include_directory, ] + + 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)] + if sys.maxsize > 2**32: + cmake_args += ['-A', 'x64'] + build_args += ['--', '/m'] + else: + cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg] + build_args += ['--', '-j2'] + + 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) + +setup( + name='pyigl', + version='0.0.1', + author='Geometric Computing Lab @ NYU', + author_email='info@geometriccomputing.org', + description='', + long_description='', + ext_modules=[CMakeExtension('pyigl')], + cmdclass=dict(build_ext=CMakeBuild), + zip_safe=False, +)