/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2000 - (show annotations) (download)
Thu Feb 26 23:00:19 2009 UTC (10 years, 9 months ago) by jpye
File size: 65343 byte(s)
Fixed support for SCons 0.97 on Linux (Ubuntu 8.04).
dtar checks for fakeroot before proceeding.
Debian package doesn't depend on g77, we prefer gfortran instead.
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 ff = context.env.get('LATEXFLAGS')
1959 context.env.Append(LATEXFLAGS=['-interaction=nonstopmode','-halt-on-error'])
1960 is_ok = context.TryBuild(builder=b,text=lmodern_test_text,extension=".latex")
1961 print "is_ok=",is_ok
1962 if ff is not None:
1963 context.env['LATEXFLAGS'] = ff
1964 else:
1965 del context.env['LATEXFLAGS']
1966 context.Result(is_ok)
1967 return is_ok
1968
1969 #----------------
1970 # GCC Version sniffing
1971
1972 # TODO FIXME
1973
1974 gcc_version4 = False
1975
1976 #------------------------------------------------------
1977 # CONFIGURATION
1978
1979 conf = Configure(env
1980 , custom_tests = {
1981 'CheckCC' : CheckCC
1982 , 'CheckCXX' : CheckCXX
1983 , 'CheckF77' : CheckF77
1984 , 'CheckMath' : CheckMath
1985 , 'CheckMalloc' : CheckMalloc
1986 , 'CheckDLOpen' : CheckDLOpen
1987 , 'CheckSwigVersion' : CheckSwigVersion
1988 , 'CheckPythonLib' : CheckPythonLib
1989 , 'CheckCUnit' : CheckCUnit
1990 , 'CheckDMalloc' : CheckDMalloc
1991 , 'CheckLyx' : CheckLyx
1992 , 'CheckLatex2HTML' : CheckLatex2HTML
1993 , 'CheckLModern' : CheckLModern
1994 , 'CheckGraphViz' : CheckGraphViz
1995 , 'CheckGraphVizBoolean' : CheckGraphVizBoolean
1996 , 'CheckUFSparse' : CheckUFSparse
1997 , 'CheckTcl' : CheckTcl
1998 , 'CheckTclVersion' : CheckTclVersion
1999 , 'CheckTk' : CheckTk
2000 , 'CheckTkVersion' : CheckTkVersion
2001 , 'CheckGcc' : CheckGcc
2002 , 'CheckGccVisibility' : CheckGccVisibility
2003 , 'CheckYacc' : CheckYacc
2004 , 'CheckLex' : CheckLex
2005 , 'CheckTkTable' : CheckTkTable
2006 , 'CheckX11' : CheckX11
2007 , 'CheckIDA' : CheckIDA
2008 , 'CheckSUNDIALS' : CheckSUNDIALS
2009 , 'CheckCONOPT' : CheckCONOPT
2010 , 'CheckIPOPT' : CheckIPOPT
2011 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
2012 , 'CheckFPE' : CheckFPE
2013 , 'CheckSIGINT' : CheckSIGINT
2014 , 'CheckSigReset' : CheckSigReset
2015 # , 'CheckIsNan' : CheckIsNan
2016 # , 'CheckCppUnitConfig' : CheckCppUnitConfig
2017 }
2018 # , config_h = "config.h"
2019 )
2020
2021 def sconsversioncheck():
2022
2023 # uncomment the following line to skip the version check:
2024 # return 1
2025
2026 import SCons
2027 v = SCons.__version__.split(".")
2028 if v[0] != '0':
2029 if v[0] == '1':
2030 return 1;
2031 return 0
2032 if int(v[1]) >= 97:
2033 return 1
2034 if v[1] != '96':
2035 return 0
2036 micro = int(v[2])
2037 if micro == 92 or micro == 93 or micro == 96:
2038 return 1;
2039 return 0
2040
2041 if not sconsversioncheck():
2042 print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
2043 print "or consult the developers in the case of newer versions. Modify"
2044 print "the function 'sconsversioncheck' in the file SConstruct if you"
2045 print "want to *force* SCons to continue."
2046 Exit(1)
2047
2048 # check C compiler
2049
2050 if conf.CheckCC() is False:
2051 print "Failed to build simple test file with your C compiler."
2052 print "Check your compiler is installed and running correctly."
2053 Exit(1)
2054
2055 if conf.CheckCXX() is False:
2056 print "Failed to build simple test file with your C++ compiler."
2057 print "Check your compiler is installed and running correctly."
2058 print "You can set your C++ compiler using the CXX scons option."
2059 Exit(1)
2060
2061 # stdio -- just to check that compiler is behaving
2062
2063 if conf.CheckHeader('stdio.h') is False:
2064 print "CPPPATH =",env.get('CPPPATH')
2065 print "Did not find 'stdio.h'! Check your compiler configuration."
2066 print ""
2067 print "You environment is printed here:"
2068 for k,v in os.environ.iteritems():
2069 print "%-30s%s" % ("%s :" % k, v)
2070 Exit(1)
2071
2072 if conf.CheckFunc('snprintf') is False:
2073 print "Didn't find snprintf";
2074 exit(1)
2075
2076 if conf.CheckFunc('strdup'):
2077 conf.env['HAVE_STRDUP'] = True
2078
2079 if platform.system()=="Windows" and env.get('WITH_MSVCR71'):
2080 conf.env.Append(LIBS='msvcr71')
2081
2082 # Math library
2083
2084 conf.env['HAVE_IEEE']=True
2085
2086 if need_libm and (conf.CheckMath() is False):
2087 conf.env['HAVE_IEEE']=False
2088 print 'Did not find math library, exiting!'
2089 Exit(1)
2090
2091 # Malloc
2092
2093 if conf.CheckMalloc() is False:
2094 conf.env['HAVE_MALLOC']=False
2095 print "Did not find functioning 'malloc', exiting!"
2096 Exit(1)
2097
2098 # dlopen/LoadLibrary
2099
2100 # CURRENTLY BREAKS LATER TEST (libsave?)
2101 #if conf.CheckDLOpen() is False:
2102 # print "Did not find functioning dlopen/LoadLibrary, exiting!"
2103 # Exit(1)
2104
2105 # Where is 'isnan'?
2106
2107 if conf.CheckFunc('isnan') is False and conf.CheckFunc('_isnan') is False:
2108 print "Didn't find isnan"
2109 # Exit(1)
2110
2111 # GCC visibility
2112
2113 if conf.CheckGcc():
2114 conf.env['HAVE_GCC']=True;
2115 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
2116 conf.env['HAVE_GCCVISIBILITY']=True;
2117 conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
2118 conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
2119 conf.env.Append(CCFLAGS=['-Wall'])
2120
2121 # Catching SIGINT
2122
2123 if env['WITH_SIGNALS']:
2124 if not conf.CheckSIGINT():
2125 with_signals = False
2126 without_signals_reason = "SIGINT uncatchable"
2127
2128 # Catching SIGFPE
2129
2130 if conf.CheckFPE():
2131 conf.env['HAVE_C99FPE']=True
2132 else:
2133 conf.env['HAVE_C99FPE']=False
2134
2135 # Checking for signal reset requirement
2136
2137 if conf.CheckSigReset() is False:
2138 print "Unable to determine if signal reset is required"
2139 Exit(1)
2140
2141 # YACC
2142
2143 if conf.CheckYacc():
2144 conf.env['HAVE_YACC']=True
2145
2146 if conf.CheckLex():
2147 conf.env['HAVE_LEX']=True
2148
2149 # Tcl/Tk
2150
2151 if with_tcltk:
2152 if conf.CheckTcl():
2153 if conf.CheckTclVersion():
2154 if conf.CheckTk():
2155 if with_tcltk and conf.CheckTkVersion():
2156 if env['STATIC_TCLTK']:
2157 if conf.CheckTkTable():
2158 pass
2159 else:
2160 without_tcltk_reason = "TkTable not found"
2161 with_tcltk = False
2162 else:
2163 without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
2164 with_tcltk = False
2165 else:
2166 without_tcltk_reason = "Tk not found."
2167 with_tcltk = False
2168 else:
2169 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
2170 with_tcltk = False
2171
2172 else:
2173 without_tcltk_reason = "Tcl not found."
2174 with_tcltk = False
2175
2176 if env['STATIC_TCLTK']:
2177 conf.CheckX11()
2178
2179 # Python... obviously we're already running python, so we just need to
2180 # check that we can link to the python library OK:
2181
2182 if not conf.CheckPythonLib():
2183 without_python_reason = 'libpython2.x not found or not linkable'
2184 with_python = False
2185 env['WITH_PYTHON']=False
2186
2187 # SWIG version
2188
2189 if with_python and conf.CheckSwigVersion() is False:
2190 without_python_reason = 'SWIG >= 1.3.24 is required'
2191 with_python = False
2192 env['WITH_PYTHON']=False
2193
2194 # CUnit
2195
2196 if with_cunit:
2197 if not conf.CheckCUnit():
2198 without_cunit_reason = 'CUnit not found'
2199 with_cunit = False
2200 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
2201
2202 # DMALLOC
2203
2204 if with_dmalloc:
2205 if not conf.CheckDMalloc():
2206 without_dmalloc_reason = 'dmalloc not found'
2207 with_dmalloc = False
2208
2209 # GRAPHVIZ
2210
2211 if with_graphviz:
2212 if not conf.CheckGraphViz():
2213 without_graphviz_reason = 'graphviz not found'
2214 with_graphviz = False
2215 env['WITH_GRAPHVIZ'] = False
2216 env['HAVE_GRAPHVIZ_BOOLEAN'] = conf.CheckGraphVizBoolean()
2217
2218 # UFSPARSE
2219
2220 if with_ufsparse:
2221 if not conf.CheckUFSparse():
2222 without_ufsparse_reason = 'ufsparse not found'
2223 with_ufsparse = False
2224 env['WITH_UFSPARSE'] = False
2225
2226 # IDA
2227
2228 if with_ida:
2229 if not conf.CheckSUNDIALS():
2230 with_ida = False
2231 without_ida_reason = "SUNDIALS not found, or bad version"
2232 elif not conf.CheckIDA():
2233 with_ida = False
2234 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
2235
2236 # CONOPT
2237
2238 if not with_conopt:
2239 without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
2240 elif conf.CheckCONOPT() is False:
2241 if conf.env.get('CONOPT_LINKED'):
2242 conf.env['CONOPT_LINKED'] = False
2243 # we no longer require CONOPT at buildtime in order to build support for it
2244 #with_conopt = False
2245 #without_conpt_reason = "CONOPT not found"
2246
2247 # IPOPT
2248
2249 if not with_ipopt:
2250 without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)"
2251 elif not conf.CheckIPOPT():
2252 with_ipopt = False
2253 without_ipopt_reason = "IPOPT not found"
2254
2255 # BLAS
2256
2257 need_blas=False
2258
2259 if with_lsode:
2260 need_fortran = True
2261 need_fortran_reasons.append("LSODE")
2262 need_blas=True
2263
2264 if with_ipopt:
2265 need_blas=True
2266
2267 if need_blas:
2268 if conf.CheckLib('blas'):
2269 with_local_blas = False
2270 without_local_blas_reason = "Found BLAS installed on system"
2271 else:
2272 with_local_blas = True
2273 need_fortran = True
2274 need_fortran_reasons.append("BLAS")
2275 else:
2276 with_local_blas= False;
2277 without_local_blas_reason = "BLAS not required"
2278
2279 # FORTRAN
2280
2281 if need_fortran:
2282 print "NEED FORTRAN"
2283 import SCons
2284 if SCons.__version__[0:4]=="0.97":
2285 # Older SCons verions 0.97 (eg Ubuntu 8.04) doesn't have the 'gfortran' tool'.
2286 # On this system, the 'fortran' tool seems to detect gfortran OK.
2287 conf.env.Tool('fortran')
2288 else:
2289 conf.env.Tool('g77')
2290 conf.env.Tool('gfortran')
2291 detect_fortran = conf.env.Detect(['gfortran','g77'])
2292 if detect_fortran:
2293 # For some reason, g77 doesn't get detected properly on MinGW
2294 if not env.has_key('F77') and not env.has_key('FORTRAN'):
2295 print "Fixing detection of F77 on MinGW...(?)"
2296 conf.env.Replace(F77=detect_fortran)
2297 conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
2298 conf.env.Replace(F77FLAGS='')
2299 #print "F77:",conf.env['F77']
2300 #print "F77COM:",conf.env['F77COM']
2301 #print "F77FLAGS:",conf.env['F77FLAGS']
2302 fortran_builder = Builder(
2303 action='$F77COM'
2304 , suffix='.o'
2305 , src_suffix='.f'
2306 )
2307 conf.env.Append(BUILDERS={'Fortran':fortran_builder})
2308 if platform.system()=="Linux":
2309 print "APPARENTLY FORTRAN WAS DETECTED"
2310 conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
2311 else:
2312 print "FAILED FORTRAN DETECTION"
2313 with_lsode=False;
2314 without_lsode_reason="FORTRAN-77 required but not found"
2315 else:
2316 print "FORTRAN WAS NOT FOUND TO BE REQUIRED"
2317
2318 if need_fortran and conf.CheckF77() is False:
2319 print "Failed to build simple test file with your Fortran compiler."
2320 print "Check your compiler is installed and running correctly."
2321 print "You can set your Fortran compiler using the FORTRAN scons option."
2322 print "The fortran compiler is REQUIRED to build:",", ".join(need_fortran_reasons)
2323 print "Perhaps try examining the value of your WITH_SOLVERS option (remove LSODE, etc)."
2324 Exit(1)
2325
2326 #else:
2327 # print "FORTRAN not required"
2328
2329 # F2C
2330
2331 if need_fortran:
2332 if platform.system()=="Windows":
2333 pass
2334 #conf.env.Append(LIBPATH='c:\mingw\lib')
2335
2336 # scrollkeeper
2337
2338 if with_scrollkeeper:
2339 if conf.CheckScrollkeeperConfig() is False:
2340 with_scrollkeeper=False
2341 without_scrollkeeper_reason="unable to detect scrollkeeper-config"
2342
2343 # lyx
2344
2345 if with_doc_build:
2346 if not conf.CheckLyx():
2347 with_doc_build = False
2348 without_doc_build_reason="unable to locate LyX"
2349
2350 with_latex2html = conf.CheckLatex2HTML()
2351
2352 if conf.CheckLModern() is False:
2353 with_doc_build = False
2354 without_doc_build_reason="'lmodern' is not available"
2355
2356 # TODO: -D_HPUX_SOURCE is needed
2357
2358 # TODO: check size of void*
2359
2360 # TODO: detect if dynamic libraries are possible or not
2361
2362 if platform.system()=="Windows" and env.has_key('MSVS'):
2363 _found_windows_h = conf.CheckHeader('Windows.h')
2364
2365 if not _found_windows_h:
2366 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
2367 Exit(1)
2368
2369 if with_python and conf.CheckHeader(['basetsd.h','BaseTsd.h']) is False:
2370 with_python = 0;
2371 without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
2372
2373 conf.Finish()
2374
2375 print "-=-=-=-=-=-=-=-=- LIBS =",env.get('LIBS')
2376
2377 #---------------------------------------
2378 # SUBSTITUTION DICTIONARY for .in files
2379
2380 release = env.get('RELEASE')
2381 if release=="0.":
2382 release="0"
2383
2384 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
2385
2386 subst_dict = {
2387 '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
2388 ,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS']
2389 , '@GLADE_FILE@':'ascend.glade'
2390 , '@HELP_ROOT@':''
2391 , '@ICON_EXTENSION@':icon_extension
2392 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
2393 , '@INSTALL_BIN@':env['INSTALL_BIN']
2394 , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
2395 , '@INSTALL_LIB@':env['INSTALL_LIB']
2396 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
2397 , '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS']
2398 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
2399 , '@VERSION@':version
2400 , '@RELEASE@':release
2401 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
2402 , '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation'
2403 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
2404 , '@SHLIBPREFIX@':env['SHLIBPREFIX']
2405 , '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX']
2406 , '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX']
2407 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
2408 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
2409 , '@PYTHON@' : python_exe
2410 , '@PYVERSION@' : pyversion
2411 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
2412 , '@WITH_GRAPHVIZ@': str(int(env.get('WITH_GRAPHVIZ')))
2413 }
2414
2415 if env.get('WITH_DOC'):
2416 print "WITH_DOC:",env['WITH_DOC']
2417 subst_dict['@HELP_ROOT@']=env['HELP_ROOT']
2418
2419 # bool options...
2420 for k,v in {
2421 'ASC_WITH_DMALLOC':with_dmalloc
2422 ,'ASC_WITH_UFSPARSE':with_ufsparse
2423 ,'ASC_WITH_MMIO':with_mmio
2424 ,'ASC_SIGNAL_TRAPS':with_signals
2425 ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
2426 ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
2427 ,'HAVE_IEEE':env.get('HAVE_IEEE')
2428 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
2429 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
2430 ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
2431 }.iteritems():
2432
2433 if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
2434
2435 if with_python:
2436 subst_dict['@ASCXX_USE_PYTHON@']="1"
2437 env['WITH_PYTHON']=1;
2438
2439 if with_latex2html:
2440 env['WITH_LATEX2HTML']=1
2441
2442 if env.has_key('HAVE_GCCVISIBILITY'):
2443 subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
2444
2445 env.Append(SUBST_DICT=subst_dict)
2446
2447 #for k,v in subst_dict.iteritems():
2448 # print "%-50s%s" % ("'%s'"%k,v)
2449
2450 # REMOVED: long command-line support on Win2k
2451
2452 #------------------------------------------------------
2453 # RECIPE: SWIG scanner
2454
2455 import SCons.Script
2456
2457 SWIGScanner = SCons.Scanner.ClassicCPP(
2458 "SWIGScan"
2459 , ".i"
2460 , "CPPPATH"
2461 , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
2462 )
2463
2464 env.Append(SCANNERS=[SWIGScanner])
2465
2466 #------------------------------------------------------
2467 # Recipe for 'CHMOD' ACTION
2468
2469 import SCons
2470 from SCons.Script.SConscript import SConsEnvironment
2471 SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2472 lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2473
2474 def InstallPerm(env, dest, files, perm):
2475 obj = env.Install(dest, files)
2476 for i in obj:
2477 env.AddPostAction(i, env.Chmod(str(i), perm))
2478
2479 SConsEnvironment.InstallPerm = InstallPerm
2480
2481 # define wrappers
2482 SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2483 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2484 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2485
2486 #------------------------------------------------------
2487 # BUILD...
2488
2489 # so that #include <modulename/headername.h> works across all modules...
2490 env.AppendUnique(CPPPATH=['#base/generic'])
2491
2492 if env['DEBUG']:
2493 env.Append(CCFLAGS=['-g'])
2494 env.Append(LINKFLAGS=['-g'])
2495
2496 if env['GCOV']:
2497 env.Append(
2498 CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2499 , LIBS=['gcov']
2500 , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2501 )
2502
2503 if with_ida:
2504 env.Append(WITH_IDA=1)
2505
2506 if with_conopt:
2507 env.Append(WITH_CONOPT=1)
2508
2509 if with_ipopt:
2510 env.Append(WITH_IPOPT=1)
2511
2512 if with_dopri5:
2513 env.Append(WITH_DOPRI5=1)
2514
2515 if with_graphviz and env.get('GRAPHVIZ_RPATH'):
2516 env.Append(RPATH=env['GRAPHVIZ_RPATH'])
2517
2518 #-------------
2519 # TCL/TK GUI
2520
2521 if with_tcltk:
2522 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2523 else:
2524 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2525
2526 #-------------
2527 # PYTHON INTERFACE
2528
2529 if with_python:
2530 env.SConscript(['pygtk/SConscript'],'env')
2531 else:
2532 print "Skipping... Python bindings aren't being built:",without_python_reason
2533
2534 #------------
2535 # BASE/GENERIC SUBDIRECTORIES
2536
2537 libascend_env = env.Clone()
2538
2539 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2540
2541 srcs = []
2542 for d in dirs:
2543 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2544 srcs += heresrcs
2545
2546 #-------------
2547 # IMPORTED CODE: LSODE, BLAS, etc
2548
2549 #if with_lsode:
2550 # srcs += env.SConscript(['lsod/SConscript'],'env')
2551 # srcs += env.SConscript(['linpack/SConscript'],'env')
2552 #else:
2553 # print "Skipping... LSODE won't be built:", without_lsode_reason
2554
2555 if with_local_blas:
2556 env['blasobjs'] = env.SConscript(['blas/SConscript'],'env')
2557 else:
2558 env['blasobjs'] = []
2559 print "Skipping... BLAS won't be built:", without_local_blas_reason
2560
2561 if not with_ida:
2562 print "Skipping... IDA won't be built:", without_ida_reason
2563
2564 if not with_dopri5:
2565 print "Skipping... DOPRI5 won't be built:", without_dopri5_reason
2566
2567 if with_mmio:
2568 srcs += env.SConscript(['mmio/SConscript'],'env')
2569 else:
2570 print "Skipping... MMIO export won't be built:", without_mmio_reason
2571 #-------------
2572 # LIBASCEND -- all base/generic functionality
2573
2574 if with_dmalloc:
2575 libascend_env.Append(LIBS=['dmalloc'])
2576
2577 if with_ufsparse:
2578 libascend_env.Append(LIBS=['cxsparse'])
2579
2580 libascend = libascend_env.SharedLibrary('ascend',srcs)
2581
2582 # for use in declaring dependent shared libraries in SConscript files (eg solvers/*/SConscript)
2583 env['libascend'] = libascend
2584
2585 env.Alias('libascend',libascend)
2586
2587 #-------------
2588 # UNIT TESTS (C CODE)
2589
2590 if with_cunit:
2591 testdirs = ['general','solver','utilities','linear','compiler']
2592 testsrcs = []
2593 for testdir in testdirs:
2594 path = 'base/generic/'+testdir+'/test/'
2595 env.SConscript([path+'SConscript'],'env')
2596 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2597
2598 #print "TESTSRCS =",testsrcs
2599
2600 env.SConscript(['test/SConscript'],'env')
2601 env.SConscript(['base/generic/test/SConscript'],'env')
2602
2603 env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2604
2605 else:
2606 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2607
2608 #-------------
2609 # EXTERNAL SOLVERS
2610
2611 env['extfns']=[]
2612
2613 env.SConscript(['solvers/SConscript'],'env')
2614
2615 #-------------
2616 # EXTERNAL FUNCTIONS
2617
2618 modeldirs = env.SConscript(['models/SConscript'],'env')
2619
2620 if not with_extfns:
2621 print "Skipping... External modules aren't being built:",without_extfns_reason
2622
2623 env.Alias('extfns',env['extfns'])
2624
2625 #------------------------------------------------------
2626 # CREATE ASCEND-CONFIG scriptlet
2627
2628 ascendconfig = env.SubstInFile('ascend-config.in')
2629
2630
2631 #------------------------------------------------------
2632 # CREATE asc4dev scriptlet
2633
2634 asc4devcmd = env.SubstInFile('tcltk/asc4dev.in')
2635 env.AddPostAction(asc4devcmd, 'chmod 755 $TARGET')
2636 #------------------------------------------------------
2637 # INSTALLATION
2638
2639 if env.get('CAN_INSTALL'):
2640
2641 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE','INSTALL_DOC']
2642 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2643 install_dirs += modeldirs + [Dir(env.subst("$INSTALL_ROOT$INSTALL_SOLVERS"))]
2644
2645 # TODO: add install options
2646 env.Alias('install',install_dirs)
2647
2648 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2649
2650 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2651
2652 #------------------------------------------------------
2653 # WINDOWS INSTALLER
2654
2655 if not env.get('NSIS'):
2656 with_installer = False
2657 without_installer_reason = "NSIS not found"
2658
2659 if with_installer:
2660 env.Append(NSISDEFINES={
2661 'OUTFILE':"#dist/"+env['WIN_INSTALLER_NAME']
2662 ,"VERSION":version
2663 ,'PYVERSION':pyversion
2664 })
2665 installer = env.Installer('nsis/installer.nsi')
2666 Depends(installer,["pygtk","tcltk","ascend.dll","models","ascend-config"])
2667 env.Alias('installer',installer)
2668 else:
2669 print "Skipping... Windows installer isn't being built:",without_installer_reason
2670
2671
2672 #------------------------------------------------------
2673 # PROJECT FILE for MSVC
2674
2675 env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2676
2677 #------------------------------------------------------
2678 # CREATE the SPEC file for generation of RPM packages
2679
2680 if platform.system()=="Linux":
2681 env.SubstInFile('ascend.spec.in')
2682
2683 #------------------------------------------------------
2684 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2685
2686 #if with_scrollkeeper:
2687 # #env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2688 # #env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2689
2690 #------------------------------------------------------
2691 # DISTRIBUTION TAR FILE
2692
2693 env['DISTTAR_FORMAT']='bz2'
2694 env.Append(
2695 DISTTAR_EXCLUDEEXTS=['.o','.os','.so','.a','.dll','.lib','.cc','.cache',
2696 '.pyc','.cvsignore','.dblite','.log','.pl','.out','.exe','.aux','.idx',
2697 '.toc','.lof','.lot','.mm','.warnings','.tm2','.swp',',tmp','.gz',
2698 '.bz2','.7z','.deb','.dsc','.changes']
2699 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2700 )
2701
2702 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2703 , [env.Dir('#')]
2704 )
2705
2706 env.Depends(tar,'ascend.spec')
2707 env.Depends(tar,'#doc/book.pdf')
2708
2709 #------------------------------------------------------
2710 # DISTRIBUTION TAR FILE (new style with AccumulateBuilder)
2711
2712 # ...
2713
2714 #------------------------------------------------------
2715 # DEBIAN TARBALL for use with Build Service
2716
2717 import glob
2718 deb_manfiles = glob.glob('debian/*.man')
2719
2720 deb_tar = env.Tar(
2721 'dist/debian.tar.gz'
2722 ,deb_manfiles + ['debian/rules','debian/control','debian/changelog','debian/compat','debian/copyright','debian/dirs'
2723 ,'debian/postinst','debian/postrm']
2724 ,TARFLAGS = ['cz']
2725 )
2726
2727 Alias('dist',[tar,deb_tar])
2728
2729 #------------------------------------------------------
2730 # DOCUMENTATION
2731
2732 #print "WITH_DOC_BUILD = ",with_doc_build
2733
2734 if not with_doc_build:
2735 print "Skipping... Documentation isn't being built:",without_doc_build_reason
2736
2737 #user's manual
2738 env.SConscript('doc/SConscript',['env'])
2739
2740 # doxygen documentation
2741 env.SConscript('base/doc/SConscript',['env'])
2742
2743 #------------------------------------------------------
2744 # RPM BUILD
2745
2746 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2747 # (check * for the version number used to create the tarball)
2748
2749 #------------------------------------------------------
2750 # DEFAULT TARGETS
2751
2752 default_targets =['libascend','solvers']
2753 if with_tcltk:
2754 default_targets.append('tcltk')
2755 if with_python:
2756 default_targets.append('pygtk')
2757 if with_installer:
2758 default_targets.append('installer')
2759 if with_extfns:
2760 default_targets.append('extfns')
2761 if with_doc_build:
2762 default_targets.append('doc')
2763
2764 env.Default(default_targets)
2765
2766 print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2767
2768 # vim: set syntax=python:

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