/[ascend]/branches/adrian/scons/sundials.py
ViewVC logotype

Contents of /branches/adrian/scons/sundials.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2884 - (show annotations) (download) (as text)
Wed Apr 1 10:57:31 2015 UTC (8 years, 6 months ago) by adrian
File MIME type: text/x-python
File size: 5149 byte(s)
creating branch 'adrian' as a copy of the 'pallav' branch, current head revision
1 import os, os.path, platform, subprocess
2 from SCons.Script import *
3 from SCons.Util import WhereIs
4 munge = lambda s: s
5
6 try:
7 # if we have access to GetShortPathName, we'll use it...
8 import win32api
9 def munge1(s):
10 s1 = s
11 try:
12 # we can only munge the path if it actually exists
13 s1 = win32api.GetShortPathName(s)
14 except:
15 # if it doesn't exist, we just return the un-munged path
16 pass
17 return s1
18 munge = munge1
19 except:
20 pass
21
22 def winpath(path):
23 """
24 Convert a MSYS path to a native Windows path, so that we can pass values correctly to GCC
25 """
26 import subprocess
27 import os
28 #print "path = %s"%path
29 fn = "scons%d" % os.getpid()
30 while os.path.exists(fn):
31 fn = fn + "0"
32 try:
33 f = file(fn,"w")
34 f.write("#!python\nimport sys\nprint sys.argv[1]")
35 f.close()
36 #print "FILE %s FOUND? %d"%(fn,os.path.exists(fn))
37 p1 = subprocess.Popen(["sh.exe","-c","%s %s"%(fn,path)], stdout=subprocess.PIPE)
38 #p1 = subprocess.Popen(["sh.exe","-c","echo hello"], stdout=subprocess.PIPE)
39 out = p1.communicate()[0].strip()
40 #print "NEW PATH IS '%s'" % out
41 except Exception,e:
42 print "FAILED: %s"%str(e)
43 finally:
44 #print "Deleting %s" % fn
45 os.unlink(fn)
46 return out
47
48 def generate(env):
49 """
50 Detect SUNDIALS (IDA) settings and add them to the environment.
51 """
52 try:
53 if platform.system()=="Windows":
54 try:
55 # one day, we'll provide a SUNDIALS installer so that people don't have to
56 # build their own SUNDIALS. In that case, look for the settings in the registry
57 import _winreg
58 x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE)
59 y= _winreg.OpenKey(x,r"SOFTWARE\SUNDIALS")
60 PATH,t = _winreg.QueryValueEx(y,"InstallPath")
61 LIB = os.path.join(PATH,"lib")
62 BIN = os.path.join(PATH,"bin")
63 INCLUDE = os.path.join(PATH,"include")
64 env['SUNDIALS_CPPPATH'] = [munge(INCLUDE)]
65 env['SUNDIALS_LIBPATH'] = [munge(BIN)]
66 env['SUNDIALS_LIBS'] = ['sundials_ida','sundials_nvecserial','m']
67 except WindowsError:
68 sundialsconfig = find_sundials_config(env)
69 if not sundialsconfig:
70 raise RuntimeError("Unable to locate sundials-config in Windows PATH")
71 # if someone has installed sundials with ./configure --prefix=/MinGW using MSYS, then
72 # this should work, but we would like to make this a lot more robust!
73 cmd = ['sh.exe',sundialsconfig,'-mida','-ts','-lc']
74 env1 = env.Clone()
75 env1['CPPPATH'] = None
76 env1['LIBPATH'] = None
77 env1['LIBS'] = None
78 #print "RUNNING sundials-config"
79 env1.ParseConfig(cmd)
80 env['SUNDIALS_CPPPATH'] = [munge(winpath(p)) for p in env1.get('CPPPATH')]
81 env['SUNDIALS_LIBPATH'] = [munge(winpath(p)) for p in env1.get('LIBPATH')]
82 env['SUNDIALS_LIBS'] = env1.get('LIBS')
83 env['HAVE_SUNDIALS'] = True
84
85 env['HAVE_SUNDIALS'] = True
86
87 else:
88 sundialsconfig = env.WhereIs("sundials-config")
89 if not sundialsconfig:
90 raise RuntimeError("Unable to locate 'sundials-config' in PATH")
91 cmd = ['sundials-config','-mida','-ts','-lc']
92 env1 = env.Clone()
93 env1['CPPPATH'] = None
94 env1['LIBPATH'] = None
95 env1['LIBS'] = None
96 env1.ParseConfig(cmd)
97
98 # tricky stuff to detect the necessary extra 'lapack' linkage if required
99 if os.path.exists("/etc/lsb-release"):
100 print "CHECKING SUNDIALS"
101 s = env.WhereIs('sundials-config')
102 if s == "/usr/bin/sundials-config":
103 print "STANDARD CONFIG"
104 # With Ubuntu 11.10 onwards, we need to explicitly add lapack (and blas?)
105 f = file("/etc/lsb-release")
106 v = {}
107 for l in f:
108 x = l.strip().split("=")
109 v[x[0]] = x[1]
110 print v
111 if v['DISTRIB_ID']=="Ubuntu" and float(v['DISTRIB_RELEASE'])>=11.10:
112 print "ADDING LAPACK"
113 env1['LIBS'].append("lapack")
114
115 env['SUNDIALS_CPPPATH'] = env1.get('CPPPATH')
116 env['SUNDIALS_LIBPATH'] = env1.get('LIBPATH')
117 env['SUNDIALS_LIBS'] = env1.get('LIBS')
118 env['HAVE_SUNDIALS'] = True
119
120 print "SUNDIALS_LIBS =",env.get('SUNDIALS_LIBS')
121 print "SUNDIALS_LIBPATH =",env.get('SUNDIALS_LIBPATH')
122 print "SUNDIALS_CPPPATH =",env.get('SUNDIALS_CPPPATH')
123
124 except Exception, e:
125 print "FAILED SUNDIALS DETECTION (%s):" % platform.system(),e.__class__,str(e)
126 env['HAVE_SUNDIALS'] = False
127
128 def find_sundials_config(env):
129 """
130 Try and figure out if sundials-config is installed on this machine, and if so, where.
131 """
132 if SCons.Util.can_read_reg:
133 # If we can read the registry, get the NSIS command from it
134 try:
135 # 0x20019 is KEY_READ,
136 k = SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,'SOFTWARE\\SUNDIALS',0,0x20019)
137 val, tok = SCons.Util.RegQueryValueEx(k,None)
138 ret = val + os.path.sep + 'makensis.exe'
139 if os.path.exists(ret):
140 return '"' + ret + '"'
141 else:
142 return None
143 except:
144 pass # Couldn't find the key, just act like we can't read the registry
145 # Hope it's on the path, but note that we have to be careful with PATHEXT since sundials-config doesn't have an
146 # an executable-signifying suffix (seems like a weakness with env.WhereIs in SCons??
147 return WhereIs('sundials-config',path=os.environ['PATH'],pathext="")
148
149 def exists(env):
150 if find_sundials_config(env) != None:
151 return 1
152 return 0
153

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22