|
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