/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1678 - (hide annotations) (download)
Wed Dec 19 00:29:48 2007 UTC (11 years, 11 months ago) by jpye
File size: 61534 byte(s)
Removed references to MFGRAPH, seems better to use GraphViz directly.
Added configuration test for GraphViz.
Added configuration test for strdup, fixed mmio to not create its own strdup if other form is available already.

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 jpye 1678 'GRAPHVIZ_PREFIX'
637     ,"Where are your GRAPHVIZ files?"
638 johnpye 1109 ,default_prefix
639     ))
640    
641     opts.Add(PackageOption(
642 jpye 1678 'GRAPHVIZ_CPPPATH'
643     ,"Where are your GRAPHVIZ include files?"
644 johnpye 1109 ,default_cpppath
645     ))
646    
647     opts.Add(PackageOption(
648 jpye 1678 'GRAPHVIZ_LIBPATH'
649     ,"Where are your GRAPHVIZ libraries?"
650 johnpye 1109 ,default_libpath
651     ))
652    
653 jpye 1678 opts.Add(
654     'GRAPHVIZ_LIBS'
655     ,"What are your GRAPHVIZ libraries named?"
656     ,['gvc','graph','cdt']
657     )
658    
659 johnpye 1109 opts.Add(BoolOption(
660 jpye 1678 'WITH_GRAPHVIZ'
661     ,"Link to the GRAPHVIZ library (if available, for generating incidence graphs)"
662 johnpye 1109 ,True
663     ))
664    
665 jpye 1326
666     #------ ufsparse --------
667     opts.Add(PackageOption(
668     'UFSPARSE_PREFIX'
669     ,"Where are your UFSPARSE files?"
670     ,default_prefix
671     ))
672    
673     opts.Add(PackageOption(
674     'UFSPARSE_CPPPATH'
675     ,"Where are your UFSPARSE include files?"
676     ,default_cpppath
677     ))
678    
679     opts.Add(PackageOption(
680     'UFSPARSE_LIBPATH'
681     ,"Where are your UFSPARSE libraries?"
682     ,default_libpath
683     ))
684    
685     opts.Add(BoolOption(
686     'WITH_UFSPARSE'
687     ,"Link to the UFSPARSE library (if available, for additional sparse matrix routines)"
688     ,True
689     ))
690    
691 johnpye 938 #-----------------------
692    
693 jpye 1557 opts.Add(BoolOption(
694     'UPDATE_NO_YACC_LEX'
695     ,"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)"
696     ,False
697     ))
698    
699 johnpye 563 opts.Add(
700     'DISTTAR_NAME'
701     ,"Stem name of the tarball created by 'scons dist'. So for 'ascend-aaa.tar.bz2', set this to 'ascend-aaa'."
702     ,"ascend-"+version
703     )
704    
705 johnpye 656 opts.Add(
706     'RELEASE'
707     ,"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."
708     ,"0"
709     )
710    
711 johnpye 605 opts.Add(BoolOption(
712 johnpye 628 'ABSOLUTE_PATHS'
713 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."
714 johnpye 628 ,default_absolute_paths
715 johnpye 605 ))
716    
717 johnpye 578 opts.Add(
718     'WIN_INSTALLER_NAME'
719     ,"Name of the installer .exe to create under Windows (minus the '.exe')"
720 jpye 1467 ,"ascend-"+version+"-py"+pyversion+".exe"
721 johnpye 578 )
722    
723 johnpye 594 opts.Add(BoolOption(
724     'WITH_XTERM_COLORS'
725     ,"Set to 0 if you don't want xterm colour codes in the console output"
726     ,True
727     ))
728    
729 johnpye 761 opts.Add(BoolOption(
730     'WITH_EXTFNS'
731 jpye 1504 ,"Set to 0 if you don't want to attempt to build the external modules bundled with ASCEND"
732 johnpye 761 ,True
733     ))
734    
735 johnpye 816 opts.Add(BoolOption(
736     'WITH_SCROLLKEEPER'
737     ,"Set to to 1 if you want to install an OMF file that can be read by scrollkeeper (eg Yelp on GNOME)"
738     ,default_with_scrollkeeper
739     ))
740    
741 jpye 1557
742 johnpye 546 if platform.system()!="Windows":
743     opts.Add(BoolOption(
744     'WITH_GCCVISIBILITY'
745     , 'Whether to use GCC Visibility extensions when building with GCC 4.0'
746     , True
747     ))
748    
749 johnpye 832
750    
751 johnpye 392 # TODO: OTHER OPTIONS?
752     # TODO: flags for optimisation
753 johnpye 393 # TODO: turning on/off bintoken functionality
754 johnpye 427 # TODO: Where will the 'Makefile.bt' file be installed?
755 johnpye 393
756 johnpye 498 # Import the outside environment
757    
758 johnpye 800 def c_escape(str):
759     return re.sub("\\\\","/",str)
760    
761     envadditional={}
762 johnpye 740
763 jpye 1630 tools = [
764 jpye 1645 'lex', 'yacc', 'fortran', 'swig', 'nsis', 'substinfile'
765 jpye 1630 ,'disttar', 'tar'
766     ]
767 johnpye 832 if platform.system()=="Windows":
768 johnpye 1078 if os.environ.get('OSTYPE')=='msys' or os.environ.get('MSYSTEM'):
769 johnpye 832 envenv = os.environ;
770 jpye 1459 tools += ['mingw']
771 johnpye 922 #TODO removed 'doxygen' for SCons 0.96.93
772 johnpye 832 envadditional['IS_MINGW']=True
773     else:
774 johnpye 1082 print "Assuming VC++ build environment (Note: MinGW is preferred)"
775 johnpye 832 envenv = {
776     'PATH':os.environ['PATH']
777     ,'INCLUDE':os.environ['INCLUDE']
778     ,'LIB':os.environ['LIB']
779     ,'MSVS_IGNORE_IDE_PATHS':1
780     }
781 jpye 1459 tools += ['default']
782 johnpye 922 #TODO removed 'doxygen' for SCons 0.96.93
783 johnpye 832 envadditional['CPPDEFINES']=['_CRT_SECURE_NO_DEPRECATE']
784 johnpye 498 else:
785 johnpye 832 if os.environ.get('TARGET')=='mingw':
786     envenv = os.environ
787 jpye 1459 tools += ['crossmingw']
788 jpye 1420 envadditional['CPPPATH']=['/usr/lib/gcc/i586-mingw32msvc/3.4.5/include','/usr/include']
789     envadditional['LIBS']=['gcc']
790 johnpye 832 else:
791     envenv = os.environ
792 jpye 1459 tools += ['default']
793 johnpye 922 #TODO removed 'doxygen' for SCons 0.96.93
794 johnpye 800
795 johnpye 832
796 johnpye 800 env = Environment(
797     ENV=envenv
798     , toolpath=['scons']
799     , tools=tools
800     , **envadditional
801     )
802 johnpye 498
803 jpye 1420 #print "PATH =",os.environ['PATH']
804     #print "PROGSUFFIX =",env['PROGSUFFIX']
805     #print "CPPPATH =",env['CPPPATH']
806 jpye 1380
807 johnpye 385 opts.Update(env)
808 jpye 1520
809     if 'LSOD' in env['WITH_SOLVERS']:
810     if 'LSODE' not in env['WITH_SOLVERS']:
811     env['WITH_SOLVERS'].append('LSODE')
812     env['WITH_SOLVERS'].remove('LSOD')
813    
814 johnpye 385 opts.Save('options.cache',env)
815    
816     Help(opts.GenerateHelpText(env))
817    
818 johnpye 551 with_tcltk = env.get('WITH_TCLTK')
819 johnpye 427 without_tcltk_reason = "disabled by options/config.py"
820 johnpye 386
821 johnpye 551 with_python = env.get('WITH_PYTHON')
822 johnpye 427 without_python_reason = "disabled by options/config.py"
823 johnpye 387
824 johnpye 593 with_cunit = env.get('WITH_CUNIT')
825 johnpye 427 without_cunit_reason = "not requested"
826 johnpye 400
827 johnpye 761 with_extfns = env.get('WITH_EXTFNS')
828     without_extfn_reason = "disabled by options/config.py"
829    
830 johnpye 816 with_scrollkeeper = env.get('WITH_SCROLLKEEPER')
831     without_scrollkeeper_reason = "disabled by options/config.py"
832    
833 johnpye 938 with_dmalloc = env.get('WITH_DMALLOC')
834     without_dmalloc_reason = "disabled by options/config.py"
835    
836 jpye 1678 with_graphviz = env.get('WITH_GRAPHVIZ')
837     without_graphiviz_reason = "disabled by options/config.py"
838 johnpye 1109
839 jpye 1326 with_ufsparse = env.get('WITH_UFSPARSE')
840     without_ufsparse_reason = "disabled by options/config.py"
841    
842 johnpye 993 with_mmio = env.get('WITH_MMIO')
843     without_mmio_reason = "disabled by options/config.py"
844    
845 johnpye 1142 with_signals = env.get('WITH_SIGNALS')
846     without_signals_reason = "disabled by options/config.py"
847    
848 jpye 1442 with_doc = env.get('WITH_DOC')
849    
850 jpye 1443 with_doc_build = env.get('WITH_DOC_BUILD');
851 jpye 1470 without_doc_build_reason = "disabled by options/config.py"
852 jpye 1443 if not with_doc:
853 jpye 1470 with_doc_build = False
854     without_doc_build_reason = "disabled by with_doc"
855 jpye 1443
856 jpye 1442 with_latex2html = False
857    
858 johnpye 631 if platform.system()=="Windows":
859     with_installer=1
860     else:
861     with_installer=0
862     without_installer_reason = "only possible under Windows"
863 jpye 1529
864 jpye 1509 if 'LSODE' in env['WITH_SOLVERS']:
865 johnpye 673 with_lsode=True
866     else:
867     with_lsode=False
868     without_lsode_reason = "not requested (WITH_SOLVERS)"
869    
870     if 'IDA' in env['WITH_SOLVERS']:
871     with_ida=True
872     else:
873     with_ida=False
874     without_ida_reason = "not requested (WITH_SOLVERS)"
875    
876    
877 johnpye 783 if 'CONOPT' in env['WITH_SOLVERS']:
878     with_conopt=True
879     else:
880     with_conopt=False
881     without_conopt_reason = "not requested (WITH_SOLVERS)"
882    
883 jpye 1529 if 'IPOPT' in env['WITH_SOLVERS']:
884     with_ipopt=True
885     else:
886     with_ipopt=False
887     without_ipopt_reason = "not requested (WITH_SOLVERS)"
888 johnpye 783
889 jpye 1529
890 johnpye 464 #print "SOLVERS:",env['WITH_SOLVERS']
891     #print "WITH_BINTOKEN:",env['WITH_BINTOKEN']
892     #print "DEFAULT_ASCENDLIBRARY:",env['DEFAULT_ASCENDLIBRARY']
893 johnpye 393
894 johnpye 463 can_install = True
895     if platform.system()=='Windows':
896     can_install = False
897    
898     env['CAN_INSTALL']=can_install
899 johnpye 721
900 jpye 1437 print "TCL=",env['TCL']
901 johnpye 521 print "TCL_CPPPATH =",env['TCL_CPPPATH']
902     print "TCL_LIBPATH =",env['TCL_LIBPATH']
903     print "TCL_LIB =",env['TCL_LIB']
904 johnpye 562 print "CC =",env['CC']
905     print "CXX =",env['CXX']
906 johnpye 673 print "FORTRAN=",env.get('FORTRAN')
907 johnpye 393
908 johnpye 628 print "ABSOLUTE PATHS =",env['ABSOLUTE_PATHS']
909 jpye 1504 print "INSTALL_ASCDATA =",env['INSTALL_ASCDATA']
910 jpye 1413 print "INSTALL_PREFIX =",env['INSTALL_PREFIX']
911 jpye 1504 print "INSTALL_MODELS =",env['INSTALL_MODELS']
912     print "INSTALL_SOLVERS =",env['INSTALL_SOLVERS']
913     print "DEFAULT_ASCENDLIBRARY =",env['DEFAULT_ASCENDLIBRARY']
914 jpye 1519 print "DEFAULT_ASCENDSOLVERS =",env['DEFAULT_ASCENDSOLVERS']
915 jpye 1504
916    
917 johnpye 385 #------------------------------------------------------
918 johnpye 398 # SPECIAL CONFIGURATION TESTS
919    
920 johnpye 463 need_fortran = False
921 jpye 1641 need_fortran_reasons = []
922 johnpye 463
923 johnpye 400 #----------------
924 jpye 1448 # CC
925    
926     cc_test_text = """
927     int main(void){
928     return 0;
929     }
930     """;
931    
932     def CheckCC(context):
933     context.Message("Checking C compiler ('%s')... " % context.env.get('CC'))
934     is_ok = context.TryCompile(cc_test_text,".c")
935     context.Result(is_ok)
936     return is_ok
937    
938     #----------------
939     # CXX
940    
941     cxx_test_text = """
942     template<class X>
943     class pair{
944     public:
945     X a;
946     X b;
947     };
948    
949     int main(void){
950     pair<double> P;
951     P.a = 0;
952     return 0;
953     }
954     """;
955    
956     def CheckCXX(context):
957     context.Message("Checking C++ compiler ('%s')... " % context.env.get('CXX'))
958 jpye 1630 if not context.env.get('CXX'):
959     context.Result("not found")
960     return False
961     is_ok = context.TryCompile(cxx_test_text,".cpp")
962 jpye 1448 context.Result(is_ok)
963     return is_ok
964    
965 jpye 1641 #----------------
966    
967     f77_test_text = """
968     C Hello World in Fortran 77
969    
970     PROGRAM HELLO
971     PRINT*, 'Hello World!'
972     END
973     """;
974    
975     def CheckF77(context):
976     context.Message("Checking Fortran 77 compiler ('%s')..." % context.env.get('FORTRAN'))
977     if not context.env.get('FORTRAN'):
978     context.Result('not found')
979     return False
980     is_ok = context.TryCompile(f77_test_text,".f")
981     context.Result(is_ok)
982     return is_ok
983 jpye 1448
984     #----------------
985 johnpye 400 # SWIG
986    
987 johnpye 398 import os,re
988    
989 johnpye 413 def get_swig_version(env):
990 johnpye 403 cmd = env['SWIG']+' -version'
991 johnpye 427 (cin,coutcerr) = os.popen4(cmd)
992 johnpye 403 output = coutcerr.read()
993 johnpye 398
994 johnpye 403 restr = "SWIG\\s+Version\\s+(?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<pat>[0-9]+)\\s*$"
995     expr = re.compile(restr,re.M);
996 johnpye 398 m = expr.search(output);
997     if not m:
998 johnpye 413 return None
999 johnpye 398 maj = int(m.group('maj'))
1000     min = int(m.group('min'))
1001     pat = int(m.group('pat'))
1002 johnpye 413
1003     return (maj,min,pat)
1004 johnpye 398
1005 johnpye 413
1006     def CheckSwigVersion(context):
1007    
1008     try:
1009     context.Message("Checking version of SWIG... ")
1010     maj,min,pat = get_swig_version(context.env)
1011     except:
1012     context.Result("Failed to detect version, or failed to run SWIG")
1013     return 0;
1014    
1015 johnpye 478 context.env['SWIGVERSION']=tuple([maj,min,pat])
1016    
1017 johnpye 398 if maj == 1 and (
1018 johnpye 400 min > 3
1019     or (min == 3 and pat >= 24)
1020 johnpye 398 ):
1021     context.Result("ok, %d.%d.%d" % (maj,min,pat))
1022     return 1;
1023 johnpye 401 else:
1024     context.Result("too old, %d.%d.%d" % (maj,min,pat))
1025     return 0;
1026 johnpye 398
1027 johnpye 400 #----------------
1028 johnpye 816 # Scrollkeeper (Linux documentation system)
1029    
1030     def get_scrollkeeper_omfdir(env):
1031     cmd = 'scrollkeeper-config --omfdir'
1032     (cin,coutcerr) = os.popen4(cmd)
1033     output = coutcerr.read()
1034     return output.strip()
1035    
1036     def CheckScrollkeeperConfig(context):
1037     try:
1038     context.Message("Checking for scrollkeeper...")
1039     dir=get_scrollkeeper_omfdir(context.env)
1040     except:
1041     context.Result("Failed to run 'scrollkeeper-config'")
1042     return 0
1043     context.env['OMFDIR']=dir
1044     context.Result("OK, %s" % dir)
1045     return 1
1046    
1047     #----------------
1048 johnpye 400 # General purpose library-and-header test
1049    
1050 johnpye 404 class KeepContext:
1051 johnpye 521 def __init__(self,context,varprefix,static=False):
1052 johnpye 404 self.keep = {}
1053 johnpye 521 for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']:
1054 johnpye 705 #print "Keeping env %s = %s" % (k,context.env.get(k))
1055     self.keep[k]=context.env.get(k)
1056 johnpye 404
1057     if context.env.has_key(varprefix+'_CPPPATH'):
1058 johnpye 743 context.env.AppendUnique(CPPPATH=[env[varprefix+'_CPPPATH']])
1059 johnpye 800 #print "Adding '"+str(env[varprefix+'_CPPPATH'])+"' to cpp path"
1060 johnpye 428
1061 johnpye 521 if static:
1062     staticlib=env[varprefix+'_LIB']
1063     #print "STATIC LIB = ",staticlib
1064     context.env.Append(
1065     LINKFLAGS=[staticlib]
1066     )
1067     else:
1068     if context.env.has_key(varprefix+'_LIBPATH'):
1069     context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']])
1070 johnpye 800 #print "Adding '"+str(env[varprefix+'_LIBPATH'])+"' to lib path"
1071 johnpye 428
1072 johnpye 521 if context.env.has_key(varprefix+'_LIB'):
1073     context.env.Append(LIBS=[env[varprefix+'_LIB']])
1074 johnpye 705 #print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs"
1075 jpye 1547 elif context.env.has_key(varprefix+'_LIBS'):
1076     context.env.AppendUnique(LIBS=env[varprefix+'_LIBS'])
1077 johnpye 404
1078     def restore(self,context):
1079 johnpye 464 #print "RESTORING CONTEXT"
1080     #print self.keep
1081     #print "..."
1082 johnpye 404 for k in self.keep:
1083 johnpye 463 if self.keep[k]==None:
1084 johnpye 521 if context.env.has_key(k):
1085     #print "Clearing "+str(k)
1086     del context.env[k];
1087 johnpye 463 else:
1088 johnpye 705 #print "Restoring %s to '%s'" %(k,self.keep.get(k))
1089 johnpye 463 context.env[k]=self.keep[k];
1090 johnpye 404
1091 johnpye 521 def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False):
1092 johnpye 400 """This method will check for variables LIBNAME_LIBPATH
1093     and LIBNAME_CPPPATH and try to compile and link the
1094     file with the provided text, linking with the
1095     library libname."""
1096    
1097 johnpye 521 if static:
1098     context.Message( 'Checking for static '+libname+'... ' )
1099     else:
1100     context.Message( 'Checking for '+libname+'... ' )
1101    
1102 johnpye 400 if varprefix==None:
1103     varprefix = libname.upper()
1104    
1105 johnpye 705 #print "LIBS is currently:",context.env.get('LIBS')
1106 johnpye 521 keep = KeepContext(context,varprefix,static)
1107 johnpye 400
1108 jpye 1678 if not context.env.has_key(varprefix+'_LIB') and not context.env.has_key(varprefix+'_LIBS'):
1109 johnpye 463 # if varprefix_LIB were in env, KeepContext would
1110     # have appended it already
1111 johnpye 705 context.env.Append(LIBS=[libname])
1112 johnpye 428
1113 johnpye 404 is_ok = context.TryLink(text,ext)
1114 johnpye 428
1115 johnpye 521 #print "Link success? ",(is_ok != 0)
1116 johnpye 400
1117 johnpye 405 keep.restore(context)
1118 johnpye 400
1119 johnpye 428 # print "Restored CPPPATH="+str(context.env['CPPPATH'])
1120 johnpye 705 # print "Restored LIBS="+str(context.env['LIBS'])
1121 johnpye 428 # print "Restored LIBPATH="+str(context.env['LIBPATH'])
1122    
1123 johnpye 404 context.Result(is_ok)
1124     return is_ok
1125    
1126     #----------------
1127 johnpye 502 # GCC
1128    
1129     gcc_test_text = """
1130     #ifndef __GNUC__
1131     # error "Not using GCC"
1132     #endif
1133    
1134     int main(void){
1135     return __GNUC__;
1136     }
1137     """
1138    
1139     def CheckGcc(context):
1140     context.Message("Checking for GCC... ")
1141     is_ok = context.TryCompile(gcc_test_text,".c")
1142     context.Result(is_ok)
1143     return is_ok
1144    
1145     #----------------
1146 johnpye 500 # GCC VISIBILITY feature
1147    
1148     gccvisibility_test_text = """
1149     #if __GNUC__ < 4
1150     # error "Require GCC version 4 or newer"
1151     #endif
1152    
1153     __attribute__ ((visibility("default"))) int x;
1154    
1155     int main(void){
1156     extern int x;
1157     x = 4;
1158     }
1159     """
1160    
1161     def CheckGccVisibility(context):
1162     context.Message("Checking for GCC 'visibility' capability... ")
1163 johnpye 546 if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']:
1164     context.Result("disabled")
1165     return 0
1166 johnpye 500 is_ok = context.TryCompile(gccvisibility_test_text,".c")
1167     context.Result(is_ok)
1168     return is_ok
1169 johnpye 502
1170 johnpye 500 #----------------
1171 johnpye 502 # YACC
1172    
1173     yacc_test_text = """
1174 johnpye 646 %{
1175     #include <stdio.h>
1176 johnpye 741
1177     /* MSVC++ needs this before it can swallow Bison output */
1178     #ifdef _MSC_VER
1179     # define __STDC__
1180     #endif
1181 johnpye 646 %}
1182     %token MSG
1183 johnpye 502 %start ROOT
1184 johnpye 646 %%
1185     ROOT:
1186     MSG { printf("HELLO"); }
1187     ;
1188     %%
1189 johnpye 502 """
1190    
1191     def CheckYacc(context):
1192 johnpye 644 context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
1193 johnpye 502 is_ok = context.TryCompile(yacc_test_text,".y")
1194     context.Result(is_ok)
1195     return is_ok
1196    
1197     #----------------
1198 johnpye 1025 # LEX
1199    
1200     lex_test_text = """
1201     %{
1202     #include <stdio.h>
1203     %}
1204     DIGIT [0-9]
1205     ID [a-z][a-z0-9]*
1206     %%
1207     {DIGIT}+ {
1208     printf("A digit: %s\\n",yytext);
1209     }
1210    
1211     [ \\t\\n]+ /* ignore */
1212    
1213     . {
1214     printf("Unrecognized guff");
1215     }
1216     %%
1217     main(){
1218     yylex();
1219     }
1220     """
1221    
1222     def CheckLex(context):
1223     context.Message("Checking for Lex ('%s')... " % context.env.get('LEX'))
1224     is_ok = context.TryCompile(lex_test_text,".l")
1225     context.Result(is_ok)
1226     return is_ok
1227    
1228     #----------------
1229 johnpye 404 # CUnit test
1230    
1231 johnpye 400 cunit_test_text = """
1232 johnpye 451 #include <CUnit/CUnit.h>
1233 johnpye 400 int maxi(int i1, int i2){
1234     return (i1 > i2) ? i1 : i2;
1235     }
1236    
1237     void test_maxi(void){
1238     CU_ASSERT(maxi(0,2) == 2);
1239     CU_ASSERT(maxi(0,-2) == 0);
1240     CU_ASSERT(maxi(2,2) == 2);
1241    
1242     }
1243     int main(void){
1244     /* CU_initialize_registry() */
1245 johnpye 404 return 0;
1246 johnpye 400 }
1247     """
1248    
1249     def CheckCUnit(context):
1250 johnpye 451 return CheckExtLib(context,'cunit',cunit_test_text)
1251 johnpye 400
1252 johnpye 404 #----------------
1253 johnpye 938 # dmalloc test
1254    
1255     dmalloc_test_text = """
1256     #include <stdlib.h>
1257     #include <dmalloc.h>
1258    
1259     int main(void){
1260     char *c;
1261     c = malloc(100*sizeof(char));
1262     free(c);
1263     return 0;
1264     }
1265     """
1266    
1267     def CheckDMalloc(context):
1268     return CheckExtLib(context,'dmalloc',dmalloc_test_text)
1269    
1270     #----------------
1271 jpye 1678 # graphviz test
1272 johnpye 1109
1273 jpye 1678 graphviz_test_text = """
1274     #include <graphviz/gvc.h>
1275 johnpye 1109 int main(void){
1276 jpye 1678 Agraph_t *g;
1277     GVC_t *gvc;
1278     gvc = gvContext();
1279     g = agopen("g", AGDIGRAPH);
1280 johnpye 1109 return 0;
1281     }
1282     """
1283    
1284 jpye 1678 def CheckGraphViz(context):
1285     return CheckExtLib(context,'graphviz',graphviz_test_text,ext=".c")
1286 johnpye 1109
1287     #----------------
1288 jpye 1326 # ufsparse test
1289    
1290     ufsparse_test_text = """
1291     #include <ufsparse/cs.h>
1292     int main(void){
1293     cs *A,*B,*C;
1294     C = cs_multiply(A,B);
1295     return 0;
1296     }
1297     """
1298    
1299     def CheckUFSparse(context):
1300     return CheckExtLib(context
1301     ,libname='cxsparse'
1302     ,varprefix='ufsparse'
1303     ,text=ufsparse_test_text
1304     ,ext=".c"
1305     )
1306    
1307     #----------------
1308 johnpye 673 # MATH test
1309    
1310     math_test_text = """
1311 johnpye 705 #ifndef _ALL_SOURCE
1312     # define _ALL_SOURCE
1313     #endif
1314     #ifndef _XOPEN_SOURCE
1315     # define _XOPEN_SOURCE
1316     #endif
1317     #ifndef _XOPEN_SOURCE_EXTENDED
1318     # define _XOPEN_SOURCE_EXTENDED 1
1319     #endif
1320 johnpye 673 #include <math.h>
1321     int main(void){
1322 johnpye 705 double x = 1.0; double y = 1.0; int i = 1;
1323     acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
1324     j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
1325     y0(x); y1(x); yn(i,x);
1326 jpye 1420 /* this part causes problems with crossmingw... */
1327 johnpye 705 #ifdef _THREAD_SAFE
1328     gamma_r(x,&i);
1329     lgamma_r(x,&i);
1330     #else
1331     gamma(x);
1332     lgamma(x);
1333     #endif
1334     hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
1335 johnpye 673 return 0;
1336     }
1337     """
1338    
1339     def CheckMath(context):
1340 johnpye 832 context.Message('Checking for IEEE math library... ')
1341 johnpye 705 libsave=context.env.get('LIBS');
1342     context.env.AppendUnique(LIBS=['m'])
1343     is_ok=context.TryLink(math_test_text,".c")
1344     context.Result(is_ok)
1345     if not is_ok:
1346     context.env['LIBS']=libsave
1347     return is_ok
1348    
1349 johnpye 673 #----------------
1350 jpye 1656 # malloc.h test
1351    
1352     malloc_test_text = """
1353 jpye 1660 #include <stdlib.h>
1354 jpye 1656 int main(){
1355     double *x;
1356     x = malloc(sizeof(double)*5);
1357     x[4] = 3.3;
1358     free(x);
1359     }
1360     """
1361    
1362     def CheckMalloc(context):
1363     context.Message("Checking for malloc...")
1364     is_ok = context.TryLink(malloc_test_text,".c")
1365     context.Result(is_ok)
1366     return is_ok
1367    
1368     #----------------
1369     # dlopen test
1370    
1371     dlopen_test_text = """
1372     #ifdef __WIN32__
1373     # include <windows.h>
1374     #else
1375     # include <dlfcn.h>
1376     #endif
1377     int main(){
1378     #ifdef __WIN32__
1379     HINSTANCE d;
1380     LoadLibrary("imaginary_and_nonexistent.dll");
1381     #else
1382     void *d;
1383     d = dlopen("imaginary_and_nonexistent.so", 1);
1384     #endif
1385     return 0;
1386     }
1387     """
1388    
1389     def CheckDLOpen(context):
1390     context.Message("Checking for ability to load shared libraries at runtime...")
1391     libsave=context.env.get('LIBS');
1392     if platform.system()!="Windows":
1393     context.env.Append(LIBS=['dl'])
1394     is_ok = context.TryLink(dlopen_test_text,".c")
1395     context.Result(is_ok)
1396     context.env['LIBS'] = libsave
1397     return is_ok
1398    
1399     #----------------
1400 johnpye 957 # libpython test
1401    
1402     libpython_test_text = """
1403     #include <Python.h>
1404     int main(void){
1405     PyObject *p;
1406     p = Py_None;
1407     return 0;
1408     }
1409     """
1410    
1411     def CheckPythonLib(context):
1412     context.Message('Checking for libpython... ')
1413    
1414     if platform.system()=="Windows":
1415     python_lib='python%d%d'
1416     else:
1417     python_lib='python%d.%d'
1418 johnpye 958 python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])]
1419 johnpye 957
1420     python_cpppath = [distutils.sysconfig.get_python_inc()]
1421     cfig = distutils.sysconfig.get_config_vars()
1422    
1423     lastLIBS = context.env.get('LIBS')
1424     lastLIBPATH = context.env.get('LIBPATH')
1425     lastCPPPATH = context.env.get('CPPPATH')
1426 johnpye 959 lastLINKFLAGS = context.env.get('LINKFLAGS')
1427 johnpye 957
1428     python_libpath = []
1429 johnpye 959 python_linkflags = []
1430 johnpye 965 if platform.system()=="Windows":
1431 jpye 1551 python_libpath += [os.path.join(sys.prefix,"libs")]
1432 johnpye 965 else:
1433     # checked on Linux and SunOS
1434     if cfig['LDLIBRARY']==cfig['LIBRARY']:
1435     sys.stdout.write("(static)")
1436     python_libpath += [cfig['LIBPL']]
1437     python_linkflags += cfig['LIBS'].split(' ')
1438 johnpye 957
1439 johnpye 958 context.env.AppendUnique(LIBS=python_libs)
1440 johnpye 957 context.env.AppendUnique(LIBPATH=python_libpath)
1441     context.env.AppendUnique(CPPPATH=python_cpppath)
1442 johnpye 959 context.env.AppendUnique(LINKFLAGS=python_linkflags)
1443 johnpye 957 result = context.TryLink(libpython_test_text,".c");
1444    
1445 johnpye 958 context.Result(result)
1446 johnpye 957
1447     if(result):
1448 johnpye 958 context.env['PYTHON_LIBPATH']=python_libpath
1449     context.env['PYTHON_LIB']=python_libs
1450     context.env['PYTHON_CPPPATH']=python_cpppath
1451 johnpye 959 context.env['PYTHON_LINKFLAGS']=python_linkflags
1452 johnpye 957
1453     context.env['LIBS'] = lastLIBS
1454     context.env['LIBPATH'] = lastLIBPATH
1455     context.env['CPPPATH'] = lastCPPPATH
1456 johnpye 959 context.env['LINKFLAGS'] = lastLINKFLAGS
1457 johnpye 957
1458     return result
1459    
1460     #----------------
1461 johnpye 673 # IDA test
1462    
1463 johnpye 913 sundials_version_major_required = 2
1464     sundials_version_minor_min = 2
1465     sundials_version_minor_max = 3
1466    
1467     sundials_version_text = """
1468     #include <sundials/sundials_config.h>
1469     #include <stdio.h>
1470     int main(){
1471     printf("%s",SUNDIALS_PACKAGE_VERSION);
1472     return 0;
1473     }
1474     """
1475    
1476 johnpye 673 ida_test_text = """
1477 jpye 1400 #if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2
1478     # include <sundials/sundials_config.h>
1479     # include <sundials/sundials_nvector.h>
1480 jpye 1405 # include <nvector_serial.h>
1481 jpye 1400 # include <ida.h>
1482     # include <ida/ida_spgmr.h>
1483     #else
1484     # include <sundials/sundials_config.h>
1485     # include <nvector/nvector_serial.h>
1486 johnpye 907 # include <ida/ida.h>
1487 jpye 1400 #endif
1488 johnpye 673 int main(){
1489     void *ida_mem;
1490     ida_mem = IDACreate();
1491 johnpye 782 return 0;
1492 johnpye 673 }
1493     """
1494    
1495 johnpye 913 # slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS,
1496     # so detect the version and act accordingly.
1497 jpye 1400 def CheckSUNDIALS(context):
1498     keep = KeepContext(context,'SUNDIALS')
1499 jpye 1402 context.Message("Checking for SUNDIALS... ")
1500 johnpye 913 (is_ok,output) = context.TryRun(sundials_version_text,'.c')
1501     keep.restore(context)
1502     if not is_ok:
1503 jpye 1402 context.Result(0)
1504 johnpye 913 return 0
1505    
1506     major,minor,patch = tuple([int(i) for i in output.split(".")])
1507     context.env['SUNDIALS_VERSION_MAJOR'] = major
1508     context.env['SUNDIALS_VERSION_MINOR'] = minor
1509     if major != sundials_version_major_required \
1510     or minor < sundials_version_minor_min \
1511     or minor > sundials_version_minor_max:
1512     context.Result(output+" (bad version)")
1513     # bad version
1514     return 0
1515    
1516     # good version
1517 johnpye 1086 context.Result("%d.%d.%d, good" % (major,minor,patch))
1518 jpye 1400
1519 johnpye 913 return 1
1520    
1521 jpye 1400
1522     def CheckIDA(context):
1523 jpye 1402 context.Message( 'Checking for IDA... ' )
1524 jpye 1400
1525 jpye 1404 keep = KeepContext(context,"SUNDIALS")
1526 jpye 1400
1527     major = context.env['SUNDIALS_VERSION_MAJOR']
1528     minor = context.env['SUNDIALS_VERSION_MINOR']
1529    
1530 jpye 1404 cppdef = context.env.get('CPPDEFINES')
1531    
1532     context.env.Append(CPPDEFINES=[
1533     ('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR")
1534     ,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")
1535     ])
1536    
1537     context.env['SUNDIALS_CPPPATH_EXTRA']=[]
1538     if major==2 and minor==2:
1539     context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"])
1540    
1541 jpye 1400 context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")])
1542 jpye 1404 context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS'])
1543     context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA'])
1544 jpye 1400
1545     is_ok = context.TryLink(ida_test_text,".c")
1546     context.Result(is_ok)
1547    
1548 jpye 1404 if cppdef:
1549     context.env['CPPDEFINES']=cppdef
1550 jpye 1552 else:
1551     del context.env['CPPDEFINES']
1552    
1553 jpye 1400 keep.restore(context)
1554    
1555     return is_ok
1556    
1557    
1558 johnpye 673 #----------------
1559 johnpye 783 # CONOPT test
1560    
1561     conopt_test_text = """
1562 johnpye 800 #if !defined(_WIN32)
1563     # define FNAME_LCASE_DECOR
1564     #endif
1565    
1566 johnpye 783 #include <conopt.h>
1567     #include <stdlib.h>
1568     int main(){
1569     int s, *v, e;
1570     s = COIDEF_Size();
1571     v = (int *)malloc(s*sizeof(int));
1572     e = COIDEF_Ini(v);
1573     return e;
1574     }
1575     """
1576    
1577     def CheckCONOPT(context):
1578     context.Message( 'Checking for CONOPT... ' )
1579    
1580     keep = KeepContext(context,"CONOPT")
1581    
1582     is_ok = context.TryLink(conopt_test_text,".c")
1583     context.Result(is_ok)
1584    
1585     keep.restore(context)
1586    
1587     return is_ok
1588    
1589     #----------------
1590 jpye 1529 # IPOPT test
1591    
1592     ipopt_test_text = """
1593     #if !defined(_WIN32)
1594     # define FNAME_LCASE_DECOR
1595     #endif
1596    
1597     #include <ipopt/IpStdCInterface.h>
1598     int main(){
1599     Number n;
1600 jpye 1546 IpoptProblem nlp = 0;
1601 jpye 1529 FreeIpoptProblem(nlp); // probably a crash if you run this
1602     return 0;
1603     }
1604     """
1605    
1606     def CheckIPOPT(context):
1607     context.Message( 'Checking for IPOPT... ' )
1608    
1609     keep = KeepContext(context,"IPOPT")
1610     is_ok = context.TryLink(ipopt_test_text,".c")
1611     context.Result(is_ok)
1612    
1613     keep.restore(context)
1614    
1615     return is_ok
1616    
1617     #----------------
1618 johnpye 405 # Tcl test
1619 johnpye 404
1620 johnpye 561 # TCL and TK required version 8.1, 8.2, 8.3, or 8.4:
1621     tcltk_minor_newest_acceptable = 4
1622     tcltk_major_required = 8
1623    
1624 johnpye 404 tcl_check_text = r"""
1625     #include <tcl.h>
1626     #include <stdio.h>
1627     int main(void){
1628     printf("%s",TCL_PATCH_LEVEL);
1629     return 0;
1630     }
1631     """
1632    
1633     def CheckTcl(context):
1634 johnpye 521 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
1635 johnpye 405
1636     def CheckTclVersion(context):
1637 johnpye 521 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
1638 johnpye 405 context.Message("Checking Tcl version... ")
1639     (is_ok,output) = context.TryRun(tcl_check_text,'.c')
1640 johnpye 404 keep.restore(context)
1641     if not is_ok:
1642 johnpye 405 context.Result("failed to run check")
1643 johnpye 404 return 0
1644 johnpye 405
1645 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
1646 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1647 johnpye 428 context.Result(output+" (bad version)")
1648 johnpye 405 # bad version
1649     return 0
1650    
1651     # good version
1652 johnpye 552 context.Result(output+", good")
1653 johnpye 404 return 1
1654    
1655 johnpye 405 #----------------
1656 johnpye 463 # Tk test
1657 johnpye 405
1658     tk_check_text = r"""
1659     #include <tk.h>
1660     #include <stdio.h>
1661     int main(void){
1662     printf("%s",TK_PATCH_LEVEL);
1663     return 0;
1664     }
1665     """
1666     def CheckTk(context):
1667 johnpye 673 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
1668 johnpye 405
1669 johnpye 428
1670 johnpye 405 def CheckTkVersion(context):
1671 johnpye 521 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
1672 johnpye 405 context.Message("Checking Tk version... ")
1673 johnpye 521 #print "LINKFLAGS =",context.env['LINKFLAGS']
1674 johnpye 405 (is_ok,output) = context.TryRun(tk_check_text,'.c')
1675 johnpye 404 keep.restore(context)
1676     if not is_ok:
1677     context.Result("failed to run check")
1678     return 0
1679    
1680 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
1681 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1682 johnpye 404 # bad version
1683 johnpye 561 context.Result(output+" (bad version)")
1684 johnpye 404 return 0
1685 johnpye 400
1686 johnpye 404 # good version
1687 johnpye 561 context.Result(output+" (good)")
1688 johnpye 404 return 1
1689 johnpye 485
1690     #----------------
1691 johnpye 521 # Tktable test
1692    
1693     tktable_check_text = r"""
1694     #include <tkTable.h>
1695     #include <stdio.h>
1696     int main(void){
1697     Table mytable;
1698     return 0;
1699     }
1700     """
1701    
1702     def CheckTkTable(context):
1703     return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
1704    
1705     #---------------
1706     # X11 test
1707    
1708     x11_check_text = r"""
1709     #include <X11/Xlib.h>
1710     #include <X11/IntrinsicP.h>
1711     #include <X11/Intrinsic.h>
1712     #include <X11/ObjectP.h>
1713     #include <X11/Object.h>
1714     int main(void){
1715     Object mything;
1716     return 0;
1717     }
1718     """
1719    
1720     def CheckX11(context):
1721     return CheckExtLib(context,'X11',x11_check_text)
1722    
1723     #----------------
1724 johnpye 968 # Check that we can raise and catch sigint
1725    
1726     sigint_test_text = r"""
1727     #include <signal.h>
1728     #include <setjmp.h>
1729     #include <stdlib.h>
1730     static jmp_buf g_jmpenv;
1731     void sighandler(int sig){
1732     longjmp(g_jmpenv,sig);
1733     }
1734     void testsigint(){
1735     raise(SIGINT);
1736     }
1737     int main(void){
1738     signal(SIGINT,&sighandler);
1739     switch(setjmp(g_jmpenv)){
1740     case 0:
1741     testsigint();
1742     exit(1);
1743     case SIGINT:
1744     exit(0);
1745     default:
1746     exit(2);
1747     }
1748     }
1749     """
1750    
1751     def CheckSIGINT(context):
1752     context.Message("Checking SIGINT is catchable... ")
1753     (is_ok,output)=context.TryRun(sigint_test_text,".c")
1754     context.Result(is_ok)
1755     return is_ok
1756    
1757     #----------------
1758 johnpye 953 # Check that we're able to catch floating point errors
1759    
1760     sigfpe_test_text = r"""
1761     #include <signal.h>
1762     #include <setjmp.h>
1763     #include <stdlib.h>
1764     #include <fenv.h>
1765     static jmp_buf g_jmpenv;
1766     void fpehandler(int sig){
1767     longjmp(g_jmpenv,sig);
1768     }
1769     int main(void){
1770     fenv_t myfenv;
1771     fegetenv(&myfenv);
1772     fesetenv(&myfenv);
1773     feenableexcept(FE_ALL_EXCEPT);
1774     signal(SIGFPE,&fpehandler);
1775     double x;
1776     switch(setjmp(g_jmpenv)){
1777     case 0:
1778     x = 1.0 / 0.0;
1779     /* failed to catch */
1780     exit(1);
1781     case SIGFPE:
1782     exit(0);
1783     }
1784     }
1785     """
1786    
1787     def CheckFPE(context):
1788 johnpye 968 context.Message("Checking C99 FPE behaviour... ")
1789 johnpye 953 (is_ok,output) = context.TryRun(sigfpe_test_text,'.c')
1790     context.Result(is_ok)
1791     return is_ok
1792    
1793     #----------------
1794 johnpye 968 # signal reset needed?
1795    
1796     sigreset_test_text = r"""
1797     #include <signal.h>
1798     #include <setjmp.h>
1799     #include <stdlib.h>
1800     #include <stdio.h>
1801     typedef void SigHandlerFn(int);
1802     static jmp_buf g_jmpenv;
1803     void sighandler(int sig){
1804     longjmp(g_jmpenv,sig);
1805     }
1806     void testsigint(){
1807 johnpye 1002 /* fprintf(stderr,"Raising SIGINT\n"); */
1808 johnpye 968 raise(SIGINT);
1809     }
1810     int main(void){
1811     SigHandlerFn *last,*saved;
1812     saved = signal(SIGINT,&sighandler);
1813     if(saved!=SIG_DFL){
1814 johnpye 1002 fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL);
1815 johnpye 968 exit(3);
1816     }
1817     switch(setjmp(g_jmpenv)){
1818     case 0:
1819     testsigint();
1820     fprintf(stderr,"Back from SIGINT\n");
1821     exit(1);
1822     case SIGINT:
1823     break;
1824     default:
1825     exit(2);
1826     };
1827 johnpye 1002 last = signal(SIGINT,SIG_DFL);
1828 johnpye 968 if(last!=&sighandler){
1829     printf("1");
1830     exit(0);
1831     }
1832     printf("0");
1833     exit(0);
1834     }
1835     """
1836    
1837     def CheckSigReset(context):
1838     context.Message("Checking signal handler reset... ")
1839     (is_ok,output) = context.TryRun(sigreset_test_text,'.c')
1840     if not is_ok:
1841     context.Result("ERROR")
1842 johnpye 1260 return False
1843 johnpye 1002 if int(output)==1:
1844 johnpye 968 context.Result("required");
1845     context.env['ASC_RESETNEEDED'] = True
1846     else:
1847     context.Result("not required");
1848     context.env['ASC_RESETNEEDED'] = False
1849 jpye 1658 return True
1850 johnpye 968
1851     #----------------
1852 jpye 1442 # LyX on this system?
1853    
1854     def CheckLyx(context):
1855     context.Message("Checking for LyX... ")
1856     r = context.env.WhereIs("lyx")
1857 jpye 1469 if r:
1858     context.Result(r)
1859     else:
1860     context.Result(0)
1861 jpye 1442 return r
1862    
1863     #----------------
1864     # Latex2HTML on this system?
1865    
1866     def CheckLatex2HTML(context):
1867     context.Message("Checking for latex2html...")
1868     if context.env.WhereIs("latex2html"):
1869     r = True
1870     else:
1871     r = False
1872     context.Result(r)
1873     return r
1874    
1875     #----------------
1876 johnpye 485 # GCC Version sniffing
1877    
1878     # TODO FIXME
1879    
1880     gcc_version4 = False
1881    
1882 johnpye 398 #------------------------------------------------------
1883 johnpye 385 # CONFIGURATION
1884    
1885     conf = Configure(env
1886     , custom_tests = {
1887 jpye 1448 'CheckCC' : CheckCC
1888     , 'CheckCXX' : CheckCXX
1889 jpye 1641 , 'CheckF77' : CheckF77
1890 jpye 1448 , 'CheckMath' : CheckMath
1891 jpye 1656 , 'CheckMalloc' : CheckMalloc
1892     , 'CheckDLOpen' : CheckDLOpen
1893 johnpye 673 , 'CheckSwigVersion' : CheckSwigVersion
1894 johnpye 957 , 'CheckPythonLib' : CheckPythonLib
1895 johnpye 400 , 'CheckCUnit' : CheckCUnit
1896 johnpye 938 , 'CheckDMalloc' : CheckDMalloc
1897 jpye 1442 , 'CheckLyx' : CheckLyx
1898     , 'CheckLatex2HTML' : CheckLatex2HTML
1899 jpye 1678 , 'CheckGraphViz' : CheckGraphViz
1900 jpye 1326 , 'CheckUFSparse' : CheckUFSparse
1901 johnpye 404 , 'CheckTcl' : CheckTcl
1902     , 'CheckTclVersion' : CheckTclVersion
1903 johnpye 405 , 'CheckTk' : CheckTk
1904     , 'CheckTkVersion' : CheckTkVersion
1905 johnpye 502 , 'CheckGcc' : CheckGcc
1906 johnpye 500 , 'CheckGccVisibility' : CheckGccVisibility
1907 johnpye 502 , 'CheckYacc' : CheckYacc
1908 johnpye 1025 , 'CheckLex' : CheckLex
1909 johnpye 521 , 'CheckTkTable' : CheckTkTable
1910     , 'CheckX11' : CheckX11
1911 johnpye 673 , 'CheckIDA' : CheckIDA
1912 jpye 1400 , 'CheckSUNDIALS' : CheckSUNDIALS
1913 johnpye 783 , 'CheckCONOPT' : CheckCONOPT
1914 jpye 1529 , 'CheckIPOPT' : CheckIPOPT
1915 johnpye 816 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
1916 johnpye 953 , 'CheckFPE' : CheckFPE
1917 johnpye 968 , 'CheckSIGINT' : CheckSIGINT
1918     , 'CheckSigReset' : CheckSigReset
1919 johnpye 400 # , 'CheckIsNan' : CheckIsNan
1920     # , 'CheckCppUnitConfig' : CheckCppUnitConfig
1921 johnpye 385 }
1922 johnpye 459 # , config_h = "config.h"
1923 johnpye 385 )
1924    
1925 jpye 1357 def sconsversioncheck():
1926    
1927     # uncomment the following line to skip the version check:
1928     # return 1
1929    
1930     import SCons
1931     v = SCons.__version__.split(".")
1932     if v[0] != '0':
1933     return 0
1934 jpye 1431 if int(v[1]) >= 97:
1935     return 1
1936 jpye 1357 if v[1] != '96':
1937     return 0
1938     micro = int(v[2])
1939 jpye 1394 if micro == 92 or micro == 93 or micro == 96:
1940 jpye 1357 return 1;
1941     return 0
1942    
1943     if not sconsversioncheck():
1944     print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
1945     print "or consult the developers in the case of newer versions. Modify"
1946     print "the function 'sconsversioncheck' in the file SConstruct if you"
1947     print "want to *force* SCons to continue."
1948     Exit(1)
1949    
1950 jpye 1448 # check C compiler
1951    
1952 jpye 1654 if conf.CheckCC() is False:
1953 jpye 1448 print "Failed to build simple test file with your C compiler."
1954     print "Check your compiler is installed and running correctly."
1955     Exit(1)
1956    
1957 jpye 1654 if conf.CheckCXX() is False:
1958 jpye 1448 print "Failed to build simple test file with your C++ compiler."
1959     print "Check your compiler is installed and running correctly."
1960 jpye 1630 print "You can set your C++ compiler using the CXX scons option."
1961 jpye 1448 Exit(1)
1962    
1963 johnpye 740 # stdio -- just to check that compiler is behaving
1964 johnpye 398
1965 jpye 1654 if conf.CheckHeader('stdio.h') is False:
1966 johnpye 832 print "CPPPATH =",env.get('CPPPATH')
1967 johnpye 740 print "Did not find 'stdio.h'! Check your compiler configuration."
1968 johnpye 1080 print ""
1969     print "You environment is printed here:"
1970     for k,v in os.environ.iteritems():
1971     print "%-30s%s" % ("%s :" % k, v)
1972 johnpye 740 Exit(1)
1973    
1974 jpye 1654 if conf.CheckFunc('snprintf') is False:
1975 johnpye 1228 print "Didn't find snprintf";
1976     exit(1)
1977    
1978 jpye 1678 if conf.CheckFunc('strdup'):
1979     conf.env['HAVE_STRDUP'] = True
1980    
1981 johnpye 385 # Math library
1982    
1983 johnpye 1262 conf.env['HAVE_IEEE']=True
1984    
1985 jpye 1654 if need_libm and (conf.CheckMath() is False):
1986 johnpye 1232 conf.env['HAVE_IEEE']=False
1987 johnpye 1262 print 'Did not find math library, exiting!'
1988     Exit(1)
1989 johnpye 427
1990 jpye 1656 # Malloc
1991    
1992     if conf.CheckMalloc() is False:
1993     conf.env['HAVE_MALLOC']=False
1994     print "Did not find functioning 'malloc', exiting!"
1995     Exit(1)
1996    
1997     # dlopen/LoadLibrary
1998    
1999 jpye 1659 # CURRENTLY BREAKS LATER TEST (libsave?)
2000     #if conf.CheckDLOpen() is False:
2001     # print "Did not find functioning dlopen/LoadLibrary, exiting!"
2002     # Exit(1)
2003 jpye 1656
2004 johnpye 385 # Where is 'isnan'?
2005    
2006 jpye 1654 if conf.CheckFunc('isnan') is False and conf.CheckFunc('_isnan') is False:
2007 johnpye 385 print "Didn't find isnan"
2008 johnpye 414 # Exit(1)
2009 johnpye 385
2010 johnpye 500 # GCC visibility
2011    
2012 johnpye 502 if conf.CheckGcc():
2013     conf.env['HAVE_GCC']=True;
2014 johnpye 526 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
2015 johnpye 509 conf.env['HAVE_GCCVISIBILITY']=True;
2016     conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
2017     conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
2018 johnpye 709 conf.env.Append(CCFLAGS=['-Wall'])
2019 johnpye 500
2020 johnpye 968 # Catching SIGINT
2021    
2022 johnpye 1142 if env['WITH_SIGNALS']:
2023 jpye 1655 if not conf.CheckSIGINT():
2024 johnpye 1142 with_signals = False
2025     without_signals_reason = "SIGINT uncatchable"
2026 johnpye 968
2027 johnpye 953 # Catching SIGFPE
2028    
2029     if conf.CheckFPE():
2030 johnpye 968 conf.env['HAVE_C99FPE']=True
2031 johnpye 953 else:
2032 johnpye 968 conf.env['HAVE_C99FPE']=False
2033 johnpye 953
2034 johnpye 968 # Checking for signal reset requirement
2035    
2036 jpye 1654 if conf.CheckSigReset() is False:
2037 johnpye 968 print "Unable to determine if signal reset is required"
2038 johnpye 1260 Exit(1)
2039 johnpye 968
2040 johnpye 502 # YACC
2041    
2042 jpye 1552 if conf.CheckYacc():
2043 johnpye 502 conf.env['HAVE_YACC']=True
2044    
2045 jpye 1552 if conf.CheckLex():
2046 johnpye 1025 conf.env['HAVE_LEX']=True
2047 johnpye 502
2048 johnpye 387 # Tcl/Tk
2049 johnpye 386
2050 johnpye 586 if with_tcltk:
2051     if conf.CheckTcl():
2052     if conf.CheckTclVersion():
2053     if conf.CheckTk():
2054     if with_tcltk and conf.CheckTkVersion():
2055     if env['STATIC_TCLTK']:
2056     if conf.CheckTkTable():
2057     pass
2058     else:
2059     without_tcltk_reason = "TkTable not found"
2060     with_tcltk = False
2061     else:
2062     without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
2063     with_tcltk = False
2064 johnpye 521 else:
2065 johnpye 586 without_tcltk_reason = "Tk not found."
2066 johnpye 551 with_tcltk = False
2067 johnpye 428 else:
2068 johnpye 586 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
2069 johnpye 551 with_tcltk = False
2070 johnpye 586
2071 johnpye 428 else:
2072 johnpye 586 without_tcltk_reason = "Tcl not found."
2073 johnpye 551 with_tcltk = False
2074 johnpye 386
2075 johnpye 521 if env['STATIC_TCLTK']:
2076     conf.CheckX11()
2077    
2078 johnpye 395 # Python... obviously we're already running python, so we just need to
2079     # check that we can link to the python library OK:
2080    
2081 jpye 1655 if not conf.CheckPythonLib():
2082 johnpye 957 without_python_reason = 'libpython2.x not found or not linkable'
2083     with_python = False
2084 johnpye 982 env['WITH_PYTHON']=False
2085 johnpye 391
2086 johnpye 395 # SWIG version
2087    
2088 jpye 1656 if with_python and conf.CheckSwigVersion() is False:
2089 johnpye 413 without_python_reason = 'SWIG >= 1.3.24 is required'
2090     with_python = False
2091 johnpye 982 env['WITH_PYTHON']=False
2092 johnpye 413
2093 johnpye 400 # CUnit
2094    
2095 johnpye 593 if with_cunit:
2096 jpye 1655 if not conf.CheckCUnit():
2097 johnpye 427 without_cunit_reason = 'CUnit not found'
2098 johnpye 665 with_cunit = False
2099 johnpye 705 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
2100 johnpye 427
2101 johnpye 938 # DMALLOC
2102    
2103     if with_dmalloc:
2104 jpye 1655 if not conf.CheckDMalloc():
2105 johnpye 938 without_dmalloc_reason = 'dmalloc not found'
2106     with_dmalloc = False
2107    
2108 jpye 1678 # GRAPHVIZ
2109 johnpye 1109
2110 jpye 1678 if with_graphviz:
2111     if not conf.CheckGraphViz():
2112     without_graphviz_reason = 'graphviz not found'
2113     with_graphviz = False
2114     env['WITH_GRAPHVIZ'] = False
2115 johnpye 1109
2116 jpye 1326 # UFSPARSE
2117    
2118     if with_ufsparse:
2119 jpye 1655 if not conf.CheckUFSparse():
2120 jpye 1678 without_ufsparse_reason = 'ufsparse not found'
2121 jpye 1326 with_ufsparse = False
2122     env['WITH_UFSPARSE'] = False
2123    
2124 johnpye 673 # IDA
2125    
2126     if not with_ida:
2127     without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
2128 jpye 1655 elif not conf.CheckSUNDIALS():
2129 jpye 1400 with_ida = False
2130     without_ida_reason = "SUNDIALS not found, or bad version"
2131 jpye 1655 elif not conf.CheckIDA():
2132 johnpye 673 with_ida = False
2133 jpye 1400 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
2134 johnpye 673
2135 johnpye 797 # CONOPT
2136 johnpye 783
2137     if not with_conopt:
2138     without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
2139 jpye 1654 elif conf.CheckCONOPT() is False:
2140 jpye 1541 if conf.env.get('CONOPT_LINKED'):
2141     conf.env['CONOPT_LINKED'] = False
2142     # we no longer require CONOPT at buildtime in order to build support for it
2143     #with_conopt = False
2144     #without_conpt_reason = "CONOPT not found"
2145 johnpye 783
2146 jpye 1529 # IPOPT
2147    
2148     if not with_ipopt:
2149     without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
2150 jpye 1657 elif not conf.CheckIPOPT():
2151 jpye 1529 with_ipopt = False
2152     without_ipopt_reason = "IPOPT not found"
2153    
2154 johnpye 427 # BLAS
2155    
2156 johnpye 459 need_blas=False
2157 johnpye 673
2158     if with_lsode:
2159     need_fortran = True
2160 jpye 1641 need_fortran_reasons.append("LSODE")
2161 johnpye 459 need_blas=True
2162 johnpye 673
2163 johnpye 459 if need_blas:
2164     if conf.CheckLib('blas'):
2165     with_local_blas = False
2166     without_local_blas_reason = "Found BLAS installed on system"
2167     else:
2168     with_local_blas = True
2169     need_fortran = True
2170 jpye 1641 need_fortran_reasons.append("BLAS")
2171 johnpye 673 else:
2172     with_local_blas= False;
2173     without_local_blas_reason = "BLAS not required"
2174 johnpye 427
2175     # FORTRAN
2176    
2177     if need_fortran:
2178 johnpye 629 conf.env.Tool('fortran')
2179 jpye 1380 detect_fortran = conf.env.Detect(['gfortran','g77'])
2180 johnpye 427 if detect_fortran:
2181     # For some reason, g77 doesn't get detected properly on MinGW
2182 johnpye 673 if not env.has_key('F77') and not env.has_key('FORTRAN'):
2183 jpye 1357 print "Fixing detection of F77 on MinGW...(?)"
2184 johnpye 427 conf.env.Replace(F77=detect_fortran)
2185     conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
2186     conf.env.Replace(F77FLAGS='')
2187 johnpye 428 #print "F77:",conf.env['F77']
2188     #print "F77COM:",conf.env['F77COM']
2189     #print "F77FLAGS:",conf.env['F77FLAGS']
2190 johnpye 427 fortran_builder = Builder(
2191     action='$F77COM'
2192     , suffix='.o'
2193     , src_suffix='.f'
2194     )
2195     conf.env.Append(BUILDERS={'Fortran':fortran_builder})
2196 johnpye 1284 if platform.system()=="Linux":
2197     conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
2198 johnpye 427 else:
2199 johnpye 673 with_lsode=False;
2200     without_lsode_reason="FORTRAN-77 required but not found"
2201 johnpye 629
2202 jpye 1654 if need_fortran and conf.CheckF77() is False:
2203 jpye 1641 print "Failed to build simple test file with your Fortran compiler."
2204     print "Check your compiler is installed and running correctly."
2205     print "You can set your Fortran compiler using the FORTRAN scons option."
2206     print "The fortran compiler is REQUIRED to build:",", ".join(need_fortran_reasons)
2207     print "Perhaps try examining the value of your WITH_SOLVERS option (remove LSODE, etc)."
2208     Exit(1)
2209    
2210 johnpye 464 #else:
2211     # print "FORTRAN not required"
2212 johnpye 400
2213 johnpye 673 # F2C
2214    
2215     if need_fortran:
2216     if platform.system()=="Windows":
2217 jpye 1380 pass
2218     #conf.env.Append(LIBPATH='c:\mingw\lib')
2219 johnpye 673
2220 johnpye 816 # scrollkeeper
2221 johnpye 673
2222 johnpye 816 if with_scrollkeeper:
2223 jpye 1654 if conf.CheckScrollkeeperConfig() is False:
2224 johnpye 816 with_scrollkeeper=False
2225     without_scrollkeeper_reason="unable to detect scrollkeeper-config"
2226    
2227 jpye 1442 # lyx
2228    
2229 jpye 1470 if with_doc_build:
2230 jpye 1654 if conf.CheckLyx() is False:
2231 jpye 1470 with_doc_build = False
2232     without_doc_build_reason="unable to locate lyx"
2233 jpye 1442
2234     with_latext2html = conf.CheckLatex2HTML()
2235    
2236 johnpye 385 # TODO: -D_HPUX_SOURCE is needed
2237    
2238     # TODO: check size of void*
2239    
2240 johnpye 393 # TODO: detect if dynamic libraries are possible or not
2241    
2242 johnpye 427 if platform.system()=="Windows" and env.has_key('MSVS'):
2243 johnpye 740 _found_windows_h = conf.CheckHeader('Windows.h')
2244    
2245     if not _found_windows_h:
2246 johnpye 741 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
2247 johnpye 740 Exit(1)
2248 johnpye 741
2249 jpye 1654 if with_python and conf.CheckHeader(['basetsd.h','BaseTsd.h']) is False:
2250 johnpye 427 with_python = 0;
2251     without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
2252    
2253 johnpye 395 conf.Finish()
2254    
2255 johnpye 507 #---------------------------------------
2256     # SUBSTITUTION DICTIONARY for .in files
2257    
2258 johnpye 658 release = env.get('RELEASE')
2259     if release=="0.":
2260     release="0"
2261    
2262 johnpye 800 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
2263    
2264 johnpye 507 subst_dict = {
2265     '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
2266 jpye 1519 ,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS']
2267 johnpye 507 , '@GLADE_FILE@':'ascend.glade'
2268     , '@HELP_ROOT@':''
2269     , '@ICON_EXTENSION@':icon_extension
2270 johnpye 628 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
2271 johnpye 507 , '@INSTALL_BIN@':env['INSTALL_BIN']
2272     , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
2273 johnpye 683 , '@INSTALL_LIB@':env['INSTALL_LIB']
2274 johnpye 721 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
2275 jpye 1504 , '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS']
2276 johnpye 507 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
2277     , '@VERSION@':version
2278 johnpye 658 , '@RELEASE@':release
2279 johnpye 563 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
2280 jpye 1590 , '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation'
2281 johnpye 1228 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
2282     , '@SHLIBPREFIX@':env['SHLIBPREFIX']
2283 jpye 1597 , '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX']
2284     , '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX']
2285 johnpye 589 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
2286 johnpye 627 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
2287 johnpye 683 , '@PYTHON@' : python_exe
2288 jpye 1466 , '@PYVERSION@' : pyversion
2289 johnpye 800 , '@ASC_CONOPT_LIB@':env.get('CONOPT_LIB')
2290     , '@ASC_CONOPT_ENVVAR@':env.get('CONOPT_ENVVAR')
2291 jpye 1399 , '@ASC_CONOPT_DLPATH@':c_escape(env.subst("$CONOPT_DLPATH"))
2292 johnpye 1174 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
2293 jpye 1535 , '@WITH_SOLVERS@':",".join(env.get('WITH_SOLVERS'))
2294 johnpye 507 }
2295    
2296 jpye 1442 if env.get('WITH_DOC'):
2297     print "WITH_DOC:",env['WITH_DOC']
2298     subst_dict['@HELP_ROOT@']=env['HELP_ROOT']
2299 johnpye 507
2300 johnpye 597 # bool options...
2301 johnpye 673 for k,v in {
2302 johnpye 1142 'ASC_WITH_IDA':with_ida
2303     ,'ASC_WITH_DMALLOC':with_dmalloc
2304 jpye 1678 ,'ASC_WITH_GRAPHVIZ':with_graphviz
2305 jpye 1326 ,'ASC_WITH_UFSPARSE':with_ufsparse
2306 johnpye 1142 ,'ASC_WITH_CONOPT':with_conopt
2307 jpye 1541 ,'ASC_LINKED_CONOPT':env.get('CONOPT_LINKED')
2308 jpye 1529 ,'ASC_WITH_IPOPT':with_ipopt
2309 johnpye 1142 ,'ASC_WITH_LSODE':with_lsode
2310     ,'ASC_WITH_MMIO':with_mmio
2311     ,'ASC_SIGNAL_TRAPS':with_signals
2312     ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
2313     ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
2314 johnpye 1261 ,'HAVE_IEEE':env.get('HAVE_IEEE')
2315 jpye 1412 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
2316 johnpye 1142 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
2317     ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
2318     }.iteritems():
2319    
2320     if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
2321 johnpye 594
2322 johnpye 507 if with_python:
2323     subst_dict['@ASCXX_USE_PYTHON@']="1"
2324 johnpye 673 env['WITH_PYTHON']=1;
2325 johnpye 507
2326 jpye 1442 if with_latex2html:
2327     env['WITH_LATEX2HTML']=1
2328    
2329 johnpye 507 if env.has_key('HAVE_GCCVISIBILITY'):
2330     subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
2331    
2332     env.Append(SUBST_DICT=subst_dict)
2333    
2334 johnpye 1142 #for k,v in subst_dict.iteritems():
2335     # print "%-50s%s" % ("'%s'"%k,v)
2336 johnpye 829
2337 johnpye 1142 # REMOVED: long command-line support on Win2k
2338 johnpye 829
2339     #------------------------------------------------------
2340 johnpye 558 # RECIPE: SWIG scanner
2341    
2342     import SCons.Script
2343    
2344     SWIGScanner = SCons.Scanner.ClassicCPP(
2345     "SWIGScan"
2346     , ".i"
2347     , "CPPPATH"
2348     , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
2349     )
2350    
2351     env.Append(SCANNERS=[SWIGScanner])
2352    
2353     #------------------------------------------------------
2354 johnpye 463 # Recipe for 'CHMOD' ACTION
2355 johnpye 439
2356     import SCons
2357     from SCons.Script.SConscript import SConsEnvironment
2358     SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2359     lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2360    
2361     def InstallPerm(env, dest, files, perm):
2362     obj = env.Install(dest, files)
2363     for i in obj:
2364     env.AddPostAction(i, env.Chmod(str(i), perm))
2365    
2366     SConsEnvironment.InstallPerm = InstallPerm
2367    
2368     # define wrappers
2369     SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2370 johnpye 578 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2371 johnpye 629 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2372 johnpye 463
2373 johnpye 439 #------------------------------------------------------
2374 johnpye 463 # BUILD...
2375 johnpye 385
2376 johnpye 463 # so that #include <modulename/headername.h> works across all modules...
2377 johnpye 743 env.AppendUnique(CPPPATH=['#base/generic'])
2378 johnpye 385
2379 johnpye 508 if env['DEBUG']:
2380     env.Append(CCFLAGS=['-g'])
2381 jpye 1554 env.Append(LINKFLAGS=['-g'])
2382 johnpye 508
2383 johnpye 591 if env['GCOV']:
2384     env.Append(
2385     CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2386     , LIBS=['gcov']
2387     , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2388     )
2389    
2390 johnpye 673 if with_ida:
2391     env.Append(WITH_IDA=1)
2392    
2393 johnpye 783 if with_conopt:
2394     env.Append(WITH_CONOPT=1)
2395    
2396 jpye 1529 if with_ipopt:
2397     env.Append(WITH_IPOPT=1)
2398    
2399 johnpye 463 #-------------
2400     # TCL/TK GUI
2401 johnpye 385
2402 johnpye 551 if with_tcltk:
2403 johnpye 569 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2404 johnpye 391 else:
2405 johnpye 982 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2406 johnpye 386
2407 johnpye 463 #-------------
2408     # PYTHON INTERFACE
2409    
2410 johnpye 387 if with_python:
2411 johnpye 532 env.SConscript(['pygtk/SConscript'],'env')
2412 johnpye 391 else:
2413 johnpye 982 print "Skipping... Python bindings aren't being built:",without_python_reason
2414 johnpye 400
2415 johnpye 463 #------------
2416     # BASE/GENERIC SUBDIRECTORIES
2417    
2418 johnpye 673 libascend_env = env.Copy()
2419    
2420 johnpye 1316 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2421 johnpye 463
2422     srcs = []
2423     for d in dirs:
2424 johnpye 673 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2425 johnpye 463 srcs += heresrcs
2426    
2427     #-------------
2428 johnpye 673 # IMPORTED CODE: LSODE, BLAS, etc
2429    
2430 jpye 1509 #if with_lsode:
2431     # srcs += env.SConscript(['lsod/SConscript'],'env')
2432     # srcs += env.SConscript(['linpack/SConscript'],'env')
2433     #else:
2434     # print "Skipping... LSODE won't be built:", without_lsode_reason
2435 johnpye 673
2436     if with_local_blas:
2437 jpye 1515 env['blasobjs'] = env.SConscript(['blas/SConscript'],'env')
2438 johnpye 673 else:
2439 jpye 1515 env['blasobjs'] = []
2440 johnpye 673 print "Skipping... BLAS won't be built:", without_local_blas_reason
2441    
2442     if not with_ida:
2443     print "Skipping... IDA won't be built:", without_ida_reason
2444    
2445 johnpye 993 if with_mmio:
2446     srcs += env.SConscript(['mmio/SConscript'],'env')
2447     else:
2448     print "Skipping... MMIO export won't be built:", without_mmio_reason
2449 johnpye 673 #-------------
2450 johnpye 463 # LIBASCEND -- all base/generic functionality
2451    
2452 johnpye 938 if with_dmalloc:
2453     libascend_env.Append(LIBS=['dmalloc'])
2454    
2455 jpye 1326 if with_ufsparse:
2456     libascend_env.Append(LIBS=['cxsparse'])
2457    
2458 johnpye 673 libascend = libascend_env.SharedLibrary('ascend',srcs)
2459 johnpye 463
2460 jpye 1510 # for use in declaring dependent shared libraries in SConscript files (eg solvers/*/SConscript)
2461     env['libascend'] = libascend
2462    
2463 johnpye 673 env.Alias('libascend',libascend)
2464    
2465 johnpye 463 #-------------
2466 johnpye 761 # UNIT TESTS (C CODE)
2467 johnpye 463
2468 johnpye 593 if with_cunit:
2469 jpye 1638 testdirs = ['general','solver','utilities','linear','compiler']
2470 johnpye 593 testsrcs = []
2471 johnpye 400 for testdir in testdirs:
2472     path = 'base/generic/'+testdir+'/test/'
2473     env.SConscript([path+'SConscript'],'env')
2474 johnpye 593 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2475    
2476     #print "TESTSRCS =",testsrcs
2477    
2478 johnpye 400 env.SConscript(['test/SConscript'],'env')
2479     env.SConscript(['base/generic/test/SConscript'],'env')
2480 johnpye 593
2481     env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2482 johnpye 400
2483     else:
2484 johnpye 427 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2485 johnpye 400
2486 johnpye 761 #-------------
2487 jpye 1504 # EXTERNAL SOLVERS
2488    
2489     env['extfns']=[]
2490    
2491 jpye 1505 env.SConscript(['solvers/SConscript'],'env')
2492 jpye 1504
2493     #-------------
2494 johnpye 761 # EXTERNAL FUNCTIONS
2495    
2496 johnpye 811 modeldirs = env.SConscript(['models/SConscript'],'env')
2497    
2498     if not with_extfns:
2499 johnpye 761 print "Skipping... External modules aren't being built:",without_extfns_reason
2500    
2501 johnpye 811 env.Alias('extfns',env['extfns'])
2502 johnpye 761
2503 johnpye 463 #------------------------------------------------------
2504 johnpye 683 # CREATE ASCEND-CONFIG scriptlet
2505    
2506     ascendconfig = env.SubstInFile('ascend-config.in')
2507    
2508 jpye 1625
2509 johnpye 683 #------------------------------------------------------
2510 jpye 1625 # CREATE asc4dev scriptlet
2511    
2512     asc4devcmd = env.SubstInFile('tcltk/asc4dev.in')
2513     env.AddPostAction(asc4devcmd, 'chmod 755 $TARGET')
2514     #------------------------------------------------------
2515 johnpye 463 # INSTALLATION
2516 johnpye 427
2517 johnpye 552 if env.get('CAN_INSTALL'):
2518 johnpye 427
2519 jpye 1442 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE','INSTALL_DOC']
2520 jpye 1436 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2521 jpye 1505 install_dirs += modeldirs + [Dir(env.subst("$INSTALL_ROOT$INSTALL_SOLVERS"))]
2522 johnpye 449
2523 johnpye 463 # TODO: add install options
2524     env.Alias('install',install_dirs)
2525 johnpye 400
2526 jpye 1436 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2527 johnpye 435
2528 jpye 1436 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2529 johnpye 683
2530 johnpye 438 #------------------------------------------------------
2531 johnpye 631 # WINDOWS INSTALLER
2532    
2533 jpye 1551 if not env.get('NSIS'):
2534     with_installer = False
2535     without_installer_reason = "NSIS not found"
2536    
2537 johnpye 631 if with_installer:
2538 jpye 1467 env.Append(NSISDEFINES={
2539     'OUTFILE':"#dist/"+env['WIN_INSTALLER_NAME']
2540     ,"VERSION":version
2541     ,'PYVERSION':pyversion
2542     })
2543 jpye 1570 installer = env.Installer('nsis/installer.nsi')
2544 jpye 1465 Depends(installer,["pygtk","tcltk","ascend.dll","models","ascend-config"])
2545     env.Alias('installer',installer)
2546 johnpye 631 else:
2547     print "Skipping... Windows installer isn't being built:",without_installer_reason
2548    
2549 jpye 1465
2550 johnpye 631 #------------------------------------------------------
2551 johnpye 673 # PROJECT FILE for MSVC
2552    
2553     env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2554    
2555     #------------------------------------------------------
2556 johnpye 438 # CREATE the SPEC file for generation of RPM packages
2557    
2558 johnpye 463 if platform.system()=="Linux":
2559     env.SubstInFile('ascend.spec.in')
2560 johnpye 552
2561     #------------------------------------------------------
2562 johnpye 816 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2563    
2564 jpye 1442 #if with_scrollkeeper:
2565     # #env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2566     # #env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2567 johnpye 816
2568     #------------------------------------------------------
2569 johnpye 552 # DISTRIBUTION TAR FILE
2570    
2571 johnpye 554 env['DISTTAR_FORMAT']='bz2'
2572 johnpye 556 env.Append(
2573 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']
2574 jpye 1417 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2575 johnpye 556 )
2576 johnpye 554
2577 johnpye 563 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2578 johnpye 556 , [env.Dir('#')]
2579 johnpye 554 )
2580    
2581 johnpye 680 env.Depends(tar,'ascend.spec')
2582 jpye 1442 env.Depends(tar,'#doc/book.pdf')
2583 johnpye 680
2584 jpye 1596 #------------------------------------------------------
2585 jpye 1622 # DISTRIBUTION TAR FILE (new style with AccumulateBuilder)
2586    
2587     # ...
2588    
2589     #------------------------------------------------------
2590 jpye 1596 # DEBIAN TARBALL for use with Build Service
2591 johnpye 862
2592 jpye 1596 import glob
2593     deb_manfiles = glob.glob('debian/*.man')
2594    
2595     deb_tar = env.Tar(
2596     'dist/debian.tar.gz'
2597 jpye 1609 ,deb_manfiles + ['debian/compat','debian/copyright','debian/dirs'
2598     ,'debian/postinst','debian/postrm']
2599 jpye 1596 ,TARFLAGS = ['cz']
2600     )
2601    
2602     Alias('dist',[tar,deb_tar])
2603    
2604 johnpye 554 #------------------------------------------------------
2605 jpye 1551 # DOCUMENTATION
2606 johnpye 816
2607    
2608 jpye 1551 if not with_doc_build:
2609     print "Skipping... Documentation isn't being built:",without_doc_build_reason
2610 jpye 1442
2611 jpye 1551 #user's manual
2612     env.SConscript('doc/SConscript',['env'])
2613 johnpye 766
2614 jpye 1551 # doxygen documentation
2615 johnpye 766 env.SConscript('base/doc/SConscript',['env'])
2616    
2617     #------------------------------------------------------
2618 johnpye 554 # RPM BUILD
2619    
2620 johnpye 766 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2621     # (check * for the version number used to create the tarball)
2622 johnpye 554
2623     #------------------------------------------------------
2624     # DEFAULT TARGETS
2625    
2626 jpye 1504 default_targets =['libascend','solvers']
2627 johnpye 629 if with_tcltk:
2628     default_targets.append('tcltk')
2629     if with_python:
2630     default_targets.append('pygtk')
2631 johnpye 631 if with_installer:
2632     default_targets.append('installer')
2633 johnpye 761 if with_extfns:
2634     default_targets.append('extfns')
2635 jpye 1443 if with_doc_build:
2636 jpye 1442 default_targets.append('doc')
2637 johnpye 554
2638 johnpye 629 env.Default(default_targets)
2639    
2640     print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2641    
2642 johnpye 705 # vim: set syntax=python:

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