/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1638 - (show annotations) (download)
Thu Nov 8 12:08:19 2007 UTC (12 years, 1 month ago) by jpye
File size: 58909 byte(s)
Added CUnit test suite for 'compiler' module.
Added a couple of *very* preliminary tests.
Removed some debug output from packages.c
Fixed a #include missing from module.h.
Added a couple of missing #ifdef __cplusplus from test header files.
Added little bit of test code into relman_hessian_count (still active).

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')=="MINGW32":
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
916 #----------------
917 # CC
918
919 cc_test_text = """
920 int main(void){
921 return 0;
922 }
923 """;
924
925 def CheckCC(context):
926 context.Message("Checking C compiler ('%s')... " % context.env.get('CC'))
927 is_ok = context.TryCompile(cc_test_text,".c")
928 context.Result(is_ok)
929 return is_ok
930
931 #----------------
932 # CXX
933
934 cxx_test_text = """
935 template<class X>
936 class pair{
937 public:
938 X a;
939 X b;
940 };
941
942 int main(void){
943 pair<double> P;
944 P.a = 0;
945 return 0;
946 }
947 """;
948
949 def CheckCXX(context):
950 context.Message("Checking C++ compiler ('%s')... " % context.env.get('CXX'))
951 if not context.env.get('CXX'):
952 context.Result("not found")
953 return False
954 is_ok = context.TryCompile(cxx_test_text,".cpp")
955 context.Result(is_ok)
956 return is_ok
957
958
959
960 #----------------
961 # SWIG
962
963 import os,re
964
965 def get_swig_version(env):
966 cmd = env['SWIG']+' -version'
967 (cin,coutcerr) = os.popen4(cmd)
968 output = coutcerr.read()
969
970 restr = "SWIG\\s+Version\\s+(?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<pat>[0-9]+)\\s*$"
971 expr = re.compile(restr,re.M);
972 m = expr.search(output);
973 if not m:
974 return None
975 maj = int(m.group('maj'))
976 min = int(m.group('min'))
977 pat = int(m.group('pat'))
978
979 return (maj,min,pat)
980
981
982 def CheckSwigVersion(context):
983
984 try:
985 context.Message("Checking version of SWIG... ")
986 maj,min,pat = get_swig_version(context.env)
987 except:
988 context.Result("Failed to detect version, or failed to run SWIG")
989 return 0;
990
991 context.env['SWIGVERSION']=tuple([maj,min,pat])
992
993 if maj == 1 and (
994 min > 3
995 or (min == 3 and pat >= 24)
996 ):
997 context.Result("ok, %d.%d.%d" % (maj,min,pat))
998 return 1;
999 else:
1000 context.Result("too old, %d.%d.%d" % (maj,min,pat))
1001 return 0;
1002
1003 #----------------
1004 # Scrollkeeper (Linux documentation system)
1005
1006 def get_scrollkeeper_omfdir(env):
1007 cmd = 'scrollkeeper-config --omfdir'
1008 (cin,coutcerr) = os.popen4(cmd)
1009 output = coutcerr.read()
1010 return output.strip()
1011
1012 def CheckScrollkeeperConfig(context):
1013 try:
1014 context.Message("Checking for scrollkeeper...")
1015 dir=get_scrollkeeper_omfdir(context.env)
1016 except:
1017 context.Result("Failed to run 'scrollkeeper-config'")
1018 return 0
1019 context.env['OMFDIR']=dir
1020 context.Result("OK, %s" % dir)
1021 return 1
1022
1023 #----------------
1024 # General purpose library-and-header test
1025
1026 class KeepContext:
1027 def __init__(self,context,varprefix,static=False):
1028 self.keep = {}
1029 for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']:
1030 #print "Keeping env %s = %s" % (k,context.env.get(k))
1031 self.keep[k]=context.env.get(k)
1032
1033 if context.env.has_key(varprefix+'_CPPPATH'):
1034 context.env.AppendUnique(CPPPATH=[env[varprefix+'_CPPPATH']])
1035 #print "Adding '"+str(env[varprefix+'_CPPPATH'])+"' to cpp path"
1036
1037 if static:
1038 staticlib=env[varprefix+'_LIB']
1039 #print "STATIC LIB = ",staticlib
1040 context.env.Append(
1041 LINKFLAGS=[staticlib]
1042 )
1043 else:
1044 if context.env.has_key(varprefix+'_LIBPATH'):
1045 context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']])
1046 #print "Adding '"+str(env[varprefix+'_LIBPATH'])+"' to lib path"
1047
1048 if context.env.has_key(varprefix+'_LIB'):
1049 context.env.Append(LIBS=[env[varprefix+'_LIB']])
1050 #print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs"
1051 elif context.env.has_key(varprefix+'_LIBS'):
1052 context.env.AppendUnique(LIBS=env[varprefix+'_LIBS'])
1053
1054 def restore(self,context):
1055 #print "RESTORING CONTEXT"
1056 #print self.keep
1057 #print "..."
1058 for k in self.keep:
1059 if self.keep[k]==None:
1060 if context.env.has_key(k):
1061 #print "Clearing "+str(k)
1062 del context.env[k];
1063 else:
1064 #print "Restoring %s to '%s'" %(k,self.keep.get(k))
1065 context.env[k]=self.keep[k];
1066
1067 def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False):
1068 """This method will check for variables LIBNAME_LIBPATH
1069 and LIBNAME_CPPPATH and try to compile and link the
1070 file with the provided text, linking with the
1071 library libname."""
1072
1073 if static:
1074 context.Message( 'Checking for static '+libname+'... ' )
1075 else:
1076 context.Message( 'Checking for '+libname+'... ' )
1077
1078 if varprefix==None:
1079 varprefix = libname.upper()
1080
1081 #print "LIBS is currently:",context.env.get('LIBS')
1082 keep = KeepContext(context,varprefix,static)
1083
1084 if not context.env.has_key(varprefix+'_LIB'):
1085 # if varprefix_LIB were in env, KeepContext would
1086 # have appended it already
1087 context.env.Append(LIBS=[libname])
1088
1089 is_ok = context.TryLink(text,ext)
1090
1091 #print "Link success? ",(is_ok != 0)
1092
1093 keep.restore(context)
1094
1095 # print "Restored CPPPATH="+str(context.env['CPPPATH'])
1096 # print "Restored LIBS="+str(context.env['LIBS'])
1097 # print "Restored LIBPATH="+str(context.env['LIBPATH'])
1098
1099 context.Result(is_ok)
1100 return is_ok
1101
1102 #----------------
1103 # GCC
1104
1105 gcc_test_text = """
1106 #ifndef __GNUC__
1107 # error "Not using GCC"
1108 #endif
1109
1110 int main(void){
1111 return __GNUC__;
1112 }
1113 """
1114
1115 def CheckGcc(context):
1116 context.Message("Checking for GCC... ")
1117 is_ok = context.TryCompile(gcc_test_text,".c")
1118 context.Result(is_ok)
1119 return is_ok
1120
1121 #----------------
1122 # GCC VISIBILITY feature
1123
1124 gccvisibility_test_text = """
1125 #if __GNUC__ < 4
1126 # error "Require GCC version 4 or newer"
1127 #endif
1128
1129 __attribute__ ((visibility("default"))) int x;
1130
1131 int main(void){
1132 extern int x;
1133 x = 4;
1134 }
1135 """
1136
1137 def CheckGccVisibility(context):
1138 context.Message("Checking for GCC 'visibility' capability... ")
1139 if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']:
1140 context.Result("disabled")
1141 return 0
1142 is_ok = context.TryCompile(gccvisibility_test_text,".c")
1143 context.Result(is_ok)
1144 return is_ok
1145
1146 #----------------
1147 # YACC
1148
1149 yacc_test_text = """
1150 %{
1151 #include <stdio.h>
1152
1153 /* MSVC++ needs this before it can swallow Bison output */
1154 #ifdef _MSC_VER
1155 # define __STDC__
1156 #endif
1157 %}
1158 %token MSG
1159 %start ROOT
1160 %%
1161 ROOT:
1162 MSG { printf("HELLO"); }
1163 ;
1164 %%
1165 """
1166
1167 def CheckYacc(context):
1168 context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
1169 is_ok = context.TryCompile(yacc_test_text,".y")
1170 context.Result(is_ok)
1171 return is_ok
1172
1173 #----------------
1174 # LEX
1175
1176 lex_test_text = """
1177 %{
1178 #include <stdio.h>
1179 %}
1180 DIGIT [0-9]
1181 ID [a-z][a-z0-9]*
1182 %%
1183 {DIGIT}+ {
1184 printf("A digit: %s\\n",yytext);
1185 }
1186
1187 [ \\t\\n]+ /* ignore */
1188
1189 . {
1190 printf("Unrecognized guff");
1191 }
1192 %%
1193 main(){
1194 yylex();
1195 }
1196 """
1197
1198 def CheckLex(context):
1199 context.Message("Checking for Lex ('%s')... " % context.env.get('LEX'))
1200 is_ok = context.TryCompile(lex_test_text,".l")
1201 context.Result(is_ok)
1202 return is_ok
1203
1204 #----------------
1205 # CUnit test
1206
1207 cunit_test_text = """
1208 #include <CUnit/CUnit.h>
1209 int maxi(int i1, int i2){
1210 return (i1 > i2) ? i1 : i2;
1211 }
1212
1213 void test_maxi(void){
1214 CU_ASSERT(maxi(0,2) == 2);
1215 CU_ASSERT(maxi(0,-2) == 0);
1216 CU_ASSERT(maxi(2,2) == 2);
1217
1218 }
1219 int main(void){
1220 /* CU_initialize_registry() */
1221 return 0;
1222 }
1223 """
1224
1225 def CheckCUnit(context):
1226 return CheckExtLib(context,'cunit',cunit_test_text)
1227
1228 #----------------
1229 # dmalloc test
1230
1231 dmalloc_test_text = """
1232 #include <stdlib.h>
1233 #include <dmalloc.h>
1234
1235 int main(void){
1236 char *c;
1237 c = malloc(100*sizeof(char));
1238 free(c);
1239 return 0;
1240 }
1241 """
1242
1243 def CheckDMalloc(context):
1244 return CheckExtLib(context,'dmalloc',dmalloc_test_text)
1245
1246 #----------------
1247 # mfgraph test
1248
1249 mfgraph_test_text = """
1250 #include <mfgraph/mfg_draw_graph.h>
1251 int main(void){
1252 using namespace mfg;
1253 DrawGraph g;
1254 return 0;
1255 }
1256 """
1257
1258 def CheckMFGraph(context):
1259 return CheckExtLib(context,'mfgraph',mfgraph_test_text,ext=".cpp")
1260
1261 #----------------
1262 # ufsparse test
1263
1264 ufsparse_test_text = """
1265 #include <ufsparse/cs.h>
1266 int main(void){
1267 cs *A,*B,*C;
1268 C = cs_multiply(A,B);
1269 return 0;
1270 }
1271 """
1272
1273 def CheckUFSparse(context):
1274 return CheckExtLib(context
1275 ,libname='cxsparse'
1276 ,varprefix='ufsparse'
1277 ,text=ufsparse_test_text
1278 ,ext=".c"
1279 )
1280
1281 #----------------
1282 # MATH test
1283
1284 math_test_text = """
1285 #ifndef _ALL_SOURCE
1286 # define _ALL_SOURCE
1287 #endif
1288 #ifndef _XOPEN_SOURCE
1289 # define _XOPEN_SOURCE
1290 #endif
1291 #ifndef _XOPEN_SOURCE_EXTENDED
1292 # define _XOPEN_SOURCE_EXTENDED 1
1293 #endif
1294 #include <math.h>
1295 int main(void){
1296 double x = 1.0; double y = 1.0; int i = 1;
1297 acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
1298 j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
1299 y0(x); y1(x); yn(i,x);
1300 /* this part causes problems with crossmingw... */
1301 #ifdef _THREAD_SAFE
1302 gamma_r(x,&i);
1303 lgamma_r(x,&i);
1304 #else
1305 gamma(x);
1306 lgamma(x);
1307 #endif
1308 hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
1309 return 0;
1310 }
1311 """
1312
1313 def CheckMath(context):
1314 context.Message('Checking for IEEE math library... ')
1315 libsave=context.env.get('LIBS');
1316 context.env.AppendUnique(LIBS=['m'])
1317 is_ok=context.TryLink(math_test_text,".c")
1318 context.Result(is_ok)
1319 if not is_ok:
1320 context.env['LIBS']=libsave
1321 return is_ok
1322
1323 #----------------
1324 # libpython test
1325
1326 libpython_test_text = """
1327 #include <Python.h>
1328 int main(void){
1329 PyObject *p;
1330 p = Py_None;
1331 return 0;
1332 }
1333 """
1334
1335 def CheckPythonLib(context):
1336 context.Message('Checking for libpython... ')
1337
1338 if platform.system()=="Windows":
1339 python_lib='python%d%d'
1340 else:
1341 python_lib='python%d.%d'
1342 python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])]
1343
1344 python_cpppath = [distutils.sysconfig.get_python_inc()]
1345 cfig = distutils.sysconfig.get_config_vars()
1346
1347 lastLIBS = context.env.get('LIBS')
1348 lastLIBPATH = context.env.get('LIBPATH')
1349 lastCPPPATH = context.env.get('CPPPATH')
1350 lastLINKFLAGS = context.env.get('LINKFLAGS')
1351
1352 python_libpath = []
1353 python_linkflags = []
1354 if platform.system()=="Windows":
1355 python_libpath += [os.path.join(sys.prefix,"libs")]
1356 else:
1357 # checked on Linux and SunOS
1358 if cfig['LDLIBRARY']==cfig['LIBRARY']:
1359 sys.stdout.write("(static)")
1360 python_libpath += [cfig['LIBPL']]
1361 python_linkflags += cfig['LIBS'].split(' ')
1362
1363 context.env.AppendUnique(LIBS=python_libs)
1364 context.env.AppendUnique(LIBPATH=python_libpath)
1365 context.env.AppendUnique(CPPPATH=python_cpppath)
1366 context.env.AppendUnique(LINKFLAGS=python_linkflags)
1367 result = context.TryLink(libpython_test_text,".c");
1368
1369 context.Result(result)
1370
1371 if(result):
1372 context.env['PYTHON_LIBPATH']=python_libpath
1373 context.env['PYTHON_LIB']=python_libs
1374 context.env['PYTHON_CPPPATH']=python_cpppath
1375 context.env['PYTHON_LINKFLAGS']=python_linkflags
1376
1377 context.env['LIBS'] = lastLIBS
1378 context.env['LIBPATH'] = lastLIBPATH
1379 context.env['CPPPATH'] = lastCPPPATH
1380 context.env['LINKFLAGS'] = lastLINKFLAGS
1381
1382 return result
1383
1384 #----------------
1385 # IDA test
1386
1387 sundials_version_major_required = 2
1388 sundials_version_minor_min = 2
1389 sundials_version_minor_max = 3
1390
1391 sundials_version_text = """
1392 #include <sundials/sundials_config.h>
1393 #include <stdio.h>
1394 int main(){
1395 printf("%s",SUNDIALS_PACKAGE_VERSION);
1396 return 0;
1397 }
1398 """
1399
1400 ida_test_text = """
1401 #if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2
1402 # include <sundials/sundials_config.h>
1403 # include <sundials/sundials_nvector.h>
1404 # include <nvector_serial.h>
1405 # include <ida.h>
1406 # include <ida/ida_spgmr.h>
1407 #else
1408 # include <sundials/sundials_config.h>
1409 # include <nvector/nvector_serial.h>
1410 # include <ida/ida.h>
1411 #endif
1412 int main(){
1413 void *ida_mem;
1414 ida_mem = IDACreate();
1415 return 0;
1416 }
1417 """
1418
1419 # slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS,
1420 # so detect the version and act accordingly.
1421 def CheckSUNDIALS(context):
1422 keep = KeepContext(context,'SUNDIALS')
1423 context.Message("Checking for SUNDIALS... ")
1424 (is_ok,output) = context.TryRun(sundials_version_text,'.c')
1425 keep.restore(context)
1426 if not is_ok:
1427 context.Result(0)
1428 return 0
1429
1430 major,minor,patch = tuple([int(i) for i in output.split(".")])
1431 context.env['SUNDIALS_VERSION_MAJOR'] = major
1432 context.env['SUNDIALS_VERSION_MINOR'] = minor
1433 if major != sundials_version_major_required \
1434 or minor < sundials_version_minor_min \
1435 or minor > sundials_version_minor_max:
1436 context.Result(output+" (bad version)")
1437 # bad version
1438 return 0
1439
1440 # good version
1441 context.Result("%d.%d.%d, good" % (major,minor,patch))
1442
1443 return 1
1444
1445
1446 def CheckIDA(context):
1447 context.Message( 'Checking for IDA... ' )
1448
1449 keep = KeepContext(context,"SUNDIALS")
1450
1451 major = context.env['SUNDIALS_VERSION_MAJOR']
1452 minor = context.env['SUNDIALS_VERSION_MINOR']
1453
1454 cppdef = context.env.get('CPPDEFINES')
1455
1456 context.env.Append(CPPDEFINES=[
1457 ('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR")
1458 ,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")
1459 ])
1460
1461 context.env['SUNDIALS_CPPPATH_EXTRA']=[]
1462 if major==2 and minor==2:
1463 context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"])
1464
1465 context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")])
1466 context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS'])
1467 context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA'])
1468
1469 is_ok = context.TryLink(ida_test_text,".c")
1470 context.Result(is_ok)
1471
1472 if cppdef:
1473 context.env['CPPDEFINES']=cppdef
1474 else:
1475 del context.env['CPPDEFINES']
1476
1477 keep.restore(context)
1478
1479 return is_ok
1480
1481
1482 #----------------
1483 # CONOPT test
1484
1485 conopt_test_text = """
1486 #if !defined(_WIN32)
1487 # define FNAME_LCASE_DECOR
1488 #endif
1489
1490 #include <conopt.h>
1491 #include <stdlib.h>
1492 int main(){
1493 int s, *v, e;
1494 s = COIDEF_Size();
1495 v = (int *)malloc(s*sizeof(int));
1496 e = COIDEF_Ini(v);
1497 return e;
1498 }
1499 """
1500
1501 def CheckCONOPT(context):
1502 context.Message( 'Checking for CONOPT... ' )
1503
1504 keep = KeepContext(context,"CONOPT")
1505
1506 is_ok = context.TryLink(conopt_test_text,".c")
1507 context.Result(is_ok)
1508
1509 keep.restore(context)
1510
1511 return is_ok
1512
1513 #----------------
1514 # IPOPT test
1515
1516 ipopt_test_text = """
1517 #if !defined(_WIN32)
1518 # define FNAME_LCASE_DECOR
1519 #endif
1520
1521 #include <ipopt/IpStdCInterface.h>
1522 int main(){
1523 Number n;
1524 IpoptProblem nlp = 0;
1525 FreeIpoptProblem(nlp); // probably a crash if you run this
1526 return 0;
1527 }
1528 """
1529
1530 def CheckIPOPT(context):
1531 context.Message( 'Checking for IPOPT... ' )
1532
1533 keep = KeepContext(context,"IPOPT")
1534 is_ok = context.TryLink(ipopt_test_text,".c")
1535 context.Result(is_ok)
1536
1537 keep.restore(context)
1538
1539 return is_ok
1540
1541 #----------------
1542 # Tcl test
1543
1544 # TCL and TK required version 8.1, 8.2, 8.3, or 8.4:
1545 tcltk_minor_newest_acceptable = 4
1546 tcltk_major_required = 8
1547
1548 tcl_check_text = r"""
1549 #include <tcl.h>
1550 #include <stdio.h>
1551 int main(void){
1552 printf("%s",TCL_PATCH_LEVEL);
1553 return 0;
1554 }
1555 """
1556
1557 def CheckTcl(context):
1558 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
1559
1560 def CheckTclVersion(context):
1561 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
1562 context.Message("Checking Tcl version... ")
1563 (is_ok,output) = context.TryRun(tcl_check_text,'.c')
1564 keep.restore(context)
1565 if not is_ok:
1566 context.Result("failed to run check")
1567 return 0
1568
1569 major,minor,patch = tuple([int(i) for i in output.split(".")])
1570 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1571 context.Result(output+" (bad version)")
1572 # bad version
1573 return 0
1574
1575 # good version
1576 context.Result(output+", good")
1577 return 1
1578
1579 #----------------
1580 # Tk test
1581
1582 tk_check_text = r"""
1583 #include <tk.h>
1584 #include <stdio.h>
1585 int main(void){
1586 printf("%s",TK_PATCH_LEVEL);
1587 return 0;
1588 }
1589 """
1590 def CheckTk(context):
1591 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
1592
1593
1594 def CheckTkVersion(context):
1595 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
1596 context.Message("Checking Tk version... ")
1597 #print "LINKFLAGS =",context.env['LINKFLAGS']
1598 (is_ok,output) = context.TryRun(tk_check_text,'.c')
1599 keep.restore(context)
1600 if not is_ok:
1601 context.Result("failed to run check")
1602 return 0
1603
1604 major,minor,patch = tuple([int(i) for i in output.split(".")])
1605 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1606 # bad version
1607 context.Result(output+" (bad version)")
1608 return 0
1609
1610 # good version
1611 context.Result(output+" (good)")
1612 return 1
1613
1614 #----------------
1615 # Tktable test
1616
1617 tktable_check_text = r"""
1618 #include <tkTable.h>
1619 #include <stdio.h>
1620 int main(void){
1621 Table mytable;
1622 return 0;
1623 }
1624 """
1625
1626 def CheckTkTable(context):
1627 return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
1628
1629 #---------------
1630 # X11 test
1631
1632 x11_check_text = r"""
1633 #include <X11/Xlib.h>
1634 #include <X11/IntrinsicP.h>
1635 #include <X11/Intrinsic.h>
1636 #include <X11/ObjectP.h>
1637 #include <X11/Object.h>
1638 int main(void){
1639 Object mything;
1640 return 0;
1641 }
1642 """
1643
1644 def CheckX11(context):
1645 return CheckExtLib(context,'X11',x11_check_text)
1646
1647 #----------------
1648 # Check that we can raise and catch sigint
1649
1650 sigint_test_text = r"""
1651 #include <signal.h>
1652 #include <setjmp.h>
1653 #include <stdlib.h>
1654 static jmp_buf g_jmpenv;
1655 void sighandler(int sig){
1656 longjmp(g_jmpenv,sig);
1657 }
1658 void testsigint(){
1659 raise(SIGINT);
1660 }
1661 int main(void){
1662 signal(SIGINT,&sighandler);
1663 switch(setjmp(g_jmpenv)){
1664 case 0:
1665 testsigint();
1666 exit(1);
1667 case SIGINT:
1668 exit(0);
1669 default:
1670 exit(2);
1671 }
1672 }
1673 """
1674
1675 def CheckSIGINT(context):
1676 context.Message("Checking SIGINT is catchable... ")
1677 (is_ok,output)=context.TryRun(sigint_test_text,".c")
1678 context.Result(is_ok)
1679 return is_ok
1680
1681 #----------------
1682 # Check that we're able to catch floating point errors
1683
1684 sigfpe_test_text = r"""
1685 #include <signal.h>
1686 #include <setjmp.h>
1687 #include <stdlib.h>
1688 #include <fenv.h>
1689 static jmp_buf g_jmpenv;
1690 void fpehandler(int sig){
1691 longjmp(g_jmpenv,sig);
1692 }
1693 int main(void){
1694 fenv_t myfenv;
1695 fegetenv(&myfenv);
1696 fesetenv(&myfenv);
1697 feenableexcept(FE_ALL_EXCEPT);
1698 signal(SIGFPE,&fpehandler);
1699 double x;
1700 switch(setjmp(g_jmpenv)){
1701 case 0:
1702 x = 1.0 / 0.0;
1703 /* failed to catch */
1704 exit(1);
1705 case SIGFPE:
1706 exit(0);
1707 }
1708 }
1709 """
1710
1711 def CheckFPE(context):
1712 context.Message("Checking C99 FPE behaviour... ")
1713 (is_ok,output) = context.TryRun(sigfpe_test_text,'.c')
1714 context.Result(is_ok)
1715 return is_ok
1716
1717 #----------------
1718 # signal reset needed?
1719
1720 sigreset_test_text = r"""
1721 #include <signal.h>
1722 #include <setjmp.h>
1723 #include <stdlib.h>
1724 #include <stdio.h>
1725 typedef void SigHandlerFn(int);
1726 static jmp_buf g_jmpenv;
1727 void sighandler(int sig){
1728 longjmp(g_jmpenv,sig);
1729 }
1730 void testsigint(){
1731 /* fprintf(stderr,"Raising SIGINT\n"); */
1732 raise(SIGINT);
1733 }
1734 int main(void){
1735 SigHandlerFn *last,*saved;
1736 saved = signal(SIGINT,&sighandler);
1737 if(saved!=SIG_DFL){
1738 fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL);
1739 exit(3);
1740 }
1741 switch(setjmp(g_jmpenv)){
1742 case 0:
1743 testsigint();
1744 fprintf(stderr,"Back from SIGINT\n");
1745 exit(1);
1746 case SIGINT:
1747 break;
1748 default:
1749 exit(2);
1750 };
1751 last = signal(SIGINT,SIG_DFL);
1752 if(last!=&sighandler){
1753 printf("1");
1754 exit(0);
1755 }
1756 printf("0");
1757 exit(0);
1758 }
1759 """
1760
1761 def CheckSigReset(context):
1762 context.Message("Checking signal handler reset... ")
1763 (is_ok,output) = context.TryRun(sigreset_test_text,'.c')
1764 if not is_ok:
1765 context.Result("ERROR")
1766 return False
1767 if int(output)==1:
1768 context.Result("required");
1769 context.env['ASC_RESETNEEDED'] = True
1770 else:
1771 context.Result("not required");
1772 context.env['ASC_RESETNEEDED'] = False
1773 return is_ok
1774
1775 #----------------
1776 # LyX on this system?
1777
1778 def CheckLyx(context):
1779 context.Message("Checking for LyX... ")
1780 r = context.env.WhereIs("lyx")
1781 if r:
1782 context.Result(r)
1783 else:
1784 context.Result(0)
1785 return r
1786
1787 #----------------
1788 # Latex2HTML on this system?
1789
1790 def CheckLatex2HTML(context):
1791 context.Message("Checking for latex2html...")
1792 if context.env.WhereIs("latex2html"):
1793 r = True
1794 else:
1795 r = False
1796 context.Result(r)
1797 return r
1798
1799 #----------------
1800 # GCC Version sniffing
1801
1802 # TODO FIXME
1803
1804 gcc_version4 = False
1805
1806 #------------------------------------------------------
1807 # CONFIGURATION
1808
1809 conf = Configure(env
1810 , custom_tests = {
1811 'CheckCC' : CheckCC
1812 , 'CheckCXX' : CheckCXX
1813 , 'CheckMath' : CheckMath
1814 , 'CheckSwigVersion' : CheckSwigVersion
1815 , 'CheckPythonLib' : CheckPythonLib
1816 , 'CheckCUnit' : CheckCUnit
1817 , 'CheckDMalloc' : CheckDMalloc
1818 , 'CheckLyx' : CheckLyx
1819 , 'CheckLatex2HTML' : CheckLatex2HTML
1820 , 'CheckMFGraph' : CheckMFGraph
1821 , 'CheckUFSparse' : CheckUFSparse
1822 , 'CheckTcl' : CheckTcl
1823 , 'CheckTclVersion' : CheckTclVersion
1824 , 'CheckTk' : CheckTk
1825 , 'CheckTkVersion' : CheckTkVersion
1826 , 'CheckGcc' : CheckGcc
1827 , 'CheckGccVisibility' : CheckGccVisibility
1828 , 'CheckYacc' : CheckYacc
1829 , 'CheckLex' : CheckLex
1830 , 'CheckTkTable' : CheckTkTable
1831 , 'CheckX11' : CheckX11
1832 , 'CheckIDA' : CheckIDA
1833 , 'CheckSUNDIALS' : CheckSUNDIALS
1834 , 'CheckCONOPT' : CheckCONOPT
1835 , 'CheckIPOPT' : CheckIPOPT
1836 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
1837 , 'CheckFPE' : CheckFPE
1838 , 'CheckSIGINT' : CheckSIGINT
1839 , 'CheckSigReset' : CheckSigReset
1840 # , 'CheckIsNan' : CheckIsNan
1841 # , 'CheckCppUnitConfig' : CheckCppUnitConfig
1842 }
1843 # , config_h = "config.h"
1844 )
1845
1846 def sconsversioncheck():
1847
1848 # uncomment the following line to skip the version check:
1849 # return 1
1850
1851 import SCons
1852 v = SCons.__version__.split(".")
1853 if v[0] != '0':
1854 return 0
1855 if int(v[1]) >= 97:
1856 return 1
1857 if v[1] != '96':
1858 return 0
1859 micro = int(v[2])
1860 if micro == 92 or micro == 93 or micro == 96:
1861 return 1;
1862 return 0
1863
1864 if not sconsversioncheck():
1865 print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
1866 print "or consult the developers in the case of newer versions. Modify"
1867 print "the function 'sconsversioncheck' in the file SConstruct if you"
1868 print "want to *force* SCons to continue."
1869 Exit(1)
1870
1871 # check C compiler
1872
1873 if not conf.CheckCC():
1874 print "Failed to build simple test file with your C compiler."
1875 print "Check your compiler is installed and running correctly."
1876 Exit(1)
1877
1878 if not conf.CheckCXX():
1879 print "Failed to build simple test file with your C++ compiler."
1880 print "Check your compiler is installed and running correctly."
1881 print "You can set your C++ compiler using the CXX scons option."
1882 Exit(1)
1883
1884 # stdio -- just to check that compiler is behaving
1885
1886 if not conf.CheckHeader('stdio.h'):
1887 print "CPPPATH =",env.get('CPPPATH')
1888 print "Did not find 'stdio.h'! Check your compiler configuration."
1889 print ""
1890 print "You environment is printed here:"
1891 for k,v in os.environ.iteritems():
1892 print "%-30s%s" % ("%s :" % k, v)
1893 Exit(1)
1894
1895 if not conf.CheckFunc('snprintf'):
1896 print "Didn't find snprintf";
1897 exit(1)
1898
1899 # Math library
1900
1901 conf.env['HAVE_IEEE']=True
1902
1903 if need_libm and not conf.CheckMath():
1904 conf.env['HAVE_IEEE']=False
1905 print 'Did not find math library, exiting!'
1906 Exit(1)
1907
1908 # Where is 'isnan'?
1909
1910 if not conf.CheckFunc('isnan') and not conf.CheckFunc('_isnan'):
1911 print "Didn't find isnan"
1912 # Exit(1)
1913
1914 # GCC visibility
1915
1916 if conf.CheckGcc():
1917 conf.env['HAVE_GCC']=True;
1918 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
1919 conf.env['HAVE_GCCVISIBILITY']=True;
1920 conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
1921 conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
1922 conf.env.Append(CCFLAGS=['-Wall'])
1923
1924 # Catching SIGINT
1925
1926 if env['WITH_SIGNALS']:
1927 if not conf.CheckSIGINT():
1928 with_signals = False
1929 without_signals_reason = "SIGINT uncatchable"
1930
1931 # Catching SIGFPE
1932
1933 if conf.CheckFPE():
1934 conf.env['HAVE_C99FPE']=True
1935 else:
1936 conf.env['HAVE_C99FPE']=False
1937
1938 # Checking for signal reset requirement
1939
1940 if not conf.CheckSigReset():
1941 print "Unable to determine if signal reset is required"
1942 Exit(1)
1943
1944 # YACC
1945
1946 if conf.CheckYacc():
1947 conf.env['HAVE_YACC']=True
1948
1949 if conf.CheckLex():
1950 conf.env['HAVE_LEX']=True
1951
1952 # Tcl/Tk
1953
1954 if with_tcltk:
1955 if conf.CheckTcl():
1956 if conf.CheckTclVersion():
1957 if conf.CheckTk():
1958 if with_tcltk and conf.CheckTkVersion():
1959 if env['STATIC_TCLTK']:
1960 if conf.CheckTkTable():
1961 pass
1962 else:
1963 without_tcltk_reason = "TkTable not found"
1964 with_tcltk = False
1965 else:
1966 without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
1967 with_tcltk = False
1968 else:
1969 without_tcltk_reason = "Tk not found."
1970 with_tcltk = False
1971 else:
1972 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
1973 with_tcltk = False
1974
1975 else:
1976 without_tcltk_reason = "Tcl not found."
1977 with_tcltk = False
1978
1979 if env['STATIC_TCLTK']:
1980 conf.CheckX11()
1981
1982 # Python... obviously we're already running python, so we just need to
1983 # check that we can link to the python library OK:
1984
1985 if not conf.CheckPythonLib():
1986 without_python_reason = 'libpython2.x not found or not linkable'
1987 with_python = False
1988 env['WITH_PYTHON']=False
1989
1990 # SWIG version
1991
1992 if with_python and not conf.CheckSwigVersion():
1993 without_python_reason = 'SWIG >= 1.3.24 is required'
1994 with_python = False
1995 env['WITH_PYTHON']=False
1996
1997 # CUnit
1998
1999 if with_cunit:
2000 if not conf.CheckCUnit():
2001 without_cunit_reason = 'CUnit not found'
2002 with_cunit = False
2003 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
2004
2005 # DMALLOC
2006
2007 if with_dmalloc:
2008 if not conf.CheckDMalloc():
2009 without_dmalloc_reason = 'dmalloc not found'
2010 with_dmalloc = False
2011
2012 # MFGRAPH
2013
2014 if with_mfgraph:
2015 if not conf.CheckMFGraph():
2016 without_mfgraph_reason = 'mfgraph not found'
2017 with_mfgraph = False
2018 env['WITH_MFGRAPH'] = False
2019
2020 # UFSPARSE
2021
2022 if with_ufsparse:
2023 if not conf.CheckUFSparse():
2024 without_ufsparse_reason = 'mfgraph not found'
2025 with_ufsparse = False
2026 env['WITH_UFSPARSE'] = False
2027
2028 # IDA
2029
2030 if not with_ida:
2031 without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
2032 elif not conf.CheckSUNDIALS():
2033 with_ida = False
2034 without_ida_reason = "SUNDIALS not found, or bad version"
2035 elif not conf.CheckIDA():
2036 with_ida = False
2037 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
2038
2039 # CONOPT
2040
2041 if not with_conopt:
2042 without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
2043 elif not conf.CheckCONOPT():
2044 if conf.env.get('CONOPT_LINKED'):
2045 conf.env['CONOPT_LINKED'] = False
2046 # we no longer require CONOPT at buildtime in order to build support for it
2047 #with_conopt = False
2048 #without_conpt_reason = "CONOPT not found"
2049
2050 # IPOPT
2051
2052 if not with_ipopt:
2053 without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
2054 elif not conf.CheckIPOPT():
2055 with_ipopt = False
2056 without_ipopt_reason = "IPOPT not found"
2057
2058 # BLAS
2059
2060 need_blas=False
2061
2062 if with_lsode:
2063 need_fortran = True
2064 need_blas=True
2065
2066 if need_blas:
2067 if conf.CheckLib('blas'):
2068 with_local_blas = False
2069 without_local_blas_reason = "Found BLAS installed on system"
2070 else:
2071 with_local_blas = True
2072 need_fortran = True
2073 else:
2074 with_local_blas= False;
2075 without_local_blas_reason = "BLAS not required"
2076
2077 # FORTRAN
2078
2079 if need_fortran:
2080 conf.env.Tool('fortran')
2081 detect_fortran = conf.env.Detect(['gfortran','g77'])
2082 if detect_fortran:
2083 # For some reason, g77 doesn't get detected properly on MinGW
2084 if not env.has_key('F77') and not env.has_key('FORTRAN'):
2085 print "Fixing detection of F77 on MinGW...(?)"
2086 conf.env.Replace(F77=detect_fortran)
2087 conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
2088 conf.env.Replace(F77FLAGS='')
2089 #print "F77:",conf.env['F77']
2090 #print "F77COM:",conf.env['F77COM']
2091 #print "F77FLAGS:",conf.env['F77FLAGS']
2092 fortran_builder = Builder(
2093 action='$F77COM'
2094 , suffix='.o'
2095 , src_suffix='.f'
2096 )
2097 conf.env.Append(BUILDERS={'Fortran':fortran_builder})
2098 if platform.system()=="Linux":
2099 conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
2100 else:
2101 with_lsode=False;
2102 without_lsode_reason="FORTRAN-77 required but not found"
2103
2104 #else:
2105 # print "FORTRAN not required"
2106
2107 # F2C
2108
2109 if need_fortran:
2110 if platform.system()=="Windows":
2111 pass
2112 #conf.env.Append(LIBPATH='c:\mingw\lib')
2113
2114 # scrollkeeper
2115
2116 if with_scrollkeeper:
2117 if not conf.CheckScrollkeeperConfig():
2118 with_scrollkeeper=False
2119 without_scrollkeeper_reason="unable to detect scrollkeeper-config"
2120
2121 # lyx
2122
2123 if with_doc_build:
2124 if not conf.CheckLyx():
2125 with_doc_build = False
2126 without_doc_build_reason="unable to locate lyx"
2127
2128 with_latext2html = conf.CheckLatex2HTML()
2129
2130 # TODO: -D_HPUX_SOURCE is needed
2131
2132 # TODO: check size of void*
2133
2134 # TODO: detect if dynamic libraries are possible or not
2135
2136 if platform.system()=="Windows" and env.has_key('MSVS'):
2137 _found_windows_h = conf.CheckHeader('Windows.h')
2138
2139 if not _found_windows_h:
2140 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
2141 Exit(1)
2142
2143 if with_python and not conf.CheckHeader(['basetsd.h','BaseTsd.h']):
2144 with_python = 0;
2145 without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
2146
2147 conf.Finish()
2148
2149 #---------------------------------------
2150 # SUBSTITUTION DICTIONARY for .in files
2151
2152 release = env.get('RELEASE')
2153 if release=="0.":
2154 release="0"
2155
2156 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
2157
2158 subst_dict = {
2159 '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
2160 ,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS']
2161 , '@GLADE_FILE@':'ascend.glade'
2162 , '@HELP_ROOT@':''
2163 , '@ICON_EXTENSION@':icon_extension
2164 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
2165 , '@INSTALL_BIN@':env['INSTALL_BIN']
2166 , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
2167 , '@INSTALL_LIB@':env['INSTALL_LIB']
2168 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
2169 , '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS']
2170 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
2171 , '@VERSION@':version
2172 , '@RELEASE@':release
2173 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
2174 , '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation'
2175 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
2176 , '@SHLIBPREFIX@':env['SHLIBPREFIX']
2177 , '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX']
2178 , '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX']
2179 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
2180 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
2181 , '@PYTHON@' : python_exe
2182 , '@PYVERSION@' : pyversion
2183 , '@ASC_CONOPT_LIB@':env.get('CONOPT_LIB')
2184 , '@ASC_CONOPT_ENVVAR@':env.get('CONOPT_ENVVAR')
2185 , '@ASC_CONOPT_DLPATH@':c_escape(env.subst("$CONOPT_DLPATH"))
2186 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
2187 , '@WITH_SOLVERS@':",".join(env.get('WITH_SOLVERS'))
2188 }
2189
2190 if env.get('WITH_DOC'):
2191 print "WITH_DOC:",env['WITH_DOC']
2192 subst_dict['@HELP_ROOT@']=env['HELP_ROOT']
2193
2194 # bool options...
2195 for k,v in {
2196 'ASC_WITH_IDA':with_ida
2197 ,'ASC_WITH_DMALLOC':with_dmalloc
2198 ,'ASC_WITH_MFGRAPH':with_mfgraph
2199 ,'ASC_WITH_UFSPARSE':with_ufsparse
2200 ,'ASC_WITH_CONOPT':with_conopt
2201 ,'ASC_LINKED_CONOPT':env.get('CONOPT_LINKED')
2202 ,'ASC_WITH_IPOPT':with_ipopt
2203 ,'ASC_WITH_LSODE':with_lsode
2204 ,'ASC_WITH_MMIO':with_mmio
2205 ,'ASC_SIGNAL_TRAPS':with_signals
2206 ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
2207 ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
2208 ,'HAVE_IEEE':env.get('HAVE_IEEE')
2209 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
2210 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
2211 ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
2212 }.iteritems():
2213
2214 if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
2215
2216 if with_python:
2217 subst_dict['@ASCXX_USE_PYTHON@']="1"
2218 env['WITH_PYTHON']=1;
2219
2220 if with_latex2html:
2221 env['WITH_LATEX2HTML']=1
2222
2223 if env.has_key('HAVE_GCCVISIBILITY'):
2224 subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
2225
2226 env.Append(SUBST_DICT=subst_dict)
2227
2228 #for k,v in subst_dict.iteritems():
2229 # print "%-50s%s" % ("'%s'"%k,v)
2230
2231 # REMOVED: long command-line support on Win2k
2232
2233 #------------------------------------------------------
2234 # RECIPE: SWIG scanner
2235
2236 import SCons.Script
2237
2238 SWIGScanner = SCons.Scanner.ClassicCPP(
2239 "SWIGScan"
2240 , ".i"
2241 , "CPPPATH"
2242 , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
2243 )
2244
2245 env.Append(SCANNERS=[SWIGScanner])
2246
2247 #------------------------------------------------------
2248 # Recipe for 'CHMOD' ACTION
2249
2250 import SCons
2251 from SCons.Script.SConscript import SConsEnvironment
2252 SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2253 lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2254
2255 def InstallPerm(env, dest, files, perm):
2256 obj = env.Install(dest, files)
2257 for i in obj:
2258 env.AddPostAction(i, env.Chmod(str(i), perm))
2259
2260 SConsEnvironment.InstallPerm = InstallPerm
2261
2262 # define wrappers
2263 SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2264 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2265 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2266
2267 #------------------------------------------------------
2268 # BUILD...
2269
2270 # so that #include <modulename/headername.h> works across all modules...
2271 env.AppendUnique(CPPPATH=['#base/generic'])
2272
2273 if env['DEBUG']:
2274 env.Append(CCFLAGS=['-g'])
2275 env.Append(LINKFLAGS=['-g'])
2276
2277 if env['GCOV']:
2278 env.Append(
2279 CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2280 , LIBS=['gcov']
2281 , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2282 )
2283
2284 if with_ida:
2285 env.Append(WITH_IDA=1)
2286
2287 if with_conopt:
2288 env.Append(WITH_CONOPT=1)
2289
2290 if with_ipopt:
2291 env.Append(WITH_IPOPT=1)
2292
2293 #-------------
2294 # TCL/TK GUI
2295
2296 if with_tcltk:
2297 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2298 else:
2299 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2300
2301 #-------------
2302 # PYTHON INTERFACE
2303
2304 if with_python:
2305 env.SConscript(['pygtk/SConscript'],'env')
2306 else:
2307 print "Skipping... Python bindings aren't being built:",without_python_reason
2308
2309 #------------
2310 # BASE/GENERIC SUBDIRECTORIES
2311
2312 libascend_env = env.Copy()
2313
2314 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2315
2316 srcs = []
2317 for d in dirs:
2318 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2319 srcs += heresrcs
2320
2321 #-------------
2322 # IMPORTED CODE: LSODE, BLAS, etc
2323
2324 #if with_lsode:
2325 # srcs += env.SConscript(['lsod/SConscript'],'env')
2326 # srcs += env.SConscript(['linpack/SConscript'],'env')
2327 #else:
2328 # print "Skipping... LSODE won't be built:", without_lsode_reason
2329
2330 if with_local_blas:
2331 env['blasobjs'] = env.SConscript(['blas/SConscript'],'env')
2332 else:
2333 env['blasobjs'] = []
2334 print "Skipping... BLAS won't be built:", without_local_blas_reason
2335
2336 if not with_ida:
2337 print "Skipping... IDA won't be built:", without_ida_reason
2338
2339 if with_mmio:
2340 srcs += env.SConscript(['mmio/SConscript'],'env')
2341 else:
2342 print "Skipping... MMIO export won't be built:", without_mmio_reason
2343 #-------------
2344 # LIBASCEND -- all base/generic functionality
2345
2346 if with_dmalloc:
2347 libascend_env.Append(LIBS=['dmalloc'])
2348
2349 if with_ufsparse:
2350 libascend_env.Append(LIBS=['cxsparse'])
2351
2352 libascend = libascend_env.SharedLibrary('ascend',srcs)
2353
2354 # for use in declaring dependent shared libraries in SConscript files (eg solvers/*/SConscript)
2355 env['libascend'] = libascend
2356
2357 env.Alias('libascend',libascend)
2358
2359 #-------------
2360 # UNIT TESTS (C CODE)
2361
2362 if with_cunit:
2363 testdirs = ['general','solver','utilities','linear','compiler']
2364 testsrcs = []
2365 for testdir in testdirs:
2366 path = 'base/generic/'+testdir+'/test/'
2367 env.SConscript([path+'SConscript'],'env')
2368 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2369
2370 #print "TESTSRCS =",testsrcs
2371
2372 env.SConscript(['test/SConscript'],'env')
2373 env.SConscript(['base/generic/test/SConscript'],'env')
2374
2375 env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2376
2377 else:
2378 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2379
2380 #-------------
2381 # EXTERNAL SOLVERS
2382
2383 env['extfns']=[]
2384
2385 env.SConscript(['solvers/SConscript'],'env')
2386
2387 #-------------
2388 # EXTERNAL FUNCTIONS
2389
2390 modeldirs = env.SConscript(['models/SConscript'],'env')
2391
2392 if not with_extfns:
2393 print "Skipping... External modules aren't being built:",without_extfns_reason
2394
2395 env.Alias('extfns',env['extfns'])
2396
2397 #------------------------------------------------------
2398 # CREATE ASCEND-CONFIG scriptlet
2399
2400 ascendconfig = env.SubstInFile('ascend-config.in')
2401
2402
2403 #------------------------------------------------------
2404 # CREATE asc4dev scriptlet
2405
2406 asc4devcmd = env.SubstInFile('tcltk/asc4dev.in')
2407 env.AddPostAction(asc4devcmd, 'chmod 755 $TARGET')
2408 #------------------------------------------------------
2409 # INSTALLATION
2410
2411 if env.get('CAN_INSTALL'):
2412
2413 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE','INSTALL_DOC']
2414 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2415 install_dirs += modeldirs + [Dir(env.subst("$INSTALL_ROOT$INSTALL_SOLVERS"))]
2416
2417 # TODO: add install options
2418 env.Alias('install',install_dirs)
2419
2420 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2421
2422 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2423
2424 #------------------------------------------------------
2425 # WINDOWS INSTALLER
2426
2427 if not env.get('NSIS'):
2428 with_installer = False
2429 without_installer_reason = "NSIS not found"
2430
2431 if with_installer:
2432 env.Append(NSISDEFINES={
2433 'OUTFILE':"#dist/"+env['WIN_INSTALLER_NAME']
2434 ,"VERSION":version
2435 ,'PYVERSION':pyversion
2436 })
2437 installer = env.Installer('nsis/installer.nsi')
2438 Depends(installer,["pygtk","tcltk","ascend.dll","models","ascend-config"])
2439 env.Alias('installer',installer)
2440 else:
2441 print "Skipping... Windows installer isn't being built:",without_installer_reason
2442
2443
2444 #------------------------------------------------------
2445 # PROJECT FILE for MSVC
2446
2447 env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2448
2449 #------------------------------------------------------
2450 # CREATE the SPEC file for generation of RPM packages
2451
2452 if platform.system()=="Linux":
2453 env.SubstInFile('ascend.spec.in')
2454
2455 #------------------------------------------------------
2456 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2457
2458 #if with_scrollkeeper:
2459 # #env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2460 # #env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2461
2462 #------------------------------------------------------
2463 # DISTRIBUTION TAR FILE
2464
2465 env['DISTTAR_FORMAT']='bz2'
2466 env.Append(
2467 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']
2468 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2469 )
2470
2471 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2472 , [env.Dir('#')]
2473 )
2474
2475 env.Depends(tar,'ascend.spec')
2476 env.Depends(tar,'#doc/book.pdf')
2477
2478 #------------------------------------------------------
2479 # DISTRIBUTION TAR FILE (new style with AccumulateBuilder)
2480
2481 # ...
2482
2483 #------------------------------------------------------
2484 # DEBIAN TARBALL for use with Build Service
2485
2486 import glob
2487 deb_manfiles = glob.glob('debian/*.man')
2488
2489 deb_tar = env.Tar(
2490 'dist/debian.tar.gz'
2491 ,deb_manfiles + ['debian/compat','debian/copyright','debian/dirs'
2492 ,'debian/postinst','debian/postrm']
2493 ,TARFLAGS = ['cz']
2494 )
2495
2496 Alias('dist',[tar,deb_tar])
2497
2498 #------------------------------------------------------
2499 # DOCUMENTATION
2500
2501
2502 if not with_doc_build:
2503 print "Skipping... Documentation isn't being built:",without_doc_build_reason
2504
2505 #user's manual
2506 env.SConscript('doc/SConscript',['env'])
2507
2508 # doxygen documentation
2509 env.SConscript('base/doc/SConscript',['env'])
2510
2511 #------------------------------------------------------
2512 # RPM BUILD
2513
2514 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2515 # (check * for the version number used to create the tarball)
2516
2517 #------------------------------------------------------
2518 # DEFAULT TARGETS
2519
2520 default_targets =['libascend','solvers']
2521 if with_tcltk:
2522 default_targets.append('tcltk')
2523 if with_python:
2524 default_targets.append('pygtk')
2525 if with_installer:
2526 default_targets.append('installer')
2527 if with_extfns:
2528 default_targets.append('extfns')
2529 if with_doc_build:
2530 default_targets.append('doc')
2531
2532 env.Default(default_targets)
2533
2534 print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2535
2536 # vim: set syntax=python:

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