/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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