44import sys
55import re
66import shutil
7+ import platform
8+ import sysconfig
79from distutils import ccompiler
810from setuptools import setup
911from setuptools .extension import Extension
10- from numpy import get_include
12+ import numpy
1113
1214cwd = os .path .abspath (os .path .dirname (__file__ ))
1315fftwdir = os .path .join (cwd , 'mpi4py_fft' , 'fftw' )
1416prec_map = {'float' : 'f' , 'double' : '' , 'long double' : 'l' }
17+ triplet = sysconfig .get_config_var ('MULTIARCH' ) or ''
18+ bits = platform .architecture ()[0 ][:- 3 ]
1519
16- def get_library_dirs ():
17- lib_dirs = [os .path .join (sys .prefix , 'lib' )]
18- for f in ('FFTW_ROOT' , 'FFTW_DIR' ):
19- if f in os .environ :
20- lib_dirs .append (os .path .join (os .environ [f ], 'lib' ))
21- return lib_dirs
20+ def append (dirlist , * args ):
21+ entry = os .path .join (* args )
22+ entry = os .path .normpath (entry )
23+ if os .path .isdir (entry ):
24+ if entry not in dirlist :
25+ dirlist .append (entry )
26+
27+ def get_prefix_dirs ():
28+ dirs = []
29+ for envvar in ('FFTW_ROOT' , 'FFTW_DIR' ):
30+ if envvar in os .environ :
31+ prefix = os .environ [envvar ]
32+ append (dirs , prefix )
33+ append (dirs , sys .prefix )
34+ return dirs
2235
2336def get_include_dirs ():
24- inc_dirs = [get_include (), os .path .join (sys .prefix , 'include' )]
25- for f in ('FFTW_ROOT' , 'FFTW_DIR' ):
26- if f in os .environ :
27- inc_dirs .append (os .path .join (os .environ [f ], 'include' ))
28- return inc_dirs
37+ dirs = []
38+ if 'FFTW_INCLUDE_DIR' in os .environ :
39+ entry = os .environ ['FFTW_INCLUDE_DIR' ]
40+ append (dirs , entry )
41+ for prefix in get_prefix_dirs ():
42+ append (dirs , prefix , 'include' , triplet )
43+ append (dirs , prefix , 'include' )
44+ dirs .append (numpy .get_include ())
45+ return dirs
46+
47+ def get_library_dirs ():
48+ dirs = []
49+ if 'FFTW_LIBRARY_DIR' in os .environ :
50+ entry = os .environ ['FFTW_LIBRARY_DIR' ]
51+ append (dirs , entry )
52+ for prefix in get_prefix_dirs ():
53+ append (dirs , prefix , 'lib' + bits )
54+ append (dirs , prefix , 'lib' , triplet )
55+ append (dirs , prefix , 'lib' )
56+ return dirs
2957
3058def get_fftw_libs ():
3159 """Return FFTW libraries"""
@@ -34,14 +62,14 @@ def get_fftw_libs():
3462 libs = {}
3563 for d in ('float' , 'double' , 'long double' ):
3664 lib = 'fftw3' + prec_map [d ]
65+ tlib = lib + '_threads'
3766 if compiler .find_library_file (library_dirs , lib ):
3867 libs [d ] = [lib ]
39- tlib = '_' .join ((lib , 'threads' ))
4068 if compiler .find_library_file (library_dirs , tlib ):
4169 libs [d ].append (tlib )
42- if sys . platform in ( 'unix' , 'darwin' ) :
70+ if os . name == 'posix' :
4371 libs [d ].append ('m' )
44- assert len (libs ) > 0 , "No FFTW libraries found in {} {} " .format (library_dirs , sys . prefix )
72+ assert len (libs ) > 0 , "No FFTW libraries found in {}" .format (library_dirs )
4573 return libs
4674
4775def generate_extensions (fftwlibs ):
0 commit comments