/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1657 - (hide annotations) (download)
Thu Nov 29 12:12:05 2007 UTC (12 years, 1 month ago) by jpye
File size: 61227 byte(s)
changed conf.CheckIPOPT
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     return is_ok
1842    
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     if conf.CheckDLOpen() is False:
1989     print "Did not find functioning dlopen/LoadLibrary, exiting!"
1990     Exit(1)
1991    
1992 johnpye 385 # Where is 'isnan'?
1993    
1994 jpye 1654 if conf.CheckFunc('isnan') is False and conf.CheckFunc('_isnan') is False:
1995 johnpye 385 print "Didn't find isnan"
1996 johnpye 414 # Exit(1)
1997 johnpye 385
1998 johnpye 500 # GCC visibility
1999    
2000 johnpye 502 if conf.CheckGcc():
2001     conf.env['HAVE_GCC']=True;
2002 johnpye 526 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
2003 johnpye 509 conf.env['HAVE_GCCVISIBILITY']=True;
2004     conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
2005     conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
2006 johnpye 709 conf.env.Append(CCFLAGS=['-Wall'])
2007 johnpye 500
2008 johnpye 968 # Catching SIGINT
2009    
2010 johnpye 1142 if env['WITH_SIGNALS']:
2011 jpye 1655 if not conf.CheckSIGINT():
2012 johnpye 1142 with_signals = False
2013     without_signals_reason = "SIGINT uncatchable"
2014 johnpye 968
2015 johnpye 953 # Catching SIGFPE
2016    
2017     if conf.CheckFPE():
2018 johnpye 968 conf.env['HAVE_C99FPE']=True
2019 johnpye 953 else:
2020 johnpye 968 conf.env['HAVE_C99FPE']=False
2021 johnpye 953
2022 johnpye 968 # Checking for signal reset requirement
2023    
2024 jpye 1654 if conf.CheckSigReset() is False:
2025 johnpye 968 print "Unable to determine if signal reset is required"
2026 johnpye 1260 Exit(1)
2027 johnpye 968
2028 johnpye 502 # YACC
2029    
2030 jpye 1552 if conf.CheckYacc():
2031 johnpye 502 conf.env['HAVE_YACC']=True
2032    
2033 jpye 1552 if conf.CheckLex():
2034 johnpye 1025 conf.env['HAVE_LEX']=True
2035 johnpye 502
2036 johnpye 387 # Tcl/Tk
2037 johnpye 386
2038 johnpye 586 if with_tcltk:
2039     if conf.CheckTcl():
2040     if conf.CheckTclVersion():
2041     if conf.CheckTk():
2042     if with_tcltk and conf.CheckTkVersion():
2043     if env['STATIC_TCLTK']:
2044     if conf.CheckTkTable():
2045     pass
2046     else:
2047     without_tcltk_reason = "TkTable not found"
2048     with_tcltk = False
2049     else:
2050     without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
2051     with_tcltk = False
2052 johnpye 521 else:
2053 johnpye 586 without_tcltk_reason = "Tk not found."
2054 johnpye 551 with_tcltk = False
2055 johnpye 428 else:
2056 johnpye 586 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
2057 johnpye 551 with_tcltk = False
2058 johnpye 586
2059 johnpye 428 else:
2060 johnpye 586 without_tcltk_reason = "Tcl not found."
2061 johnpye 551 with_tcltk = False
2062 johnpye 386
2063 johnpye 521 if env['STATIC_TCLTK']:
2064     conf.CheckX11()
2065    
2066 johnpye 395 # Python... obviously we're already running python, so we just need to
2067     # check that we can link to the python library OK:
2068    
2069 jpye 1655 if not conf.CheckPythonLib():
2070 johnpye 957 without_python_reason = 'libpython2.x not found or not linkable'
2071     with_python = False
2072 johnpye 982 env['WITH_PYTHON']=False
2073 johnpye 391
2074 johnpye 395 # SWIG version
2075    
2076 jpye 1656 if with_python and conf.CheckSwigVersion() is False:
2077 johnpye 413 without_python_reason = 'SWIG >= 1.3.24 is required'
2078     with_python = False
2079 johnpye 982 env['WITH_PYTHON']=False
2080 johnpye 413
2081 johnpye 400 # CUnit
2082    
2083 johnpye 593 if with_cunit:
2084 jpye 1655 if not conf.CheckCUnit():
2085 johnpye 427 without_cunit_reason = 'CUnit not found'
2086 johnpye 665 with_cunit = False
2087 johnpye 705 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
2088 johnpye 427
2089 johnpye 938 # DMALLOC
2090    
2091     if with_dmalloc:
2092 jpye 1655 if not conf.CheckDMalloc():
2093 johnpye 938 without_dmalloc_reason = 'dmalloc not found'
2094     with_dmalloc = False
2095    
2096 jpye 1326 # MFGRAPH
2097 johnpye 1109
2098     if with_mfgraph:
2099 jpye 1655 if not conf.CheckMFGraph():
2100 johnpye 1109 without_mfgraph_reason = 'mfgraph not found'
2101 johnpye 1113 with_mfgraph = False
2102 johnpye 1114 env['WITH_MFGRAPH'] = False
2103 johnpye 1109
2104 jpye 1326 # UFSPARSE
2105    
2106     if with_ufsparse:
2107 jpye 1655 if not conf.CheckUFSparse():
2108 jpye 1326 without_ufsparse_reason = 'mfgraph not found'
2109     with_ufsparse = False
2110     env['WITH_UFSPARSE'] = False
2111    
2112 johnpye 673 # IDA
2113    
2114     if not with_ida:
2115     without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
2116 jpye 1655 elif not conf.CheckSUNDIALS():
2117 jpye 1400 with_ida = False
2118     without_ida_reason = "SUNDIALS not found, or bad version"
2119 jpye 1655 elif not conf.CheckIDA():
2120 johnpye 673 with_ida = False
2121 jpye 1400 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
2122 johnpye 673
2123 johnpye 797 # CONOPT
2124 johnpye 783
2125     if not with_conopt:
2126     without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
2127 jpye 1654 elif conf.CheckCONOPT() is False:
2128 jpye 1541 if conf.env.get('CONOPT_LINKED'):
2129     conf.env['CONOPT_LINKED'] = False
2130     # we no longer require CONOPT at buildtime in order to build support for it
2131     #with_conopt = False
2132     #without_conpt_reason = "CONOPT not found"
2133 johnpye 783
2134 jpye 1529 # IPOPT
2135    
2136     if not with_ipopt:
2137     without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
2138 jpye 1657 elif not conf.CheckIPOPT():
2139 jpye 1529 with_ipopt = False
2140     without_ipopt_reason = "IPOPT not found"
2141    
2142 johnpye 427 # BLAS
2143    
2144 johnpye 459 need_blas=False
2145 johnpye 673
2146     if with_lsode:
2147     need_fortran = True
2148 jpye 1641 need_fortran_reasons.append("LSODE")
2149 johnpye 459 need_blas=True
2150 johnpye 673
2151 johnpye 459 if need_blas:
2152     if conf.CheckLib('blas'):
2153     with_local_blas = False
2154     without_local_blas_reason = "Found BLAS installed on system"
2155     else:
2156     with_local_blas = True
2157     need_fortran = True
2158 jpye 1641 need_fortran_reasons.append("BLAS")
2159 johnpye 673 else:
2160     with_local_blas= False;
2161     without_local_blas_reason = "BLAS not required"
2162 johnpye 427
2163     # FORTRAN
2164    
2165     if need_fortran:
2166 johnpye 629 conf.env.Tool('fortran')
2167 jpye 1380 detect_fortran = conf.env.Detect(['gfortran','g77'])
2168 johnpye 427 if detect_fortran:
2169     # For some reason, g77 doesn't get detected properly on MinGW
2170 johnpye 673 if not env.has_key('F77') and not env.has_key('FORTRAN'):
2171 jpye 1357 print "Fixing detection of F77 on MinGW...(?)"
2172 johnpye 427 conf.env.Replace(F77=detect_fortran)
2173     conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
2174     conf.env.Replace(F77FLAGS='')
2175 johnpye 428 #print "F77:",conf.env['F77']
2176     #print "F77COM:",conf.env['F77COM']
2177     #print "F77FLAGS:",conf.env['F77FLAGS']
2178 johnpye 427 fortran_builder = Builder(
2179     action='$F77COM'
2180     , suffix='.o'
2181     , src_suffix='.f'
2182     )
2183     conf.env.Append(BUILDERS={'Fortran':fortran_builder})
2184 johnpye 1284 if platform.system()=="Linux":
2185     conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
2186 johnpye 427 else:
2187 johnpye 673 with_lsode=False;
2188     without_lsode_reason="FORTRAN-77 required but not found"
2189 johnpye 629
2190 jpye 1654 if need_fortran and conf.CheckF77() is False:
2191 jpye 1641 print "Failed to build simple test file with your Fortran compiler."
2192     print "Check your compiler is installed and running correctly."
2193     print "You can set your Fortran compiler using the FORTRAN scons option."
2194     print "The fortran compiler is REQUIRED to build:",", ".join(need_fortran_reasons)
2195     print "Perhaps try examining the value of your WITH_SOLVERS option (remove LSODE, etc)."
2196     Exit(1)
2197    
2198 johnpye 464 #else:
2199     # print "FORTRAN not required"
2200 johnpye 400
2201 johnpye 673 # F2C
2202    
2203     if need_fortran:
2204     if platform.system()=="Windows":
2205 jpye 1380 pass
2206     #conf.env.Append(LIBPATH='c:\mingw\lib')
2207 johnpye 673
2208 johnpye 816 # scrollkeeper
2209 johnpye 673
2210 johnpye 816 if with_scrollkeeper:
2211 jpye 1654 if conf.CheckScrollkeeperConfig() is False:
2212 johnpye 816 with_scrollkeeper=False
2213     without_scrollkeeper_reason="unable to detect scrollkeeper-config"
2214    
2215 jpye 1442 # lyx
2216    
2217 jpye 1470 if with_doc_build:
2218 jpye 1654 if conf.CheckLyx() is False:
2219 jpye 1470 with_doc_build = False
2220     without_doc_build_reason="unable to locate lyx"
2221 jpye 1442
2222     with_latext2html = conf.CheckLatex2HTML()
2223    
2224 johnpye 385 # TODO: -D_HPUX_SOURCE is needed
2225    
2226     # TODO: check size of void*
2227    
2228 johnpye 393 # TODO: detect if dynamic libraries are possible or not
2229    
2230 johnpye 427 if platform.system()=="Windows" and env.has_key('MSVS'):
2231 johnpye 740 _found_windows_h = conf.CheckHeader('Windows.h')
2232    
2233     if not _found_windows_h:
2234 johnpye 741 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
2235 johnpye 740 Exit(1)
2236 johnpye 741
2237 jpye 1654 if with_python and conf.CheckHeader(['basetsd.h','BaseTsd.h']) is False:
2238 johnpye 427 with_python = 0;
2239     without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
2240    
2241 johnpye 395 conf.Finish()
2242    
2243 johnpye 507 #---------------------------------------
2244     # SUBSTITUTION DICTIONARY for .in files
2245    
2246 johnpye 658 release = env.get('RELEASE')
2247     if release=="0.":
2248     release="0"
2249    
2250 johnpye 800 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
2251    
2252 johnpye 507 subst_dict = {
2253     '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
2254 jpye 1519 ,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS']
2255 johnpye 507 , '@GLADE_FILE@':'ascend.glade'
2256     , '@HELP_ROOT@':''
2257     , '@ICON_EXTENSION@':icon_extension
2258 johnpye 628 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
2259 johnpye 507 , '@INSTALL_BIN@':env['INSTALL_BIN']
2260     , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
2261 johnpye 683 , '@INSTALL_LIB@':env['INSTALL_LIB']
2262 johnpye 721 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
2263 jpye 1504 , '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS']
2264 johnpye 507 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
2265     , '@VERSION@':version
2266 johnpye 658 , '@RELEASE@':release
2267 johnpye 563 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
2268 jpye 1590 , '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation'
2269 johnpye 1228 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
2270     , '@SHLIBPREFIX@':env['SHLIBPREFIX']
2271 jpye 1597 , '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX']
2272     , '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX']
2273 johnpye 589 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
2274 johnpye 627 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
2275 johnpye 683 , '@PYTHON@' : python_exe
2276 jpye 1466 , '@PYVERSION@' : pyversion
2277 johnpye 800 , '@ASC_CONOPT_LIB@':env.get('CONOPT_LIB')
2278     , '@ASC_CONOPT_ENVVAR@':env.get('CONOPT_ENVVAR')
2279 jpye 1399 , '@ASC_CONOPT_DLPATH@':c_escape(env.subst("$CONOPT_DLPATH"))
2280 johnpye 1174 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
2281 jpye 1535 , '@WITH_SOLVERS@':",".join(env.get('WITH_SOLVERS'))
2282 johnpye 507 }
2283    
2284 jpye 1442 if env.get('WITH_DOC'):
2285     print "WITH_DOC:",env['WITH_DOC']
2286     subst_dict['@HELP_ROOT@']=env['HELP_ROOT']
2287 johnpye 507
2288 johnpye 597 # bool options...
2289 johnpye 673 for k,v in {
2290 johnpye 1142 'ASC_WITH_IDA':with_ida
2291     ,'ASC_WITH_DMALLOC':with_dmalloc
2292     ,'ASC_WITH_MFGRAPH':with_mfgraph
2293 jpye 1326 ,'ASC_WITH_UFSPARSE':with_ufsparse
2294 johnpye 1142 ,'ASC_WITH_CONOPT':with_conopt
2295 jpye 1541 ,'ASC_LINKED_CONOPT':env.get('CONOPT_LINKED')
2296 jpye 1529 ,'ASC_WITH_IPOPT':with_ipopt
2297 johnpye 1142 ,'ASC_WITH_LSODE':with_lsode
2298     ,'ASC_WITH_MMIO':with_mmio
2299     ,'ASC_SIGNAL_TRAPS':with_signals
2300     ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
2301     ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
2302 johnpye 1261 ,'HAVE_IEEE':env.get('HAVE_IEEE')
2303 jpye 1412 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
2304 johnpye 1142 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
2305     ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
2306     }.iteritems():
2307    
2308     if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
2309 johnpye 594
2310 johnpye 507 if with_python:
2311     subst_dict['@ASCXX_USE_PYTHON@']="1"
2312 johnpye 673 env['WITH_PYTHON']=1;
2313 johnpye 507
2314 jpye 1442 if with_latex2html:
2315     env['WITH_LATEX2HTML']=1
2316    
2317 johnpye 507 if env.has_key('HAVE_GCCVISIBILITY'):
2318     subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
2319    
2320     env.Append(SUBST_DICT=subst_dict)
2321    
2322 johnpye 1142 #for k,v in subst_dict.iteritems():
2323     # print "%-50s%s" % ("'%s'"%k,v)
2324 johnpye 829
2325 johnpye 1142 # REMOVED: long command-line support on Win2k
2326 johnpye 829
2327     #------------------------------------------------------
2328 johnpye 558 # RECIPE: SWIG scanner
2329    
2330     import SCons.Script
2331    
2332     SWIGScanner = SCons.Scanner.ClassicCPP(
2333     "SWIGScan"
2334     , ".i"
2335     , "CPPPATH"
2336     , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
2337     )
2338    
2339     env.Append(SCANNERS=[SWIGScanner])
2340    
2341     #------------------------------------------------------
2342 johnpye 463 # Recipe for 'CHMOD' ACTION
2343 johnpye 439
2344     import SCons
2345     from SCons.Script.SConscript import SConsEnvironment
2346     SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2347     lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2348    
2349     def InstallPerm(env, dest, files, perm):
2350     obj = env.Install(dest, files)
2351     for i in obj:
2352     env.AddPostAction(i, env.Chmod(str(i), perm))
2353    
2354     SConsEnvironment.InstallPerm = InstallPerm
2355    
2356     # define wrappers
2357     SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2358 johnpye 578 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2359 johnpye 629 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2360 johnpye 463
2361 johnpye 439 #------------------------------------------------------
2362 johnpye 463 # BUILD...
2363 johnpye 385
2364 johnpye 463 # so that #include <modulename/headername.h> works across all modules...
2365 johnpye 743 env.AppendUnique(CPPPATH=['#base/generic'])
2366 johnpye 385
2367 johnpye 508 if env['DEBUG']:
2368     env.Append(CCFLAGS=['-g'])
2369 jpye 1554 env.Append(LINKFLAGS=['-g'])
2370 johnpye 508
2371 johnpye 591 if env['GCOV']:
2372     env.Append(
2373     CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2374     , LIBS=['gcov']
2375     , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2376     )
2377    
2378 johnpye 673 if with_ida:
2379     env.Append(WITH_IDA=1)
2380    
2381 johnpye 783 if with_conopt:
2382     env.Append(WITH_CONOPT=1)
2383    
2384 jpye 1529 if with_ipopt:
2385     env.Append(WITH_IPOPT=1)
2386    
2387 johnpye 463 #-------------
2388     # TCL/TK GUI
2389 johnpye 385
2390 johnpye 551 if with_tcltk:
2391 johnpye 569 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2392 johnpye 391 else:
2393 johnpye 982 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2394 johnpye 386
2395 johnpye 463 #-------------
2396     # PYTHON INTERFACE
2397    
2398 johnpye 387 if with_python:
2399 johnpye 532 env.SConscript(['pygtk/SConscript'],'env')
2400 johnpye 391 else:
2401 johnpye 982 print "Skipping... Python bindings aren't being built:",without_python_reason
2402 johnpye 400
2403 johnpye 463 #------------
2404     # BASE/GENERIC SUBDIRECTORIES
2405    
2406 johnpye 673 libascend_env = env.Copy()
2407    
2408 johnpye 1316 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2409 johnpye 463
2410     srcs = []
2411     for d in dirs:
2412 johnpye 673 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2413 johnpye 463 srcs += heresrcs
2414    
2415     #-------------
2416 johnpye 673 # IMPORTED CODE: LSODE, BLAS, etc
2417    
2418 jpye 1509 #if with_lsode:
2419     # srcs += env.SConscript(['lsod/SConscript'],'env')
2420     # srcs += env.SConscript(['linpack/SConscript'],'env')
2421     #else:
2422     # print "Skipping... LSODE won't be built:", without_lsode_reason
2423 johnpye 673
2424     if with_local_blas:
2425 jpye 1515 env['blasobjs'] = env.SConscript(['blas/SConscript'],'env')
2426 johnpye 673 else:
2427 jpye 1515 env['blasobjs'] = []
2428 johnpye 673 print "Skipping... BLAS won't be built:", without_local_blas_reason
2429    
2430     if not with_ida:
2431     print "Skipping... IDA won't be built:", without_ida_reason
2432    
2433 johnpye 993 if with_mmio:
2434     srcs += env.SConscript(['mmio/SConscript'],'env')
2435     else:
2436     print "Skipping... MMIO export won't be built:", without_mmio_reason
2437 johnpye 673 #-------------
2438 johnpye 463 # LIBASCEND -- all base/generic functionality
2439    
2440 johnpye 938 if with_dmalloc:
2441     libascend_env.Append(LIBS=['dmalloc'])
2442    
2443 jpye 1326 if with_ufsparse:
2444     libascend_env.Append(LIBS=['cxsparse'])
2445    
2446 johnpye 673 libascend = libascend_env.SharedLibrary('ascend',srcs)
2447 johnpye 463
2448 jpye 1510 # for use in declaring dependent shared libraries in SConscript files (eg solvers/*/SConscript)
2449     env['libascend'] = libascend
2450    
2451 johnpye 673 env.Alias('libascend',libascend)
2452    
2453 johnpye 463 #-------------
2454 johnpye 761 # UNIT TESTS (C CODE)
2455 johnpye 463
2456 johnpye 593 if with_cunit:
2457 jpye 1638 testdirs = ['general','solver','utilities','linear','compiler']
2458 johnpye 593 testsrcs = []
2459 johnpye 400 for testdir in testdirs:
2460     path = 'base/generic/'+testdir+'/test/'
2461     env.SConscript([path+'SConscript'],'env')
2462 johnpye 593 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2463    
2464     #print "TESTSRCS =",testsrcs
2465    
2466 johnpye 400 env.SConscript(['test/SConscript'],'env')
2467     env.SConscript(['base/generic/test/SConscript'],'env')
2468 johnpye 593
2469     env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2470 johnpye 400
2471     else:
2472 johnpye 427 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2473 johnpye 400
2474 johnpye 761 #-------------
2475 jpye 1504 # EXTERNAL SOLVERS
2476    
2477     env['extfns']=[]
2478    
2479 jpye 1505 env.SConscript(['solvers/SConscript'],'env')
2480 jpye 1504
2481     #-------------
2482 johnpye 761 # EXTERNAL FUNCTIONS
2483    
2484 johnpye 811 modeldirs = env.SConscript(['models/SConscript'],'env')
2485    
2486     if not with_extfns:
2487 johnpye 761 print "Skipping... External modules aren't being built:",without_extfns_reason
2488    
2489 johnpye 811 env.Alias('extfns',env['extfns'])
2490 johnpye 761
2491 johnpye 463 #------------------------------------------------------
2492 johnpye 683 # CREATE ASCEND-CONFIG scriptlet
2493    
2494     ascendconfig = env.SubstInFile('ascend-config.in')
2495    
2496 jpye 1625
2497 johnpye 683 #------------------------------------------------------
2498 jpye 1625 # CREATE asc4dev scriptlet
2499    
2500     asc4devcmd = env.SubstInFile('tcltk/asc4dev.in')
2501     env.AddPostAction(asc4devcmd, 'chmod 755 $TARGET')
2502     #------------------------------------------------------
2503 johnpye 463 # INSTALLATION
2504 johnpye 427
2505 johnpye 552 if env.get('CAN_INSTALL'):
2506 johnpye 427
2507 jpye 1442 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE','INSTALL_DOC']
2508 jpye 1436 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2509 jpye 1505 install_dirs += modeldirs + [Dir(env.subst("$INSTALL_ROOT$INSTALL_SOLVERS"))]
2510 johnpye 449
2511 johnpye 463 # TODO: add install options
2512     env.Alias('install',install_dirs)
2513 johnpye 400
2514 jpye 1436 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2515 johnpye 435
2516 jpye 1436 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2517 johnpye 683
2518 johnpye 438 #------------------------------------------------------
2519 johnpye 631 # WINDOWS INSTALLER
2520    
2521 jpye 1551 if not env.get('NSIS'):
2522     with_installer = False
2523     without_installer_reason = "NSIS not found"
2524    
2525 johnpye 631 if with_installer:
2526 jpye 1467 env.Append(NSISDEFINES={
2527     'OUTFILE':"#dist/"+env['WIN_INSTALLER_NAME']
2528     ,"VERSION":version
2529     ,'PYVERSION':pyversion
2530     })
2531 jpye 1570 installer = env.Installer('nsis/installer.nsi')
2532 jpye 1465 Depends(installer,["pygtk","tcltk","ascend.dll","models","ascend-config"])
2533     env.Alias('installer',installer)
2534 johnpye 631 else:
2535     print "Skipping... Windows installer isn't being built:",without_installer_reason
2536    
2537 jpye 1465
2538 johnpye 631 #------------------------------------------------------
2539 johnpye 673 # PROJECT FILE for MSVC
2540    
2541     env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2542    
2543     #------------------------------------------------------
2544 johnpye 438 # CREATE the SPEC file for generation of RPM packages
2545    
2546 johnpye 463 if platform.system()=="Linux":
2547     env.SubstInFile('ascend.spec.in')
2548 johnpye 552
2549     #------------------------------------------------------
2550 johnpye 816 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2551    
2552 jpye 1442 #if with_scrollkeeper:
2553     # #env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2554     # #env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2555 johnpye 816
2556     #------------------------------------------------------
2557 johnpye 552 # DISTRIBUTION TAR FILE
2558    
2559 johnpye 554 env['DISTTAR_FORMAT']='bz2'
2560 johnpye 556 env.Append(
2561 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']
2562 jpye 1417 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2563 johnpye 556 )
2564 johnpye 554
2565 johnpye 563 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2566 johnpye 556 , [env.Dir('#')]
2567 johnpye 554 )
2568    
2569 johnpye 680 env.Depends(tar,'ascend.spec')
2570 jpye 1442 env.Depends(tar,'#doc/book.pdf')
2571 johnpye 680
2572 jpye 1596 #------------------------------------------------------
2573 jpye 1622 # DISTRIBUTION TAR FILE (new style with AccumulateBuilder)
2574    
2575     # ...
2576    
2577     #------------------------------------------------------
2578 jpye 1596 # DEBIAN TARBALL for use with Build Service
2579 johnpye 862
2580 jpye 1596 import glob
2581     deb_manfiles = glob.glob('debian/*.man')
2582    
2583     deb_tar = env.Tar(
2584     'dist/debian.tar.gz'
2585 jpye 1609 ,deb_manfiles + ['debian/compat','debian/copyright','debian/dirs'
2586     ,'debian/postinst','debian/postrm']
2587 jpye 1596 ,TARFLAGS = ['cz']
2588     )
2589    
2590     Alias('dist',[tar,deb_tar])
2591    
2592 johnpye 554 #------------------------------------------------------
2593 jpye 1551 # DOCUMENTATION
2594 johnpye 816
2595    
2596 jpye 1551 if not with_doc_build:
2597     print "Skipping... Documentation isn't being built:",without_doc_build_reason
2598 jpye 1442
2599 jpye 1551 #user's manual
2600     env.SConscript('doc/SConscript',['env'])
2601 johnpye 766
2602 jpye 1551 # doxygen documentation
2603 johnpye 766 env.SConscript('base/doc/SConscript',['env'])
2604    
2605     #------------------------------------------------------
2606 johnpye 554 # RPM BUILD
2607    
2608 johnpye 766 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2609     # (check * for the version number used to create the tarball)
2610 johnpye 554
2611     #------------------------------------------------------
2612     # DEFAULT TARGETS
2613    
2614 jpye 1504 default_targets =['libascend','solvers']
2615 johnpye 629 if with_tcltk:
2616     default_targets.append('tcltk')
2617     if with_python:
2618     default_targets.append('pygtk')
2619 johnpye 631 if with_installer:
2620     default_targets.append('installer')
2621 johnpye 761 if with_extfns:
2622     default_targets.append('extfns')
2623 jpye 1443 if with_doc_build:
2624 jpye 1442 default_targets.append('doc')
2625 johnpye 554
2626 johnpye 629 env.Default(default_targets)
2627    
2628     print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2629    
2630 johnpye 705 # vim: set syntax=python:

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