/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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