|
1 | 1 | #!/usr/bin/env python
|
2 | 2 |
|
3 |
| -import os, sys |
| 3 | +import os |
| 4 | +import sys |
| 5 | +import re |
4 | 6 | import shutil
|
5 | 7 | from distutils import ccompiler
|
6 |
| -import six |
7 | 8 | from setuptools import setup
|
8 | 9 | from setuptools.extension import Extension
|
9 | 10 | from numpy import get_include
|
|
19 | 20 | include_dirs.append(os.path.join(os.environ[f], 'include'))
|
20 | 21 |
|
21 | 22 | prec_map = {'float': 'f', 'double': '', 'long double': 'l'}
|
22 |
| -compiler = ccompiler.new_compiler() |
23 | 23 |
|
24 |
| -libs = {} |
25 |
| -for d in ('float', 'double', 'long double'): |
26 |
| - lib = 'fftw3'+prec_map[d] |
27 |
| - if compiler.find_library_file(library_dirs, lib): |
28 |
| - libs[d] = [lib] |
29 |
| - tlib = '_'.join((lib, 'threads')) |
30 |
| - if compiler.find_library_file(library_dirs, tlib): |
31 |
| - libs[d].append(tlib) |
32 |
| - if sys.platform in ('unix', 'darwin'): |
33 |
| - libs[d].append('m') |
| 24 | +def get_fftw_libs(): |
| 25 | + """Return FFTW libraries""" |
| 26 | + compiler = ccompiler.new_compiler() |
| 27 | + libs = {} |
| 28 | + for d in ('float', 'double', 'long double'): |
| 29 | + lib = 'fftw3'+prec_map[d] |
| 30 | + if compiler.find_library_file(library_dirs, lib): |
| 31 | + libs[d] = [lib] |
| 32 | + tlib = '_'.join((lib, 'threads')) |
| 33 | + if compiler.find_library_file(library_dirs, tlib): |
| 34 | + libs[d].append(tlib) |
| 35 | + if sys.platform in ('unix', 'darwin'): |
| 36 | + libs[d].append('m') |
| 37 | + return libs |
34 | 38 |
|
35 |
| -# Generate files with float and long double if needed |
36 |
| -for d in ('float', 'long double'): |
37 |
| - p = 'fftw'+prec_map[d]+'_' |
38 |
| - for fl in ('fftw_planxfftn.h', 'fftw_planxfftn.c', 'fftw_xfftn.pyx', 'fftw_xfftn.pxd'): |
39 |
| - fp = fl.replace('fftw_', p) |
40 |
| - shutil.copy(os.path.join(fftwdir, fl), os.path.join(fftwdir, fp)) |
41 |
| - sedcmd = "sed -i ''" if sys.platform == 'darwin' else "sed -i''" |
42 |
| - os.system(sedcmd + " 's/fftw_/{0}/g' {1}".format(p, os.path.join(fftwdir, fp))) |
43 |
| - os.system(sedcmd + " 's/double/{0}/g' {1}".format(d, os.path.join(fftwdir, fp))) |
| 39 | +def generate_extensions(fftwlibs): |
| 40 | + """Generate files with float and long double""" |
| 41 | + for d in fftwlibs: |
| 42 | + if d == 'double': |
| 43 | + continue |
| 44 | + p = 'fftw'+prec_map[d]+'_' |
| 45 | + for fl in ('fftw_planxfftn.h', 'fftw_planxfftn.c', 'fftw_xfftn.pyx', 'fftw_xfftn.pxd'): |
| 46 | + fp = fl.replace('fftw_', p) |
| 47 | + shutil.copy(os.path.join(fftwdir, fl), os.path.join(fftwdir, fp)) |
| 48 | + sedcmd = "sed -i ''" if sys.platform == 'darwin' else "sed -i''" |
| 49 | + os.system(sedcmd + " 's/fftw_/{0}/g' {1}".format(p, os.path.join(fftwdir, fp))) |
| 50 | + os.system(sedcmd + " 's/double/{0}/g' {1}".format(d, os.path.join(fftwdir, fp))) |
44 | 51 |
|
45 |
| -ext = [Extension("mpi4py_fft.fftw.utilities", |
46 |
| - sources=[os.path.join(fftwdir, "utilities.pyx")], |
47 |
| - include_dirs=[get_include(), |
48 |
| - os.path.join(sys.prefix, 'include')])] |
| 52 | +def get_extensions(fftwlibs): |
| 53 | + """Return list of extension modules""" |
| 54 | + ext = [Extension("mpi4py_fft.fftw.utilities", |
| 55 | + sources=[os.path.join(fftwdir, "utilities.pyx")], |
| 56 | + include_dirs=include_dirs)] |
49 | 57 |
|
50 |
| -for d, v in six.iteritems(libs): |
51 |
| - p = 'fftw'+prec_map[d]+'_' |
52 |
| - ext.append(Extension("mpi4py_fft.fftw.{}xfftn".format(p), |
53 |
| - sources=[os.path.join(fftwdir, "{}xfftn.pyx".format(p)), |
54 |
| - os.path.join(fftwdir, "{}planxfftn.c".format(p))], |
55 |
| - #define_macros=[('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')], |
56 |
| - libraries=v, |
57 |
| - include_dirs=include_dirs, |
58 |
| - library_dirs=library_dirs)) |
| 58 | + for d, libs in fftwlibs.items(): |
| 59 | + p = 'fftw'+prec_map[d]+'_' |
| 60 | + ext.append(Extension("mpi4py_fft.fftw.{}xfftn".format(p), |
| 61 | + sources=[os.path.join(fftwdir, "{}xfftn.pyx".format(p)), |
| 62 | + os.path.join(fftwdir, "{}planxfftn.c".format(p))], |
| 63 | + #define_macros=[('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')], |
| 64 | + libraries=libs, |
| 65 | + include_dirs=include_dirs, |
| 66 | + library_dirs=library_dirs)) |
| 67 | + return ext |
59 | 68 |
|
| 69 | +def version(): |
| 70 | + srcdir = os.path.join(cwd, 'mpi4py_fft') |
| 71 | + with open(os.path.join(srcdir, '__init__.py')) as f: |
| 72 | + m = re.search(r"__version__\s*=\s*'(.*)'", f.read()) |
| 73 | + return m.groups()[0] |
| 74 | + |
| 75 | +fftw_libs = get_fftw_libs() |
| 76 | +assert len(fftw_libs) > 0, "No FFTW libraries found!" |
| 77 | +generate_extensions(fftw_libs) |
60 | 78 | with open("README.rst", "r") as fh:
|
61 | 79 | long_description = fh.read()
|
62 | 80 |
|
63 | 81 | setup(name="mpi4py-fft",
|
64 |
| - version="1.0.1", |
| 82 | + version=version(), |
65 | 83 | description="mpi4py-fft -- FFT with MPI",
|
66 | 84 | long_description=long_description,
|
67 | 85 | author="Lisandro Dalcin and Mikael Mortensen",
|
|
82 | 100 | 'Topic :: Scientific/Engineering :: Mathematics',
|
83 | 101 | 'Topic :: Software Development :: Libraries :: Python Modules',
|
84 | 102 | ],
|
85 |
| - ext_modules=ext, |
86 |
| - install_requires=["mpi4py", "numpy", "six"], |
87 |
| - setup_requires=["setuptools>=18.0", "cython>=0.25", "six"] |
| 103 | + ext_modules=get_extensions(fftw_libs), |
| 104 | + install_requires=["mpi4py", "numpy"], |
| 105 | + setup_requires=["setuptools>=18.0", "cython>=0.25"] |
88 | 106 | )
|
0 commit comments