/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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