/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1714 - (hide annotations) (download)
Tue Jan 8 02:48:20 2008 UTC (11 years, 11 months ago) by jpye
File size: 62476 byte(s)
Fix for different GraphViz include paths on Windows.
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 jpye 1713 ,"Where are your GRAPHVIZ include files? (don't need the final '/graphviz')"
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 jpye 1714 #ifdef __WIN32__
1279     # include <gvc.h>
1280     #else
1281     # include <graphviz/gvc.h>
1282     #endif
1283 johnpye 1109 int main(void){
1284 jpye 1678 Agraph_t *g;
1285     GVC_t *gvc;
1286     gvc = gvContext();
1287     g = agopen("g", AGDIGRAPH);
1288 johnpye 1109 return 0;
1289     }
1290     """
1291    
1292 jpye 1678 def CheckGraphViz(context):
1293     return CheckExtLib(context,'graphviz',graphviz_test_text,ext=".c")
1294 johnpye 1109
1295     #----------------
1296 jpye 1326 # ufsparse test
1297    
1298     ufsparse_test_text = """
1299     #include <ufsparse/cs.h>
1300     int main(void){
1301     cs *A,*B,*C;
1302     C = cs_multiply(A,B);
1303     return 0;
1304     }
1305     """
1306    
1307     def CheckUFSparse(context):
1308     return CheckExtLib(context
1309     ,libname='cxsparse'
1310     ,varprefix='ufsparse'
1311     ,text=ufsparse_test_text
1312     ,ext=".c"
1313     )
1314    
1315     #----------------
1316 johnpye 673 # MATH test
1317    
1318     math_test_text = """
1319 johnpye 705 #ifndef _ALL_SOURCE
1320     # define _ALL_SOURCE
1321     #endif
1322     #ifndef _XOPEN_SOURCE
1323     # define _XOPEN_SOURCE
1324     #endif
1325     #ifndef _XOPEN_SOURCE_EXTENDED
1326     # define _XOPEN_SOURCE_EXTENDED 1
1327     #endif
1328 johnpye 673 #include <math.h>
1329     int main(void){
1330 johnpye 705 double x = 1.0; double y = 1.0; int i = 1;
1331     acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
1332     j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
1333     y0(x); y1(x); yn(i,x);
1334 jpye 1420 /* this part causes problems with crossmingw... */
1335 johnpye 705 #ifdef _THREAD_SAFE
1336     gamma_r(x,&i);
1337     lgamma_r(x,&i);
1338     #else
1339     gamma(x);
1340     lgamma(x);
1341     #endif
1342     hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
1343 johnpye 673 return 0;
1344     }
1345     """
1346    
1347     def CheckMath(context):
1348 johnpye 832 context.Message('Checking for IEEE math library... ')
1349 johnpye 705 libsave=context.env.get('LIBS');
1350     context.env.AppendUnique(LIBS=['m'])
1351     is_ok=context.TryLink(math_test_text,".c")
1352     context.Result(is_ok)
1353     if not is_ok:
1354     context.env['LIBS']=libsave
1355     return is_ok
1356    
1357 johnpye 673 #----------------
1358 jpye 1656 # malloc.h test
1359    
1360     malloc_test_text = """
1361 jpye 1660 #include <stdlib.h>
1362 jpye 1656 int main(){
1363     double *x;
1364     x = malloc(sizeof(double)*5);
1365     x[4] = 3.3;
1366     free(x);
1367     }
1368     """
1369    
1370     def CheckMalloc(context):
1371     context.Message("Checking for malloc...")
1372     is_ok = context.TryLink(malloc_test_text,".c")
1373     context.Result(is_ok)
1374     return is_ok
1375    
1376     #----------------
1377     # dlopen test
1378    
1379     dlopen_test_text = """
1380     #ifdef __WIN32__
1381     # include <windows.h>
1382     #else
1383     # include <dlfcn.h>
1384     #endif
1385     int main(){
1386     #ifdef __WIN32__
1387     HINSTANCE d;
1388     LoadLibrary("imaginary_and_nonexistent.dll");
1389     #else
1390     void *d;
1391     d = dlopen("imaginary_and_nonexistent.so", 1);
1392     #endif
1393     return 0;
1394     }
1395     """
1396    
1397     def CheckDLOpen(context):
1398     context.Message("Checking for ability to load shared libraries at runtime...")
1399     libsave=context.env.get('LIBS');
1400     if platform.system()!="Windows":
1401     context.env.Append(LIBS=['dl'])
1402     is_ok = context.TryLink(dlopen_test_text,".c")
1403     context.Result(is_ok)
1404     context.env['LIBS'] = libsave
1405     return is_ok
1406    
1407     #----------------
1408 johnpye 957 # libpython test
1409    
1410     libpython_test_text = """
1411     #include <Python.h>
1412     int main(void){
1413     PyObject *p;
1414     p = Py_None;
1415     return 0;
1416     }
1417     """
1418    
1419     def CheckPythonLib(context):
1420     context.Message('Checking for libpython... ')
1421    
1422     if platform.system()=="Windows":
1423     python_lib='python%d%d'
1424     else:
1425     python_lib='python%d.%d'
1426 johnpye 958 python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])]
1427 johnpye 957
1428     python_cpppath = [distutils.sysconfig.get_python_inc()]
1429     cfig = distutils.sysconfig.get_config_vars()
1430    
1431     lastLIBS = context.env.get('LIBS')
1432     lastLIBPATH = context.env.get('LIBPATH')
1433     lastCPPPATH = context.env.get('CPPPATH')
1434 johnpye 959 lastLINKFLAGS = context.env.get('LINKFLAGS')
1435 johnpye 957
1436     python_libpath = []
1437 johnpye 959 python_linkflags = []
1438 johnpye 965 if platform.system()=="Windows":
1439 jpye 1551 python_libpath += [os.path.join(sys.prefix,"libs")]
1440 johnpye 965 else:
1441     # checked on Linux and SunOS
1442     if cfig['LDLIBRARY']==cfig['LIBRARY']:
1443     sys.stdout.write("(static)")
1444     python_libpath += [cfig['LIBPL']]
1445     python_linkflags += cfig['LIBS'].split(' ')
1446 johnpye 957
1447 johnpye 958 context.env.AppendUnique(LIBS=python_libs)
1448 johnpye 957 context.env.AppendUnique(LIBPATH=python_libpath)
1449     context.env.AppendUnique(CPPPATH=python_cpppath)
1450 johnpye 959 context.env.AppendUnique(LINKFLAGS=python_linkflags)
1451 johnpye 957 result = context.TryLink(libpython_test_text,".c");
1452    
1453 johnpye 958 context.Result(result)
1454 johnpye 957
1455     if(result):
1456 johnpye 958 context.env['PYTHON_LIBPATH']=python_libpath
1457     context.env['PYTHON_LIB']=python_libs
1458     context.env['PYTHON_CPPPATH']=python_cpppath
1459 johnpye 959 context.env['PYTHON_LINKFLAGS']=python_linkflags
1460 johnpye 957
1461     context.env['LIBS'] = lastLIBS
1462     context.env['LIBPATH'] = lastLIBPATH
1463     context.env['CPPPATH'] = lastCPPPATH
1464 johnpye 959 context.env['LINKFLAGS'] = lastLINKFLAGS
1465 johnpye 957
1466     return result
1467    
1468     #----------------
1469 johnpye 673 # IDA test
1470    
1471 johnpye 913 sundials_version_major_required = 2
1472     sundials_version_minor_min = 2
1473     sundials_version_minor_max = 3
1474    
1475     sundials_version_text = """
1476     #include <sundials/sundials_config.h>
1477     #include <stdio.h>
1478     int main(){
1479     printf("%s",SUNDIALS_PACKAGE_VERSION);
1480     return 0;
1481     }
1482     """
1483    
1484 johnpye 673 ida_test_text = """
1485 jpye 1400 #if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2
1486     # include <sundials/sundials_config.h>
1487     # include <sundials/sundials_nvector.h>
1488 jpye 1405 # include <nvector_serial.h>
1489 jpye 1400 # include <ida.h>
1490     # include <ida/ida_spgmr.h>
1491     #else
1492     # include <sundials/sundials_config.h>
1493     # include <nvector/nvector_serial.h>
1494 johnpye 907 # include <ida/ida.h>
1495 jpye 1400 #endif
1496 johnpye 673 int main(){
1497     void *ida_mem;
1498     ida_mem = IDACreate();
1499 johnpye 782 return 0;
1500 johnpye 673 }
1501     """
1502    
1503 johnpye 913 # slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS,
1504     # so detect the version and act accordingly.
1505 jpye 1400 def CheckSUNDIALS(context):
1506     keep = KeepContext(context,'SUNDIALS')
1507 jpye 1402 context.Message("Checking for SUNDIALS... ")
1508 johnpye 913 (is_ok,output) = context.TryRun(sundials_version_text,'.c')
1509     keep.restore(context)
1510     if not is_ok:
1511 jpye 1402 context.Result(0)
1512 johnpye 913 return 0
1513    
1514     major,minor,patch = tuple([int(i) for i in output.split(".")])
1515     context.env['SUNDIALS_VERSION_MAJOR'] = major
1516     context.env['SUNDIALS_VERSION_MINOR'] = minor
1517     if major != sundials_version_major_required \
1518     or minor < sundials_version_minor_min \
1519     or minor > sundials_version_minor_max:
1520     context.Result(output+" (bad version)")
1521     # bad version
1522     return 0
1523    
1524     # good version
1525 johnpye 1086 context.Result("%d.%d.%d, good" % (major,minor,patch))
1526 jpye 1400
1527 johnpye 913 return 1
1528    
1529 jpye 1400
1530     def CheckIDA(context):
1531 jpye 1402 context.Message( 'Checking for IDA... ' )
1532 jpye 1400
1533 jpye 1404 keep = KeepContext(context,"SUNDIALS")
1534 jpye 1400
1535     major = context.env['SUNDIALS_VERSION_MAJOR']
1536     minor = context.env['SUNDIALS_VERSION_MINOR']
1537    
1538 jpye 1404 cppdef = context.env.get('CPPDEFINES')
1539    
1540     context.env.Append(CPPDEFINES=[
1541     ('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR")
1542     ,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")
1543     ])
1544    
1545     context.env['SUNDIALS_CPPPATH_EXTRA']=[]
1546     if major==2 and minor==2:
1547     context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"])
1548    
1549 jpye 1400 context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")])
1550 jpye 1404 context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS'])
1551     context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA'])
1552 jpye 1400
1553     is_ok = context.TryLink(ida_test_text,".c")
1554     context.Result(is_ok)
1555    
1556 jpye 1404 if cppdef:
1557     context.env['CPPDEFINES']=cppdef
1558 jpye 1552 else:
1559     del context.env['CPPDEFINES']
1560    
1561 jpye 1400 keep.restore(context)
1562    
1563     return is_ok
1564    
1565    
1566 johnpye 673 #----------------
1567 johnpye 783 # CONOPT test
1568    
1569     conopt_test_text = """
1570 johnpye 800 #if !defined(_WIN32)
1571     # define FNAME_LCASE_DECOR
1572     #endif
1573    
1574 johnpye 783 #include <conopt.h>
1575     #include <stdlib.h>
1576     int main(){
1577     int s, *v, e;
1578     s = COIDEF_Size();
1579     v = (int *)malloc(s*sizeof(int));
1580     e = COIDEF_Ini(v);
1581     return e;
1582     }
1583     """
1584    
1585     def CheckCONOPT(context):
1586     context.Message( 'Checking for CONOPT... ' )
1587    
1588     keep = KeepContext(context,"CONOPT")
1589    
1590     is_ok = context.TryLink(conopt_test_text,".c")
1591     context.Result(is_ok)
1592    
1593     keep.restore(context)
1594    
1595     return is_ok
1596    
1597     #----------------
1598 jpye 1529 # IPOPT test
1599    
1600     ipopt_test_text = """
1601     #if !defined(_WIN32)
1602     # define FNAME_LCASE_DECOR
1603     #endif
1604    
1605     #include <ipopt/IpStdCInterface.h>
1606     int main(){
1607     Number n;
1608 jpye 1546 IpoptProblem nlp = 0;
1609 jpye 1529 FreeIpoptProblem(nlp); // probably a crash if you run this
1610     return 0;
1611     }
1612     """
1613    
1614     def CheckIPOPT(context):
1615     context.Message( 'Checking for IPOPT... ' )
1616    
1617     keep = KeepContext(context,"IPOPT")
1618     is_ok = context.TryLink(ipopt_test_text,".c")
1619     context.Result(is_ok)
1620    
1621     keep.restore(context)
1622    
1623     return is_ok
1624    
1625     #----------------
1626 johnpye 405 # Tcl test
1627 johnpye 404
1628 johnpye 561 # TCL and TK required version 8.1, 8.2, 8.3, or 8.4:
1629     tcltk_minor_newest_acceptable = 4
1630     tcltk_major_required = 8
1631    
1632 johnpye 404 tcl_check_text = r"""
1633     #include <tcl.h>
1634     #include <stdio.h>
1635     int main(void){
1636     printf("%s",TCL_PATCH_LEVEL);
1637     return 0;
1638     }
1639     """
1640    
1641     def CheckTcl(context):
1642 johnpye 521 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
1643 johnpye 405
1644     def CheckTclVersion(context):
1645 johnpye 521 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
1646 johnpye 405 context.Message("Checking Tcl version... ")
1647     (is_ok,output) = context.TryRun(tcl_check_text,'.c')
1648 johnpye 404 keep.restore(context)
1649     if not is_ok:
1650 johnpye 405 context.Result("failed to run check")
1651 johnpye 404 return 0
1652 johnpye 405
1653 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
1654 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1655 johnpye 428 context.Result(output+" (bad version)")
1656 johnpye 405 # bad version
1657     return 0
1658    
1659     # good version
1660 johnpye 552 context.Result(output+", good")
1661 johnpye 404 return 1
1662    
1663 johnpye 405 #----------------
1664 johnpye 463 # Tk test
1665 johnpye 405
1666     tk_check_text = r"""
1667     #include <tk.h>
1668     #include <stdio.h>
1669     int main(void){
1670     printf("%s",TK_PATCH_LEVEL);
1671     return 0;
1672     }
1673     """
1674     def CheckTk(context):
1675 johnpye 673 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
1676 johnpye 405
1677 johnpye 428
1678 johnpye 405 def CheckTkVersion(context):
1679 johnpye 521 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
1680 johnpye 405 context.Message("Checking Tk version... ")
1681 johnpye 521 #print "LINKFLAGS =",context.env['LINKFLAGS']
1682 johnpye 405 (is_ok,output) = context.TryRun(tk_check_text,'.c')
1683 johnpye 404 keep.restore(context)
1684     if not is_ok:
1685     context.Result("failed to run check")
1686     return 0
1687    
1688 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
1689 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1690 johnpye 404 # bad version
1691 johnpye 561 context.Result(output+" (bad version)")
1692 johnpye 404 return 0
1693 johnpye 400
1694 johnpye 404 # good version
1695 johnpye 561 context.Result(output+" (good)")
1696 johnpye 404 return 1
1697 johnpye 485
1698     #----------------
1699 johnpye 521 # Tktable test
1700    
1701     tktable_check_text = r"""
1702     #include <tkTable.h>
1703     #include <stdio.h>
1704     int main(void){
1705     Table mytable;
1706     return 0;
1707     }
1708     """
1709    
1710     def CheckTkTable(context):
1711     return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
1712    
1713     #---------------
1714     # X11 test
1715    
1716     x11_check_text = r"""
1717     #include <X11/Xlib.h>
1718     #include <X11/IntrinsicP.h>
1719     #include <X11/Intrinsic.h>
1720     #include <X11/ObjectP.h>
1721     #include <X11/Object.h>
1722     int main(void){
1723     Object mything;
1724     return 0;
1725     }
1726     """
1727    
1728     def CheckX11(context):
1729     return CheckExtLib(context,'X11',x11_check_text)
1730    
1731     #----------------
1732 johnpye 968 # Check that we can raise and catch sigint
1733    
1734     sigint_test_text = r"""
1735     #include <signal.h>
1736     #include <setjmp.h>
1737     #include <stdlib.h>
1738     static jmp_buf g_jmpenv;
1739     void sighandler(int sig){
1740     longjmp(g_jmpenv,sig);
1741     }
1742     void testsigint(){
1743     raise(SIGINT);
1744     }
1745     int main(void){
1746     signal(SIGINT,&sighandler);
1747     switch(setjmp(g_jmpenv)){
1748     case 0:
1749     testsigint();
1750     exit(1);
1751     case SIGINT:
1752     exit(0);
1753     default:
1754     exit(2);
1755     }
1756     }
1757     """
1758    
1759     def CheckSIGINT(context):
1760     context.Message("Checking SIGINT is catchable... ")
1761     (is_ok,output)=context.TryRun(sigint_test_text,".c")
1762     context.Result(is_ok)
1763     return is_ok
1764    
1765     #----------------
1766 johnpye 953 # Check that we're able to catch floating point errors
1767    
1768     sigfpe_test_text = r"""
1769     #include <signal.h>
1770     #include <setjmp.h>
1771     #include <stdlib.h>
1772     #include <fenv.h>
1773     static jmp_buf g_jmpenv;
1774     void fpehandler(int sig){
1775     longjmp(g_jmpenv,sig);
1776     }
1777     int main(void){
1778     fenv_t myfenv;
1779     fegetenv(&myfenv);
1780     fesetenv(&myfenv);
1781     feenableexcept(FE_ALL_EXCEPT);
1782     signal(SIGFPE,&fpehandler);
1783     double x;
1784     switch(setjmp(g_jmpenv)){
1785     case 0:
1786     x = 1.0 / 0.0;
1787     /* failed to catch */
1788     exit(1);
1789     case SIGFPE:
1790     exit(0);
1791     }
1792     }
1793     """
1794    
1795     def CheckFPE(context):
1796 johnpye 968 context.Message("Checking C99 FPE behaviour... ")
1797 johnpye 953 (is_ok,output) = context.TryRun(sigfpe_test_text,'.c')
1798     context.Result(is_ok)
1799     return is_ok
1800    
1801     #----------------
1802 johnpye 968 # signal reset needed?
1803    
1804     sigreset_test_text = r"""
1805     #include <signal.h>
1806     #include <setjmp.h>
1807     #include <stdlib.h>
1808     #include <stdio.h>
1809     typedef void SigHandlerFn(int);
1810     static jmp_buf g_jmpenv;
1811     void sighandler(int sig){
1812     longjmp(g_jmpenv,sig);
1813     }
1814     void testsigint(){
1815 johnpye 1002 /* fprintf(stderr,"Raising SIGINT\n"); */
1816 johnpye 968 raise(SIGINT);
1817     }
1818     int main(void){
1819     SigHandlerFn *last,*saved;
1820     saved = signal(SIGINT,&sighandler);
1821     if(saved!=SIG_DFL){
1822 johnpye 1002 fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL);
1823 johnpye 968 exit(3);
1824     }
1825     switch(setjmp(g_jmpenv)){
1826     case 0:
1827     testsigint();
1828     fprintf(stderr,"Back from SIGINT\n");
1829     exit(1);
1830     case SIGINT:
1831     break;
1832     default:
1833     exit(2);
1834     };
1835 johnpye 1002 last = signal(SIGINT,SIG_DFL);
1836 johnpye 968 if(last!=&sighandler){
1837     printf("1");
1838     exit(0);
1839     }
1840     printf("0");
1841     exit(0);
1842     }
1843     """
1844    
1845     def CheckSigReset(context):
1846     context.Message("Checking signal handler reset... ")
1847     (is_ok,output) = context.TryRun(sigreset_test_text,'.c')
1848     if not is_ok:
1849     context.Result("ERROR")
1850 johnpye 1260 return False
1851 johnpye 1002 if int(output)==1:
1852 johnpye 968 context.Result("required");
1853     context.env['ASC_RESETNEEDED'] = True
1854     else:
1855     context.Result("not required");
1856     context.env['ASC_RESETNEEDED'] = False
1857 jpye 1658 return True
1858 johnpye 968
1859     #----------------
1860 jpye 1442 # LyX on this system?
1861    
1862     def CheckLyx(context):
1863     context.Message("Checking for LyX... ")
1864     r = context.env.WhereIs("lyx")
1865 jpye 1469 if r:
1866     context.Result(r)
1867     else:
1868     context.Result(0)
1869 jpye 1442 return r
1870    
1871     #----------------
1872     # Latex2HTML on this system?
1873    
1874     def CheckLatex2HTML(context):
1875     context.Message("Checking for latex2html...")
1876     if context.env.WhereIs("latex2html"):
1877     r = True
1878     else:
1879     r = False
1880     context.Result(r)
1881     return r
1882    
1883     #----------------
1884 jpye 1701 # 'lmodern' package for LaTeX available?
1885    
1886     lmodern_test_text = """
1887     \documentclass{article}
1888     \title{Cartesian closed categories and the price of eggs}
1889     \author{Jane Doe}
1890     \date{September 1994}
1891     \begin{document}
1892     \maketitle
1893     Hello world!
1894     \end{document}
1895     """;
1896    
1897     def CheckLModern(context):
1898     context.Message("Checking for lmodern...")
1899     print env['BUILDERS']
1900     b = env['BUILDERS']["DVI"]
1901     print "Builder:",b
1902     is_ok,res = context.TryBuild(builder=b,text=lmodern_test_text,extension=".latex")
1903     context.Result(is_ok)
1904     return is_ok
1905    
1906     #----------------
1907 johnpye 485 # GCC Version sniffing
1908    
1909     # TODO FIXME
1910    
1911     gcc_version4 = False
1912    
1913 johnpye 398 #------------------------------------------------------
1914 johnpye 385 # CONFIGURATION
1915    
1916     conf = Configure(env
1917     , custom_tests = {
1918 jpye 1448 'CheckCC' : CheckCC
1919     , 'CheckCXX' : CheckCXX
1920 jpye 1641 , 'CheckF77' : CheckF77
1921 jpye 1448 , 'CheckMath' : CheckMath
1922 jpye 1656 , 'CheckMalloc' : CheckMalloc
1923     , 'CheckDLOpen' : CheckDLOpen
1924 johnpye 673 , 'CheckSwigVersion' : CheckSwigVersion
1925 johnpye 957 , 'CheckPythonLib' : CheckPythonLib
1926 johnpye 400 , 'CheckCUnit' : CheckCUnit
1927 johnpye 938 , 'CheckDMalloc' : CheckDMalloc
1928 jpye 1442 , 'CheckLyx' : CheckLyx
1929     , 'CheckLatex2HTML' : CheckLatex2HTML
1930 jpye 1701 , 'CheckLModern' : CheckLModern
1931 jpye 1678 , 'CheckGraphViz' : CheckGraphViz
1932 jpye 1326 , 'CheckUFSparse' : CheckUFSparse
1933 johnpye 404 , 'CheckTcl' : CheckTcl
1934     , 'CheckTclVersion' : CheckTclVersion
1935 johnpye 405 , 'CheckTk' : CheckTk
1936     , 'CheckTkVersion' : CheckTkVersion
1937 johnpye 502 , 'CheckGcc' : CheckGcc
1938 johnpye 500 , 'CheckGccVisibility' : CheckGccVisibility
1939 johnpye 502 , 'CheckYacc' : CheckYacc
1940 johnpye 1025 , 'CheckLex' : CheckLex
1941 johnpye 521 , 'CheckTkTable' : CheckTkTable
1942     , 'CheckX11' : CheckX11
1943 johnpye 673 , 'CheckIDA' : CheckIDA
1944 jpye 1400 , 'CheckSUNDIALS' : CheckSUNDIALS
1945 johnpye 783 , 'CheckCONOPT' : CheckCONOPT
1946 jpye 1529 , 'CheckIPOPT' : CheckIPOPT
1947 johnpye 816 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
1948 johnpye 953 , 'CheckFPE' : CheckFPE
1949 johnpye 968 , 'CheckSIGINT' : CheckSIGINT
1950     , 'CheckSigReset' : CheckSigReset
1951 johnpye 400 # , 'CheckIsNan' : CheckIsNan
1952     # , 'CheckCppUnitConfig' : CheckCppUnitConfig
1953 jpye 1691 }
1954 johnpye 459 # , config_h = "config.h"
1955 johnpye 385 )
1956    
1957 jpye 1357 def sconsversioncheck():
1958    
1959     # uncomment the following line to skip the version check:
1960     # return 1
1961    
1962     import SCons
1963     v = SCons.__version__.split(".")
1964     if v[0] != '0':
1965     return 0
1966 jpye 1431 if int(v[1]) >= 97:
1967     return 1
1968 jpye 1357 if v[1] != '96':
1969     return 0
1970     micro = int(v[2])
1971 jpye 1394 if micro == 92 or micro == 93 or micro == 96:
1972 jpye 1357 return 1;
1973     return 0
1974    
1975     if not sconsversioncheck():
1976     print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
1977     print "or consult the developers in the case of newer versions. Modify"
1978     print "the function 'sconsversioncheck' in the file SConstruct if you"
1979     print "want to *force* SCons to continue."
1980     Exit(1)
1981    
1982 jpye 1448 # check C compiler
1983    
1984 jpye 1654 if conf.CheckCC() is False:
1985 jpye 1448 print "Failed to build simple test file with your C compiler."
1986     print "Check your compiler is installed and running correctly."
1987     Exit(1)
1988    
1989 jpye 1654 if conf.CheckCXX() is False:
1990 jpye 1448 print "Failed to build simple test file with your C++ compiler."
1991     print "Check your compiler is installed and running correctly."
1992 jpye 1630 print "You can set your C++ compiler using the CXX scons option."
1993 jpye 1448 Exit(1)
1994    
1995 johnpye 740 # stdio -- just to check that compiler is behaving
1996 johnpye 398
1997 jpye 1654 if conf.CheckHeader('stdio.h') is False:
1998 johnpye 832 print "CPPPATH =",env.get('CPPPATH')
1999 johnpye 740 print "Did not find 'stdio.h'! Check your compiler configuration."
2000 johnpye 1080 print ""
2001     print "You environment is printed here:"
2002     for k,v in os.environ.iteritems():
2003     print "%-30s%s" % ("%s :" % k, v)
2004 johnpye 740 Exit(1)
2005    
2006 jpye 1654 if conf.CheckFunc('snprintf') is False:
2007 johnpye 1228 print "Didn't find snprintf";
2008     exit(1)
2009    
2010 jpye 1678 if conf.CheckFunc('strdup'):
2011     conf.env['HAVE_STRDUP'] = True
2012    
2013 johnpye 385 # Math library
2014    
2015 johnpye 1262 conf.env['HAVE_IEEE']=True
2016    
2017 jpye 1654 if need_libm and (conf.CheckMath() is False):
2018 johnpye 1232 conf.env['HAVE_IEEE']=False
2019 johnpye 1262 print 'Did not find math library, exiting!'
2020     Exit(1)
2021 johnpye 427
2022 jpye 1656 # Malloc
2023    
2024     if conf.CheckMalloc() is False:
2025     conf.env['HAVE_MALLOC']=False
2026     print "Did not find functioning 'malloc', exiting!"
2027     Exit(1)
2028    
2029     # dlopen/LoadLibrary
2030    
2031 jpye 1659 # CURRENTLY BREAKS LATER TEST (libsave?)
2032     #if conf.CheckDLOpen() is False:
2033     # print "Did not find functioning dlopen/LoadLibrary, exiting!"
2034     # Exit(1)
2035 jpye 1656
2036 johnpye 385 # Where is 'isnan'?
2037    
2038 jpye 1654 if conf.CheckFunc('isnan') is False and conf.CheckFunc('_isnan') is False:
2039 johnpye 385 print "Didn't find isnan"
2040 johnpye 414 # Exit(1)
2041 johnpye 385
2042 johnpye 500 # GCC visibility
2043    
2044 johnpye 502 if conf.CheckGcc():
2045     conf.env['HAVE_GCC']=True;
2046 johnpye 526 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
2047 johnpye 509 conf.env['HAVE_GCCVISIBILITY']=True;
2048     conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
2049     conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
2050 johnpye 709 conf.env.Append(CCFLAGS=['-Wall'])
2051 johnpye 500
2052 johnpye 968 # Catching SIGINT
2053    
2054 johnpye 1142 if env['WITH_SIGNALS']:
2055 jpye 1655 if not conf.CheckSIGINT():
2056 johnpye 1142 with_signals = False
2057     without_signals_reason = "SIGINT uncatchable"
2058 johnpye 968
2059 johnpye 953 # Catching SIGFPE
2060    
2061     if conf.CheckFPE():
2062 johnpye 968 conf.env['HAVE_C99FPE']=True
2063 johnpye 953 else:
2064 johnpye 968 conf.env['HAVE_C99FPE']=False
2065 johnpye 953
2066 johnpye 968 # Checking for signal reset requirement
2067    
2068 jpye 1654 if conf.CheckSigReset() is False:
2069 johnpye 968 print "Unable to determine if signal reset is required"
2070 johnpye 1260 Exit(1)
2071 johnpye 968
2072 johnpye 502 # YACC
2073    
2074 jpye 1552 if conf.CheckYacc():
2075 johnpye 502 conf.env['HAVE_YACC']=True
2076    
2077 jpye 1552 if conf.CheckLex():
2078 johnpye 1025 conf.env['HAVE_LEX']=True
2079 johnpye 502
2080 johnpye 387 # Tcl/Tk
2081 johnpye 386
2082 johnpye 586 if with_tcltk:
2083     if conf.CheckTcl():
2084     if conf.CheckTclVersion():
2085     if conf.CheckTk():
2086     if with_tcltk and conf.CheckTkVersion():
2087     if env['STATIC_TCLTK']:
2088     if conf.CheckTkTable():
2089     pass
2090     else:
2091     without_tcltk_reason = "TkTable not found"
2092     with_tcltk = False
2093     else:
2094     without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
2095     with_tcltk = False
2096 johnpye 521 else:
2097 johnpye 586 without_tcltk_reason = "Tk not found."
2098 johnpye 551 with_tcltk = False
2099 johnpye 428 else:
2100 johnpye 586 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
2101 johnpye 551 with_tcltk = False
2102 johnpye 586
2103 johnpye 428 else:
2104 johnpye 586 without_tcltk_reason = "Tcl not found."
2105 johnpye 551 with_tcltk = False
2106 johnpye 386
2107 johnpye 521 if env['STATIC_TCLTK']:
2108     conf.CheckX11()
2109    
2110 johnpye 395 # Python... obviously we're already running python, so we just need to
2111     # check that we can link to the python library OK:
2112    
2113 jpye 1655 if not conf.CheckPythonLib():
2114 johnpye 957 without_python_reason = 'libpython2.x not found or not linkable'
2115     with_python = False
2116 johnpye 982 env['WITH_PYTHON']=False
2117 johnpye 391
2118 johnpye 395 # SWIG version
2119    
2120 jpye 1656 if with_python and conf.CheckSwigVersion() is False:
2121 johnpye 413 without_python_reason = 'SWIG >= 1.3.24 is required'
2122     with_python = False
2123 johnpye 982 env['WITH_PYTHON']=False
2124 johnpye 413
2125 johnpye 400 # CUnit
2126    
2127 johnpye 593 if with_cunit:
2128 jpye 1655 if not conf.CheckCUnit():
2129 johnpye 427 without_cunit_reason = 'CUnit not found'
2130 johnpye 665 with_cunit = False
2131 johnpye 705 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
2132 johnpye 427
2133 johnpye 938 # DMALLOC
2134    
2135     if with_dmalloc:
2136 jpye 1655 if not conf.CheckDMalloc():
2137 johnpye 938 without_dmalloc_reason = 'dmalloc not found'
2138     with_dmalloc = False
2139    
2140 jpye 1678 # GRAPHVIZ
2141 johnpye 1109
2142 jpye 1678 if with_graphviz:
2143     if not conf.CheckGraphViz():
2144     without_graphviz_reason = 'graphviz not found'
2145     with_graphviz = False
2146     env['WITH_GRAPHVIZ'] = False
2147 johnpye 1109
2148 jpye 1326 # UFSPARSE
2149    
2150     if with_ufsparse:
2151 jpye 1655 if not conf.CheckUFSparse():
2152 jpye 1678 without_ufsparse_reason = 'ufsparse not found'
2153 jpye 1326 with_ufsparse = False
2154     env['WITH_UFSPARSE'] = False
2155    
2156 johnpye 673 # IDA
2157    
2158     if not with_ida:
2159     without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
2160 jpye 1655 elif not conf.CheckSUNDIALS():
2161 jpye 1400 with_ida = False
2162     without_ida_reason = "SUNDIALS not found, or bad version"
2163 jpye 1655 elif not conf.CheckIDA():
2164 johnpye 673 with_ida = False
2165 jpye 1400 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
2166 johnpye 673
2167 johnpye 797 # CONOPT
2168 johnpye 783
2169     if not with_conopt:
2170     without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
2171 jpye 1654 elif conf.CheckCONOPT() is False:
2172 jpye 1541 if conf.env.get('CONOPT_LINKED'):
2173     conf.env['CONOPT_LINKED'] = False
2174     # we no longer require CONOPT at buildtime in order to build support for it
2175     #with_conopt = False
2176     #without_conpt_reason = "CONOPT not found"
2177 johnpye 783
2178 jpye 1529 # IPOPT
2179    
2180     if not with_ipopt:
2181     without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
2182 jpye 1657 elif not conf.CheckIPOPT():
2183 jpye 1529 with_ipopt = False
2184     without_ipopt_reason = "IPOPT not found"
2185    
2186 johnpye 427 # BLAS
2187    
2188 johnpye 459 need_blas=False
2189 johnpye 673
2190     if with_lsode:
2191     need_fortran = True
2192 jpye 1641 need_fortran_reasons.append("LSODE")
2193 johnpye 459 need_blas=True
2194 johnpye 673
2195 johnpye 459 if need_blas:
2196     if conf.CheckLib('blas'):
2197     with_local_blas = False
2198     without_local_blas_reason = "Found BLAS installed on system"
2199     else:
2200     with_local_blas = True
2201     need_fortran = True
2202 jpye 1641 need_fortran_reasons.append("BLAS")
2203 johnpye 673 else:
2204     with_local_blas= False;
2205     without_local_blas_reason = "BLAS not required"
2206 johnpye 427
2207     # FORTRAN
2208    
2209     if need_fortran:
2210 johnpye 629 conf.env.Tool('fortran')
2211 jpye 1380 detect_fortran = conf.env.Detect(['gfortran','g77'])
2212 johnpye 427 if detect_fortran:
2213     # For some reason, g77 doesn't get detected properly on MinGW
2214 johnpye 673 if not env.has_key('F77') and not env.has_key('FORTRAN'):
2215 jpye 1357 print "Fixing detection of F77 on MinGW...(?)"
2216 johnpye 427 conf.env.Replace(F77=detect_fortran)
2217     conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
2218     conf.env.Replace(F77FLAGS='')
2219 johnpye 428 #print "F77:",conf.env['F77']
2220     #print "F77COM:",conf.env['F77COM']
2221     #print "F77FLAGS:",conf.env['F77FLAGS']
2222 johnpye 427 fortran_builder = Builder(
2223     action='$F77COM'
2224     , suffix='.o'
2225     , src_suffix='.f'
2226     )
2227     conf.env.Append(BUILDERS={'Fortran':fortran_builder})
2228 johnpye 1284 if platform.system()=="Linux":
2229     conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
2230 johnpye 427 else:
2231 johnpye 673 with_lsode=False;
2232     without_lsode_reason="FORTRAN-77 required but not found"
2233 johnpye 629
2234 jpye 1654 if need_fortran and conf.CheckF77() is False:
2235 jpye 1641 print "Failed to build simple test file with your Fortran compiler."
2236     print "Check your compiler is installed and running correctly."
2237     print "You can set your Fortran compiler using the FORTRAN scons option."
2238     print "The fortran compiler is REQUIRED to build:",", ".join(need_fortran_reasons)
2239     print "Perhaps try examining the value of your WITH_SOLVERS option (remove LSODE, etc)."
2240     Exit(1)
2241    
2242 johnpye 464 #else:
2243     # print "FORTRAN not required"
2244 johnpye 400
2245 johnpye 673 # F2C
2246    
2247     if need_fortran:
2248     if platform.system()=="Windows":
2249 jpye 1380 pass
2250     #conf.env.Append(LIBPATH='c:\mingw\lib')
2251 johnpye 673
2252 johnpye 816 # scrollkeeper
2253 johnpye 673
2254 johnpye 816 if with_scrollkeeper:
2255 jpye 1654 if conf.CheckScrollkeeperConfig() is False:
2256 johnpye 816 with_scrollkeeper=False
2257     without_scrollkeeper_reason="unable to detect scrollkeeper-config"
2258    
2259 jpye 1442 # lyx
2260    
2261 jpye 1470 if with_doc_build:
2262 jpye 1654 if conf.CheckLyx() is False:
2263 jpye 1470 with_doc_build = False
2264     without_doc_build_reason="unable to locate lyx"
2265 jpye 1442
2266     with_latext2html = conf.CheckLatex2HTML()
2267    
2268 jpye 1701 #if conf.CheckLModern() is False:
2269     # with_doc_build = False
2270     # without_doc_build_reason="'lmodern' is not available"
2271    
2272 johnpye 385 # TODO: -D_HPUX_SOURCE is needed
2273    
2274     # TODO: check size of void*
2275    
2276 johnpye 393 # TODO: detect if dynamic libraries are possible or not
2277    
2278 johnpye 427 if platform.system()=="Windows" and env.has_key('MSVS'):
2279 johnpye 740 _found_windows_h = conf.CheckHeader('Windows.h')
2280    
2281     if not _found_windows_h:
2282 johnpye 741 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
2283 johnpye 740 Exit(1)
2284 johnpye 741
2285 jpye 1654 if with_python and conf.CheckHeader(['basetsd.h','BaseTsd.h']) is False:
2286 johnpye 427 with_python = 0;
2287     without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
2288    
2289 johnpye 395 conf.Finish()
2290    
2291 johnpye 507 #---------------------------------------
2292     # SUBSTITUTION DICTIONARY for .in files
2293    
2294 johnpye 658 release = env.get('RELEASE')
2295     if release=="0.":
2296     release="0"
2297    
2298 johnpye 800 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
2299    
2300 johnpye 507 subst_dict = {
2301     '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
2302 jpye 1519 ,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS']
2303 johnpye 507 , '@GLADE_FILE@':'ascend.glade'
2304     , '@HELP_ROOT@':''
2305     , '@ICON_EXTENSION@':icon_extension
2306 johnpye 628 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
2307 johnpye 507 , '@INSTALL_BIN@':env['INSTALL_BIN']
2308     , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
2309 johnpye 683 , '@INSTALL_LIB@':env['INSTALL_LIB']
2310 johnpye 721 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
2311 jpye 1504 , '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS']
2312 johnpye 507 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
2313     , '@VERSION@':version
2314 johnpye 658 , '@RELEASE@':release
2315 johnpye 563 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
2316 jpye 1590 , '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation'
2317 johnpye 1228 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
2318     , '@SHLIBPREFIX@':env['SHLIBPREFIX']
2319 jpye 1597 , '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX']
2320     , '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX']
2321 johnpye 589 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
2322 johnpye 627 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
2323 johnpye 683 , '@PYTHON@' : python_exe
2324 jpye 1466 , '@PYVERSION@' : pyversion
2325 johnpye 800 , '@ASC_CONOPT_LIB@':env.get('CONOPT_LIB')
2326     , '@ASC_CONOPT_ENVVAR@':env.get('CONOPT_ENVVAR')
2327 jpye 1399 , '@ASC_CONOPT_DLPATH@':c_escape(env.subst("$CONOPT_DLPATH"))
2328 johnpye 1174 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
2329 jpye 1535 , '@WITH_SOLVERS@':",".join(env.get('WITH_SOLVERS'))
2330 jpye 1680 , '@WITH_GRAPHVIZ@': str(int(env.get('WITH_GRAPHVIZ')))
2331 johnpye 507 }
2332    
2333 jpye 1442 if env.get('WITH_DOC'):
2334     print "WITH_DOC:",env['WITH_DOC']
2335     subst_dict['@HELP_ROOT@']=env['HELP_ROOT']
2336 johnpye 507
2337 johnpye 597 # bool options...
2338 johnpye 673 for k,v in {
2339 johnpye 1142 'ASC_WITH_IDA':with_ida
2340     ,'ASC_WITH_DMALLOC':with_dmalloc
2341 jpye 1326 ,'ASC_WITH_UFSPARSE':with_ufsparse
2342 johnpye 1142 ,'ASC_WITH_CONOPT':with_conopt
2343 jpye 1541 ,'ASC_LINKED_CONOPT':env.get('CONOPT_LINKED')
2344 jpye 1529 ,'ASC_WITH_IPOPT':with_ipopt
2345 johnpye 1142 ,'ASC_WITH_LSODE':with_lsode
2346     ,'ASC_WITH_MMIO':with_mmio
2347     ,'ASC_SIGNAL_TRAPS':with_signals
2348     ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
2349     ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
2350 johnpye 1261 ,'HAVE_IEEE':env.get('HAVE_IEEE')
2351 jpye 1412 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
2352 johnpye 1142 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
2353     ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
2354     }.iteritems():
2355    
2356     if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
2357 johnpye 594
2358 johnpye 507 if with_python:
2359     subst_dict['@ASCXX_USE_PYTHON@']="1"
2360 johnpye 673 env['WITH_PYTHON']=1;
2361 johnpye 507
2362 jpye 1442 if with_latex2html:
2363     env['WITH_LATEX2HTML']=1
2364    
2365 johnpye 507 if env.has_key('HAVE_GCCVISIBILITY'):
2366     subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
2367    
2368     env.Append(SUBST_DICT=subst_dict)
2369    
2370 johnpye 1142 #for k,v in subst_dict.iteritems():
2371     # print "%-50s%s" % ("'%s'"%k,v)
2372 johnpye 829
2373 johnpye 1142 # REMOVED: long command-line support on Win2k
2374 johnpye 829
2375     #------------------------------------------------------
2376 johnpye 558 # RECIPE: SWIG scanner
2377    
2378     import SCons.Script
2379    
2380     SWIGScanner = SCons.Scanner.ClassicCPP(
2381     "SWIGScan"
2382     , ".i"
2383     , "CPPPATH"
2384     , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
2385     )
2386    
2387     env.Append(SCANNERS=[SWIGScanner])
2388    
2389     #------------------------------------------------------
2390 johnpye 463 # Recipe for 'CHMOD' ACTION
2391 johnpye 439
2392     import SCons
2393     from SCons.Script.SConscript import SConsEnvironment
2394     SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2395     lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2396    
2397     def InstallPerm(env, dest, files, perm):
2398     obj = env.Install(dest, files)
2399     for i in obj:
2400     env.AddPostAction(i, env.Chmod(str(i), perm))
2401    
2402     SConsEnvironment.InstallPerm = InstallPerm
2403    
2404     # define wrappers
2405     SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2406 johnpye 578 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2407 johnpye 629 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2408 johnpye 463
2409 johnpye 439 #------------------------------------------------------
2410 johnpye 463 # BUILD...
2411 johnpye 385
2412 johnpye 463 # so that #include <modulename/headername.h> works across all modules...
2413 johnpye 743 env.AppendUnique(CPPPATH=['#base/generic'])
2414 johnpye 385
2415 johnpye 508 if env['DEBUG']:
2416     env.Append(CCFLAGS=['-g'])
2417 jpye 1554 env.Append(LINKFLAGS=['-g'])
2418 johnpye 508
2419 johnpye 591 if env['GCOV']:
2420     env.Append(
2421     CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2422     , LIBS=['gcov']
2423     , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2424     )
2425    
2426 johnpye 673 if with_ida:
2427     env.Append(WITH_IDA=1)
2428    
2429 johnpye 783 if with_conopt:
2430     env.Append(WITH_CONOPT=1)
2431    
2432 jpye 1529 if with_ipopt:
2433     env.Append(WITH_IPOPT=1)
2434    
2435 johnpye 463 #-------------
2436     # TCL/TK GUI
2437 johnpye 385
2438 johnpye 551 if with_tcltk:
2439 johnpye 569 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2440 johnpye 391 else:
2441 johnpye 982 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2442 johnpye 386
2443 johnpye 463 #-------------
2444     # PYTHON INTERFACE
2445    
2446 johnpye 387 if with_python:
2447 johnpye 532 env.SConscript(['pygtk/SConscript'],'env')
2448 johnpye 391 else:
2449 johnpye 982 print "Skipping... Python bindings aren't being built:",without_python_reason
2450 johnpye 400
2451 johnpye 463 #------------
2452     # BASE/GENERIC SUBDIRECTORIES
2453    
2454 johnpye 673 libascend_env = env.Copy()
2455    
2456 johnpye 1316 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2457 johnpye 463
2458     srcs = []
2459     for d in dirs:
2460 johnpye 673 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2461 johnpye 463 srcs += heresrcs
2462    
2463     #-------------
2464 johnpye 673 # IMPORTED CODE: LSODE, BLAS, etc
2465    
2466 jpye 1509 #if with_lsode:
2467     # srcs += env.SConscript(['lsod/SConscript'],'env')
2468     # srcs += env.SConscript(['linpack/SConscript'],'env')
2469     #else:
2470     # print "Skipping... LSODE won't be built:", without_lsode_reason
2471 johnpye 673
2472     if with_local_blas:
2473 jpye 1515 env['blasobjs'] = env.SConscript(['blas/SConscript'],'env')
2474 johnpye 673 else:
2475 jpye 1515 env['blasobjs'] = []
2476 johnpye 673 print "Skipping... BLAS won't be built:", without_local_blas_reason
2477    
2478     if not with_ida:
2479     print "Skipping... IDA won't be built:", without_ida_reason
2480    
2481 johnpye 993 if with_mmio:
2482     srcs += env.SConscript(['mmio/SConscript'],'env')
2483     else:
2484     print "Skipping... MMIO export won't be built:", without_mmio_reason
2485 johnpye 673 #-------------
2486 johnpye 463 # LIBASCEND -- all base/generic functionality
2487    
2488 johnpye 938 if with_dmalloc:
2489     libascend_env.Append(LIBS=['dmalloc'])
2490    
2491 jpye 1326 if with_ufsparse:
2492     libascend_env.Append(LIBS=['cxsparse'])
2493    
2494 johnpye 673 libascend = libascend_env.SharedLibrary('ascend',srcs)
2495 johnpye 463
2496 jpye 1510 # for use in declaring dependent shared libraries in SConscript files (eg solvers/*/SConscript)
2497     env['libascend'] = libascend
2498    
2499 johnpye 673 env.Alias('libascend',libascend)
2500    
2501 johnpye 463 #-------------
2502 johnpye 761 # UNIT TESTS (C CODE)
2503 johnpye 463
2504 johnpye 593 if with_cunit:
2505 jpye 1638 testdirs = ['general','solver','utilities','linear','compiler']
2506 johnpye 593 testsrcs = []
2507 johnpye 400 for testdir in testdirs:
2508     path = 'base/generic/'+testdir+'/test/'
2509     env.SConscript([path+'SConscript'],'env')
2510 johnpye 593 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2511    
2512     #print "TESTSRCS =",testsrcs
2513    
2514 johnpye 400 env.SConscript(['test/SConscript'],'env')
2515     env.SConscript(['base/generic/test/SConscript'],'env')
2516 johnpye 593
2517     env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2518 johnpye 400
2519     else:
2520 johnpye 427 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2521 johnpye 400
2522 johnpye 761 #-------------
2523 jpye 1504 # EXTERNAL SOLVERS
2524    
2525     env['extfns']=[]
2526    
2527 jpye 1505 env.SConscript(['solvers/SConscript'],'env')
2528 jpye 1504
2529     #-------------
2530 johnpye 761 # EXTERNAL FUNCTIONS
2531    
2532 johnpye 811 modeldirs = env.SConscript(['models/SConscript'],'env')
2533    
2534     if not with_extfns:
2535 johnpye 761 print "Skipping... External modules aren't being built:",without_extfns_reason
2536    
2537 johnpye 811 env.Alias('extfns',env['extfns'])
2538 johnpye 761
2539 johnpye 463 #------------------------------------------------------
2540 johnpye 683 # CREATE ASCEND-CONFIG scriptlet
2541    
2542     ascendconfig = env.SubstInFile('ascend-config.in')
2543    
2544 jpye 1625
2545 johnpye 683 #------------------------------------------------------
2546 jpye 1625 # CREATE asc4dev scriptlet
2547    
2548     asc4devcmd = env.SubstInFile('tcltk/asc4dev.in')
2549     env.AddPostAction(asc4devcmd, 'chmod 755 $TARGET')
2550     #------------------------------------------------------
2551 johnpye 463 # INSTALLATION
2552 johnpye 427
2553 johnpye 552 if env.get('CAN_INSTALL'):
2554 johnpye 427
2555 jpye 1442 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE','INSTALL_DOC']
2556 jpye 1436 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2557 jpye 1505 install_dirs += modeldirs + [Dir(env.subst("$INSTALL_ROOT$INSTALL_SOLVERS"))]
2558 johnpye 449
2559 johnpye 463 # TODO: add install options
2560     env.Alias('install',install_dirs)
2561 johnpye 400
2562 jpye 1436 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2563 johnpye 435
2564 jpye 1436 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2565 johnpye 683
2566 johnpye 438 #------------------------------------------------------
2567 johnpye 631 # WINDOWS INSTALLER
2568    
2569 jpye 1551 if not env.get('NSIS'):
2570     with_installer = False
2571     without_installer_reason = "NSIS not found"
2572    
2573 johnpye 631 if with_installer:
2574 jpye 1467 env.Append(NSISDEFINES={
2575     'OUTFILE':"#dist/"+env['WIN_INSTALLER_NAME']
2576     ,"VERSION":version
2577     ,'PYVERSION':pyversion
2578     })
2579 jpye 1570 installer = env.Installer('nsis/installer.nsi')
2580 jpye 1465 Depends(installer,["pygtk","tcltk","ascend.dll","models","ascend-config"])
2581     env.Alias('installer',installer)
2582 johnpye 631 else:
2583     print "Skipping... Windows installer isn't being built:",without_installer_reason
2584    
2585 jpye 1465
2586 johnpye 631 #------------------------------------------------------
2587 johnpye 673 # PROJECT FILE for MSVC
2588    
2589     env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2590    
2591     #------------------------------------------------------
2592 johnpye 438 # CREATE the SPEC file for generation of RPM packages
2593    
2594 johnpye 463 if platform.system()=="Linux":
2595     env.SubstInFile('ascend.spec.in')
2596 johnpye 552
2597     #------------------------------------------------------
2598 johnpye 816 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2599    
2600 jpye 1442 #if with_scrollkeeper:
2601     # #env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2602     # #env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2603 johnpye 816
2604     #------------------------------------------------------
2605 johnpye 552 # DISTRIBUTION TAR FILE
2606    
2607 johnpye 554 env['DISTTAR_FORMAT']='bz2'
2608 johnpye 556 env.Append(
2609 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']
2610 jpye 1417 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2611 johnpye 556 )
2612 johnpye 554
2613 johnpye 563 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2614 johnpye 556 , [env.Dir('#')]
2615 johnpye 554 )
2616    
2617 johnpye 680 env.Depends(tar,'ascend.spec')
2618 jpye 1442 env.Depends(tar,'#doc/book.pdf')
2619 johnpye 680
2620 jpye 1596 #------------------------------------------------------
2621 jpye 1622 # DISTRIBUTION TAR FILE (new style with AccumulateBuilder)
2622    
2623     # ...
2624    
2625     #------------------------------------------------------
2626 jpye 1596 # DEBIAN TARBALL for use with Build Service
2627 johnpye 862
2628 jpye 1596 import glob
2629     deb_manfiles = glob.glob('debian/*.man')
2630    
2631     deb_tar = env.Tar(
2632     'dist/debian.tar.gz'
2633 jpye 1609 ,deb_manfiles + ['debian/compat','debian/copyright','debian/dirs'
2634     ,'debian/postinst','debian/postrm']
2635 jpye 1596 ,TARFLAGS = ['cz']
2636     )
2637    
2638     Alias('dist',[tar,deb_tar])
2639    
2640 johnpye 554 #------------------------------------------------------
2641 jpye 1551 # DOCUMENTATION
2642 johnpye 816
2643    
2644 jpye 1551 if not with_doc_build:
2645     print "Skipping... Documentation isn't being built:",without_doc_build_reason
2646 jpye 1442
2647 jpye 1551 #user's manual
2648     env.SConscript('doc/SConscript',['env'])
2649 johnpye 766
2650 jpye 1551 # doxygen documentation
2651 johnpye 766 env.SConscript('base/doc/SConscript',['env'])
2652    
2653     #------------------------------------------------------
2654 johnpye 554 # RPM BUILD
2655    
2656 johnpye 766 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2657     # (check * for the version number used to create the tarball)
2658 johnpye 554
2659     #------------------------------------------------------
2660     # DEFAULT TARGETS
2661    
2662 jpye 1504 default_targets =['libascend','solvers']
2663 johnpye 629 if with_tcltk:
2664     default_targets.append('tcltk')
2665     if with_python:
2666     default_targets.append('pygtk')
2667 johnpye 631 if with_installer:
2668     default_targets.append('installer')
2669 johnpye 761 if with_extfns:
2670     default_targets.append('extfns')
2671 jpye 1443 if with_doc_build:
2672 jpye 1442 default_targets.append('doc')
2673 johnpye 554
2674 johnpye 629 env.Default(default_targets)
2675    
2676     print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2677    
2678 johnpye 705 # vim: set syntax=python:

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