#! Last Change: Sun Apr 26 05:00 PM 2009 J
"""Code to support special facilities to scons which are only useful for
numpy.core, hence not put into numpy.distutils.scons"""
import sys
import os
from os.path import join as pjoin, dirname as pdirname, basename as pbasename
from copy import deepcopy
import code_generators
from code_generators.generate_numpy_api import \
do_generate_api as nowrap_do_generate_numpy_api
from code_generators.generate_ufunc_api import \
do_generate_api as nowrap_do_generate_ufunc_api
from setup_common import check_api_version as _check_api_version
from setup_common import \
LONG_DOUBLE_REPRESENTATION_SRC, pyod, long_double_representation
from numscons.numdist import process_c_str as process_str
import SCons.Node
import SCons
from SCons.Builder import Builder
from SCons.Action import Action
def check_api_version(apiversion):
return _check_api_version(apiversion, pdirname(code_generators.__file__))
def split_ext(string):
sp = string.rsplit( '.', 1)
if len(sp) == 1:
return (sp[0], '')
else:
return sp
#------------------------------------
# Ufunc and multiarray API generators
#------------------------------------
def do_generate_numpy_api(target, source, env):
nowrap_do_generate_numpy_api([str(i) for i in target],
[s.value for s in source])
return 0
def do_generate_ufunc_api(target, source, env):
nowrap_do_generate_ufunc_api([str(i) for i in target],
[s.value for s in source])
return 0
def generate_api_emitter(target, source, env):
"""Returns the list of targets generated by the code generator for array
api and ufunc api."""
base, ext = split_ext(str(target[0]))
dir = pdirname(base)
ba = pbasename(base)
h = pjoin(dir, '__' + ba + '.h')
c = pjoin(dir, '__' + ba + '.c')
txt = base + '.txt'
#print h, c, txt
t = [h, c, txt]
return (t, source)
#-------------------------
# From template generators
#-------------------------
# XXX: this is general and can be used outside numpy.core.
def do_generate_from_template(targetfile, sourcefile, env):
t = open(targetfile, 'w')
s = open(sourcefile, 'r')
allstr = s.read()
s.close()
writestr = process_str(allstr)
t.write(writestr)
t.close()
return 0
def generate_from_template(target, source, env):
for t, s in zip(target, source):
do_generate_from_template(str(t), str(s), env)
def generate_from_template_emitter(target, source, env):
base, ext = split_ext(pbasename(str(source[0])))
t = pjoin(pdirname(str(target[0])), base)
return ([t], source)
#----------------
# umath generator
#----------------
def do_generate_umath(targetfile, sourcefile, env):
t = open(targetfile, 'w')
from code_generators import generate_umath
code = generate_umath.make_code(generate_umath.defdict, generate_umath.__file__)
t.write(code)
t.close()
def generate_umath(target, source, env):
for t, s in zip(target, source):
do_generate_umath(str(t), str(s), env)
def generate_umath_emitter(target, source, env):
t = str(target[0]) + '.c'
return ([t], source)
#-----------------------------------------
# Other functions related to configuration
#-----------------------------------------
def CheckGCC4(context):
src = """
int
main()
{
#if !(defined __GNUC__ && (__GNUC__ >= 4))
die from an horrible death
#endif
}
"""
context.Message("Checking if compiled with gcc 4.x or above ... ")
st = context.TryCompile(src, '.c')
if st:
context.Result(' yes')
else:
context.Result(' no')
return st == 1
def CheckBrokenMathlib(context, mathlib):
src = """
/* check whether libm is broken */
#include