Skip to content

Commit 697e267

Browse files
committed
setup: Various fixes for multiarch systems (Issue #3)
1 parent 1079387 commit 697e267

File tree

1 file changed

+43
-15
lines changed

1 file changed

+43
-15
lines changed

setup.py

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,56 @@
44
import sys
55
import re
66
import shutil
7+
import platform
8+
import sysconfig
79
from distutils import ccompiler
810
from setuptools import setup
911
from setuptools.extension import Extension
10-
from numpy import get_include
12+
import numpy
1113

1214
cwd = os.path.abspath(os.path.dirname(__file__))
1315
fftwdir = os.path.join(cwd, 'mpi4py_fft', 'fftw')
1416
prec_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

2336
def 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

3058
def 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

4775
def generate_extensions(fftwlibs):

0 commit comments

Comments
 (0)