/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2215 - (hide annotations) (download)
Mon Jul 12 23:11:29 2010 UTC (9 years, 4 months ago) by jpye
File size: 74172 byte(s)
Copying HongKe's methane correlation to trunk (pending testing?) and fixing helmholtz_g as suggested by Shrikantch (also needs double-checking).
Fixed problem with GSL in fprops/SConstruct.
1 jpye 2017 #!/usr/bin/python invoke_using_scons
2 jpye 2007 # This is a build script for use with SCons. Use it to compile ASCEND on
3     # Linux, Windows. It should also give some success on Mac, although this is
4     # much less tested.
5    
6     # version number for this ASCEND build:
7 mahesh 2150 version = "0.9.8"
8 johnpye 439
9 jpye 2007 # shared library API numbering, for Linux (FIXME windows too?)
10     soname_major = ".1"
11     soname_minor = ".0"
12    
13     import sys, os, commands, platform, distutils.sysconfig, os.path, re, types
14 jpye 2129 import subprocess
15 jpye 2007
16     # version number for python, useful on Windows
17 jpye 1466 pyversion = "%d.%d" % (sys.version_info[0],sys.version_info[1])
18    
19 johnpye 385 #------------------------------------------------------
20 jpye 2007 # PLATFORM DEFAULTS
21 johnpye 385
22 johnpye 464 #print "PLATFORM = ",platform.system()
23 johnpye 385
24 jpye 2073 default_install_prefix = '/usr/local'
25     default_install_bin = "$INSTALL_PREFIX/bin"
26     default_install_lib = "$INSTALL_PREFIX/lib"
27     default_install_models = "$INSTALL_LIB/ascend/models"
28     default_install_solvers = "$INSTALL_LIB/ascend/solvers"
29     default_install_assets = "$INSTALL_ASCDATA/glade/"
30     default_install_ascdata = "$INSTALL_SHARE/ascend"
31     default_install_include = "$INSTALL_PREFIX/include"
32 jpye 2075 default_install_python = os.path.join(distutils.sysconfig.get_python_lib(),"ascend")
33 jpye 2073
34     default_tcl = '/usr'
35     default_tcl_libpath = "$TCL/lib"
36 jpye 1488 default_tcl_cpppath = "$TCL/include"
37 jpye 1501 default_tron_envvar="TRON_PATH"
38     default_conopt_envvar="CONOPT_PATH"
39 jpye 1854 default_with_graphviz = True
40 jpye 2073 default_tcl_lib = "tcl8.5"
41     default_tk_lib = "tk8.5"
42     default_tktable_lib = "Tktable2.9"
43     default_ida_prefix="$DEFAULT_PREFIX"
44 jpye 2132 default_ipopt_libpath = "$IPOPT_PREFIX/lib"
45 jpye 2203 default_ipopt_dll = "$IPOPT_LIBPATH/Ipopt38.dll"
46 jpye 2132 default_ipopt_libs = ["$F2C_LIB","blas","lapack","pthread","ipopt"]
47 jpye 2073 default_conopt_prefix="$DEFAULT_PREFIX"
48     default_conopt_libpath="$CONOPT_PREFIX"
49     default_conopt_cpppath="$CONOPT_PREFIX"
50     default_conopt_dlpath="$CONOPT_PREFIX"
51     default_tron_prefix="$DEFAULT_PREFIX"
52     default_tron_dlpath="$TRON_PREFIX/lib"
53     default_tron_lib="tron1"
54     default_prefix="/usr"
55     default_libpath="$DEFAULT_PREFIX/lib"
56     default_cpppath="$DEFAULT_PREFIX/include"
57     default_fortran="gfortran"
58     default_f2c_lib="gfortran"
59 jpye 2094 default_swig="swig"
60 jpye 1488
61 jpye 2073 icon_extension = '.png'
62    
63 johnpye 464 if platform.system()=="Windows":
64 jpye 2073 default_prefix="c:\\MinGW"
65     default_libpath="$DEFAULT_PREFIX\\lib"
66     default_cpppath="$DEFAULT_PREFIX\\include"
67    
68 jpye 2007 # these correspond the the version of Tcl/Tk linked to in the NSIS scripts
69 jpye 2204 default_tcl_lib = "tcl85"
70     default_tk_lib = "tk85"
71 johnpye 464 default_tktable_lib = "Tktable28"
72 jpye 2007
73 johnpye 499 default_install_assets = "glade/"
74 johnpye 521 default_tcl = "c:\\Tcl"
75 jpye 1645 if os.environ.get('MSYSTEM'):
76 johnpye 642 default_tcl_libpath="$TCL\\bin"
77     else:
78     default_tcl_libpath="$TCL\\lib"
79 jpye 2007
80     # on Windows, we build ASCEND such that it finds it support files
81     # using paths relative to the location of the executable
82 johnpye 628 default_absolute_paths = False
83 jpye 2025 default_dist_rel_bin = '.'
84     default_tk_rel_dist = 'tcltk'
85     default_library_rel_dist = 'models'
86     default_solvers_rel_dist = 'solvers'
87 johnpye 739
88 jpye 2007 # where to look for IDA solver libraries, headers, etc.
89 johnpye 739 default_ida_prefix = "c:\\MinGW"
90 jpye 2132
91     # IPOPT
92     default_ipopt_libpath = "$IPOPT_PREFIX/lib/win32/release"
93 jpye 2203 default_ipopt_libs = ["Ipopt"]
94 johnpye 783
95 jpye 2007 # where to look for CONOPT when compiling
96 johnpye 800 default_conopt_prefix = "c:\\Program Files\\CONOPT"
97     default_conopt_libpath="$CONOPT_PREFIX"
98     default_conopt_cpppath="$CONOPT_PREFIX"
99 jpye 1399 default_conopt_dlpath="$CONOPT_PREFIX"
100 johnpye 800 default_conopt_lib="conopt3"
101 johnpye 935
102 jpye 2007 # FIXME remove this
103 jpye 1515 default_tron_prefix="c:\\Program Files\\TRON"
104     default_tron_dlpath="$TRON_PREFIX"
105 johnpye 739
106 johnpye 673 need_libm = False
107 jpye 1592 python_exe = sys.executable
108 johnpye 816 default_with_scrollkeeper=False
109 jpye 1504 pathsep = ";"
110 jpye 1566
111 jpye 2094 default_fortran="gfortran"
112     default_f2c_lib="gfortran"
113 jpye 1597
114 jpye 2094 default_swig=WhereIs("swig.exe")
115    
116 jpye 2007 soname_minor = ""
117     soname_major = ""
118 jpye 1854 # still problems with Graphviz on Windows, leave it off now by default.
119 jpye 2073
120 jpye 2158 if not os.path.exists(default_conopt_prefix):
121     default_conopt_prefix = None
122    
123 jpye 2073 elif platform.system()=="Darwin":
124    
125 jpye 2075 default_install_prefix = ''
126 jpye 2090 default_install_bin = "$INSTALL_PREFIX/ASCEND.app/Contents"
127 jpye 2076 default_install_lib = "$INSTALL_BIN"
128 jpye 2083 #default_install_models = "$INSTALL_PREFIX/Library/Application Support/ASCEND/Models"
129     default_install_models = "$INSTALL_BIN/Models"
130     #default_install_solvers = "$INSTALL_PREFIX/Library/Application Support/ASCEND/Solvers"
131     default_install_solvers = "$INSTALL_BIN/Solvers"
132 jpye 2090 default_install_ascdata = "$INSTALL_BIN/Resources"
133 jpye 2076 default_install_include = "$INSTALL_BIN/Headers"
134 jpye 2075 default_install_python = "$INSTALL_BIN/Python"
135 jpye 2073 default_install_assets = "$INSTALL_ASCDATA/glade/"
136 jpye 2083 # FIXME still need to work out the Tcl/Tk side of things...
137 jpye 2073
138     # within the bundle, we'll use relative paths
139     default_absolute_paths = False
140     default_dist_rel_bin = '.'
141     default_tk_rel_dist = 'tcltk'
142    
143     # we want these to be in /Library/ASCEND/Models and /Library/ASCEND/Solvers
144 jpye 2083 default_library_rel_dist = 'Models'
145     default_solvers_rel_dist = 'Solvers'
146 jpye 2073
147     # where to look for CONOPT when compiling
148     default_conopt_prefix = "/Library/CONOPT"
149    
150     default_conopt_lib="conopt3"
151    
152     # FIXME remove this
153     default_tron_dlpath="$TRON_PREFIX"
154     default_tron_lib="tron1"
155    
156     need_libm = False
157     python_exe = sys.executable
158     default_with_scrollkeeper=False
159     pathsep = ";"
160 jpye 1720
161 jpye 2158 if not os.path.exists(default_conopt_prefix):
162     default_conopt_prefix = None
163 jpye 2073
164     else: # LINUX
165    
166 johnpye 499 icon_extension = '.svg'
167 jpye 1488
168     if os.path.exists("/etc/debian_version"):
169     default_tcl_cpppath = "/usr/include/tcl8.4"
170 jpye 1787 default_tcl_lib = "tcl8.4"
171     default_tk_lib = "tk8.4"
172     default_tktable_lib = "Tktable2.8"
173 jpye 1488
174 ballan 2036 if os.path.exists("/etc/SuSE-release"):
175     default_tcl_cpppath = "/usr/include"
176     default_tcl_lib = "tcl8.4"
177     default_tk_lib = "tk8.4"
178     default_tktable_lib = "Tktable2.9"
179    
180 jpye 2006 if os.path.exists("/etc/lsb-release"):
181     _f = file("/etc/lsb-release")
182     _r = re.compile("([A-Z][^=]*)=(.*)")
183     LSB = {}
184     for l in _f:
185     _m = _r.match(l.strip())
186     LSB[_m.group(1)] = _m.group(2)
187 ballan 2036 print LSB
188     if LSB.has_key('DISTRIB_ID') and LSB['DISTRIB_ID'] == "Ubuntu":
189 jpye 2006 if float(LSB['DISTRIB_RELEASE']) >= 9.04:
190     default_tcl_lib = "tcl8.5"
191     default_tk_lib = "tk8.5"
192     default_tktable_lib = "Tktable2.9"
193     default_tcl_cpppath = "/usr/include/tcl8.5"
194    
195    
196 johnpye 628 default_absolute_paths = True
197 jpye 2025 default_dist_rel_bin = '..'
198     default_tk_rel_dist = 'share/ascend/tcltk'
199     default_library_rel_dist = 'lib/ascend/models'
200     default_solvers_rel_dist = 'lib/ascend/solvers'
201    
202 jpye 2157 default_conopt_prefix = "$DEFAULT_PREFIX"
203 johnpye 800 default_conopt_libpath="$CONOPT_PREFIX/lib"
204     default_conopt_cpppath="$CONOPT_PREFIX/include"
205 jpye 1399 default_conopt_dlpath= default_conopt_libpath + ":/usr/local/lib"
206 johnpye 800 default_conopt_lib="consub3"
207    
208 johnpye 673 need_libm = True
209 johnpye 551 if not os.path.isdir(default_tcl):
210     default_tcl = '/usr'
211 johnpye 683 python_exe = distutils.sysconfig.EXEC_PREFIX+"/bin/python"
212 johnpye 816 default_with_scrollkeeper=False
213 jpye 1504 pathsep = ":"
214 jpye 2073
215 jpye 1853 #default_graphviz_libs=["graph","cdt","gvc"]
216     #default_graphviz_libpath = default_libpath
217     #if os.path.exists("/usr/lib/graphviz/libgraph.so"):
218     # # for Ubuntu 7.04
219     # default_graphviz_libpath="/usr/lib/graphviz"
220     # default_graphviz_rpath="$GRAPHVIZ_LIBPATH"
221 jpye 2007
222 jpye 2073 if not os.path.exists(default_tron_prefix):
223     default_tron_prefix = None
224    
225     if not os.path.exists(default_ida_prefix):
226     default_ida_prefix = None
227    
228 jpye 2007 soname_clean = "${SHLIBPREFIX}ascend${SHLIBSUFFIX}"
229     soname_full = "%s%s" % (soname_clean,soname_major)
230    
231     #------------------------------------------------------
232     # OPTIONS
233     #
234     # The following give the set of command-line parameters that can be passed to
235     # SCons from the commandline. Options will be 'remembered' by being cached
236     # in the file 'options.cache'; if you want to start with a clean slate, you
237     # should remove that file.
238    
239 jpye 2162 vars = Variables(['options.cache', 'config.py'])
240 jpye 1597
241 jpye 2162 vars.Add(
242 johnpye 562 'CC'
243     ,'C Compiler command'
244     ,None
245     )
246    
247 jpye 2162 vars.Add(
248 johnpye 562 'CXX'
249     ,'C++ Compiler command'
250     ,None
251     )
252    
253 jpye 2162 vars.Add(BoolVariable(
254 johnpye 591 'GCOV'
255 johnpye 593 , 'Whether to enable coverage testing in object code'
256     , False
257 johnpye 591 ))
258    
259 jpye 2007 if platform.system()!="Windows":
260 jpye 2162 vars.Add(BoolVariable(
261 jpye 2007 'WITH_GCCVISIBILITY'
262     ,"Whether to use GCC Visibility features (only applicable if available)"
263     ,True
264     ))
265 johnpye 526
266 jpye 2162 vars.Add(BoolVariable(
267 johnpye 1142 'WITH_SIGNALS'
268     ,"Whether to permit use of signals for flow control in the C-level code"
269 johnpye 1234 ,True
270 johnpye 1142 ))
271    
272 johnpye 392 # You can turn off building of Tcl/Tk interface
273 jpye 2162 vars.Add(BoolVariable(
274 johnpye 542 'WITH_TCLTK'
275 johnpye 673 ,"Set to False if you don't want to build the original Tcl/Tk GUI."
276 johnpye 542 , True
277 johnpye 386 ))
278    
279 johnpye 392 # You can turn off the building of the Python interface
280 jpye 2162 vars.Add(BoolVariable(
281 johnpye 542 'WITH_PYTHON'
282 johnpye 673 ,"Set to False if you don't want to build Python wrappers."
283 johnpye 542 , True
284 johnpye 387 ))
285    
286 johnpye 392 # Which solvers will we allow?
287 jpye 2162 vars.Add(ListVariable(
288 johnpye 392 'WITH_SOLVERS'
289 johnpye 393 ,"List of the solvers you want to build. The default is the minimum that"
290 jpye 1520 +" works. The option 'LSOD' is provided for backwards compatibility"
291     +"; the value 'LSODE' is preferred."
292 jpye 1734 ,["QRSLV","CMSLV","LSODE","IDA","CONOPT","LRSLV","TRON","IPOPT","DOPRI5"]
293 johnpye 392 ,['QRSLV','MPS','SLV','OPTSQP'
294     ,'NGSLV','CMSLV','LRSLV','MINOS','CONOPT'
295 jpye 1734 ,'LSODE','LSOD','OPTSQP',"IDA","TRON","IPOPT","DOPRI5"
296 johnpye 392 ]
297     ))
298    
299 johnpye 393 # Where will the local copy of the help files be kept?
300 jpye 2162 vars.Add(BoolVariable(
301 jpye 1442 'WITH_DOC'
302 jpye 1443 , "Should we try to build and install help files? If not, ASCEND will access online help files"
303 jpye 1442 , True
304 johnpye 393 ))
305    
306 jpye 2162 vars.Add(BoolVariable(
307 jpye 1443 'WITH_DOC_BUILD'
308     , "If true, we'll attempt to build docs. Set false, we'll assume we already have then (eg from the tarball)"
309     , "$WITH_DOC"
310     ))
311    
312 jpye 2162 vars.Add(BoolVariable(
313 jpye 1443 'WITH_DOC_INSTALL'
314     , "If true, SCons will install the documentation file(s). If false, assume rpm or dpkg is going to do it."
315     , "$WITH_DOC"
316     ))
317    
318 jpye 2162 vars.Add(
319 jpye 1442 'HELP_ROOT'
320     , "Location of the main help file"
321     , "$INSTALL_DOC/book.pdf"
322     )
323    
324 johnpye 393 # Will bintoken support be enabled?
325 jpye 2162 vars.Add(BoolVariable(
326 johnpye 393 'WITH_BINTOKEN'
327     ,"Enable bintoken support? This means compiling models as C-code before"
328     +" running them, to increase solving speed for large models."
329     ,False
330     ))
331    
332 johnpye 398 # What should the default ASCENDLIBRARY path be?
333     # Note: users can change it by editing their ~/.ascend.ini
334 jpye 2162 vars.Add(
335 johnpye 393 'DEFAULT_ASCENDLIBRARY'
336     ,"Set the default value of the ASCENDLIBRARY -- the location where"
337     +" ASCEND will look for models when running ASCEND"
338 jpye 1519 ,"$INSTALL_MODELS"
339 johnpye 393 )
340    
341 jpye 1519 # What should the default ASCENDLIBRARY path be?
342     # Note: users can change it by editing their ~/.ascend.ini
343 jpye 2162 vars.Add(
344 jpye 1519 'DEFAULT_ASCENDSOLVERS'
345     ,"Set the default value of ASCENDSOLVERS -- the location where"
346     +" ASCEND will look for solver shared-library files"
347     ,"$INSTALL_SOLVERS"
348     )
349    
350 johnpye 398 # Where is SWIG?
351 jpye 2162 vars.Add(
352 johnpye 398 'SWIG'
353     ,"SWIG location, probably only required for MinGW and MSVC users."
354     +" Enter the location as a Windows-style path, for example"
355 johnpye 404 +" 'c:\\msys\\1.0\\home\\john\\swigwin-1.3.29\\swig.exe'."
356 jpye 2094 ,default_swig
357 johnpye 398 )
358    
359 johnpye 400 # Build the test suite?
360 jpye 2162 vars.Add(BoolVariable(
361 johnpye 593 'WITH_CUNIT'
362 johnpye 665 ,"You can disable CUnit tests with this option. This will basically stop"
363     +" SCons from parsing the SConscript files relating to the 'test'"
364     +" target, which just might make things marginally faster. Probably"
365     +" you can just ignore this option though. SCons will sniff for Cunit"
366     +" but build the tests only if you specify the 'test' target."
367     ,True
368 johnpye 400 ))
369 johnpye 393
370 johnpye 993 # Build with MMIO matrix export support?
371 jpye 2162 vars.Add(BoolVariable(
372 johnpye 993 'WITH_MMIO'
373     ,"Include support for exporting matrices in Matrix Market format"
374     ,True
375     ))
376    
377 johnpye 938 #----- default paths -----
378 jpye 2162 vars.Add(PackageVariable(
379 johnpye 938 'DEFAULT_PREFIX'
380     ,"Where are most of the shared libraries located on your system?"
381     ,default_prefix
382     ))
383    
384 jpye 2007 #------ cunit --------
385     # CUnit is a unit testing library that we use to test libascend.
386 johnpye 957
387 johnpye 935 # Where was CUNIT installed?
388 jpye 2162 vars.Add(PackageVariable(
389 johnpye 935 'CUNIT_PREFIX'
390     ,"Where are your CUnit files?"
391 johnpye 938 ,"$DEFAULT_PREFIX"
392 johnpye 935 ))
393    
394 johnpye 400 # Where are the CUnit includes?
395 jpye 2162 vars.Add(PackageVariable(
396 johnpye 400 'CUNIT_CPPPATH'
397     ,"Where are your CUnit include files?"
398 johnpye 938 ,"$CUNIT_PREFIX/include"
399 johnpye 400 ))
400 johnpye 392
401 johnpye 404 # Where are the CUnit libraries?
402 jpye 2162 vars.Add(PackageVariable(
403 johnpye 400 'CUNIT_LIBPATH'
404 johnpye 404 ,"Where are your CUnit libraries?"
405 johnpye 938 ,"$CUNIT_PREFIX/lib"
406 johnpye 400 ))
407    
408 johnpye 938 # ----- conopt-----
409 johnpye 783
410 jpye 2162 vars.Add(PackageVariable(
411 johnpye 783 "CONOPT_PREFIX"
412     ,"Prefix for your CONOPT install (CONOPT ./configure --prefix)"
413 johnpye 800 ,default_conopt_prefix
414 johnpye 783 ))
415    
416 jpye 2162 vars.Add(
417 johnpye 783 "CONOPT_LIB"
418 jpye 1747 ,"Library linked to for CONOPT. This is the name of the CONOPT .so or DLL. On Windows it seems to be called 'copopt3' but on linux it seems to be called 'consub3'."
419 johnpye 800 ,default_conopt_lib
420 johnpye 783 )
421    
422 jpye 2162 vars.Add(BoolVariable(
423 jpye 1541 "CONOPT_LINKED"
424     ,"Do you want to dynamically link to CONOPT (only possible if CONOPT is available at buildtime)"
425     ,False
426     ))
427    
428 jpye 2162 vars.Add(
429 johnpye 783 'CONOPT_CPPPATH'
430     ,"Where is your conopt.h?"
431 johnpye 800 ,default_conopt_cpppath
432 johnpye 783 )
433    
434 jpye 2162 vars.Add(
435 johnpye 783 'CONOPT_LIBPATH'
436 jpye 1399 ,"Where is your CONOPT library installed?"
437 johnpye 800 ,default_conopt_libpath
438 johnpye 783 )
439    
440 jpye 2162 vars.Add(
441 jpye 1399 'CONOPT_DLPATH'
442 jpye 1747 ,"Default (fallback) search path that ASCEND should use when dlopening the CONOPT library at runtime? This is only used if the conopt environment variable doesn't exist and doesn't point to a location where the DLL/SO is found. This is in platform-specific form (paths with ';' separator in Windows, ':' separator on Linux)."
443 jpye 1399 ,default_conopt_dlpath
444     )
445    
446 jpye 2162 vars.Add(
447 johnpye 800 'CONOPT_ENVVAR'
448 jpye 1747 ,"Name of the optional environment variable which will be used for the value of the searchpath for the CONOPT DLL/SO."
449 johnpye 800 ,default_conopt_envvar
450     )
451    
452 jpye 1546 #------- IPOPT -------
453    
454 jpye 2162 vars.Add(PackageVariable(
455 jpye 1546 "IPOPT_PREFIX"
456     ,"Prefix for your IPOPT install (IPOPT ./configure --prefix)"
457     ,default_conopt_prefix
458     ))
459    
460 jpye 2162 vars.Add(
461 jpye 1547 "IPOPT_LIBS"
462 jpye 1546 ,"Library linked to for IPOPT"
463 jpye 2132 ,default_ipopt_libs
464 jpye 1546 )
465    
466 jpye 1547
467 jpye 2162 vars.Add(
468 jpye 1546 "IPOPT_LIBPATH"
469     ,"Where is your IPOPT library installed"
470 jpye 2132 ,default_ipopt_libpath
471 jpye 1546 )
472    
473 jpye 2162 vars.Add(
474 jpye 1546 'IPOPT_CPPPATH'
475 jpye 1770 ,"Where is your IPOPT coin/IpStdCInterface.h (do not include the 'coin' in the path)"
476 jpye 1546 ,"$IPOPT_PREFIX/include"
477     )
478    
479 jpye 2162 vars.Add(
480 jpye 2132 'IPOPT_DLL'
481     ,"Exact path of IPOPT DLL to be included in the installer (Windows only)"
482     ,default_ipopt_dll
483     )
484 jpye 1546
485 jpye 2132
486    
487 jpye 1501 #------- TRON -------
488    
489 jpye 2162 vars.Add(
490 jpye 1501 'TRON_ENVVAR'
491     ,"What environment variable should be used at runtime to override the default search location for TRON DLL/SO?"
492     ,default_tron_envvar
493     )
494    
495 jpye 2162 vars.Add(
496 jpye 1501 "TRON_LIB"
497     ,"Library linked to for TRON"
498     ,"tron"
499     )
500    
501 jpye 2162 vars.Add(
502 jpye 1501 "TRON_PREFIX"
503     ,"Prefix for your TRON install"
504     ,default_tron_prefix
505 jpye 1515 )
506 jpye 1501
507 jpye 2162 vars.Add(
508 jpye 1501 'TRON_DLPATH'
509     ,"What is the default search path that ASCEND should use when dlopening the TRON library at runtime?"
510     ,default_tron_dlpath
511     )
512    
513 johnpye 938 #-------- f2c ------
514    
515 jpye 2162 vars.Add(
516 johnpye 673 "F2C_LIB"
517     ,"F2C library (eg. g2c, gfortran, f2c)"
518 jpye 1566 ,default_f2c_lib # the default is gfortran now
519 johnpye 673 )
520    
521 jpye 2162 vars.Add(PackageVariable(
522 johnpye 673 "F2C_LIBPATH"
523     ,"Directory containing F2C library (i.e. g2c, gfortran, f2c, etc.), if not already accessible"
524     ,"off"
525     ))
526    
527 jpye 2162 vars.Add(
528 jpye 1398 "FORTRAN"
529     ,"Fortran compiler (eg g77, gfortran)"
530 jpye 1566 ,default_fortran
531 jpye 1398 )
532    
533 johnpye 938 #------- tcl/tk --------
534    
535 jpye 2162 vars.Add(
536 johnpye 521 'TCL'
537     ,'Base of Tcl distribution'
538     ,default_tcl
539 johnpye 534 )
540 johnpye 521
541 johnpye 404 # Where are the Tcl includes?
542 jpye 2162 vars.Add(
543 johnpye 404 'TCL_CPPPATH'
544     ,"Where are your Tcl include files?"
545 jpye 1488 ,default_tcl_cpppath
546 johnpye 534 )
547 johnpye 404
548     # Where are the Tcl libs?
549 jpye 2162 vars.Add(
550 johnpye 404 'TCL_LIBPATH'
551     ,"Where are your Tcl libraries?"
552 johnpye 541 ,default_tcl_libpath
553 johnpye 534 )
554 johnpye 404
555 johnpye 428 # What is the name of the Tcl lib?
556 jpye 2162 vars.Add(
557 johnpye 428 'TCL_LIB'
558 johnpye 561 ,"Name of Tcl lib (eg 'tcl' or 'tcl83'), for full path to static library (if STATIC_TCLTK is set)"
559 johnpye 464 ,default_tcl_lib
560 johnpye 428 )
561    
562 johnpye 405 # Where are the Tk includes?
563 jpye 2162 vars.Add(
564 johnpye 405 'TK_CPPPATH'
565     ,"Where are your Tk include files?"
566 johnpye 464 ,'$TCL_CPPPATH'
567 johnpye 534 )
568 johnpye 404
569 johnpye 405 # Where are the Tk libs?
570 jpye 2162 vars.Add(
571 johnpye 405 'TK_LIBPATH'
572     ,"Where are your Tk libraries?"
573 johnpye 464 ,'$TCL_LIBPATH'
574 johnpye 534 )
575 johnpye 405
576 johnpye 428 # What is the name of the Tk lib?
577 jpye 2162 vars.Add(
578 johnpye 428 'TK_LIB'
579 johnpye 521 ,"Name of Tk lib (eg 'tk' or 'tk83'), or full path to static library"
580 johnpye 464 ,default_tk_lib
581 johnpye 435 )
582    
583 johnpye 460 # Static linking to TkTable
584    
585 jpye 2162 vars.Add(BoolVariable(
586 johnpye 521 'STATIC_TCLTK'
587 johnpye 554 ,'Set true for static linking for Tcl/Tk and TkTable. EXPERIMENTAL'
588 johnpye 460 ,False
589     ))
590    
591 jpye 2162 vars.Add(
592 johnpye 460 'TKTABLE_LIBPATH'
593     ,'Location of TkTable static library'
594 johnpye 464 ,'$TCL_LIBPATH/Tktable2.8'
595     )
596 johnpye 460
597 jpye 2162 vars.Add(
598 johnpye 460 'TKTABLE_LIB'
599 johnpye 521 ,'Stem name of TkTable (eg tktable2.8, no ".so" or "lib") shared library, or full path of static tktable (/usr/lib/...)'
600 johnpye 464 ,default_tktable_lib
601 johnpye 460 )
602    
603 jpye 2162 vars.Add(
604 johnpye 521 'TKTABLE_CPPPATH'
605     ,'Location of TkTable header file'
606     ,'$TCL_CPPPATH'
607     )
608    
609 jpye 2162 vars.Add(
610 johnpye 521 'X11'
611 johnpye 554 ,'Base X11 directory. Only used when STATIC_TCLTK is turned on. EXPERIMENTAL'
612 johnpye 521 ,'/usr/X11R6'
613     )
614    
615 jpye 2162 vars.Add(
616 johnpye 521 'X11_LIBPATH'
617 johnpye 554 ,'Location of X11 lib. EXPERIMENTAL'
618 johnpye 521 ,'$X11/lib'
619     )
620    
621 jpye 2162 vars.Add(
622 johnpye 521 'X11_CPPPATH'
623 johnpye 554 ,'Location of X11 includes. EXPERIMENTAL'
624 johnpye 521 ,'$X11/include'
625     )
626    
627 jpye 2162 vars.Add(
628 johnpye 521 'X11_LIB'
629 johnpye 554 ,'Name of X11 lib. EXPERIMENTAL'
630 johnpye 521 ,'X11'
631     )
632    
633 johnpye 938 #----- installed file locations (for 'scons install') -----
634    
635 jpye 2162 vars.Add(
636 johnpye 435 'INSTALL_PREFIX'
637     ,'Root location for installed files'
638 jpye 2073 ,default_install_prefix
639 johnpye 428 )
640    
641 jpye 2162 vars.Add(
642 johnpye 435 'INSTALL_BIN'
643     ,'Location to put binaries during installation'
644 jpye 2073 ,default_install_bin
645 johnpye 435 )
646    
647 jpye 2162 vars.Add(
648 johnpye 463 'INSTALL_LIB'
649 johnpye 683 ,'Location to put libraries during installation'
650 jpye 2073 ,default_install_lib
651 johnpye 463 )
652    
653 jpye 2162 vars.Add(
654 ben.allan 624 'INSTALL_SHARE'
655 johnpye 628 ,'Common shared-file location on this system'
656     ,"$INSTALL_PREFIX/share"
657 johnpye 435 )
658    
659 jpye 2162 vars.Add(
660 jpye 2025 'INSTALL_ASCDATA'
661     ,"Location of ASCEND shared data (TK, python, models etc)"
662 jpye 2073 ,default_install_ascdata
663 jpye 2025 )
664    
665 jpye 2162 vars.Add(
666 jpye 2007 'INSTALL_PYTHON'
667     ,'Common shared-file location on this system'
668 jpye 2075 ,default_install_python
669 jpye 2007 )
670    
671 jpye 2162 vars.Add(
672 jpye 2025 'INSTALL_TK'
673     ,'Location for Tcl/Tk files used by ASCEND Tk GUI'
674     ,"$INSTALL_ASCDATA/tcltk"
675 johnpye 628 )
676    
677 jpye 2162 vars.Add(
678 jpye 1504 'INSTALL_MODELS'
679     ,"Location of ASCEND model files (.a4c,.a4l,.a4s)"
680 jpye 2073 ,default_install_models
681 jpye 1504 )
682    
683 jpye 2162 vars.Add(
684 jpye 1504 'INSTALL_SOLVERS'
685     ,"Location of ASCEND solvers"
686 jpye 2073 ,default_install_solvers
687 jpye 1504 )
688    
689 jpye 2162 vars.Add(
690 jpye 1442 'INSTALL_DOC'
691     ,"Location of ASCEND documentation files"
692     ,"$INSTALL_SHARE/doc/ascend-"+version
693     )
694    
695 jpye 2162 vars.Add(
696 johnpye 435 'INSTALL_INCLUDE'
697     ,'Location to put header files during installation'
698 jpye 2073 ,default_install_include
699 johnpye 435 )
700    
701 johnpye 938
702 jpye 2162 vars.Add(
703 johnpye 938 'INSTALL_ROOT'
704     ,'For use by RPM only: location of %{buildroot} during rpmbuild'
705     ,""
706     )
707    
708 jpye 2162 vars.Add(
709 jpye 1597 'EXTLIB_SUFFIX'
710     ,"Filename suffix for ASCEND 'external libraries' (for use with IMPORT"
711 jpye 1598 ,"_ascend$SHLIBSUFFIX"
712 jpye 1597 )
713    
714 jpye 2162 vars.Add(
715 jpye 1597 'EXTLIB_PREFIX'
716     ,"Filename suffix for ASCEND 'external libraries' (for use with IMPORT"
717     ,"$SHLIBPREFIX"
718     )
719    
720 johnpye 938 #----------------------
721    
722 jpye 2162 vars.Add(
723 johnpye 455 'PYGTK_ASSETS'
724 jpye 2007 ,'Default location for Glade assets (will be recorded in pygtk/config.py)'
725 johnpye 455 ,default_install_assets
726     )
727    
728 jpye 2162 vars.Add(BoolVariable(
729 johnpye 508 'DEBUG'
730     ,"Compile source with debugger symbols, eg for use with 'gdb'"
731     ,False
732     ))
733    
734 jpye 2162 vars.Add(BoolVariable(
735 johnpye 597 'MALLOC_DEBUG'
736     ,"Compile with debugging version of MALLOC. Required for full CUnit testing"
737     ,False
738     ))
739    
740 johnpye 938 #------ dmalloc --------
741 jpye 2162 vars.Add(PackageVariable(
742 johnpye 938 'DMALLOC_PREFIX'
743     ,"Where are your dmalloc files?"
744     ,default_prefix
745     ))
746 johnpye 448
747 jpye 2162 vars.Add(PackageVariable(
748 johnpye 938 'DMALLOC_CPPPATH'
749     ,"Where are your dmalloc include files?"
750     ,default_cpppath
751     ))
752    
753 jpye 2162 vars.Add(PackageVariable(
754 johnpye 938 'DMALLOC_LIBPATH'
755     ,"Where are your dmalloc libraries?"
756     ,default_libpath
757     ))
758    
759 jpye 2162 vars.Add(BoolVariable(
760 johnpye 938 'WITH_DMALLOC'
761     ,"Link to the DMALLOC library (if available) for debugging of memory usage."
762     ,False
763     ))
764    
765 jpye 1853 #------ Graphviz --------
766 jpye 2162 # vars.Add(PackageVariable(
767 jpye 1853 # 'GRAPHVIZ_PREFIX'
768     # ,"Where are your GRAPHVIZ files?"
769     # ,default_prefix
770     # ))
771     #
772 jpye 2162 # vars.Add(PackageVariable(
773 jpye 1853 # 'GRAPHVIZ_CPPPATH'
774     # ,"Where are your GRAPHVIZ include files? (don't need the final '/graphviz')"
775     # ,default_cpppath
776     # ))
777     #
778 jpye 2162 # vars.Add(PackageVariable(
779 jpye 1853 # 'GRAPHVIZ_LIBPATH'
780     # ,"Where are your GRAPHVIZ libraries?"
781     # ,default_graphviz_libpath
782     # ))
783     #
784 jpye 2162 # vars.Add(
785 jpye 1853 # 'GRAPHVIZ_LIBS'
786     # ,"What are your GRAPHVIZ libraries named?"
787     # ,default_graphviz_libs
788     # )
789     #
790 jpye 2162 # vars.Add(PackageVariable(
791 jpye 1853 # 'GRAPHVIZ_RPATH'
792     # ,"What is your GRAPHVIZ rpath for locating libraries at runtime? (only required for old Ubuntu)"
793     # ,default_graphviz_rpath
794     # ))
795 johnpye 1109
796 jpye 2162 vars.Add(BoolVariable(
797 jpye 1678 'WITH_GRAPHVIZ'
798     ,"Link to the GRAPHVIZ library (if available, for generating incidence graphs)"
799 jpye 1854 ,default_with_graphviz
800 johnpye 1109 ))
801    
802 jpye 1326
803     #------ ufsparse --------
804 jpye 2162 vars.Add(PackageVariable(
805 jpye 1326 'UFSPARSE_PREFIX'
806     ,"Where are your UFSPARSE files?"
807     ,default_prefix
808     ))
809    
810 jpye 2162 vars.Add(PackageVariable(
811 jpye 1326 'UFSPARSE_CPPPATH'
812     ,"Where are your UFSPARSE include files?"
813     ,default_cpppath
814     ))
815    
816 jpye 2162 vars.Add(PackageVariable(
817 jpye 1326 'UFSPARSE_LIBPATH'
818     ,"Where are your UFSPARSE libraries?"
819     ,default_libpath
820     ))
821    
822 jpye 2162 vars.Add(BoolVariable(
823 jpye 1326 'WITH_UFSPARSE'
824     ,"Link to the UFSPARSE library (if available, for additional sparse matrix routines)"
825     ,True
826     ))
827    
828 johnpye 938 #-----------------------
829    
830 jpye 2162 vars.Add(BoolVariable(
831 jpye 1557 'UPDATE_NO_YACC_LEX'
832     ,"Update the *_no_yacc* and *_no_lex* files in the source tree? (these files are created so that ASCEND can be compiled in the absence of those tools)"
833     ,False
834     ))
835    
836 jpye 2162 vars.Add(
837 johnpye 563 'DISTTAR_NAME'
838     ,"Stem name of the tarball created by 'scons dist'. So for 'ascend-aaa.tar.bz2', set this to 'ascend-aaa'."
839     ,"ascend-"+version
840     )
841    
842 jpye 2162 vars.Add(
843 johnpye 656 'RELEASE'
844     ,"Release number for use in RPM spec file. This should always start with a zero for releases made by the ASCEND group, in order that third parties can make 'patch' releases of higher version numbers."
845     ,"0"
846     )
847    
848 jpye 2162 vars.Add(BoolVariable(
849 johnpye 628 'ABSOLUTE_PATHS'
850 johnpye 605 ,"Whether to use absolute or relative paths in the installed Tcl/Tk interface. If you want to build an RPM, set this to false."
851 johnpye 628 ,default_absolute_paths
852 johnpye 605 ))
853    
854 jpye 2162 vars.Add(
855 johnpye 578 'WIN_INSTALLER_NAME'
856     ,"Name of the installer .exe to create under Windows (minus the '.exe')"
857 jpye 1467 ,"ascend-"+version+"-py"+pyversion+".exe"
858 johnpye 578 )
859    
860 jpye 2162 vars.Add(BoolVariable(
861 johnpye 594 'WITH_XTERM_COLORS'
862     ,"Set to 0 if you don't want xterm colour codes in the console output"
863     ,True
864     ))
865    
866 jpye 2162 vars.Add(BoolVariable(
867 johnpye 761 'WITH_EXTFNS'
868 jpye 1504 ,"Set to 0 if you don't want to attempt to build the external modules bundled with ASCEND"
869 johnpye 761 ,True
870     ))
871    
872 jpye 2162 vars.Add(BoolVariable(
873 johnpye 816 'WITH_SCROLLKEEPER'
874     ,"Set to to 1 if you want to install an OMF file that can be read by scrollkeeper (eg Yelp on GNOME)"
875     ,default_with_scrollkeeper
876     ))
877    
878 jpye 2162 vars.Add(BoolVariable(
879 jpye 1720 'WITH_MSVCR71'
880     ,"Attempt to link against MSVCR71.DLL, to enable passing of FILE* objects to/from python"
881     ,False
882     ))
883 jpye 1557
884 johnpye 546
885 johnpye 392 # TODO: OTHER OPTIONS?
886     # TODO: flags for optimisation
887 johnpye 393 # TODO: turning on/off bintoken functionality
888 johnpye 427 # TODO: Where will the 'Makefile.bt' file be installed?
889 johnpye 393
890 johnpye 498 # Import the outside environment
891    
892 johnpye 800 def c_escape(str):
893     return re.sub("\\\\","/",str)
894    
895     envadditional={}
896 johnpye 740
897 jpye 1630 tools = [
898 jpye 2146 'lex', 'yacc', 'fortran', 'swig', 'substinfile'
899 mahesh 2150 ,'disttar', 'tar', 'graphviz','sundials'
900 jpye 1630 ]
901 johnpye 832 if platform.system()=="Windows":
902 jpye 2146 tools += ['nsis']
903    
904 johnpye 1078 if os.environ.get('OSTYPE')=='msys' or os.environ.get('MSYSTEM'):
905 johnpye 832 envenv = os.environ;
906 jpye 1459 tools += ['mingw']
907 johnpye 922 #TODO removed 'doxygen' for SCons 0.96.93
908 johnpye 832 envadditional['IS_MINGW']=True
909     else:
910 johnpye 1082 print "Assuming VC++ build environment (Note: MinGW is preferred)"
911 johnpye 832 envenv = {
912     'PATH':os.environ['PATH']
913     ,'INCLUDE':os.environ['INCLUDE']
914     ,'LIB':os.environ['LIB']
915     ,'MSVS_IGNORE_IDE_PATHS':1
916     }
917 jpye 1459 tools += ['default']
918 johnpye 922 #TODO removed 'doxygen' for SCons 0.96.93
919 johnpye 832 envadditional['CPPDEFINES']=['_CRT_SECURE_NO_DEPRECATE']
920 johnpye 498 else:
921 johnpye 832 if os.environ.get('TARGET')=='mingw':
922     envenv = os.environ
923 jpye 1459 tools += ['crossmingw']
924 jpye 1420 envadditional['CPPPATH']=['/usr/lib/gcc/i586-mingw32msvc/3.4.5/include','/usr/include']
925     envadditional['LIBS']=['gcc']
926 johnpye 832 else:
927     envenv = os.environ
928 jpye 1459 tools += ['default']
929 johnpye 922 #TODO removed 'doxygen' for SCons 0.96.93
930 johnpye 800
931 johnpye 832
932 johnpye 800 env = Environment(
933     ENV=envenv
934     , toolpath=['scons']
935     , tools=tools
936     , **envadditional
937     )
938 johnpye 498
939 jpye 1420 #print "PATH =",os.environ['PATH']
940     #print "PROGSUFFIX =",env['PROGSUFFIX']
941     #print "CPPPATH =",env['CPPPATH']
942 jpye 1380
943 jpye 2162 vars.Update(env)
944 jpye 1520
945 jpye 1853 for l in ['SUNDIALS','IPOPT']:
946 jpye 1712 var = "%s_LIBS" % l
947 jpye 2161 if env.get(var) and not isinstance(env[var],types.ListType):
948 jpye 1712 env[var] = env[var].split(",")
949    
950 jpye 1520 if 'LSOD' in env['WITH_SOLVERS']:
951     if 'LSODE' not in env['WITH_SOLVERS']:
952     env['WITH_SOLVERS'].append('LSODE')
953     env['WITH_SOLVERS'].remove('LSOD')
954    
955 jpye 2162 vars.Save('options.cache',env)
956 johnpye 385
957 jpye 2162 Help(vars.GenerateHelpText(env))
958 johnpye 385
959 johnpye 551 with_tcltk = env.get('WITH_TCLTK')
960 johnpye 427 without_tcltk_reason = "disabled by options/config.py"
961 johnpye 386
962 johnpye 551 with_python = env.get('WITH_PYTHON')
963 johnpye 427 without_python_reason = "disabled by options/config.py"
964 johnpye 387
965 johnpye 593 with_cunit = env.get('WITH_CUNIT')
966 johnpye 427 without_cunit_reason = "not requested"
967 johnpye 400
968 johnpye 761 with_extfns = env.get('WITH_EXTFNS')
969     without_extfn_reason = "disabled by options/config.py"
970    
971 johnpye 816 with_scrollkeeper = env.get('WITH_SCROLLKEEPER')
972     without_scrollkeeper_reason = "disabled by options/config.py"
973    
974 johnpye 938 with_dmalloc = env.get('WITH_DMALLOC')
975     without_dmalloc_reason = "disabled by options/config.py"
976    
977 jpye 1678 with_graphviz = env.get('WITH_GRAPHVIZ')
978     without_graphiviz_reason = "disabled by options/config.py"
979 johnpye 1109
980 jpye 1326 with_ufsparse = env.get('WITH_UFSPARSE')
981     without_ufsparse_reason = "disabled by options/config.py"
982    
983 johnpye 993 with_mmio = env.get('WITH_MMIO')
984     without_mmio_reason = "disabled by options/config.py"
985    
986 johnpye 1142 with_signals = env.get('WITH_SIGNALS')
987     without_signals_reason = "disabled by options/config.py"
988    
989 jpye 1442 with_doc = env.get('WITH_DOC')
990    
991 jpye 1443 with_doc_build = env.get('WITH_DOC_BUILD');
992 jpye 1470 without_doc_build_reason = "disabled by options/config.py"
993 jpye 1443 if not with_doc:
994 jpye 1470 with_doc_build = False
995     without_doc_build_reason = "disabled by with_doc"
996 jpye 1443
997 jpye 1442 with_latex2html = False
998    
999 johnpye 631 if platform.system()=="Windows":
1000     with_installer=1
1001     else:
1002     with_installer=0
1003     without_installer_reason = "only possible under Windows"
1004 johnpye 673
1005 jpye 1734 with_lsode = 'LSODE' in env['WITH_SOLVERS']
1006     without_lsode_reason = "Not selected (see config option WITH_SOLVERS)"
1007 johnpye 673
1008 jpye 1734 with_ida = 'IDA' in env['WITH_SOLVERS']
1009     without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
1010 johnpye 783
1011 jpye 1734 with_dopri5 = 'DOPRI5' in env['WITH_SOLVERS']
1012     without_dopri5_reason = "Not selected (see config option WITH_SOLVERS)"
1013 johnpye 783
1014 jpye 1734 with_conopt = 'CONOPT' in env['WITH_SOLVERS']
1015     without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
1016 jpye 1529
1017 jpye 1734 with_ipopt = 'IPOPT' in env['WITH_SOLVERS']
1018     without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
1019    
1020    
1021 johnpye 464 #print "SOLVERS:",env['WITH_SOLVERS']
1022     #print "WITH_BINTOKEN:",env['WITH_BINTOKEN']
1023     #print "DEFAULT_ASCENDLIBRARY:",env['DEFAULT_ASCENDLIBRARY']
1024 johnpye 393
1025 johnpye 463 can_install = True
1026     if platform.system()=='Windows':
1027     can_install = False
1028    
1029     env['CAN_INSTALL']=can_install
1030 johnpye 721
1031 jpye 1437 print "TCL=",env['TCL']
1032 johnpye 521 print "TCL_CPPPATH =",env['TCL_CPPPATH']
1033     print "TCL_LIBPATH =",env['TCL_LIBPATH']
1034     print "TCL_LIB =",env['TCL_LIB']
1035 johnpye 562 print "CC =",env['CC']
1036     print "CXX =",env['CXX']
1037 johnpye 673 print "FORTRAN=",env.get('FORTRAN')
1038 johnpye 393
1039 johnpye 628 print "ABSOLUTE PATHS =",env['ABSOLUTE_PATHS']
1040 jpye 1504 print "INSTALL_ASCDATA =",env['INSTALL_ASCDATA']
1041 jpye 1413 print "INSTALL_PREFIX =",env['INSTALL_PREFIX']
1042 jpye 1504 print "INSTALL_MODELS =",env['INSTALL_MODELS']
1043     print "INSTALL_SOLVERS =",env['INSTALL_SOLVERS']
1044 jpye 2016 print "INSTALL_PYTHON =",env['INSTALL_PYTHON']
1045 jpye 1504 print "DEFAULT_ASCENDLIBRARY =",env['DEFAULT_ASCENDLIBRARY']
1046 jpye 1519 print "DEFAULT_ASCENDSOLVERS =",env['DEFAULT_ASCENDSOLVERS']
1047 jpye 1504
1048    
1049 johnpye 385 #------------------------------------------------------
1050 johnpye 398 # SPECIAL CONFIGURATION TESTS
1051    
1052 johnpye 463 need_fortran = False
1053 jpye 1641 need_fortran_reasons = []
1054 johnpye 463
1055 johnpye 400 #----------------
1056 jpye 1448 # CC
1057    
1058     cc_test_text = """
1059     int main(void){
1060     return 0;
1061     }
1062     """;
1063    
1064     def CheckCC(context):
1065     context.Message("Checking C compiler ('%s')... " % context.env.get('CC'))
1066     is_ok = context.TryCompile(cc_test_text,".c")
1067     context.Result(is_ok)
1068     return is_ok
1069    
1070     #----------------
1071     # CXX
1072    
1073     cxx_test_text = """
1074     template<class X>
1075     class pair{
1076     public:
1077     X a;
1078     X b;
1079     };
1080    
1081     int main(void){
1082     pair<double> P;
1083     P.a = 0;
1084     return 0;
1085     }
1086     """;
1087    
1088     def CheckCXX(context):
1089     context.Message("Checking C++ compiler ('%s')... " % context.env.get('CXX'))
1090 jpye 1630 if not context.env.get('CXX'):
1091     context.Result("not found")
1092     return False
1093     is_ok = context.TryCompile(cxx_test_text,".cpp")
1094 jpye 1448 context.Result(is_ok)
1095     return is_ok
1096    
1097 jpye 1641 #----------------
1098    
1099     f77_test_text = """
1100     C Hello World in Fortran 77
1101    
1102     PROGRAM HELLO
1103     PRINT*, 'Hello World!'
1104     END
1105     """;
1106    
1107     def CheckF77(context):
1108     context.Message("Checking Fortran 77 compiler ('%s')..." % context.env.get('FORTRAN'))
1109     if not context.env.get('FORTRAN'):
1110     context.Result('not found')
1111     return False
1112     is_ok = context.TryCompile(f77_test_text,".f")
1113     context.Result(is_ok)
1114     return is_ok
1115 jpye 1448
1116     #----------------
1117 johnpye 400 # SWIG
1118    
1119 johnpye 398 import os,re
1120    
1121 johnpye 413 def get_swig_version(env):
1122 jpye 2129 cmd = [env['SWIG'],'-version']
1123 jpye 2143 p = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
1124     output, err = p.communicate()
1125 johnpye 398
1126 jpye 2143 restr = r"\s*SWIG\s+Version\s+(?P<maj>[0-9]+)\.(?P<min>[0-9]+)\.(?P<pat>[0-9]+)\b"
1127     expr = re.compile(restr,re.MULTILINE|re.IGNORECASE);
1128     m = expr.match(output);
1129 johnpye 398 if not m:
1130 jpye 2143 raise RuntimeError("Failed match on output '%s'" % output)
1131 johnpye 398 maj = int(m.group('maj'))
1132     min = int(m.group('min'))
1133     pat = int(m.group('pat'))
1134 johnpye 413
1135     return (maj,min,pat)
1136 johnpye 398
1137 johnpye 413
1138     def CheckSwigVersion(context):
1139    
1140     try:
1141     context.Message("Checking version of SWIG... ")
1142     maj,min,pat = get_swig_version(context.env)
1143 jpye 2143 except Exception,e:
1144     context.Result("Failed to detect version, or failed to run SWIG (%s)" % str(e))
1145 jpye 2070 return False;
1146 johnpye 413
1147 johnpye 478 context.env['SWIGVERSION']=tuple([maj,min,pat])
1148    
1149 jpye 2094 msg = "too old"
1150     res = False
1151 jpye 2208 if maj == 1 and (
1152 johnpye 400 min > 3
1153     or (min == 3 and pat >= 24)
1154 johnpye 398 ):
1155 jpye 2094 msg = "ok"
1156     res = True
1157 johnpye 398
1158 jpye 2094 context.Result("%s, %d.%d.%d" % (msg, maj,min,pat))
1159     return res;
1160    
1161 johnpye 400 #----------------
1162 johnpye 816 # Scrollkeeper (Linux documentation system)
1163    
1164     def get_scrollkeeper_omfdir(env):
1165 jpye 2129 cmd = ['scrollkeeper-config','--omfdir']
1166 jpye 2143 p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
1167     output = p.communicate()
1168     return output.strip()
1169 johnpye 816
1170     def CheckScrollkeeperConfig(context):
1171     try:
1172     context.Message("Checking for scrollkeeper...")
1173     dir=get_scrollkeeper_omfdir(context.env)
1174     except:
1175     context.Result("Failed to run 'scrollkeeper-config'")
1176     return 0
1177     context.env['OMFDIR']=dir
1178     context.Result("OK, %s" % dir)
1179     return 1
1180    
1181     #----------------
1182 johnpye 400 # General purpose library-and-header test
1183    
1184 johnpye 404 class KeepContext:
1185 johnpye 521 def __init__(self,context,varprefix,static=False):
1186 johnpye 404 self.keep = {}
1187 johnpye 521 for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']:
1188 johnpye 705 #print "Keeping env %s = %s" % (k,context.env.get(k))
1189     self.keep[k]=context.env.get(k)
1190 johnpye 404
1191     if context.env.has_key(varprefix+'_CPPPATH'):
1192 johnpye 743 context.env.AppendUnique(CPPPATH=[env[varprefix+'_CPPPATH']])
1193 johnpye 800 #print "Adding '"+str(env[varprefix+'_CPPPATH'])+"' to cpp path"
1194 johnpye 428
1195 johnpye 521 if static:
1196     staticlib=env[varprefix+'_LIB']
1197     #print "STATIC LIB = ",staticlib
1198     context.env.Append(
1199     LINKFLAGS=[staticlib]
1200     )
1201     else:
1202     if context.env.has_key(varprefix+'_LIBPATH'):
1203     context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']])
1204 johnpye 800 #print "Adding '"+str(env[varprefix+'_LIBPATH'])+"' to lib path"
1205 johnpye 428
1206 johnpye 521 if context.env.has_key(varprefix+'_LIB'):
1207     context.env.Append(LIBS=[env[varprefix+'_LIB']])
1208 johnpye 705 #print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs"
1209 jpye 1547 elif context.env.has_key(varprefix+'_LIBS'):
1210     context.env.AppendUnique(LIBS=env[varprefix+'_LIBS'])
1211 johnpye 404
1212     def restore(self,context):
1213 johnpye 464 #print "RESTORING CONTEXT"
1214     #print self.keep
1215     #print "..."
1216 johnpye 404 for k in self.keep:
1217 johnpye 463 if self.keep[k]==None:
1218 johnpye 521 if context.env.has_key(k):
1219     #print "Clearing "+str(k)
1220     del context.env[k];
1221 johnpye 463 else:
1222 johnpye 705 #print "Restoring %s to '%s'" %(k,self.keep.get(k))
1223 johnpye 463 context.env[k]=self.keep[k];
1224 johnpye 404
1225 jpye 1721 def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False,testname=None):
1226 johnpye 400 """This method will check for variables LIBNAME_LIBPATH
1227     and LIBNAME_CPPPATH and try to compile and link the
1228     file with the provided text, linking with the
1229     library libname."""
1230    
1231 jpye 1721 if testname is None:
1232     testname = libname
1233    
1234 johnpye 521 if static:
1235 jpye 1721 context.Message( 'Checking for static '+testname+'... ' )
1236 johnpye 521 else:
1237 jpye 1721 context.Message( 'Checking for '+testname+'... ' )
1238 johnpye 521
1239 johnpye 400 if varprefix==None:
1240     varprefix = libname.upper()
1241    
1242 johnpye 705 #print "LIBS is currently:",context.env.get('LIBS')
1243 johnpye 521 keep = KeepContext(context,varprefix,static)
1244 johnpye 400
1245 jpye 1678 if not context.env.has_key(varprefix+'_LIB') and not context.env.has_key(varprefix+'_LIBS'):
1246 johnpye 463 # if varprefix_LIB were in env, KeepContext would
1247     # have appended it already
1248 johnpye 705 context.env.Append(LIBS=[libname])
1249 johnpye 428
1250 johnpye 404 is_ok = context.TryLink(text,ext)
1251 johnpye 428
1252 johnpye 521 #print "Link success? ",(is_ok != 0)
1253 johnpye 400
1254 johnpye 405 keep.restore(context)
1255 johnpye 400
1256 johnpye 428 # print "Restored CPPPATH="+str(context.env['CPPPATH'])
1257 johnpye 705 # print "Restored LIBS="+str(context.env['LIBS'])
1258 johnpye 428 # print "Restored LIBPATH="+str(context.env['LIBPATH'])
1259    
1260 johnpye 404 context.Result(is_ok)
1261     return is_ok
1262    
1263     #----------------
1264 johnpye 502 # GCC
1265    
1266     gcc_test_text = """
1267     #ifndef __GNUC__
1268     # error "Not using GCC"
1269     #endif
1270    
1271     int main(void){
1272     return __GNUC__;
1273     }
1274     """
1275    
1276     def CheckGcc(context):
1277     context.Message("Checking for GCC... ")
1278     is_ok = context.TryCompile(gcc_test_text,".c")
1279     context.Result(is_ok)
1280     return is_ok
1281    
1282     #----------------
1283 johnpye 500 # GCC VISIBILITY feature
1284    
1285     gccvisibility_test_text = """
1286     #if __GNUC__ < 4
1287     # error "Require GCC version 4 or newer"
1288     #endif
1289    
1290     __attribute__ ((visibility("default"))) int x;
1291    
1292     int main(void){
1293     extern int x;
1294     x = 4;
1295     }
1296     """
1297    
1298     def CheckGccVisibility(context):
1299     context.Message("Checking for GCC 'visibility' capability... ")
1300 johnpye 546 if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']:
1301     context.Result("disabled")
1302     return 0
1303 johnpye 500 is_ok = context.TryCompile(gccvisibility_test_text,".c")
1304     context.Result(is_ok)
1305     return is_ok
1306 johnpye 502
1307 johnpye 500 #----------------
1308 johnpye 502 # YACC
1309    
1310     yacc_test_text = """
1311 johnpye 646 %{
1312     #include <stdio.h>
1313 johnpye 741
1314     /* MSVC++ needs this before it can swallow Bison output */
1315     #ifdef _MSC_VER
1316     # define __STDC__
1317     #endif
1318 johnpye 646 %}
1319     %token MSG
1320 johnpye 502 %start ROOT
1321 johnpye 646 %%
1322     ROOT:
1323     MSG { printf("HELLO"); }
1324     ;
1325     %%
1326 johnpye 502 """
1327    
1328     def CheckYacc(context):
1329 johnpye 644 context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
1330 johnpye 502 is_ok = context.TryCompile(yacc_test_text,".y")
1331     context.Result(is_ok)
1332     return is_ok
1333    
1334     #----------------
1335 johnpye 1025 # LEX
1336    
1337     lex_test_text = """
1338     %{
1339     #include <stdio.h>
1340     %}
1341     DIGIT [0-9]
1342     ID [a-z][a-z0-9]*
1343     %%
1344     {DIGIT}+ {
1345     printf("A digit: %s\\n",yytext);
1346     }
1347    
1348     [ \\t\\n]+ /* ignore */
1349    
1350     . {
1351     printf("Unrecognized guff");
1352     }
1353     %%
1354     main(){
1355     yylex();
1356     }
1357     """
1358    
1359     def CheckLex(context):
1360     context.Message("Checking for Lex ('%s')... " % context.env.get('LEX'))
1361     is_ok = context.TryCompile(lex_test_text,".l")
1362     context.Result(is_ok)
1363     return is_ok
1364    
1365     #----------------
1366 johnpye 404 # CUnit test
1367    
1368 johnpye 400 cunit_test_text = """
1369 johnpye 451 #include <CUnit/CUnit.h>
1370 johnpye 400 int maxi(int i1, int i2){
1371     return (i1 > i2) ? i1 : i2;
1372     }
1373    
1374     void test_maxi(void){
1375     CU_ASSERT(maxi(0,2) == 2);
1376     CU_ASSERT(maxi(0,-2) == 0);
1377     CU_ASSERT(maxi(2,2) == 2);
1378    
1379     }
1380     int main(void){
1381     /* CU_initialize_registry() */
1382 johnpye 404 return 0;
1383 johnpye 400 }
1384     """
1385    
1386     def CheckCUnit(context):
1387 johnpye 451 return CheckExtLib(context,'cunit',cunit_test_text)
1388 johnpye 400
1389 johnpye 404 #----------------
1390 johnpye 938 # dmalloc test
1391    
1392     dmalloc_test_text = """
1393     #include <stdlib.h>
1394     #include <dmalloc.h>
1395    
1396     int main(void){
1397     char *c;
1398 jpye 1733 c = (char *)malloc(100*sizeof(char));
1399 johnpye 938 free(c);
1400     return 0;
1401     }
1402     """
1403    
1404     def CheckDMalloc(context):
1405     return CheckExtLib(context,'dmalloc',dmalloc_test_text)
1406    
1407     #----------------
1408 jpye 1678 # graphviz test
1409 johnpye 1109
1410 jpye 1678 graphviz_test_text = """
1411 jpye 1714 #ifdef __WIN32__
1412     # include <gvc.h>
1413     #else
1414     # include <graphviz/gvc.h>
1415     #endif
1416 johnpye 1109 int main(void){
1417 jpye 1678 Agraph_t *g;
1418     GVC_t *gvc;
1419     gvc = gvContext();
1420     g = agopen("g", AGDIGRAPH);
1421 johnpye 1109 return 0;
1422     }
1423     """
1424    
1425 jpye 1678 def CheckGraphViz(context):
1426     return CheckExtLib(context,'graphviz',graphviz_test_text,ext=".c")
1427 johnpye 1109
1428 jpye 1721 graphviz_boolean_test = """
1429     #ifdef __WIN32__
1430 jpye 1722 # include <types.h>
1431 jpye 1721 #else
1432 jpye 1722 # include <graphviz/types.h>
1433 jpye 1721 #endif
1434 jpye 1722 #ifndef GV_TYPES_H
1435     # error WHERE IS GV_TYPES_H?
1436     #endif
1437     int main(void){
1438 jpye 1721 boolean x;
1439     x = TRUE;
1440     return 0;
1441     }
1442     """
1443    
1444     def CheckGraphVizBoolean(context):
1445     return CheckExtLib(context,'graphviz',graphviz_boolean_test,ext=".c" \
1446     ,testname="graphviz 'boolean' definition"
1447     )
1448    
1449 johnpye 1109 #----------------
1450 jpye 1326 # ufsparse test
1451    
1452     ufsparse_test_text = """
1453     #include <ufsparse/cs.h>
1454     int main(void){
1455     cs *A,*B,*C;
1456     C = cs_multiply(A,B);
1457     return 0;
1458     }
1459     """
1460    
1461     def CheckUFSparse(context):
1462     return CheckExtLib(context
1463     ,libname='cxsparse'
1464     ,varprefix='ufsparse'
1465     ,text=ufsparse_test_text
1466     ,ext=".c"
1467     )
1468    
1469     #----------------
1470 johnpye 673 # MATH test
1471    
1472     math_test_text = """
1473 johnpye 705 #ifndef _ALL_SOURCE
1474     # define _ALL_SOURCE
1475     #endif
1476     #ifndef _XOPEN_SOURCE
1477     # define _XOPEN_SOURCE
1478     #endif
1479     #ifndef _XOPEN_SOURCE_EXTENDED
1480     # define _XOPEN_SOURCE_EXTENDED 1
1481     #endif
1482 johnpye 673 #include <math.h>
1483     int main(void){
1484 johnpye 705 double x = 1.0; double y = 1.0; int i = 1;
1485     acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
1486     j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
1487     y0(x); y1(x); yn(i,x);
1488 jpye 1420 /* this part causes problems with crossmingw... */
1489 johnpye 705 #ifdef _THREAD_SAFE
1490     gamma_r(x,&i);
1491     lgamma_r(x,&i);
1492     #else
1493     gamma(x);
1494     lgamma(x);
1495     #endif
1496     hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
1497 johnpye 673 return 0;
1498     }
1499     """
1500    
1501     def CheckMath(context):
1502 johnpye 832 context.Message('Checking for IEEE math library... ')
1503 johnpye 705 libsave=context.env.get('LIBS');
1504     context.env.AppendUnique(LIBS=['m'])
1505     is_ok=context.TryLink(math_test_text,".c")
1506     context.Result(is_ok)
1507 jpye 1941 if libsave is None:
1508     del(context.env['LIBS'])
1509     else:
1510 johnpye 705 context.env['LIBS']=libsave
1511     return is_ok
1512    
1513 johnpye 673 #----------------
1514 jpye 1656 # malloc.h test
1515    
1516     malloc_test_text = """
1517 jpye 1660 #include <stdlib.h>
1518 jpye 1656 int main(){
1519     double *x;
1520     x = malloc(sizeof(double)*5);
1521     x[4] = 3.3;
1522     free(x);
1523     }
1524     """
1525    
1526     def CheckMalloc(context):
1527     context.Message("Checking for malloc...")
1528     is_ok = context.TryLink(malloc_test_text,".c")
1529     context.Result(is_ok)
1530     return is_ok
1531    
1532     #----------------
1533     # dlopen test
1534    
1535     dlopen_test_text = """
1536     #ifdef __WIN32__
1537     # include <windows.h>
1538     #else
1539     # include <dlfcn.h>
1540     #endif
1541     int main(){
1542     #ifdef __WIN32__
1543     HINSTANCE d;
1544     LoadLibrary("imaginary_and_nonexistent.dll");
1545     #else
1546     void *d;
1547     d = dlopen("imaginary_and_nonexistent.so", 1);
1548     #endif
1549     return 0;
1550     }
1551     """
1552    
1553     def CheckDLOpen(context):
1554     context.Message("Checking for ability to load shared libraries at runtime...")
1555     libsave=context.env.get('LIBS');
1556     if platform.system()!="Windows":
1557     context.env.Append(LIBS=['dl'])
1558     is_ok = context.TryLink(dlopen_test_text,".c")
1559     context.Result(is_ok)
1560     context.env['LIBS'] = libsave
1561     return is_ok
1562    
1563     #----------------
1564 johnpye 957 # libpython test
1565    
1566     libpython_test_text = """
1567     #include <Python.h>
1568     int main(void){
1569     PyObject *p;
1570     p = Py_None;
1571     return 0;
1572     }
1573     """
1574    
1575     def CheckPythonLib(context):
1576     context.Message('Checking for libpython... ')
1577    
1578     if platform.system()=="Windows":
1579     python_lib='python%d%d'
1580     else:
1581     python_lib='python%d.%d'
1582    
1583 jpye 1786 try:
1584     python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])]
1585     python_cpppath = [distutils.sysconfig.get_python_inc()]
1586     cfig = distutils.sysconfig.get_config_vars()
1587     except:
1588     context.Result("not found")
1589     return 0
1590 johnpye 957
1591     lastLIBS = context.env.get('LIBS')
1592     lastLIBPATH = context.env.get('LIBPATH')
1593     lastCPPPATH = context.env.get('CPPPATH')
1594 johnpye 959 lastLINKFLAGS = context.env.get('LINKFLAGS')
1595 johnpye 957
1596     python_libpath = []
1597 johnpye 959 python_linkflags = []
1598 johnpye 965 if platform.system()=="Windows":
1599 jpye 1551 python_libpath += [os.path.join(sys.prefix,"libs")]
1600 jpye 2069 elif platform.system()=="Darwin":
1601     python_libpath += [cfig['LIBPL']]
1602     python_linkflags += cfig['LIBS'].split(' ')
1603 johnpye 965 else:
1604     # checked on Linux and SunOS
1605     if cfig['LDLIBRARY']==cfig['LIBRARY']:
1606     sys.stdout.write("(static)")
1607     python_libpath += [cfig['LIBPL']]
1608     python_linkflags += cfig['LIBS'].split(' ')
1609 johnpye 957
1610 johnpye 958 context.env.AppendUnique(LIBS=python_libs)
1611 johnpye 957 context.env.AppendUnique(LIBPATH=python_libpath)
1612     context.env.AppendUnique(CPPPATH=python_cpppath)
1613 johnpye 959 context.env.AppendUnique(LINKFLAGS=python_linkflags)
1614 johnpye 957 result = context.TryLink(libpython_test_text,".c");
1615    
1616 johnpye 958 context.Result(result)
1617 johnpye 957
1618     if(result):
1619 johnpye 958 context.env['PYTHON_LIBPATH']=python_libpath
1620     context.env['PYTHON_LIB']=python_libs
1621     context.env['PYTHON_CPPPATH']=python_cpppath
1622 johnpye 959 context.env['PYTHON_LINKFLAGS']=python_linkflags
1623 johnpye 957
1624     context.env['LIBS'] = lastLIBS
1625     context.env['LIBPATH'] = lastLIBPATH
1626     context.env['CPPPATH'] = lastCPPPATH
1627 johnpye 959 context.env['LINKFLAGS'] = lastLINKFLAGS
1628 johnpye 957
1629     return result
1630    
1631     #----------------
1632 johnpye 673 # IDA test
1633    
1634 johnpye 913 sundials_version_major_required = 2
1635     sundials_version_minor_min = 2
1636 jpye 2085 sundials_version_minor_max = 4
1637 johnpye 913
1638     sundials_version_text = """
1639     #include <sundials/sundials_config.h>
1640     #include <stdio.h>
1641     int main(){
1642     printf("%s",SUNDIALS_PACKAGE_VERSION);
1643     return 0;
1644     }
1645     """
1646    
1647 johnpye 673 ida_test_text = """
1648 jpye 1400 #if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2
1649     # include <sundials/sundials_config.h>
1650     # include <sundials/sundials_nvector.h>
1651 jpye 1405 # include <nvector_serial.h>
1652 jpye 1400 # include <ida.h>
1653     # include <ida/ida_spgmr.h>
1654     #else
1655     # include <sundials/sundials_config.h>
1656     # include <nvector/nvector_serial.h>
1657 johnpye 907 # include <ida/ida.h>
1658 jpye 1400 #endif
1659 johnpye 673 int main(){
1660     void *ida_mem;
1661     ida_mem = IDACreate();
1662 johnpye 782 return 0;
1663 johnpye 673 }
1664     """
1665    
1666 johnpye 913 # slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS,
1667     # so detect the version and act accordingly.
1668 jpye 1400 def CheckSUNDIALS(context):
1669     keep = KeepContext(context,'SUNDIALS')
1670 jpye 1402 context.Message("Checking for SUNDIALS... ")
1671 johnpye 913 (is_ok,output) = context.TryRun(sundials_version_text,'.c')
1672     keep.restore(context)
1673     if not is_ok:
1674 jpye 1402 context.Result(0)
1675 johnpye 913 return 0
1676    
1677     major,minor,patch = tuple([int(i) for i in output.split(".")])
1678     context.env['SUNDIALS_VERSION_MAJOR'] = major
1679     context.env['SUNDIALS_VERSION_MINOR'] = minor
1680     if major != sundials_version_major_required \
1681     or minor < sundials_version_minor_min \
1682     or minor > sundials_version_minor_max:
1683     context.Result(output+" (bad version)")
1684     # bad version
1685     return 0
1686    
1687     # good version
1688 johnpye 1086 context.Result("%d.%d.%d, good" % (major,minor,patch))
1689 jpye 1400
1690 johnpye 913 return 1
1691    
1692 jpye 1400
1693     def CheckIDA(context):
1694 jpye 1402 context.Message( 'Checking for IDA... ' )
1695 jpye 1400
1696 jpye 1404 keep = KeepContext(context,"SUNDIALS")
1697 jpye 1400
1698     major = context.env['SUNDIALS_VERSION_MAJOR']
1699     minor = context.env['SUNDIALS_VERSION_MINOR']
1700    
1701 jpye 1404 cppdef = context.env.get('CPPDEFINES')
1702    
1703     context.env.Append(CPPDEFINES=[
1704     ('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR")
1705     ,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")
1706     ])
1707    
1708     context.env['SUNDIALS_CPPPATH_EXTRA']=[]
1709     if major==2 and minor==2:
1710     context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"])
1711    
1712 jpye 1400 context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")])
1713 jpye 1404 context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS'])
1714     context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA'])
1715 jpye 1400
1716     is_ok = context.TryLink(ida_test_text,".c")
1717     context.Result(is_ok)
1718    
1719 jpye 1404 if cppdef:
1720     context.env['CPPDEFINES']=cppdef
1721 jpye 1552 else:
1722     del context.env['CPPDEFINES']
1723    
1724 jpye 1400 keep.restore(context)
1725    
1726     return is_ok
1727    
1728    
1729 johnpye 673 #----------------
1730 johnpye 783 # CONOPT test
1731    
1732     conopt_test_text = """
1733 johnpye 800 #if !defined(_WIN32)
1734     # define FNAME_LCASE_DECOR
1735     #endif
1736    
1737 johnpye 783 #include <conopt.h>
1738     #include <stdlib.h>
1739     int main(){
1740     int s, *v, e;
1741     s = COIDEF_Size();
1742     v = (int *)malloc(s*sizeof(int));
1743     e = COIDEF_Ini(v);
1744     return e;
1745     }
1746     """
1747    
1748     def CheckCONOPT(context):
1749     context.Message( 'Checking for CONOPT... ' )
1750    
1751     keep = KeepContext(context,"CONOPT")
1752    
1753     is_ok = context.TryLink(conopt_test_text,".c")
1754     context.Result(is_ok)
1755    
1756     keep.restore(context)
1757    
1758     return is_ok
1759    
1760     #----------------
1761 jpye 1529 # IPOPT test
1762    
1763     ipopt_test_text = """
1764     #if !defined(_WIN32)
1765     # define FNAME_LCASE_DECOR
1766     #endif
1767    
1768 jpye 1770 #include <coin/IpStdCInterface.h>
1769 jpye 1529 int main(){
1770     Number n;
1771 jpye 1546 IpoptProblem nlp = 0;
1772 jpye 1941 n = 1;
1773 jpye 1529 FreeIpoptProblem(nlp); // probably a crash if you run this
1774     return 0;
1775     }
1776     """
1777    
1778     def CheckIPOPT(context):
1779     context.Message( 'Checking for IPOPT... ' )
1780    
1781     keep = KeepContext(context,"IPOPT")
1782     is_ok = context.TryLink(ipopt_test_text,".c")
1783     context.Result(is_ok)
1784    
1785     keep.restore(context)
1786    
1787     return is_ok
1788    
1789     #----------------
1790 johnpye 405 # Tcl test
1791 johnpye 404
1792 jpye 1787 # TCL and TK required version 8.1 through 8.5:
1793     tcltk_minor_newest_acceptable = 5
1794 johnpye 561 tcltk_major_required = 8
1795    
1796 johnpye 404 tcl_check_text = r"""
1797     #include <tcl.h>
1798     #include <stdio.h>
1799     int main(void){
1800     printf("%s",TCL_PATCH_LEVEL);
1801     return 0;
1802     }
1803     """
1804    
1805     def CheckTcl(context):
1806 johnpye 521 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
1807 johnpye 405
1808     def CheckTclVersion(context):
1809 johnpye 521 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
1810 johnpye 405 context.Message("Checking Tcl version... ")
1811     (is_ok,output) = context.TryRun(tcl_check_text,'.c')
1812 johnpye 404 keep.restore(context)
1813     if not is_ok:
1814 johnpye 405 context.Result("failed to run check")
1815 johnpye 404 return 0
1816 johnpye 405
1817 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
1818 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1819 johnpye 428 context.Result(output+" (bad version)")
1820 johnpye 405 # bad version
1821     return 0
1822    
1823     # good version
1824 johnpye 552 context.Result(output+", good")
1825 johnpye 404 return 1
1826    
1827 johnpye 405 #----------------
1828 johnpye 463 # Tk test
1829 johnpye 405
1830     tk_check_text = r"""
1831     #include <tk.h>
1832     #include <stdio.h>
1833     int main(void){
1834     printf("%s",TK_PATCH_LEVEL);
1835     return 0;
1836     }
1837     """
1838     def CheckTk(context):
1839 johnpye 673 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
1840 johnpye 405
1841 johnpye 428
1842 johnpye 405 def CheckTkVersion(context):
1843 johnpye 521 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
1844 johnpye 405 context.Message("Checking Tk version... ")
1845 johnpye 521 #print "LINKFLAGS =",context.env['LINKFLAGS']
1846 johnpye 405 (is_ok,output) = context.TryRun(tk_check_text,'.c')
1847 johnpye 404 keep.restore(context)
1848     if not is_ok:
1849     context.Result("failed to run check")
1850     return 0
1851    
1852 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
1853 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1854 johnpye 404 # bad version
1855 johnpye 561 context.Result(output+" (bad version)")
1856 johnpye 404 return 0
1857 johnpye 400
1858 johnpye 404 # good version
1859 johnpye 561 context.Result(output+" (good)")
1860 johnpye 404 return 1
1861 johnpye 485
1862     #----------------
1863 johnpye 521 # Tktable test
1864    
1865     tktable_check_text = r"""
1866     #include <tkTable.h>
1867     #include <stdio.h>
1868     int main(void){
1869     Table mytable;
1870     return 0;
1871     }
1872     """
1873    
1874     def CheckTkTable(context):
1875     return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
1876    
1877     #---------------
1878     # X11 test
1879    
1880     x11_check_text = r"""
1881     #include <X11/Xlib.h>
1882     #include <X11/IntrinsicP.h>
1883     #include <X11/Intrinsic.h>
1884     #include <X11/ObjectP.h>
1885     #include <X11/Object.h>
1886     int main(void){
1887     Object mything;
1888     return 0;
1889     }
1890     """
1891    
1892     def CheckX11(context):
1893     return CheckExtLib(context,'X11',x11_check_text)
1894    
1895     #----------------
1896 johnpye 968 # Check that we can raise and catch sigint
1897    
1898     sigint_test_text = r"""
1899     #include <signal.h>
1900     #include <setjmp.h>
1901     #include <stdlib.h>
1902     static jmp_buf g_jmpenv;
1903     void sighandler(int sig){
1904     longjmp(g_jmpenv,sig);
1905     }
1906     void testsigint(){
1907     raise(SIGINT);
1908     }
1909     int main(void){
1910     signal(SIGINT,&sighandler);
1911     switch(setjmp(g_jmpenv)){
1912     case 0:
1913     testsigint();
1914     exit(1);
1915     case SIGINT:
1916     exit(0);
1917     default:
1918     exit(2);
1919     }
1920     }
1921     """
1922    
1923     def CheckSIGINT(context):
1924     context.Message("Checking SIGINT is catchable... ")
1925     (is_ok,output)=context.TryRun(sigint_test_text,".c")
1926     context.Result(is_ok)
1927     return is_ok
1928    
1929     #----------------
1930 johnpye 953 # Check that we're able to catch floating point errors
1931    
1932     sigfpe_test_text = r"""
1933     #include <signal.h>
1934     #include <setjmp.h>
1935     #include <stdlib.h>
1936     #include <fenv.h>
1937     static jmp_buf g_jmpenv;
1938     void fpehandler(int sig){
1939     longjmp(g_jmpenv,sig);
1940     }
1941     int main(void){
1942     fenv_t myfenv;
1943     fegetenv(&myfenv);
1944     fesetenv(&myfenv);
1945     feenableexcept(FE_ALL_EXCEPT);
1946     signal(SIGFPE,&fpehandler);
1947     double x;
1948     switch(setjmp(g_jmpenv)){
1949     case 0:
1950     x = 1.0 / 0.0;
1951     /* failed to catch */
1952     exit(1);
1953     case SIGFPE:
1954     exit(0);
1955     }
1956     }
1957     """
1958    
1959     def CheckFPE(context):
1960 johnpye 968 context.Message("Checking C99 FPE behaviour... ")
1961 johnpye 953 (is_ok,output) = context.TryRun(sigfpe_test_text,'.c')
1962     context.Result(is_ok)
1963     return is_ok
1964    
1965     #----------------
1966 johnpye 968 # signal reset needed?
1967    
1968     sigreset_test_text = r"""
1969     #include <signal.h>
1970     #include <setjmp.h>
1971     #include <stdlib.h>
1972     #include <stdio.h>
1973     typedef void SigHandlerFn(int);
1974     static jmp_buf g_jmpenv;
1975     void sighandler(int sig){
1976     longjmp(g_jmpenv,sig);
1977     }
1978     void testsigint(){
1979 johnpye 1002 /* fprintf(stderr,"Raising SIGINT\n"); */
1980 johnpye 968 raise(SIGINT);
1981     }
1982     int main(void){
1983     SigHandlerFn *last,*saved;
1984     saved = signal(SIGINT,&sighandler);
1985     if(saved!=SIG_DFL){
1986 johnpye 1002 fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL);
1987 johnpye 968 exit(3);
1988     }
1989     switch(setjmp(g_jmpenv)){
1990     case 0:
1991     testsigint();
1992     fprintf(stderr,"Back from SIGINT\n");
1993     exit(1);
1994     case SIGINT:
1995     break;
1996     default:
1997     exit(2);
1998     };
1999 johnpye 1002 last = signal(SIGINT,SIG_DFL);
2000 johnpye 968 if(last!=&sighandler){
2001     printf("1");
2002     exit(0);
2003     }
2004     printf("0");
2005     exit(0);
2006     }
2007     """
2008    
2009     def CheckSigReset(context):
2010     context.Message("Checking signal handler reset... ")
2011 jpye 1941 libsave=context.env.get('LIBS')
2012     context.env.AppendUnique(LIBS=['m'])
2013 johnpye 968 (is_ok,output) = context.TryRun(sigreset_test_text,'.c')
2014 jpye 1941
2015     if libsave is None:
2016     del(context.env['LIBS'])
2017     else:
2018     context.env['LIBS']=libsave
2019    
2020 johnpye 968 if not is_ok:
2021     context.Result("ERROR")
2022 johnpye 1260 return False
2023 johnpye 1002 if int(output)==1:
2024 johnpye 968 context.Result("required");
2025     context.env['ASC_RESETNEEDED'] = True
2026     else:
2027     context.Result("not required");
2028     context.env['ASC_RESETNEEDED'] = False
2029 jpye 1658 return True
2030 johnpye 968
2031     #----------------
2032 jpye 1442 # LyX on this system?
2033    
2034     def CheckLyx(context):
2035     context.Message("Checking for LyX... ")
2036     r = context.env.WhereIs("lyx")
2037 jpye 1469 if r:
2038     context.Result(r)
2039     else:
2040     context.Result(0)
2041 jpye 1442 return r
2042    
2043     #----------------
2044     # Latex2HTML on this system?
2045    
2046     def CheckLatex2HTML(context):
2047     context.Message("Checking for latex2html...")
2048     if context.env.WhereIs("latex2html"):
2049     r = True
2050     else:
2051     r = False
2052     context.Result(r)
2053     return r
2054    
2055     #----------------
2056 jpye 1701 # 'lmodern' package for LaTeX available?
2057    
2058 jpye 1723 lmodern_test_text = r"""
2059 jpye 1701 \documentclass{article}
2060 jpye 1723 \usepackage{lmodern}
2061 jpye 1701 \title{Cartesian closed categories and the price of eggs}
2062     \author{Jane Doe}
2063     \date{September 1994}
2064     \begin{document}
2065     \maketitle
2066     Hello world!
2067     \end{document}
2068     """;
2069    
2070     def CheckLModern(context):
2071     context.Message("Checking for lmodern...")
2072 jpye 1770 b = context.env.get("DVI")
2073     if not b:
2074     context.Result(False)
2075     return False
2076 jpye 2000 ff = context.env.get('LATEXFLAGS')
2077     context.env.Append(LATEXFLAGS=['-interaction=nonstopmode','-halt-on-error'])
2078     is_ok = context.TryBuild(builder=b,text=lmodern_test_text,extension=".latex")
2079     print "is_ok=",is_ok
2080     if ff is not None:
2081     context.env['LATEXFLAGS'] = ff
2082     else:
2083     del context.env['LATEXFLAGS']
2084 jpye 1701 context.Result(is_ok)
2085     return is_ok
2086    
2087     #----------------
2088 johnpye 485 # GCC Version sniffing
2089    
2090     # TODO FIXME
2091    
2092     gcc_version4 = False
2093    
2094 johnpye 398 #------------------------------------------------------
2095 johnpye 385 # CONFIGURATION
2096    
2097     conf = Configure(env
2098     , custom_tests = {
2099 jpye 1448 'CheckCC' : CheckCC
2100     , 'CheckCXX' : CheckCXX
2101 jpye 1641 , 'CheckF77' : CheckF77
2102 jpye 1448 , 'CheckMath' : CheckMath
2103 jpye 1656 , 'CheckMalloc' : CheckMalloc
2104     , 'CheckDLOpen' : CheckDLOpen
2105 johnpye 673 , 'CheckSwigVersion' : CheckSwigVersion
2106 johnpye 957 , 'CheckPythonLib' : CheckPythonLib
2107 johnpye 400 , 'CheckCUnit' : CheckCUnit
2108 johnpye 938 , 'CheckDMalloc' : CheckDMalloc
2109 jpye 1442 , 'CheckLyx' : CheckLyx
2110     , 'CheckLatex2HTML' : CheckLatex2HTML
2111 jpye 1701 , 'CheckLModern' : CheckLModern
2112 jpye 1678 , 'CheckGraphViz' : CheckGraphViz
2113 jpye 1721 , 'CheckGraphVizBoolean' : CheckGraphVizBoolean
2114 jpye 1326 , 'CheckUFSparse' : CheckUFSparse
2115 johnpye 404 , 'CheckTcl' : CheckTcl
2116     , 'CheckTclVersion' : CheckTclVersion
2117 johnpye 405 , 'CheckTk' : CheckTk
2118     , 'CheckTkVersion' : CheckTkVersion
2119 johnpye 502 , 'CheckGcc' : CheckGcc
2120 johnpye 500 , 'CheckGccVisibility' : CheckGccVisibility
2121 johnpye 502 , 'CheckYacc' : CheckYacc
2122 johnpye 1025 , 'CheckLex' : CheckLex
2123 johnpye 521 , 'CheckTkTable' : CheckTkTable
2124     , 'CheckX11' : CheckX11
2125 johnpye 673 , 'CheckIDA' : CheckIDA
2126 jpye 1400 , 'CheckSUNDIALS' : CheckSUNDIALS
2127 johnpye 783 , 'CheckCONOPT' : CheckCONOPT
2128 jpye 1529 , 'CheckIPOPT' : CheckIPOPT
2129 johnpye 816 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
2130 johnpye 953 , 'CheckFPE' : CheckFPE
2131 johnpye 968 , 'CheckSIGINT' : CheckSIGINT
2132     , 'CheckSigReset' : CheckSigReset
2133 johnpye 400 # , 'CheckIsNan' : CheckIsNan
2134     # , 'CheckCppUnitConfig' : CheckCppUnitConfig
2135 jpye 1691 }
2136 johnpye 459 # , config_h = "config.h"
2137 johnpye 385 )
2138    
2139 jpye 1357 def sconsversioncheck():
2140    
2141     # uncomment the following line to skip the version check:
2142     # return 1
2143    
2144     import SCons
2145     v = SCons.__version__.split(".")
2146     if v[0] != '0':
2147 jpye 1999 if v[0] == '1':
2148     return 1;
2149 jpye 1357 return 0
2150 jpye 1431 if int(v[1]) >= 97:
2151     return 1
2152 jpye 1357 if v[1] != '96':
2153     return 0
2154     micro = int(v[2])
2155 jpye 1394 if micro == 92 or micro == 93 or micro == 96:
2156 jpye 1357 return 1;
2157     return 0
2158    
2159     if not sconsversioncheck():
2160     print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
2161     print "or consult the developers in the case of newer versions. Modify"
2162     print "the function 'sconsversioncheck' in the file SConstruct if you"
2163     print "want to *force* SCons to continue."
2164     Exit(1)
2165    
2166 jpye 1448 # check C compiler
2167    
2168 jpye 1654 if conf.CheckCC() is False:
2169 jpye 1448 print "Failed to build simple test file with your C compiler."
2170     print "Check your compiler is installed and running correctly."
2171     Exit(1)
2172    
2173 jpye 1654 if conf.CheckCXX() is False:
2174 jpye 1448 print "Failed to build simple test file with your C++ compiler."
2175     print "Check your compiler is installed and running correctly."
2176 jpye 1630 print "You can set your C++ compiler using the CXX scons option."
2177 jpye 1448 Exit(1)
2178    
2179 johnpye 740 # stdio -- just to check that compiler is behaving
2180 johnpye 398
2181 jpye 1654 if conf.CheckHeader('stdio.h') is False:
2182 johnpye 832 print "CPPPATH =",env.get('CPPPATH')
2183 johnpye 740 print "Did not find 'stdio.h'! Check your compiler configuration."
2184 johnpye 1080 print ""
2185     print "You environment is printed here:"
2186     for k,v in os.environ.iteritems():
2187     print "%-30s%s" % ("%s :" % k, v)
2188 johnpye 740 Exit(1)
2189    
2190 jpye 2037 # sizes of vars used in libascend eg in gl_list etc.
2191 ballan 2036
2192 jpye 2037 _sizes = {
2193     "VOID_P" : "void *"
2194     ,"INT" : "int"
2195     ,"LONG" : "long"
2196     ,"LONG_LONG" : "long long"
2197     }
2198 ballan 2036
2199 jpye 2037 for _var,_type in _sizes.iteritems():
2200     _size = conf.CheckTypeSize(_type)
2201     if not _size:
2202     print "Couldn't determine 'sizeof(%s)'" % _type
2203     Exit(1)
2204     conf.env["SIZEOF_%s" % _var] = str(_size)
2205 ballan 2036
2206 jpye 2037 # check for some string functions
2207 ballan 2036
2208 jpye 1654 if conf.CheckFunc('snprintf') is False:
2209 johnpye 1228 print "Didn't find snprintf";
2210 jpye 2037 Exit(1)
2211 johnpye 1228
2212 jpye 1678 if conf.CheckFunc('strdup'):
2213     conf.env['HAVE_STRDUP'] = True
2214    
2215 jpye 2037 # attempt to support MSVCRT 7.1 on Windows
2216    
2217 jpye 1720 if platform.system()=="Windows" and env.get('WITH_MSVCR71'):
2218     conf.env.Append(LIBS='msvcr71')
2219    
2220 johnpye 385 # Math library
2221    
2222 johnpye 1262 conf.env['HAVE_IEEE']=True
2223    
2224 jpye 1654 if need_libm and (conf.CheckMath() is False):
2225 johnpye 1232 conf.env['HAVE_IEEE']=False
2226 johnpye 1262 print 'Did not find math library, exiting!'
2227     Exit(1)
2228 johnpye 427
2229 jpye 1656 # Malloc
2230    
2231     if conf.CheckMalloc() is False:
2232     conf.env['HAVE_MALLOC']=False
2233     print "Did not find functioning 'malloc', exiting!"
2234     Exit(1)
2235    
2236     # dlopen/LoadLibrary
2237    
2238 jpye 1659 # CURRENTLY BREAKS LATER TEST (libsave?)
2239     #if conf.CheckDLOpen() is False:
2240     # print "Did not find functioning dlopen/LoadLibrary, exiting!"
2241     # Exit(1)
2242 jpye 1656
2243 johnpye 385 # Where is 'isnan'?
2244    
2245 jpye 1654 if conf.CheckFunc('isnan') is False and conf.CheckFunc('_isnan') is False:
2246 johnpye 385 print "Didn't find isnan"
2247 johnpye 414 # Exit(1)
2248 johnpye 385
2249 johnpye 500 # GCC visibility
2250    
2251 johnpye 502 if conf.CheckGcc():
2252     conf.env['HAVE_GCC']=True;
2253 jpye 2027 if env.get('WITH_GCCVISIBILITY') and conf.CheckGccVisibility():
2254 johnpye 509 conf.env['HAVE_GCCVISIBILITY']=True;
2255     conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
2256     conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
2257 johnpye 709 conf.env.Append(CCFLAGS=['-Wall'])
2258 johnpye 500
2259 johnpye 968 # Catching SIGINT
2260    
2261 johnpye 1142 if env['WITH_SIGNALS']:
2262 jpye 1655 if not conf.CheckSIGINT():
2263 johnpye 1142 with_signals = False
2264     without_signals_reason = "SIGINT uncatchable"
2265 johnpye 968
2266 johnpye 953 # Catching SIGFPE
2267    
2268     if conf.CheckFPE():
2269 johnpye 968 conf.env['HAVE_C99FPE']=True
2270 johnpye 953 else:
2271 johnpye 968 conf.env['HAVE_C99FPE']=False
2272 johnpye 953
2273 johnpye 968 # Checking for signal reset requirement
2274    
2275 jpye 1654 if conf.CheckSigReset() is False:
2276 johnpye 968 print "Unable to determine if signal reset is required"
2277 johnpye 1260 Exit(1)
2278 johnpye 968
2279 johnpye 502 # YACC
2280    
2281 jpye 1552 if conf.CheckYacc():
2282 johnpye 502 conf.env['HAVE_YACC']=True
2283    
2284 jpye 1552 if conf.CheckLex():
2285 johnpye 1025 conf.env['HAVE_LEX']=True
2286 johnpye 502
2287 johnpye 387 # Tcl/Tk
2288 johnpye 386
2289 johnpye 586 if with_tcltk:
2290     if conf.CheckTcl():
2291     if conf.CheckTclVersion():
2292     if conf.CheckTk():
2293     if with_tcltk and conf.CheckTkVersion():
2294     if env['STATIC_TCLTK']:
2295     if conf.CheckTkTable():
2296     pass
2297     else:
2298     without_tcltk_reason = "TkTable not found"
2299     with_tcltk = False
2300     else:
2301     without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
2302     with_tcltk = False
2303 johnpye 521 else:
2304 johnpye 586 without_tcltk_reason = "Tk not found."
2305 johnpye 551 with_tcltk = False
2306 johnpye 428 else:
2307 johnpye 586 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
2308 johnpye 551 with_tcltk = False
2309 johnpye 586
2310 johnpye 428 else:
2311 johnpye 586 without_tcltk_reason = "Tcl not found."
2312 johnpye 551 with_tcltk = False
2313 johnpye 386
2314 johnpye 521 if env['STATIC_TCLTK']:
2315     conf.CheckX11()
2316    
2317 johnpye 395 # Python... obviously we're already running python, so we just need to
2318     # check that we can link to the python library OK:
2319    
2320 jpye 1655 if not conf.CheckPythonLib():
2321 johnpye 957 without_python_reason = 'libpython2.x not found or not linkable'
2322     with_python = False
2323 johnpye 982 env['WITH_PYTHON']=False
2324 johnpye 391
2325 johnpye 395 # SWIG version
2326    
2327 jpye 1656 if with_python and conf.CheckSwigVersion() is False:
2328 johnpye 413 without_python_reason = 'SWIG >= 1.3.24 is required'
2329     with_python = False
2330 johnpye 982 env['WITH_PYTHON']=False
2331 johnpye 413
2332 johnpye 400 # CUnit
2333    
2334 johnpye 593 if with_cunit:
2335 jpye 1655 if not conf.CheckCUnit():
2336 johnpye 427 without_cunit_reason = 'CUnit not found'
2337 johnpye 665 with_cunit = False
2338 johnpye 705 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
2339 johnpye 427
2340 johnpye 938 # DMALLOC
2341    
2342     if with_dmalloc:
2343 jpye 1655 if not conf.CheckDMalloc():
2344 johnpye 938 without_dmalloc_reason = 'dmalloc not found'
2345     with_dmalloc = False
2346    
2347 jpye 1678 # GRAPHVIZ
2348 johnpye 1109
2349 jpye 1678 if with_graphviz:
2350     if not conf.CheckGraphViz():
2351     without_graphviz_reason = 'graphviz not found'
2352     with_graphviz = False
2353     env['WITH_GRAPHVIZ'] = False
2354 jpye 1721 env['HAVE_GRAPHVIZ_BOOLEAN'] = conf.CheckGraphVizBoolean()
2355 johnpye 1109
2356 jpye 1326 # UFSPARSE
2357    
2358     if with_ufsparse:
2359 jpye 1655 if not conf.CheckUFSparse():
2360 jpye 1678 without_ufsparse_reason = 'ufsparse not found'
2361 jpye 1326 with_ufsparse = False
2362     env['WITH_UFSPARSE'] = False
2363    
2364 johnpye 673 # IDA
2365    
2366 jpye 1734 if with_ida:
2367     if not conf.CheckSUNDIALS():
2368     with_ida = False
2369     without_ida_reason = "SUNDIALS not found, or bad version"
2370     elif not conf.CheckIDA():
2371     with_ida = False
2372     without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
2373 johnpye 673
2374 johnpye 797 # CONOPT
2375 johnpye 783
2376     if not with_conopt:
2377     without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
2378 jpye 1654 elif conf.CheckCONOPT() is False:
2379 jpye 1541 if conf.env.get('CONOPT_LINKED'):
2380     conf.env['CONOPT_LINKED'] = False
2381     # we no longer require CONOPT at buildtime in order to build support for it
2382     #with_conopt = False
2383     #without_conpt_reason = "CONOPT not found"
2384 johnpye 783
2385 jpye 1529 # IPOPT
2386    
2387     if not with_ipopt:
2388     without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
2389 jpye 1657 elif not conf.CheckIPOPT():
2390 jpye 1529 with_ipopt = False
2391     without_ipopt_reason = "IPOPT not found"
2392    
2393 johnpye 427 # BLAS
2394    
2395 johnpye 459 need_blas=False
2396 johnpye 673
2397     if with_lsode:
2398     need_fortran = True
2399 jpye 1641 need_fortran_reasons.append("LSODE")
2400 johnpye 459 need_blas=True
2401 johnpye 673
2402 jpye 2000 if with_ipopt:
2403     need_blas=True
2404    
2405 johnpye 459 if need_blas:
2406     if conf.CheckLib('blas'):
2407     with_local_blas = False
2408     without_local_blas_reason = "Found BLAS installed on system"
2409     else:
2410     with_local_blas = True
2411     need_fortran = True
2412 jpye 1641 need_fortran_reasons.append("BLAS")
2413 johnpye 673 else:
2414     with_local_blas= False;
2415     without_local_blas_reason = "BLAS not required"
2416 johnpye 427
2417     # FORTRAN
2418    
2419     if need_fortran:
2420 jpye 1999 print "NEED FORTRAN"
2421 jpye 2163 # Removed stuff for SCons 0.97 (Ubuntu 8.04) from here -- JP
2422 jpye 1380 detect_fortran = conf.env.Detect(['gfortran','g77'])
2423 johnpye 427 if detect_fortran:
2424 jpye 2163 conf.env.Tool(detect_fortran)
2425     if detect_fortran == 'g77':
2426     print "Setting F2C_LIB to 'g2c' because G77 compiler in use"
2427     conf.env['F2C_LIB'] = 'g2c'
2428     #print "DETECT_FORTRAN =",detect_fortran
2429     #print "NOW, FORTAN =",env['FORTRAN']
2430 johnpye 427 else:
2431 jpye 2163 print "FAILED G77/FORTRAN DETECTION"
2432 johnpye 673 with_lsode=False;
2433 jpye 2163 without_lsode_reason="FORTRAN required but not detected"
2434 jpye 2000 else:
2435     print "FORTRAN WAS NOT FOUND TO BE REQUIRED"
2436 johnpye 629
2437 jpye 1654 if need_fortran and conf.CheckF77() is False:
2438 jpye 1641 print "Failed to build simple test file with your Fortran compiler."
2439     print "Check your compiler is installed and running correctly."
2440     print "You can set your Fortran compiler using the FORTRAN scons option."
2441     print "The fortran compiler is REQUIRED to build:",", ".join(need_fortran_reasons)
2442     print "Perhaps try examining the value of your WITH_SOLVERS option (remove LSODE, etc)."
2443     Exit(1)
2444    
2445 johnpye 464 #else:
2446     # print "FORTRAN not required"
2447 johnpye 400
2448 johnpye 673 # F2C
2449    
2450     if need_fortran:
2451     if platform.system()=="Windows":
2452 jpye 1380 pass
2453     #conf.env.Append(LIBPATH='c:\mingw\lib')
2454 johnpye 673
2455 johnpye 816 # scrollkeeper
2456 johnpye 673
2457 johnpye 816 if with_scrollkeeper:
2458 jpye 1654 if conf.CheckScrollkeeperConfig() is False:
2459 johnpye 816 with_scrollkeeper=False
2460     without_scrollkeeper_reason="unable to detect scrollkeeper-config"
2461    
2462 jpye 1442 # lyx
2463    
2464 jpye 1470 if with_doc_build:
2465 jpye 1769 if not conf.CheckLyx():
2466 jpye 1470 with_doc_build = False
2467 jpye 1769 without_doc_build_reason="unable to locate LyX"
2468 jpye 1442
2469 jpye 1769 with_latex2html = conf.CheckLatex2HTML()
2470 jpye 1442
2471 jpye 1723 if conf.CheckLModern() is False:
2472     with_doc_build = False
2473     without_doc_build_reason="'lmodern' is not available"
2474 jpye 1701
2475 johnpye 385 # TODO: -D_HPUX_SOURCE is needed
2476    
2477 johnpye 393 # TODO: detect if dynamic libraries are possible or not
2478    
2479 johnpye 427 if platform.system()=="Windows" and env.has_key('MSVS'):
2480 johnpye 740 _found_windows_h = conf.CheckHeader('Windows.h')
2481    
2482     if not _found_windows_h:
2483 johnpye 741 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
2484 johnpye 740 Exit(1)
2485 johnpye 741
2486 jpye 1654 if with_python and conf.CheckHeader(['basetsd.h','BaseTsd.h']) is False:
2487 johnpye 427 with_python = 0;
2488     without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
2489    
2490 johnpye 395 conf.Finish()
2491    
2492 jpye 2016 #print "-=-=-=-=-=-=-=-=- LIBS =",env.get('LIBS')
2493 jpye 1941
2494 johnpye 507 #---------------------------------------
2495     # SUBSTITUTION DICTIONARY for .in files
2496    
2497 johnpye 658 release = env.get('RELEASE')
2498     if release=="0.":
2499     release="0"
2500    
2501 johnpye 800 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
2502    
2503 johnpye 507 subst_dict = {
2504     '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
2505 jpye 1519 ,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS']
2506 johnpye 507 , '@GLADE_FILE@':'ascend.glade'
2507     , '@HELP_ROOT@':''
2508     , '@ICON_EXTENSION@':icon_extension
2509 johnpye 628 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
2510 johnpye 507 , '@INSTALL_BIN@':env['INSTALL_BIN']
2511     , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
2512 johnpye 683 , '@INSTALL_LIB@':env['INSTALL_LIB']
2513 johnpye 721 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
2514 jpye 1504 , '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS']
2515 jpye 2016 , '@INSTALL_PYTHON@':env['INSTALL_PYTHON']
2516 johnpye 507 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
2517     , '@VERSION@':version
2518 johnpye 658 , '@RELEASE@':release
2519 johnpye 563 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
2520 jpye 1590 , '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation'
2521 johnpye 1228 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
2522     , '@SHLIBPREFIX@':env['SHLIBPREFIX']
2523 jpye 1597 , '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX']
2524     , '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX']
2525 johnpye 589 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
2526 johnpye 683 , '@PYTHON@' : python_exe
2527 jpye 1466 , '@PYVERSION@' : pyversion
2528 johnpye 1174 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
2529 jpye 1680 , '@WITH_GRAPHVIZ@': str(int(env.get('WITH_GRAPHVIZ')))
2530 jpye 2025 #define ASC_ABSOLUTE_PATHS @ASC_ABSOLUTE_PATHS@
2531     #if ASC_ABSOLUTE_PATHS
2532     # define ASCENDDIST_DEFAULT "@ASCENDDIST_DEFAULT@"
2533 jpye 2029 # define ASCENDTK_DEFAULT "@ASCENDTK_DEFAULT@"
2534 jpye 2025 # define ASCENDLIBRARY_DEFAULT "@ASCENDLIBRARY_DEFAULT@"
2535     # define ASCENDSOLVERS_DEFAULT "@ASCENDSOLVERS_DEFAULT@"
2536     #else
2537     # define ASC_DIST_REL_BIN "@ASC_DIST_REL_BIN@"
2538     # define ASC_TK_REL_DIST "@ASC_TK_REL_DIST@"
2539     # define ASC_LIBRARY_REL_DIST "@ASC_LIBRARY_REL_DIST@"
2540     # define ASC_SOLVERS_REL_DIST "@ASC_SOLVERS_REL_DIST@"
2541     #endif
2542     , '@ASC_ABSOLUTE_PATHS@': str(int(env.get('ABSOLUTE_PATHS')))
2543     , '@ASCENDDIST_DEFAULT@': c_escape(env['INSTALL_PREFIX'])
2544     , '@ASCENDTK_DEFAULT@': c_escape(os.path.abspath(env.subst(env['INSTALL_TK'])))
2545     , '@ASCENDLIBRARY_DEFAULT@': c_escape(os.path.abspath(env.subst(env['DEFAULT_ASCENDLIBRARY'])))
2546     , '@ASCENDSOLVERS_DEFAULT@': c_escape(os.path.abspath(env.subst(env['DEFAULT_ASCENDSOLVERS'])))
2547     , '@ASC_DIST_REL_BIN@' : default_dist_rel_bin
2548     , '@ASC_TK_REL_DIST@' : default_tk_rel_dist
2549     , '@ASC_LIBRARY_REL_DIST@' : default_library_rel_dist
2550     , '@ASC_SOLVERS_REL_DIST@' : default_solvers_rel_dist
2551 jpye 2037 , '@SIZEOF_VOID_P@' : env['SIZEOF_VOID_P']
2552     , '@SIZEOF_INT@' : env['SIZEOF_INT']
2553     , '@SIZEOF_LONG@' : env['SIZEOF_LONG']
2554     , '@SIZEOF_LONG_LONG@' : env['SIZEOF_LONG_LONG']
2555 johnpye 507 }
2556    
2557 jpye 1442 if env.get('WITH_DOC'):
2558     print "WITH_DOC:",env['WITH_DOC']
2559     subst_dict['@HELP_ROOT@']=env['HELP_ROOT']
2560 johnpye 507
2561 johnpye 597 # bool options...
2562 johnpye 673 for k,v in {
2563 jpye 1747 'ASC_WITH_DMALLOC':with_dmalloc
2564 jpye 1326 ,'ASC_WITH_UFSPARSE':with_ufsparse
2565 johnpye 1142 ,'ASC_WITH_MMIO':with_mmio
2566     ,'ASC_SIGNAL_TRAPS':with_signals
2567     ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
2568     ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
2569 johnpye 1261 ,'HAVE_IEEE':env.get('HAVE_IEEE')
2570 johnpye 1142 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
2571     ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
2572     }.iteritems():
2573    
2574     if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
2575 johnpye 594
2576 johnpye 507 if with_python:
2577     subst_dict['@ASCXX_USE_PYTHON@']="1"
2578 johnpye 673 env['WITH_PYTHON']=1;
2579 johnpye 507
2580 jpye 1442 if with_latex2html:
2581     env['WITH_LATEX2HTML']=1
2582    
2583 johnpye 507 if env.has_key('HAVE_GCCVISIBILITY'):
2584     subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
2585    
2586     env.Append(SUBST_DICT=subst_dict)
2587    
2588 johnpye 1142 #for k,v in subst_dict.iteritems():
2589     # print "%-50s%s" % ("'%s'"%k,v)
2590 johnpye 829
2591 johnpye 1142 # REMOVED: long command-line support on Win2k
2592 johnpye 829
2593     #------------------------------------------------------
2594 johnpye 558 # RECIPE: SWIG scanner
2595    
2596     import SCons.Script
2597    
2598     SWIGScanner = SCons.Scanner.ClassicCPP(
2599     "SWIGScan"
2600     , ".i"
2601     , "CPPPATH"
2602     , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
2603     )
2604    
2605     env.Append(SCANNERS=[SWIGScanner])
2606    
2607     #------------------------------------------------------
2608 johnpye 463 # Recipe for 'CHMOD' ACTION
2609 johnpye 439
2610     import SCons
2611     from SCons.Script.SConscript import SConsEnvironment
2612     SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2613     lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2614    
2615     def InstallPerm(env, dest, files, perm):
2616     obj = env.Install(dest, files)
2617     for i in obj:
2618     env.AddPostAction(i, env.Chmod(str(i), perm))
2619 jpye 2007
2620     def InstallPermAs(env, dest, filen, perm):
2621     obj = env.InstallAs(dest, filen)
2622     for i in obj:
2623     env.AddPostAction(i, env.Chmod(str(i), perm))
2624     return dest
2625 johnpye 439
2626     SConsEnvironment.InstallPerm = InstallPerm
2627    
2628     # define wrappers
2629     SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2630 johnpye 578 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2631 johnpye 629 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2632 jpye 2076 SConsEnvironment.InstallSharedAs = lambda env, dest, files: InstallPermAs(env, dest, files, 0644)
2633 jpye 2007 SConsEnvironment.InstallLibraryAs = lambda env, dest, files: InstallPermAs(env, dest, files, 0644)
2634 johnpye 463
2635 johnpye 439 #------------------------------------------------------
2636 johnpye 463 # BUILD...
2637 johnpye 385
2638 jpye 2018 # so that #include <ascend/modulename/headername.h> works across all modules...
2639     env.AppendUnique(CPPPATH=['#'])
2640 johnpye 385
2641 johnpye 508 if env['DEBUG']:
2642 jose 2071 env.Append(
2643     CCFLAGS=['-g']
2644     ,LINKFLAGS=['-g']
2645     )
2646 johnpye 508
2647 johnpye 591 if env['GCOV']:
2648     env.Append(
2649     CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2650     , LIBS=['gcov']
2651     , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2652     )
2653    
2654 johnpye 673 if with_ida:
2655     env.Append(WITH_IDA=1)
2656    
2657 johnpye 783 if with_conopt:
2658     env.Append(WITH_CONOPT=1)
2659    
2660 jpye 1529 if with_ipopt:
2661     env.Append(WITH_IPOPT=1)
2662    
2663 jpye 1734 if with_dopri5:
2664     env.Append(WITH_DOPRI5=1)
2665    
2666 jpye 1719 if with_graphviz and env.get('GRAPHVIZ_RPATH'):
2667 jpye 1718 env.Append(RPATH=env['GRAPHVIZ_RPATH'])
2668    
2669 johnpye 463 #-------------
2670     # TCL/TK GUI
2671 johnpye 385
2672 johnpye 551 if with_tcltk:
2673 jpye 2024 env.SConscript(['tcltk/SConscript'],'env')
2674 johnpye 391 else:
2675 johnpye