/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1638 - (hide annotations) (download)
Thu Nov 8 12:08:19 2007 UTC (17 years, 5 months ago) by jpye
File size: 58909 byte(s)
Added CUnit test suite for 'compiler' module.
Added a couple of *very* preliminary tests.
Removed some debug output from packages.c
Fixed a #include missing from module.h.
Added a couple of missing #ifdef __cplusplus from test header files.
Added little bit of test code into relman_hessian_count (still active).

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

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