/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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