/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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