/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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