/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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