/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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