/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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