/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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