from distutils.core import Extension
import sys, os, re
from os.path import normpath
VERSION = "1.5.2"
VERSION_HEX = "0x01050200"
NUMARRAY_PACKAGES = ["numarray", "numarray.codegenerator"]
def config_item(s):
switch = "--" + s
if switch in sys.argv:
sys.argv.remove(switch)
return True
elif os.environ.has_key(s.upper()):
return eval(os.environ[s.upper()])
else:
return False
def normalize(pathlist):
if isinstance(pathlist, list):
return [ normalize(p) for p in pathlist ]
elif isinstance(pathlist, tuple):
return tuple([ normalize(p) for p in pathlist ])
elif isinstance(pathlist, dict):
d = {}
for key, value in pathlist.items():
d[key] = normalize(value)
return d
elif isinstance(pathlist, str):
return normpath(pathlist)
else:
return pathlist
NUMARRAY_PACKAGE_DIRS = {"numarray":"Lib",
"numarray.codegenerator":"Lib/codegenerator"}
MODULES = ["_conv",
"_sort",
"_bytes",
"_ufunc",
"_ufuncBool",
"_ufuncInt8",
"_ufuncUInt8",
"_ufuncInt16",
"_ufuncUInt16",
"_ufuncInt32",
"_ufuncUInt32",
"_ufuncFloat32",
"_ufuncFloat64",
"_ufuncComplex32",
"_ufuncComplex64",
"_ndarray",
"_numarray",
"_chararray",
"_objectarray",
"memory",
"_converter",
"_operator",
"_ufunc",
"_numerictype",
"libnumarray",
"libnumeric",
]
NUMARRAY_DATA_FILES = [('numarray', ['LICENSE.txt',normpath('Lib/testdata.fits')])]
EXTRA_LINK_ARGS = ["-lm"]
EXTRA_COMPILE_ARGS = []
# compile c-modules with timing code which generally has to be
# added manually.
if "--timing" in sys.argv:
MODULES.append("libteacup")
EXTRA_COMPILE_ARGS.append("-DMEASURE_TIMING")
# Specify this to build numarray on an unthreaded Python.
if "--unthreaded" in sys.argv:
EXTRA_COMPILE_ARGS.append("-DUNTHREADED")
sys.argv.remove("--unthreaded")
# Specify this to try to exploit multiple processors. A work
# in progress...
if "--smp" in sys.argv:
EXTRA_COMPILE_ARGS.append("-DNA_SMP=1")
sys.argv.remove("--smp")
USE_LAPACK = config_item("use_lapack")
USE_ABSOFT = config_item("use_absoft")
SELFTEST = config_item("selftest")
GENCODE = config_item("gencode")
GENUFUNCS = GENCODE or config_item("genufuncs")
GENAPI = GENCODE or config_item("genapi")
HAS_UINT64 = True
codeargs = ""
if sys.platform == "osf1V5":
EXTRA_COMPILE_ARGS.extend(["-ieee"])
elif sys.platform == "linux2":
if sys.maxint > 0x7FFFFFFF:
pass
else:
pass
elif sys.platform == "sunos5":
pass
elif sys.platform == "win32":
if sys.version.find("MSC") >= 0 and sys.version.find("v.13") < 0:
HAS_UINT64 = False
elif sys.platform == "cygwin":
EXTRA_LINK_ARGS += ["-L/lib", "-lm", "-lc", "-lgcc", "-L/lib/mingw", "-lmingwex"]
elif sys.platform == "darwin":
EXTRA_COMPILE_ARGS.extend(["-Ddarwin"])
elif sys.platform == "irix646":
pass
elif sys.platform == "freebsd4-i386":
pass
else:
pass
MODULES.extend(["_ufuncInt64"])
if HAS_UINT64:
codeargs = "--hasUInt64"
MODULES.extend(["_ufuncUInt64"])
if (not os.path.exists("Include/numarray/numconfig.h") or
not os.path.exists("Src/convmodule.c")):
GENCODE = True
def _locate_headers():
for a in sys.argv:
if "--local" == a[:len("--local")]:
words = a.split("=")
return os.path.join(words[1].strip().rstrip(), "numarray")
else:
py_version_short = "%d.%d" % sys.version_info[:2]
base = sys.exec_prefix
template = {
"win32" : '%(base)s/Include/numarray',
"darwin" : '%(base)s/include/python%(py_version_short)s/numarray',
"posix" : '%(base)s/include/python%(py_version_short)s/numarray',
}
try:
return normpath(template[sys.platform] % locals())
except KeyError:
return normpath(template["posix"] % locals())
def locate_headers(): # windows \n meta-coding fix
return re.sub(r"\\", r"\\\\", _locate_headers())
EXTRA_COMPILE_ARGS = EXTRA_COMPILE_ARGS
EXTRA_LINK_ARGS = EXTRA_LINK_ARGS
class OurExtension(Extension):
"""OurBaseExtension is an Extension with implicit include_dirs,
extra_compile_args, and extra_link_args. Used to construct our
c-api shared library.
"""
def _set_default(self, keys, key, default):
if (not keys.has_key(key) or keys[key] is None):
keys[key] = default
def __init__(self, name, sources, **keys):
self._set_default(keys, "extra_compile_args", EXTRA_COMPILE_ARGS)
self._set_default(keys, "extra_link_args", EXTRA_LINK_ARGS)
self._set_default(keys, "include_dirs", [])
keys["include_dirs"].append("Include/numarray")
keys = normalize(keys)
Extension.__init__(self, name, normalize(sources), **keys)
NUMARRAY_EXTENSIONS = [ OurExtension("numarray."+m, ["Src/"+ m +"module.c"])
for m in MODULES ]
def prepare(modules):
print "Using EXTRA_COMPILE_ARGS =",EXTRA_COMPILE_ARGS
# Generate numarray configuration header file
f = open(normpath("Include/numarray/numconfig.h"),"w")
f.write("""
/* This file is generated by setup.py. DO NOT EDIT. */
#define NUMARRAY_VERSION "%s"
#define NUMARRAY_VERSION_HEX %s
""" % (VERSION, VERSION_HEX))
f.close()
del f
for a in sys.argv:
if a.startswith("--install-headers"):
INCLUDE_DIR = a.split("=")[1]
break
else:
INCLUDE_DIR = locate_headers()
# Generate the numinclude.py, the numarray configuration module.
f = open("Lib/numinclude.py", "w")
f.write("""
# This file is generated by setup.py. DO NOT EDIT.
import _ndarray
import os
include_dir = '%s'
version = '%s'
hasUInt64 = _ndarray.hasUInt64()
LP64 = _ndarray.lp64()
if not len(include_dir): # default to same directory as numarray .py's
import numinclude
include_dir = os.sep.join(numinclude.__file__.split(os.sep)[:-1])
""" % ( INCLUDE_DIR, VERSION))
f.close()
python = sys.executable + " "
if GENUFUNCS:
os.system(python + " " + normpath("Lib/codegenerator/__init__.py")
+ " " + codeargs)
if GENAPI:
os.system(python + " " + normpath("Include/numarray/genapis.py")
+ " " + codeargs)
# if __name__ == "__main__":
prepare(MODULES)
syntax highlighted by Code2HTML, v. 0.9.1