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 = "tcl84" |
70 |
default_tk_lib = "tk84" |
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 min == 3 and (pat == 40 or pat == 39): |
1152 |
msg = "WARNING: buggy version, see the ASCEND wiki. Suggest: try version 1.3.36" |
1153 |
res = True |
1154 |
elif maj == 1 and ( |
1155 |
min > 3 |
1156 |
or (min == 3 and pat >= 24) |
1157 |
): |
1158 |
msg = "ok" |
1159 |
res = True |
1160 |
|
1161 |
context.Result("%s, %d.%d.%d" % (msg, maj,min,pat)) |
1162 |
return res; |
1163 |
|
1164 |
#---------------- |
1165 |
# Scrollkeeper (Linux documentation system) |
1166 |
|
1167 |
def get_scrollkeeper_omfdir(env): |
1168 |
cmd = ['scrollkeeper-config','--omfdir'] |
1169 |
p = subprocess.Popen(cmd,stdout=subprocess.PIPE) |
1170 |
output = p.communicate() |
1171 |
return output.strip() |
1172 |
|
1173 |
def CheckScrollkeeperConfig(context): |
1174 |
try: |
1175 |
context.Message("Checking for scrollkeeper...") |
1176 |
dir=get_scrollkeeper_omfdir(context.env) |
1177 |
except: |
1178 |
context.Result("Failed to run 'scrollkeeper-config'") |
1179 |
return 0 |
1180 |
context.env['OMFDIR']=dir |
1181 |
context.Result("OK, %s" % dir) |
1182 |
return 1 |
1183 |
|
1184 |
#---------------- |
1185 |
# General purpose library-and-header test |
1186 |
|
1187 |
class KeepContext: |
1188 |
def __init__(self,context,varprefix,static=False): |
1189 |
self.keep = {} |
1190 |
for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']: |
1191 |
#print "Keeping env %s = %s" % (k,context.env.get(k)) |
1192 |
self.keep[k]=context.env.get(k) |
1193 |
|
1194 |
if context.env.has_key(varprefix+'_CPPPATH'): |
1195 |
context.env.AppendUnique(CPPPATH=[env[varprefix+'_CPPPATH']]) |
1196 |
#print "Adding '"+str(env[varprefix+'_CPPPATH'])+"' to cpp path" |
1197 |
|
1198 |
if static: |
1199 |
staticlib=env[varprefix+'_LIB'] |
1200 |
#print "STATIC LIB = ",staticlib |
1201 |
context.env.Append( |
1202 |
LINKFLAGS=[staticlib] |
1203 |
) |
1204 |
else: |
1205 |
if context.env.has_key(varprefix+'_LIBPATH'): |
1206 |
context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']]) |
1207 |
#print "Adding '"+str(env[varprefix+'_LIBPATH'])+"' to lib path" |
1208 |
|
1209 |
if context.env.has_key(varprefix+'_LIB'): |
1210 |
context.env.Append(LIBS=[env[varprefix+'_LIB']]) |
1211 |
#print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs" |
1212 |
elif context.env.has_key(varprefix+'_LIBS'): |
1213 |
context.env.AppendUnique(LIBS=env[varprefix+'_LIBS']) |
1214 |
|
1215 |
def restore(self,context): |
1216 |
#print "RESTORING CONTEXT" |
1217 |
#print self.keep |
1218 |
#print "..." |
1219 |
for k in self.keep: |
1220 |
if self.keep[k]==None: |
1221 |
if context.env.has_key(k): |
1222 |
#print "Clearing "+str(k) |
1223 |
del context.env[k]; |
1224 |
else: |
1225 |
#print "Restoring %s to '%s'" %(k,self.keep.get(k)) |
1226 |
context.env[k]=self.keep[k]; |
1227 |
|
1228 |
def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False,testname=None): |
1229 |
"""This method will check for variables LIBNAME_LIBPATH |
1230 |
and LIBNAME_CPPPATH and try to compile and link the |
1231 |
file with the provided text, linking with the |
1232 |
library libname.""" |
1233 |
|
1234 |
if testname is None: |
1235 |
testname = libname |
1236 |
|
1237 |
if static: |
1238 |
context.Message( 'Checking for static '+testname+'... ' ) |
1239 |
else: |
1240 |
context.Message( 'Checking for '+testname+'... ' ) |
1241 |
|
1242 |
if varprefix==None: |
1243 |
varprefix = libname.upper() |
1244 |
|
1245 |
#print "LIBS is currently:",context.env.get('LIBS') |
1246 |
keep = KeepContext(context,varprefix,static) |
1247 |
|
1248 |
if not context.env.has_key(varprefix+'_LIB') and not context.env.has_key(varprefix+'_LIBS'): |
1249 |
# if varprefix_LIB were in env, KeepContext would |
1250 |
# have appended it already |
1251 |
context.env.Append(LIBS=[libname]) |
1252 |
|
1253 |
is_ok = context.TryLink(text,ext) |
1254 |
|
1255 |
#print "Link success? ",(is_ok != 0) |
1256 |
|
1257 |
keep.restore(context) |
1258 |
|
1259 |
# print "Restored CPPPATH="+str(context.env['CPPPATH']) |
1260 |
# print "Restored LIBS="+str(context.env['LIBS']) |
1261 |
# print "Restored LIBPATH="+str(context.env['LIBPATH']) |
1262 |
|
1263 |
context.Result(is_ok) |
1264 |
return is_ok |
1265 |
|
1266 |
#---------------- |
1267 |
# GCC |
1268 |
|
1269 |
gcc_test_text = """ |
1270 |
#ifndef __GNUC__ |
1271 |
# error "Not using GCC" |
1272 |
#endif |
1273 |
|
1274 |
int main(void){ |
1275 |
return __GNUC__; |
1276 |
} |
1277 |
""" |
1278 |
|
1279 |
def CheckGcc(context): |
1280 |
context.Message("Checking for GCC... ") |
1281 |
is_ok = context.TryCompile(gcc_test_text,".c") |
1282 |
context.Result(is_ok) |
1283 |
return is_ok |
1284 |
|
1285 |
#---------------- |
1286 |
# GCC VISIBILITY feature |
1287 |
|
1288 |
gccvisibility_test_text = """ |
1289 |
#if __GNUC__ < 4 |
1290 |
# error "Require GCC version 4 or newer" |
1291 |
#endif |
1292 |
|
1293 |
__attribute__ ((visibility("default"))) int x; |
1294 |
|
1295 |
int main(void){ |
1296 |
extern int x; |
1297 |
x = 4; |
1298 |
} |
1299 |
""" |
1300 |
|
1301 |
def CheckGccVisibility(context): |
1302 |
context.Message("Checking for GCC 'visibility' capability... ") |
1303 |
if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']: |
1304 |
context.Result("disabled") |
1305 |
return 0 |
1306 |
is_ok = context.TryCompile(gccvisibility_test_text,".c") |
1307 |
context.Result(is_ok) |
1308 |
return is_ok |
1309 |
|
1310 |
#---------------- |
1311 |
# YACC |
1312 |
|
1313 |
yacc_test_text = """ |
1314 |
%{ |
1315 |
#include <stdio.h> |
1316 |
|
1317 |
/* MSVC++ needs this before it can swallow Bison output */ |
1318 |
#ifdef _MSC_VER |
1319 |
# define __STDC__ |
1320 |
#endif |
1321 |
%} |
1322 |
%token MSG |
1323 |
%start ROOT |
1324 |
%% |
1325 |
ROOT: |
1326 |
MSG { printf("HELLO"); } |
1327 |
; |
1328 |
%% |
1329 |
""" |
1330 |
|
1331 |
def CheckYacc(context): |
1332 |
context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC')) |
1333 |
is_ok = context.TryCompile(yacc_test_text,".y") |
1334 |
context.Result(is_ok) |
1335 |
return is_ok |
1336 |
|
1337 |
#---------------- |
1338 |
# LEX |
1339 |
|
1340 |
lex_test_text = """ |
1341 |
%{ |
1342 |
#include <stdio.h> |
1343 |
%} |
1344 |
DIGIT [0-9] |
1345 |
ID [a-z][a-z0-9]* |
1346 |
%% |
1347 |
{DIGIT}+ { |
1348 |
printf("A digit: %s\\n",yytext); |
1349 |
} |
1350 |
|
1351 |
[ \\t\\n]+ /* ignore */ |
1352 |
|
1353 |
. { |
1354 |
printf("Unrecognized guff"); |
1355 |
} |
1356 |
%% |
1357 |
main(){ |
1358 |
yylex(); |
1359 |
} |
1360 |
""" |
1361 |
|
1362 |
def CheckLex(context): |
1363 |
context.Message("Checking for Lex ('%s')... " % context.env.get('LEX')) |
1364 |
is_ok = context.TryCompile(lex_test_text,".l") |
1365 |
context.Result(is_ok) |
1366 |
return is_ok |
1367 |
|
1368 |
#---------------- |
1369 |
# CUnit test |
1370 |
|
1371 |
cunit_test_text = """ |
1372 |
#include <CUnit/CUnit.h> |
1373 |
int maxi(int i1, int i2){ |
1374 |
return (i1 > i2) ? i1 : i2; |
1375 |
} |
1376 |
|
1377 |
void test_maxi(void){ |
1378 |
CU_ASSERT(maxi(0,2) == 2); |
1379 |
CU_ASSERT(maxi(0,-2) == 0); |
1380 |
CU_ASSERT(maxi(2,2) == 2); |
1381 |
|
1382 |
} |
1383 |
int main(void){ |
1384 |
/* CU_initialize_registry() */ |
1385 |
return 0; |
1386 |
} |
1387 |
""" |
1388 |
|
1389 |
def CheckCUnit(context): |
1390 |
return CheckExtLib(context,'cunit',cunit_test_text) |
1391 |
|
1392 |
#---------------- |
1393 |
# dmalloc test |
1394 |
|
1395 |
dmalloc_test_text = """ |
1396 |
#include <stdlib.h> |
1397 |
#include <dmalloc.h> |
1398 |
|
1399 |
int main(void){ |
1400 |
char *c; |
1401 |
c = (char *)malloc(100*sizeof(char)); |
1402 |
free(c); |
1403 |
return 0; |
1404 |
} |
1405 |
""" |
1406 |
|
1407 |
def CheckDMalloc(context): |
1408 |
return CheckExtLib(context,'dmalloc',dmalloc_test_text) |
1409 |
|
1410 |
#---------------- |
1411 |
# graphviz test |
1412 |
|
1413 |
graphviz_test_text = """ |
1414 |
#ifdef __WIN32__ |
1415 |
# include <gvc.h> |
1416 |
#else |
1417 |
# include <graphviz/gvc.h> |
1418 |
#endif |
1419 |
int main(void){ |
1420 |
Agraph_t *g; |
1421 |
GVC_t *gvc; |
1422 |
gvc = gvContext(); |
1423 |
g = agopen("g", AGDIGRAPH); |
1424 |
return 0; |
1425 |
} |
1426 |
""" |
1427 |
|
1428 |
def CheckGraphViz(context): |
1429 |
return CheckExtLib(context,'graphviz',graphviz_test_text,ext=".c") |
1430 |
|
1431 |
graphviz_boolean_test = """ |
1432 |
#ifdef __WIN32__ |
1433 |
# include <types.h> |
1434 |
#else |
1435 |
# include <graphviz/types.h> |
1436 |
#endif |
1437 |
#ifndef GV_TYPES_H |
1438 |
# error WHERE IS GV_TYPES_H? |
1439 |
#endif |
1440 |
int main(void){ |
1441 |
boolean x; |
1442 |
x = TRUE; |
1443 |
return 0; |
1444 |
} |
1445 |
""" |
1446 |
|
1447 |
def CheckGraphVizBoolean(context): |
1448 |
return CheckExtLib(context,'graphviz',graphviz_boolean_test,ext=".c" \ |
1449 |
,testname="graphviz 'boolean' definition" |
1450 |
) |
1451 |
|
1452 |
#---------------- |
1453 |
# ufsparse test |
1454 |
|
1455 |
ufsparse_test_text = """ |
1456 |
#include <ufsparse/cs.h> |
1457 |
int main(void){ |
1458 |
cs *A,*B,*C; |
1459 |
C = cs_multiply(A,B); |
1460 |
return 0; |
1461 |
} |
1462 |
""" |
1463 |
|
1464 |
def CheckUFSparse(context): |
1465 |
return CheckExtLib(context |
1466 |
,libname='cxsparse' |
1467 |
,varprefix='ufsparse' |
1468 |
,text=ufsparse_test_text |
1469 |
,ext=".c" |
1470 |
) |
1471 |
|
1472 |
#---------------- |
1473 |
# MATH test |
1474 |
|
1475 |
math_test_text = """ |
1476 |
#ifndef _ALL_SOURCE |
1477 |
# define _ALL_SOURCE |
1478 |
#endif |
1479 |
#ifndef _XOPEN_SOURCE |
1480 |
# define _XOPEN_SOURCE |
1481 |
#endif |
1482 |
#ifndef _XOPEN_SOURCE_EXTENDED |
1483 |
# define _XOPEN_SOURCE_EXTENDED 1 |
1484 |
#endif |
1485 |
#include <math.h> |
1486 |
int main(void){ |
1487 |
double x = 1.0; double y = 1.0; int i = 1; |
1488 |
acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x); |
1489 |
j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x); |
1490 |
y0(x); y1(x); yn(i,x); |
1491 |
/* this part causes problems with crossmingw... */ |
1492 |
#ifdef _THREAD_SAFE |
1493 |
gamma_r(x,&i); |
1494 |
lgamma_r(x,&i); |
1495 |
#else |
1496 |
gamma(x); |
1497 |
lgamma(x); |
1498 |
#endif |
1499 |
hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y); |
1500 |
return 0; |
1501 |
} |
1502 |
""" |
1503 |
|
1504 |
def CheckMath(context): |
1505 |
context.Message('Checking for IEEE math library... ') |
1506 |
libsave=context.env.get('LIBS'); |
1507 |
context.env.AppendUnique(LIBS=['m']) |
1508 |
is_ok=context.TryLink(math_test_text,".c") |
1509 |
context.Result(is_ok) |
1510 |
if libsave is None: |
1511 |
del(context.env['LIBS']) |
1512 |
else: |
1513 |
context.env['LIBS']=libsave |
1514 |
return is_ok |
1515 |
|
1516 |
#---------------- |
1517 |
# malloc.h test |
1518 |
|
1519 |
malloc_test_text = """ |
1520 |
#include <stdlib.h> |
1521 |
int main(){ |
1522 |
double *x; |
1523 |
x = malloc(sizeof(double)*5); |
1524 |
x[4] = 3.3; |
1525 |
free(x); |
1526 |
} |
1527 |
""" |
1528 |
|
1529 |
def CheckMalloc(context): |
1530 |
context.Message("Checking for malloc...") |
1531 |
is_ok = context.TryLink(malloc_test_text,".c") |
1532 |
context.Result(is_ok) |
1533 |
return is_ok |
1534 |
|
1535 |
#---------------- |
1536 |
# dlopen test |
1537 |
|
1538 |
dlopen_test_text = """ |
1539 |
#ifdef __WIN32__ |
1540 |
# include <windows.h> |
1541 |
#else |
1542 |
# include <dlfcn.h> |
1543 |
#endif |
1544 |
int main(){ |
1545 |
#ifdef __WIN32__ |
1546 |
HINSTANCE d; |
1547 |
LoadLibrary("imaginary_and_nonexistent.dll"); |
1548 |
#else |
1549 |
void *d; |
1550 |
d = dlopen("imaginary_and_nonexistent.so", 1); |
1551 |
#endif |
1552 |
return 0; |
1553 |
} |
1554 |
""" |
1555 |
|
1556 |
def CheckDLOpen(context): |
1557 |
context.Message("Checking for ability to load shared libraries at runtime...") |
1558 |
libsave=context.env.get('LIBS'); |
1559 |
if platform.system()!="Windows": |
1560 |
context.env.Append(LIBS=['dl']) |
1561 |
is_ok = context.TryLink(dlopen_test_text,".c") |
1562 |
context.Result(is_ok) |
1563 |
context.env['LIBS'] = libsave |
1564 |
return is_ok |
1565 |
|
1566 |
#---------------- |
1567 |
# libpython test |
1568 |
|
1569 |
libpython_test_text = """ |
1570 |
#include <Python.h> |
1571 |
int main(void){ |
1572 |
PyObject *p; |
1573 |
p = Py_None; |
1574 |
return 0; |
1575 |
} |
1576 |
""" |
1577 |
|
1578 |
def CheckPythonLib(context): |
1579 |
context.Message('Checking for libpython... ') |
1580 |
|
1581 |
if platform.system()=="Windows": |
1582 |
python_lib='python%d%d' |
1583 |
else: |
1584 |
python_lib='python%d.%d' |
1585 |
|
1586 |
try: |
1587 |
python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])] |
1588 |
python_cpppath = [distutils.sysconfig.get_python_inc()] |
1589 |
cfig = distutils.sysconfig.get_config_vars() |
1590 |
except: |
1591 |
context.Result("not found") |
1592 |
return 0 |
1593 |
|
1594 |
lastLIBS = context.env.get('LIBS') |
1595 |
lastLIBPATH = context.env.get('LIBPATH') |
1596 |
lastCPPPATH = context.env.get('CPPPATH') |
1597 |
lastLINKFLAGS = context.env.get('LINKFLAGS') |
1598 |
|
1599 |
python_libpath = [] |
1600 |
python_linkflags = [] |
1601 |
if platform.system()=="Windows": |
1602 |
python_libpath += [os.path.join(sys.prefix,"libs")] |
1603 |
elif platform.system()=="Darwin": |
1604 |
python_libpath += [cfig['LIBPL']] |
1605 |
python_linkflags += cfig['LIBS'].split(' ') |
1606 |
else: |
1607 |
# checked on Linux and SunOS |
1608 |
if cfig['LDLIBRARY']==cfig['LIBRARY']: |
1609 |
sys.stdout.write("(static)") |
1610 |
python_libpath += [cfig['LIBPL']] |
1611 |
python_linkflags += cfig['LIBS'].split(' ') |
1612 |
|
1613 |
context.env.AppendUnique(LIBS=python_libs) |
1614 |
context.env.AppendUnique(LIBPATH=python_libpath) |
1615 |
context.env.AppendUnique(CPPPATH=python_cpppath) |
1616 |
context.env.AppendUnique(LINKFLAGS=python_linkflags) |
1617 |
result = context.TryLink(libpython_test_text,".c"); |
1618 |
|
1619 |
context.Result(result) |
1620 |
|
1621 |
if(result): |
1622 |
context.env['PYTHON_LIBPATH']=python_libpath |
1623 |
context.env['PYTHON_LIB']=python_libs |
1624 |
context.env['PYTHON_CPPPATH']=python_cpppath |
1625 |
context.env['PYTHON_LINKFLAGS']=python_linkflags |
1626 |
|
1627 |
context.env['LIBS'] = lastLIBS |
1628 |
context.env['LIBPATH'] = lastLIBPATH |
1629 |
context.env['CPPPATH'] = lastCPPPATH |
1630 |
context.env['LINKFLAGS'] = lastLINKFLAGS |
1631 |
|
1632 |
return result |
1633 |
|
1634 |
#---------------- |
1635 |
# IDA test |
1636 |
|
1637 |
sundials_version_major_required = 2 |
1638 |
sundials_version_minor_min = 2 |
1639 |
sundials_version_minor_max = 4 |
1640 |
|
1641 |
sundials_version_text = """ |
1642 |
#include <sundials/sundials_config.h> |
1643 |
#include <stdio.h> |
1644 |
int main(){ |
1645 |
printf("%s",SUNDIALS_PACKAGE_VERSION); |
1646 |
return 0; |
1647 |
} |
1648 |
""" |
1649 |
|
1650 |
ida_test_text = """ |
1651 |
#if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2 |
1652 |
# include <sundials/sundials_config.h> |
1653 |
# include <sundials/sundials_nvector.h> |
1654 |
# include <nvector_serial.h> |
1655 |
# include <ida.h> |
1656 |
# include <ida/ida_spgmr.h> |
1657 |
#else |
1658 |
# include <sundials/sundials_config.h> |
1659 |
# include <nvector/nvector_serial.h> |
1660 |
# include <ida/ida.h> |
1661 |
#endif |
1662 |
int main(){ |
1663 |
void *ida_mem; |
1664 |
ida_mem = IDACreate(); |
1665 |
return 0; |
1666 |
} |
1667 |
""" |
1668 |
|
1669 |
# slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS, |
1670 |
# so detect the version and act accordingly. |
1671 |
def CheckSUNDIALS(context): |
1672 |
keep = KeepContext(context,'SUNDIALS') |
1673 |
context.Message("Checking for SUNDIALS... ") |
1674 |
(is_ok,output) = context.TryRun(sundials_version_text,'.c') |
1675 |
keep.restore(context) |
1676 |
if not is_ok: |
1677 |
context.Result(0) |
1678 |
return 0 |
1679 |
|
1680 |
major,minor,patch = tuple([int(i) for i in output.split(".")]) |
1681 |
context.env['SUNDIALS_VERSION_MAJOR'] = major |
1682 |
context.env['SUNDIALS_VERSION_MINOR'] = minor |
1683 |
if major != sundials_version_major_required \ |
1684 |
or minor < sundials_version_minor_min \ |
1685 |
or minor > sundials_version_minor_max: |
1686 |
context.Result(output+" (bad version)") |
1687 |
# bad version |
1688 |
return 0 |
1689 |
|
1690 |
# good version |
1691 |
context.Result("%d.%d.%d, good" % (major,minor,patch)) |
1692 |
|
1693 |
return 1 |
1694 |
|
1695 |
|
1696 |
def CheckIDA(context): |
1697 |
context.Message( 'Checking for IDA... ' ) |
1698 |
|
1699 |
keep = KeepContext(context,"SUNDIALS") |
1700 |
|
1701 |
major = context.env['SUNDIALS_VERSION_MAJOR'] |
1702 |
minor = context.env['SUNDIALS_VERSION_MINOR'] |
1703 |
|
1704 |
cppdef = context.env.get('CPPDEFINES') |
1705 |
|
1706 |
context.env.Append(CPPDEFINES=[ |
1707 |
('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR") |
1708 |
,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR") |
1709 |
]) |
1710 |
|
1711 |
context.env['SUNDIALS_CPPPATH_EXTRA']=[] |
1712 |
if major==2 and minor==2: |
1713 |
context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"]) |
1714 |
|
1715 |
context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")]) |
1716 |
context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS']) |
1717 |
context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA']) |
1718 |
|
1719 |
is_ok = context.TryLink(ida_test_text,".c") |
1720 |
context.Result(is_ok) |
1721 |
|
1722 |
if cppdef: |
1723 |
context.env['CPPDEFINES']=cppdef |
1724 |
else: |
1725 |
del context.env['CPPDEFINES'] |
1726 |
|
1727 |
keep.restore(context) |
1728 |
|
1729 |
return is_ok |
1730 |
|
1731 |
|
1732 |
#---------------- |
1733 |
# CONOPT test |
1734 |
|
1735 |
conopt_test_text = """ |
1736 |
#if !defined(_WIN32) |
1737 |
# define FNAME_LCASE_DECOR |
1738 |
#endif |
1739 |
|
1740 |
#include <conopt.h> |
1741 |
#include <stdlib.h> |
1742 |
int main(){ |
1743 |
int s, *v, e; |
1744 |
s = COIDEF_Size(); |
1745 |
v = (int *)malloc(s*sizeof(int)); |
1746 |
e = COIDEF_Ini(v); |
1747 |
return e; |
1748 |
} |
1749 |
""" |
1750 |
|
1751 |
def CheckCONOPT(context): |
1752 |
context.Message( 'Checking for CONOPT... ' ) |
1753 |
|
1754 |
keep = KeepContext(context,"CONOPT") |
1755 |
|
1756 |
is_ok = context.TryLink(conopt_test_text,".c") |
1757 |
context.Result(is_ok) |
1758 |
|
1759 |
keep.restore(context) |
1760 |
|
1761 |
return is_ok |
1762 |
|
1763 |
#---------------- |
1764 |
# IPOPT test |
1765 |
|
1766 |
ipopt_test_text = """ |
1767 |
#if !defined(_WIN32) |
1768 |
# define FNAME_LCASE_DECOR |
1769 |
#endif |
1770 |
|
1771 |
#include <coin/IpStdCInterface.h> |
1772 |
int main(){ |
1773 |
Number n; |
1774 |
IpoptProblem nlp = 0; |
1775 |
n = 1; |
1776 |
FreeIpoptProblem(nlp); // probably a crash if you run this |
1777 |
return 0; |
1778 |
} |
1779 |
""" |
1780 |
|
1781 |
def CheckIPOPT(context): |
1782 |
context.Message( 'Checking for IPOPT... ' ) |
1783 |
|
1784 |
keep = KeepContext(context,"IPOPT") |
1785 |
is_ok = context.TryLink(ipopt_test_text,".c") |
1786 |
context.Result(is_ok) |
1787 |
|
1788 |
keep.restore(context) |
1789 |
|
1790 |
return is_ok |
1791 |
|
1792 |
#---------------- |
1793 |
# Tcl test |
1794 |
|
1795 |
# TCL and TK required version 8.1 through 8.5: |
1796 |
tcltk_minor_newest_acceptable = 5 |
1797 |
tcltk_major_required = 8 |
1798 |
|
1799 |
tcl_check_text = r""" |
1800 |
#include <tcl.h> |
1801 |
#include <stdio.h> |
1802 |
int main(void){ |
1803 |
printf("%s",TCL_PATCH_LEVEL); |
1804 |
return 0; |
1805 |
} |
1806 |
""" |
1807 |
|
1808 |
def CheckTcl(context): |
1809 |
return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK']) |
1810 |
|
1811 |
def CheckTclVersion(context): |
1812 |
keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK']) |
1813 |
context.Message("Checking Tcl version... ") |
1814 |
(is_ok,output) = context.TryRun(tcl_check_text,'.c') |
1815 |
keep.restore(context) |
1816 |
if not is_ok: |
1817 |
context.Result("failed to run check") |
1818 |
return 0 |
1819 |
|
1820 |
major,minor,patch = tuple([int(i) for i in output.split(".")]) |
1821 |
if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable: |
1822 |
context.Result(output+" (bad version)") |
1823 |
# bad version |
1824 |
return 0 |
1825 |
|
1826 |
# good version |
1827 |
context.Result(output+", good") |
1828 |
return 1 |
1829 |
|
1830 |
#---------------- |
1831 |
# Tk test |
1832 |
|
1833 |
tk_check_text = r""" |
1834 |
#include <tk.h> |
1835 |
#include <stdio.h> |
1836 |
int main(void){ |
1837 |
printf("%s",TK_PATCH_LEVEL); |
1838 |
return 0; |
1839 |
} |
1840 |
""" |
1841 |
def CheckTk(context): |
1842 |
return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK']) |
1843 |
|
1844 |
|
1845 |
def CheckTkVersion(context): |
1846 |
keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK']) |
1847 |
context.Message("Checking Tk version... ") |
1848 |
#print "LINKFLAGS =",context.env['LINKFLAGS'] |
1849 |
(is_ok,output) = context.TryRun(tk_check_text,'.c') |
1850 |
keep.restore(context) |
1851 |
if not is_ok: |
1852 |
context.Result("failed to run check") |
1853 |
return 0 |
1854 |
|
1855 |
major,minor,patch = tuple([int(i) for i in output.split(".")]) |
1856 |
if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable: |
1857 |
# bad version |
1858 |
context.Result(output+" (bad version)") |
1859 |
return 0 |
1860 |
|
1861 |
# good version |
1862 |
context.Result(output+" (good)") |
1863 |
return 1 |
1864 |
|
1865 |
#---------------- |
1866 |
# Tktable test |
1867 |
|
1868 |
tktable_check_text = r""" |
1869 |
#include <tkTable.h> |
1870 |
#include <stdio.h> |
1871 |
int main(void){ |
1872 |
Table mytable; |
1873 |
return 0; |
1874 |
} |
1875 |
""" |
1876 |
|
1877 |
def CheckTkTable(context): |
1878 |
return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK']) |
1879 |
|
1880 |
#--------------- |
1881 |
# X11 test |
1882 |
|
1883 |
x11_check_text = r""" |
1884 |
#include <X11/Xlib.h> |
1885 |
#include <X11/IntrinsicP.h> |
1886 |
#include <X11/Intrinsic.h> |
1887 |
#include <X11/ObjectP.h> |
1888 |
#include <X11/Object.h> |
1889 |
int main(void){ |
1890 |
Object mything; |
1891 |
return 0; |
1892 |
} |
1893 |
""" |
1894 |
|
1895 |
def CheckX11(context): |
1896 |
return CheckExtLib(context,'X11',x11_check_text) |
1897 |
|
1898 |
#---------------- |
1899 |
# Check that we can raise and catch sigint |
1900 |
|
1901 |
sigint_test_text = r""" |
1902 |
#include <signal.h> |
1903 |
#include <setjmp.h> |
1904 |
#include <stdlib.h> |
1905 |
static jmp_buf g_jmpenv; |
1906 |
void sighandler(int sig){ |
1907 |
longjmp(g_jmpenv,sig); |
1908 |
} |
1909 |
void testsigint(){ |
1910 |
raise(SIGINT); |
1911 |
} |
1912 |
int main(void){ |
1913 |
signal(SIGINT,&sighandler); |
1914 |
switch(setjmp(g_jmpenv)){ |
1915 |
case 0: |
1916 |
testsigint(); |
1917 |
exit(1); |
1918 |
case SIGINT: |
1919 |
exit(0); |
1920 |
default: |
1921 |
exit(2); |
1922 |
} |
1923 |
} |
1924 |
""" |
1925 |
|
1926 |
def CheckSIGINT(context): |
1927 |
context.Message("Checking SIGINT is catchable... ") |
1928 |
(is_ok,output)=context.TryRun(sigint_test_text,".c") |
1929 |
context.Result(is_ok) |
1930 |
return is_ok |
1931 |
|
1932 |
#---------------- |
1933 |
# Check that we're able to catch floating point errors |
1934 |
|
1935 |
sigfpe_test_text = r""" |
1936 |
#include <signal.h> |
1937 |
#include <setjmp.h> |
1938 |
#include <stdlib.h> |
1939 |
#include <fenv.h> |
1940 |
static jmp_buf g_jmpenv; |
1941 |
void fpehandler(int sig){ |
1942 |
longjmp(g_jmpenv,sig); |
1943 |
} |
1944 |
int main(void){ |
1945 |
fenv_t myfenv; |
1946 |
fegetenv(&myfenv); |
1947 |
fesetenv(&myfenv); |
1948 |
feenableexcept(FE_ALL_EXCEPT); |
1949 |
signal(SIGFPE,&fpehandler); |
1950 |
double x; |
1951 |
switch(setjmp(g_jmpenv)){ |
1952 |
case 0: |
1953 |
x = 1.0 / 0.0; |
1954 |
/* failed to catch */ |
1955 |
exit(1); |
1956 |
case SIGFPE: |
1957 |
exit(0); |
1958 |
} |
1959 |
} |
1960 |
""" |
1961 |
|
1962 |
def CheckFPE(context): |
1963 |
context.Message("Checking C99 FPE behaviour... ") |
1964 |
(is_ok,output) = context.TryRun(sigfpe_test_text,'.c') |
1965 |
context.Result(is_ok) |
1966 |
return is_ok |
1967 |
|
1968 |
#---------------- |
1969 |
# signal reset needed? |
1970 |
|
1971 |
sigreset_test_text = r""" |
1972 |
#include <signal.h> |
1973 |
#include <setjmp.h> |
1974 |
#include <stdlib.h> |
1975 |
#include <stdio.h> |
1976 |
typedef void SigHandlerFn(int); |
1977 |
static jmp_buf g_jmpenv; |
1978 |
void sighandler(int sig){ |
1979 |
longjmp(g_jmpenv,sig); |
1980 |
} |
1981 |
void testsigint(){ |
1982 |
/* fprintf(stderr,"Raising SIGINT\n"); */ |
1983 |
raise(SIGINT); |
1984 |
} |
1985 |
int main(void){ |
1986 |
SigHandlerFn *last,*saved; |
1987 |
saved = signal(SIGINT,&sighandler); |
1988 |
if(saved!=SIG_DFL){ |
1989 |
fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL); |
1990 |
exit(3); |
1991 |
} |
1992 |
switch(setjmp(g_jmpenv)){ |
1993 |
case 0: |
1994 |
testsigint(); |
1995 |
fprintf(stderr,"Back from SIGINT\n"); |
1996 |
exit(1); |
1997 |
case SIGINT: |
1998 |
break; |
1999 |
default: |
2000 |
exit(2); |
2001 |
}; |
2002 |
last = signal(SIGINT,SIG_DFL); |
2003 |
if(last!=&sighandler){ |
2004 |
printf("1"); |
2005 |
exit(0); |
2006 |
} |
2007 |
printf("0"); |
2008 |
exit(0); |
2009 |
} |
2010 |
""" |
2011 |
|
2012 |
def CheckSigReset(context): |
2013 |
context.Message("Checking signal handler reset... ") |
2014 |
libsave=context.env.get('LIBS') |
2015 |
context.env.AppendUnique(LIBS=['m']) |
2016 |
(is_ok,output) = context.TryRun(sigreset_test_text,'.c') |
2017 |
|
2018 |
if libsave is None: |
2019 |
del(context.env['LIBS']) |
2020 |
else: |
2021 |
context.env['LIBS']=libsave |
2022 |
|
2023 |
if not is_ok: |
2024 |
context.Result("ERROR") |
2025 |
return False |
2026 |
if int(output)==1: |
2027 |
context.Result("required"); |
2028 |
context.env['ASC_RESETNEEDED'] = True |
2029 |
else: |
2030 |
context.Result("not required"); |
2031 |
context.env['ASC_RESETNEEDED'] = False |
2032 |
return True |
2033 |
|
2034 |
#---------------- |
2035 |
# LyX on this system? |
2036 |
|
2037 |
def CheckLyx(context): |
2038 |
context.Message("Checking for LyX... ") |
2039 |
r = context.env.WhereIs("lyx") |
2040 |
if r: |
2041 |
context.Result(r) |
2042 |
else: |
2043 |
context.Result(0) |
2044 |
return r |
2045 |
|
2046 |
#---------------- |
2047 |
# Latex2HTML on this system? |
2048 |
|
2049 |
def CheckLatex2HTML(context): |
2050 |
context.Message("Checking for latex2html...") |
2051 |
if context.env.WhereIs("latex2html"): |
2052 |
r = True |
2053 |
else: |
2054 |
r = False |
2055 |
context.Result(r) |
2056 |
return r |
2057 |
|
2058 |
#---------------- |
2059 |
# 'lmodern' package for LaTeX available? |
2060 |
|
2061 |
lmodern_test_text = r""" |
2062 |
\documentclass{article} |
2063 |
\usepackage{lmodern} |
2064 |
\title{Cartesian closed categories and the price of eggs} |
2065 |
\author{Jane Doe} |
2066 |
\date{September 1994} |
2067 |
\begin{document} |
2068 |
\maketitle |
2069 |
Hello world! |
2070 |
\end{document} |
2071 |
"""; |
2072 |
|
2073 |
def CheckLModern(context): |
2074 |
context.Message("Checking for lmodern...") |
2075 |
b = context.env.get("DVI") |
2076 |
if not b: |
2077 |
context.Result(False) |
2078 |
return False |
2079 |
ff = context.env.get('LATEXFLAGS') |
2080 |
context.env.Append(LATEXFLAGS=['-interaction=nonstopmode','-halt-on-error']) |
2081 |
is_ok = context.TryBuild(builder=b,text=lmodern_test_text,extension=".latex") |
2082 |
print "is_ok=",is_ok |
2083 |
if ff is not None: |
2084 |
context.env['LATEXFLAGS'] = ff |
2085 |
else: |
2086 |
del context.env['LATEXFLAGS'] |
2087 |
context.Result(is_ok) |
2088 |
return is_ok |
2089 |
|
2090 |
#---------------- |
2091 |
# GCC Version sniffing |
2092 |
|
2093 |
# TODO FIXME |
2094 |
|
2095 |
gcc_version4 = False |
2096 |
|
2097 |
#------------------------------------------------------ |
2098 |
# CONFIGURATION |
2099 |
|
2100 |
conf = Configure(env |
2101 |
, custom_tests = { |
2102 |
'CheckCC' : CheckCC |
2103 |
, 'CheckCXX' : CheckCXX |
2104 |
, 'CheckF77' : CheckF77 |
2105 |
, 'CheckMath' : CheckMath |
2106 |
, 'CheckMalloc' : CheckMalloc |
2107 |
, 'CheckDLOpen' : CheckDLOpen |
2108 |
, 'CheckSwigVersion' : CheckSwigVersion |
2109 |
, 'CheckPythonLib' : CheckPythonLib |
2110 |
, 'CheckCUnit' : CheckCUnit |
2111 |
, 'CheckDMalloc' : CheckDMalloc |
2112 |
, 'CheckLyx' : CheckLyx |
2113 |
, 'CheckLatex2HTML' : CheckLatex2HTML |
2114 |
, 'CheckLModern' : CheckLModern |
2115 |
, 'CheckGraphViz' : CheckGraphViz |
2116 |
, 'CheckGraphVizBoolean' : CheckGraphVizBoolean |
2117 |
, 'CheckUFSparse' : CheckUFSparse |
2118 |
, 'CheckTcl' : CheckTcl |
2119 |
, 'CheckTclVersion' : CheckTclVersion |
2120 |
, 'CheckTk' : CheckTk |
2121 |
, 'CheckTkVersion' : CheckTkVersion |
2122 |
, 'CheckGcc' : CheckGcc |
2123 |
, 'CheckGccVisibility' : CheckGccVisibility |
2124 |
, 'CheckYacc' : CheckYacc |
2125 |
, 'CheckLex' : CheckLex |
2126 |
, 'CheckTkTable' : CheckTkTable |
2127 |
, 'CheckX11' : CheckX11 |
2128 |
, 'CheckIDA' : CheckIDA |
2129 |
, 'CheckSUNDIALS' : CheckSUNDIALS |
2130 |
, 'CheckCONOPT' : CheckCONOPT |
2131 |
, 'CheckIPOPT' : CheckIPOPT |
2132 |
, 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig |
2133 |
, 'CheckFPE' : CheckFPE |
2134 |
, 'CheckSIGINT' : CheckSIGINT |
2135 |
, 'CheckSigReset' : CheckSigReset |
2136 |
# , 'CheckIsNan' : CheckIsNan |
2137 |
# , 'CheckCppUnitConfig' : CheckCppUnitConfig |
2138 |
} |
2139 |
# , config_h = "config.h" |
2140 |
) |
2141 |
|
2142 |
def sconsversioncheck(): |
2143 |
|
2144 |
# uncomment the following line to skip the version check: |
2145 |
# return 1 |
2146 |
|
2147 |
import SCons |
2148 |
v = SCons.__version__.split(".") |
2149 |
if v[0] != '0': |
2150 |
if v[0] == '1': |
2151 |
return 1; |
2152 |
return 0 |
2153 |
if int(v[1]) >= 97: |
2154 |
return 1 |
2155 |
if v[1] != '96': |
2156 |
return 0 |
2157 |
micro = int(v[2]) |
2158 |
if micro == 92 or micro == 93 or micro == 96: |
2159 |
return 1; |
2160 |
return 0 |
2161 |
|
2162 |
if not sconsversioncheck(): |
2163 |
print "Scons version is not OK. Please try version 0.96.92 or 0.96.93," |
2164 |
print "or consult the developers in the case of newer versions. Modify" |
2165 |
print "the function 'sconsversioncheck' in the file SConstruct if you" |
2166 |
print "want to *force* SCons to continue." |
2167 |
Exit(1) |
2168 |
|
2169 |
# check C compiler |
2170 |
|
2171 |
if conf.CheckCC() is False: |
2172 |
print "Failed to build simple test file with your C compiler." |
2173 |
print "Check your compiler is installed and running correctly." |
2174 |
Exit(1) |
2175 |
|
2176 |
if conf.CheckCXX() is False: |
2177 |
print "Failed to build simple test file with your C++ compiler." |
2178 |
print "Check your compiler is installed and running correctly." |
2179 |
print "You can set your C++ compiler using the CXX scons option." |
2180 |
Exit(1) |
2181 |
|
2182 |
# stdio -- just to check that compiler is behaving |
2183 |
|
2184 |
if conf.CheckHeader('stdio.h') is False: |
2185 |
print "CPPPATH =",env.get('CPPPATH') |
2186 |
print "Did not find 'stdio.h'! Check your compiler configuration." |
2187 |
print "" |
2188 |
print "You environment is printed here:" |
2189 |
for k,v in os.environ.iteritems(): |
2190 |
print "%-30s%s" % ("%s :" % k, v) |
2191 |
Exit(1) |
2192 |
|
2193 |
# sizes of vars used in libascend eg in gl_list etc. |
2194 |
|
2195 |
_sizes = { |
2196 |
"VOID_P" : "void *" |
2197 |
,"INT" : "int" |
2198 |
,"LONG" : "long" |
2199 |
,"LONG_LONG" : "long long" |
2200 |
} |
2201 |
|
2202 |
for _var,_type in _sizes.iteritems(): |
2203 |
_size = conf.CheckTypeSize(_type) |
2204 |
if not _size: |
2205 |
print "Couldn't determine 'sizeof(%s)'" % _type |
2206 |
Exit(1) |
2207 |
conf.env["SIZEOF_%s" % _var] = str(_size) |
2208 |
|
2209 |
# check for some string functions |
2210 |
|
2211 |
if conf.CheckFunc('snprintf') is False: |
2212 |
print "Didn't find snprintf"; |
2213 |
Exit(1) |
2214 |
|
2215 |
if conf.CheckFunc('strdup'): |
2216 |
conf.env['HAVE_STRDUP'] = True |
2217 |
|
2218 |
# attempt to support MSVCRT 7.1 on Windows |
2219 |
|
2220 |
if platform.system()=="Windows" and env.get('WITH_MSVCR71'): |
2221 |
conf.env.Append(LIBS='msvcr71') |
2222 |
|
2223 |
# Math library |
2224 |
|
2225 |
conf.env['HAVE_IEEE']=True |
2226 |
|
2227 |
if need_libm and (conf.CheckMath() is False): |
2228 |
conf.env['HAVE_IEEE']=False |
2229 |
print 'Did not find math library, exiting!' |
2230 |
Exit(1) |
2231 |
|
2232 |
# Malloc |
2233 |
|
2234 |
if conf.CheckMalloc() is False: |
2235 |
conf.env['HAVE_MALLOC']=False |
2236 |
print "Did not find functioning 'malloc', exiting!" |
2237 |
Exit(1) |
2238 |
|
2239 |
# dlopen/LoadLibrary |
2240 |
|
2241 |
# CURRENTLY BREAKS LATER TEST (libsave?) |
2242 |
#if conf.CheckDLOpen() is False: |
2243 |
# print "Did not find functioning dlopen/LoadLibrary, exiting!" |
2244 |
# Exit(1) |
2245 |
|
2246 |
# Where is 'isnan'? |
2247 |
|
2248 |
if conf.CheckFunc('isnan') is False and conf.CheckFunc('_isnan') is False: |
2249 |
print "Didn't find isnan" |
2250 |
# Exit(1) |
2251 |
|
2252 |
# GCC visibility |
2253 |
|
2254 |
if conf.CheckGcc(): |
2255 |
conf.env['HAVE_GCC']=True; |
2256 |
if env.get('WITH_GCCVISIBILITY') and conf.CheckGccVisibility(): |
2257 |
conf.env['HAVE_GCCVISIBILITY']=True; |
2258 |
conf.env.Append(CCFLAGS=['-fvisibility=hidden']) |
2259 |
conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY']) |
2260 |
conf.env.Append(CCFLAGS=['-Wall']) |
2261 |
|
2262 |
# Catching SIGINT |
2263 |
|
2264 |
if env['WITH_SIGNALS']: |
2265 |
if not conf.CheckSIGINT(): |
2266 |
with_signals = False |
2267 |
without_signals_reason = "SIGINT uncatchable" |
2268 |
|
2269 |
# Catching SIGFPE |
2270 |
|
2271 |
if conf.CheckFPE(): |
2272 |
conf.env['HAVE_C99FPE']=True |
2273 |
else: |
2274 |
conf.env['HAVE_C99FPE']=False |
2275 |
|
2276 |
# Checking for signal reset requirement |
2277 |
|
2278 |
if conf.CheckSigReset() is False: |
2279 |
print "Unable to determine if signal reset is required" |
2280 |
Exit(1) |
2281 |
|
2282 |
# YACC |
2283 |
|
2284 |
if conf.CheckYacc(): |
2285 |
conf.env['HAVE_YACC']=True |
2286 |
|
2287 |
if conf.CheckLex(): |
2288 |
conf.env['HAVE_LEX']=True |
2289 |
|
2290 |
# Tcl/Tk |
2291 |
|
2292 |
if with_tcltk: |
2293 |
if conf.CheckTcl(): |
2294 |
if conf.CheckTclVersion(): |
2295 |
if conf.CheckTk(): |
2296 |
if with_tcltk and conf.CheckTkVersion(): |
2297 |
if env['STATIC_TCLTK']: |
2298 |
if conf.CheckTkTable(): |
2299 |
pass |
2300 |
else: |
2301 |
without_tcltk_reason = "TkTable not found" |
2302 |
with_tcltk = False |
2303 |
else: |
2304 |
without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'" |
2305 |
with_tcltk = False |
2306 |
else: |
2307 |
without_tcltk_reason = "Tk not found." |
2308 |
with_tcltk = False |
2309 |
else: |
2310 |
without_tcltk_reason = "Require Tcl <= 8.4 Tcl." |
2311 |
with_tcltk = False |
2312 |
|
2313 |
else: |
2314 |
without_tcltk_reason = "Tcl not found." |
2315 |
with_tcltk = False |
2316 |
|
2317 |
if env['STATIC_TCLTK']: |
2318 |
conf.CheckX11() |
2319 |
|
2320 |
# Python... obviously we're already running python, so we just need to |
2321 |
# check that we can link to the python library OK: |
2322 |
|
2323 |
if not conf.CheckPythonLib(): |
2324 |
without_python_reason = 'libpython2.x not found or not linkable' |
2325 |
with_python = False |
2326 |
env['WITH_PYTHON']=False |
2327 |
|
2328 |
# SWIG version |
2329 |
|
2330 |
if with_python and conf.CheckSwigVersion() is False: |
2331 |
without_python_reason = 'SWIG >= 1.3.24 is required' |
2332 |
with_python = False |
2333 |
env['WITH_PYTHON']=False |
2334 |
|
2335 |
# CUnit |
2336 |
|
2337 |
if with_cunit: |
2338 |
if not conf.CheckCUnit(): |
2339 |
without_cunit_reason = 'CUnit not found' |
2340 |
with_cunit = False |
2341 |
#print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS') |
2342 |
|
2343 |
# DMALLOC |
2344 |
|
2345 |
if with_dmalloc: |
2346 |
if not conf.CheckDMalloc(): |
2347 |
without_dmalloc_reason = 'dmalloc not found' |
2348 |
with_dmalloc = False |
2349 |
|
2350 |
# GRAPHVIZ |
2351 |
|
2352 |
if with_graphviz: |
2353 |
if not conf.CheckGraphViz(): |
2354 |
without_graphviz_reason = 'graphviz not found' |
2355 |
with_graphviz = False |
2356 |
env['WITH_GRAPHVIZ'] = False |
2357 |
env['HAVE_GRAPHVIZ_BOOLEAN'] = conf.CheckGraphVizBoolean() |
2358 |
|
2359 |
# UFSPARSE |
2360 |
|
2361 |
if with_ufsparse: |
2362 |
if not conf.CheckUFSparse(): |
2363 |
without_ufsparse_reason = 'ufsparse not found' |
2364 |
with_ufsparse = False |
2365 |
env['WITH_UFSPARSE'] = False |
2366 |
|
2367 |
# IDA |
2368 |
|
2369 |
if with_ida: |
2370 |
if not conf.CheckSUNDIALS(): |
2371 |
with_ida = False |
2372 |
without_ida_reason = "SUNDIALS not found, or bad version" |
2373 |
elif not conf.CheckIDA(): |
2374 |
with_ida = False |
2375 |
without_ida_reason = "Unable to compile/link against SUNDIALS/IDA" |
2376 |
|
2377 |
# CONOPT |
2378 |
|
2379 |
if not with_conopt: |
2380 |
without_conopt_reason = "Not selected (see config option WITH_SOLVERS)" |
2381 |
elif conf.CheckCONOPT() is False: |
2382 |
if conf.env.get('CONOPT_LINKED'): |
2383 |
conf.env['CONOPT_LINKED'] = False |
2384 |
# we no longer require CONOPT at buildtime in order to build support for it |
2385 |
#with_conopt = False |
2386 |
#without_conpt_reason = "CONOPT not found" |
2387 |
|
2388 |
# IPOPT |
2389 |
|
2390 |
if not with_ipopt: |
2391 |
without_ipopt_reason = "Not selected (see config option WITH_SOLVERS)" |
2392 |
elif not conf.CheckIPOPT(): |
2393 |
with_ipopt = False |
2394 |
without_ipopt_reason = "IPOPT not found" |
2395 |
|
2396 |
# BLAS |
2397 |
|
2398 |
need_blas=False |
2399 |
|
2400 |
if with_lsode: |
2401 |
need_fortran = True |
2402 |
need_fortran_reasons.append("LSODE") |
2403 |
need_blas=True |
2404 |
|
2405 |
if with_ipopt: |
2406 |
need_blas=True |
2407 |
|
2408 |
if need_blas: |
2409 |
if conf.CheckLib('blas'): |
2410 |
with_local_blas = False |
2411 |
without_local_blas_reason = "Found BLAS installed on system" |
2412 |
else: |
2413 |
with_local_blas = True |
2414 |
need_fortran = True |
2415 |
need_fortran_reasons.append("BLAS") |
2416 |
else: |
2417 |
with_local_blas= False; |
2418 |
without_local_blas_reason = "BLAS not required" |
2419 |
|
2420 |
# FORTRAN |
2421 |
|
2422 |
if need_fortran: |
2423 |
print "NEED FORTRAN" |
2424 |
# Removed stuff for SCons 0.97 (Ubuntu 8.04) from here -- JP |
2425 |
detect_fortran = conf.env.Detect(['gfortran','g77']) |
2426 |
if detect_fortran: |
2427 |
conf.env.Tool(detect_fortran) |
2428 |
if detect_fortran == 'g77': |
2429 |
print "Setting F2C_LIB to 'g2c' because G77 compiler in use" |
2430 |
conf.env['F2C_LIB'] = 'g2c' |
2431 |
#print "DETECT_FORTRAN =",detect_fortran |
2432 |
#print "NOW, FORTAN =",env['FORTRAN'] |
2433 |
else: |
2434 |
print "FAILED G77/FORTRAN DETECTION" |
2435 |
with_lsode=False; |
2436 |
without_lsode_reason="FORTRAN required but not detected" |
2437 |
else: |
2438 |
print "FORTRAN WAS NOT FOUND TO BE REQUIRED" |
2439 |
|
2440 |
if need_fortran and conf.CheckF77() is False: |
2441 |
print "Failed to build simple test file with your Fortran compiler." |
2442 |
print "Check your compiler is installed and running correctly." |
2443 |
print "You can set your Fortran compiler using the FORTRAN scons option." |
2444 |
print "The fortran compiler is REQUIRED to build:",", ".join(need_fortran_reasons) |
2445 |
print "Perhaps try examining the value of your WITH_SOLVERS option (remove LSODE, etc)." |
2446 |
Exit(1) |
2447 |
|
2448 |
#else: |
2449 |
# print "FORTRAN not required" |
2450 |
|
2451 |
# F2C |
2452 |
|
2453 |
if need_fortran: |
2454 |
if platform.system()=="Windows": |
2455 |
pass |
2456 |
#conf.env.Append(LIBPATH='c:\mingw\lib') |
2457 |
|
2458 |
# scrollkeeper |
2459 |
|
2460 |
if with_scrollkeeper: |
2461 |
if conf.CheckScrollkeeperConfig() is False: |
2462 |
with_scrollkeeper=False |
2463 |
without_scrollkeeper_reason="unable to detect scrollkeeper-config" |
2464 |
|
2465 |
# lyx |
2466 |
|
2467 |
if with_doc_build: |
2468 |
if not conf.CheckLyx(): |
2469 |
with_doc_build = False |
2470 |
without_doc_build_reason="unable to locate LyX" |
2471 |
|
2472 |
with_latex2html = conf.CheckLatex2HTML() |
2473 |
|
2474 |
if conf.CheckLModern() is False: |
2475 |
with_doc_build = False |
2476 |
without_doc_build_reason="'lmodern' is not available" |
2477 |
|
2478 |
# TODO: -D_HPUX_SOURCE is needed |
2479 |
|
2480 |
# TODO: detect if dynamic libraries are possible or not |
2481 |
|
2482 |
if platform.system()=="Windows" and env.has_key('MSVS'): |
2483 |
_found_windows_h = conf.CheckHeader('Windows.h') |
2484 |
|
2485 |
if not _found_windows_h: |
2486 |
print "Could not locate 'Windows.h' in CPPPATH. Check your configuration." |
2487 |
Exit(1) |
2488 |
|
2489 |
if with_python and conf.CheckHeader(['basetsd.h','BaseTsd.h']) is False: |
2490 |
with_python = 0; |
2491 |
without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK." |
2492 |
|
2493 |
conf.Finish() |
2494 |
|
2495 |
#print "-=-=-=-=-=-=-=-=- LIBS =",env.get('LIBS') |
2496 |
|
2497 |
#--------------------------------------- |
2498 |
# SUBSTITUTION DICTIONARY for .in files |
2499 |
|
2500 |
release = env.get('RELEASE') |
2501 |
if release=="0.": |
2502 |
release="0" |
2503 |
|
2504 |
#print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH")) |
2505 |
|
2506 |
subst_dict = { |
2507 |
'@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY'] |
2508 |
,'@DEFAULT_ASCENDSOLVERS@':env['DEFAULT_ASCENDSOLVERS'] |
2509 |
, '@GLADE_FILE@':'ascend.glade' |
2510 |
, '@HELP_ROOT@':'' |
2511 |
, '@ICON_EXTENSION@':icon_extension |
2512 |
, '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA'] |
2513 |
, '@INSTALL_BIN@':env['INSTALL_BIN'] |
2514 |
, '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE'] |
2515 |
, '@INSTALL_LIB@':env['INSTALL_LIB'] |
2516 |
, '@INSTALL_MODELS@':env['INSTALL_MODELS'] |
2517 |
, '@INSTALL_SOLVERS@':env['INSTALL_SOLVERS'] |
2518 |
, '@INSTALL_PYTHON@':env['INSTALL_PYTHON'] |
2519 |
, '@PYGTK_ASSETS@':env['PYGTK_ASSETS'] |
2520 |
, '@VERSION@':version |
2521 |
, '@RELEASE@':release |
2522 |
, '@DISTTAR_NAME@':env['DISTTAR_NAME'] |
2523 |
, '@WEBHELPROOT@':'http://ascendwiki.cheme.cmu.edu/Category:Documentation' |
2524 |
, '@SHLIBSUFFIX@':env['SHLIBSUFFIX'] |
2525 |
, '@SHLIBPREFIX@':env['SHLIBPREFIX'] |
2526 |
, '@EXTLIB_SUFFIX@':env['EXTLIB_SUFFIX'] |
2527 |
, '@EXTLIB_PREFIX@':env['EXTLIB_PREFIX'] |
2528 |
, '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk' |
2529 |
, '@PYTHON@' : python_exe |
2530 |
, '@PYVERSION@' : pyversion |
2531 |
, '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#")))) |
2532 |
, '@WITH_GRAPHVIZ@': str(int(env.get('WITH_GRAPHVIZ'))) |
2533 |
#define ASC_ABSOLUTE_PATHS @ASC_ABSOLUTE_PATHS@ |
2534 |
#if ASC_ABSOLUTE_PATHS |
2535 |
# define ASCENDDIST_DEFAULT "@ASCENDDIST_DEFAULT@" |
2536 |
# define ASCENDTK_DEFAULT "@ASCENDTK_DEFAULT@" |
2537 |
# define ASCENDLIBRARY_DEFAULT "@ASCENDLIBRARY_DEFAULT@" |
2538 |
# define ASCENDSOLVERS_DEFAULT "@ASCENDSOLVERS_DEFAULT@" |
2539 |
#else |
2540 |
# define ASC_DIST_REL_BIN "@ASC_DIST_REL_BIN@" |
2541 |
# define ASC_TK_REL_DIST "@ASC_TK_REL_DIST@" |
2542 |
# define ASC_LIBRARY_REL_DIST "@ASC_LIBRARY_REL_DIST@" |
2543 |
# define ASC_SOLVERS_REL_DIST "@ASC_SOLVERS_REL_DIST@" |
2544 |
#endif |
2545 |
, '@ASC_ABSOLUTE_PATHS@': str(int(env.get('ABSOLUTE_PATHS'))) |
2546 |
, '@ASCENDDIST_DEFAULT@': c_escape(env['INSTALL_PREFIX']) |
2547 |
, '@ASCENDTK_DEFAULT@': c_escape(os.path.abspath(env.subst(env['INSTALL_TK']))) |
2548 |
, '@ASCENDLIBRARY_DEFAULT@': c_escape(os.path.abspath(env.subst(env['DEFAULT_ASCENDLIBRARY']))) |
2549 |
, '@ASCENDSOLVERS_DEFAULT@': c_escape(os.path.abspath(env.subst(env['DEFAULT_ASCENDSOLVERS']))) |
2550 |
, '@ASC_DIST_REL_BIN@' : default_dist_rel_bin |
2551 |
, '@ASC_TK_REL_DIST@' : default_tk_rel_dist |
2552 |
, '@ASC_LIBRARY_REL_DIST@' : default_library_rel_dist |
2553 |
, '@ASC_SOLVERS_REL_DIST@' : default_solvers_rel_dist |
2554 |
, '@SIZEOF_VOID_P@' : env['SIZEOF_VOID_P'] |
2555 |
, '@SIZEOF_INT@' : env['SIZEOF_INT'] |
2556 |
, '@SIZEOF_LONG@' : env['SIZEOF_LONG'] |
2557 |
, '@SIZEOF_LONG_LONG@' : env['SIZEOF_LONG_LONG'] |
2558 |
} |
2559 |
|
2560 |
if env.get('WITH_DOC'): |
2561 |
print "WITH_DOC:",env['WITH_DOC'] |
2562 |
subst_dict['@HELP_ROOT@']=env['HELP_ROOT'] |
2563 |
|
2564 |
# bool options... |
2565 |
for k,v in { |
2566 |
'ASC_WITH_DMALLOC':with_dmalloc |
2567 |
,'ASC_WITH_UFSPARSE':with_ufsparse |
2568 |
,'ASC_WITH_MMIO':with_mmio |
2569 |
,'ASC_SIGNAL_TRAPS':with_signals |
2570 |
,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED') |
2571 |
,'HAVE_C99FPE':env.get('HAVE_C99FPE') |
2572 |
,'HAVE_IEEE':env.get('HAVE_IEEE') |
2573 |
,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS') |
2574 |
,'MALLOC_DEBUG':env.get('MALLOC_DEBUG') |
2575 |
}.iteritems(): |
2576 |
|
2577 |
if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k |
2578 |
|
2579 |
if with_python: |
2580 |
subst_dict['@ASCXX_USE_PYTHON@']="1" |
2581 |
env['WITH_PYTHON']=1; |
2582 |
|
2583 |
if with_latex2html: |
2584 |
env['WITH_LATEX2HTML']=1 |
2585 |
|
2586 |
if env.has_key('HAVE_GCCVISIBILITY'): |
2587 |
subst_dict['@HAVE_GCCVISIBILITY@'] = "1" |
2588 |
|
2589 |
env.Append(SUBST_DICT=subst_dict) |
2590 |
|
2591 |
#for k,v in subst_dict.iteritems(): |
2592 |
# print "%-50s%s" % ("'%s'"%k,v) |
2593 |
|
2594 |
# REMOVED: long command-line support on Win2k |
2595 |
|
2596 |
#------------------------------------------------------ |
2597 |
# RECIPE: SWIG scanner |
2598 |
|
2599 |
import SCons.Script |
2600 |
|
2601 |
SWIGScanner = SCons.Scanner.ClassicCPP( |
2602 |
"SWIGScan" |
2603 |
, ".i" |
2604 |
, "CPPPATH" |
2605 |
, '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")' |
2606 |
) |
2607 |
|
2608 |
env.Append(SCANNERS=[SWIGScanner]) |
2609 |
|
2610 |
#------------------------------------------------------ |
2611 |
# Recipe for 'CHMOD' ACTION |
2612 |
|
2613 |
import SCons |
2614 |
from SCons.Script.SConscript import SConsEnvironment |
2615 |
SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod, |
2616 |
lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode)) |
2617 |
|
2618 |
def InstallPerm(env, dest, files, perm): |
2619 |
obj = env.Install(dest, files) |
2620 |
for i in obj: |
2621 |
env.AddPostAction(i, env.Chmod(str(i), perm)) |
2622 |
|
2623 |
def InstallPermAs(env, dest, filen, perm): |
2624 |
obj = env.InstallAs(dest, filen) |
2625 |
for i in obj: |
2626 |
env.AddPostAction(i, env.Chmod(str(i), perm)) |
2627 |
return dest |
2628 |
|
2629 |
SConsEnvironment.InstallPerm = InstallPerm |
2630 |
|
2631 |
# define wrappers |
2632 |
SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755) |
2633 |
SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644) |
2634 |
SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644) |
2635 |
SConsEnvironment.InstallSharedAs = lambda env, dest, files: InstallPermAs(env, dest, files, 0644) |
2636 |
SConsEnvironment.InstallLibraryAs = lambda env, dest, files: InstallPermAs(env, dest, files, 0644) |
2637 |
|
2638 |
#------------------------------------------------------ |
2639 |
# BUILD... |
2640 |
|
2641 |
# so that #include <ascend/modulename/headername.h> works across all modules... |
2642 |
env.AppendUnique(CPPPATH=['#']) |
2643 |
|
2644 |
if env['DEBUG']: |
2645 |
env.Append( |
2646 |
CCFLAGS=['-g'] |
2647 |
,LINKFLAGS=['-g'] |
2648 |
) |
2649 |
|
2650 |
if env['GCOV']: |
2651 |
env.Append( |
2652 |
CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage'] |
2653 |
, LIBS=['gcov'] |
2654 |
, LINKFLAGS=['-fprofile-arcs','-ftest-coverage'] |
2655 |
) |
2656 |
|
2657 |
if with_ida: |
2658 |
env.Append(WITH_IDA=1) |
2659 |
|
2660 |
if with_conopt: |
2661 |
env.Append(WITH_CONOPT=1) |
2662 |
|
2663 |
if with_ipopt: |
2664 |
env.Append(WITH_IPOPT=1) |
2665 |
|
2666 |
if with_dopri5: |
2667 |
env.Append(WITH_DOPRI5=1) |
2668 |
|
2669 |
if with_graphviz and env.get('GRAPHVIZ_RPATH'): |
2670 |
env.Append(RPATH=env['GRAPHVIZ_RPATH']) |
2671 |
|
2672 |
#------------- |
2673 |
# TCL/TK GUI |
2674 |
|
2675 |
if with_tcltk: |
2676 |
env.SConscript(['tcltk/SConscript'],'env') |
2677 |
else: |
2678 |
print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason |
2679 |
|
2680 |
#------------- |
2681 |
# PYTHON INTERFACE |
2682 |
|
2683 |
if with_python: |
2684 |
env.SConscript(['pygtk/SConscript'],'env') |
2685 |
else: |
2686 |
print "Skipping... Python bindings aren't being built:",without_python_reason |
2687 |
|
2688 |
#------------ |
2689 |
# BASE/GENERIC SUBDIRECTORIES |
2690 |
|
2691 |
libascend_env = env.Clone() |
2692 |
|
2693 |
dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear'] |
2694 |
|
2695 |
srcs = [] |
2696 |
for d in dirs: |
2697 |
heresrcs = libascend_env.SConscript('ascend/'+d+'/SConscript','libascend_env') |
2698 |
srcs += heresrcs |
2699 |
|
2700 |
#------------- |
2701 |
# IMPORTED CODE: LSODE, BLAS, etc |
2702 |
|
2703 |
#if with_lsode: |
2704 |
# srcs += env.SConscript(['lsod/SConscript'],'env') |
2705 |
# srcs += env.SConscript(['linpack/SConscript'],'env') |
2706 |
#else: |
2707 |
# print "Skipping... LSODE won't be built:", without_lsode_reason |
2708 |
|
2709 |
if with_local_blas: |
2710 |
env['blasobjs'] = env.SConscript(['blas/SConscript'],'env') |
2711 |
else: |
2712 |
env['blasobjs'] = [] |
2713 |
print "Skipping... BLAS won't be built:", without_local_blas_reason |
2714 |
|
2715 |
if not with_ida: |
2716 |
print "Skipping... IDA won't be built:", without_ida_reason |
2717 |
|
2718 |
if not with_dopri5: |
2719 |
print "Skipping... DOPRI5 won't be built:", without_dopri5_reason |
2720 |
|
2721 |
if with_mmio: |
2722 |
srcs += env.SConscript(['mmio/SConscript'],'env') |
2723 |
else: |
2724 |
print "Skipping... MMIO export won't be built:", without_mmio_reason |
2725 |
#------------- |
2726 |
# LIBASCEND -- all 'core' functionality |
2727 |
|
2728 |
# FIXME want to move these bits to ascend/SConscript |
2729 |
|
2730 |
libascend_env.Append( |
2731 |
CPPPATH=['#'] |
2732 |
,LIBS=['m'] |
2733 |
) |
2734 |
|
2735 |
if platform.system()=="Linux": |
2736 |
libascend_env.Append(LIBS=['dl']) |
2737 |
|
2738 |
if with_dmalloc: |
2739 |
libascend_env.Append(LIBS=['dmalloc']) |
2740 |
|
2741 |
if with_ufsparse: |
2742 |
libascend_env.Append(LIBS=['cxsparse']) |
2743 |
|
2744 |
if platform.system()=="Linux": |
2745 |
libascend_env.Append(LINKFLAGS=['-Wl,-soname,%s' % soname_full]) |
2746 |
|
2747 |
libascend = libascend_env.SharedLibrary('ascend',srcs) |
2748 |
|
2749 |
# create local symlink for the soname stuff. |
2750 |
#print "SONAME =",env.subst(soname_full) |
2751 |
|
2752 |
env['libascend'] = libascend |
2753 |
libtargets = [libascend] |
2754 |
|
2755 |
if platform.system()=="Linux": |
2756 |
if soname_major: |
2757 |
libascend_env.Command(soname_full,libascend,Move("$TARGET","$SOURCE")) |
2758 |
#print "MAKING LINK, SONAME_MAJOR =",soname_major |
2759 |
liblink = libascend_env.Command(soname_full, libascend, "ln -s $SOURCE $TARGET") |
2760 |
libtargets.append(liblink) |
2761 |
|
2762 |
# for use in declaring dependent shared libraries in SConscript files (eg solvers/*/SConscript) |
2763 |
|
2764 |
env.Alias('libascend',libtargets) |
2765 |
|
2766 |
#------------- |
2767 |
# UNIT TESTS (C CODE) |
2768 |
|
2769 |
test_env = env.Clone() |
2770 |
test_env.Append( |
2771 |
CPPPATH="#" |
2772 |
) |
2773 |
|
2774 |
if with_cunit: |
2775 |
testdirs = ['general','solver','utilities','linear','compiler'] |
2776 |
testsrcs = [] |
2777 |
for testdir in testdirs: |
2778 |
path = 'ascend/'+testdir+'/test/' |
2779 |
test_env.SConscript([path+'SConscript'],'test_env') |
2780 |
testsrcs += [i.path for i in test_env['TESTSRCS_'+testdir.upper()]] |
2781 |
|
2782 |
#print "TESTSRCS =",testsrcs |
2783 |
|
2784 |
test_env.SConscript(['test/SConscript'],'test_env') |
2785 |
|
2786 |
env.Alias('test',[env.Dir('test')]) |
2787 |
|
2788 |
else: |
2789 |
print "Skipping... CUnit tests aren't being built:",without_cunit_reason |
2790 |
|
2791 |
#------------- |
2792 |
# EXTERNAL SOLVERS |
2793 |
|
2794 |
env['extfns']=[] |
2795 |
|
2796 |
env.SConscript(['solvers/SConscript'],'env') |
2797 |
|
2798 |
#------------- |
2799 |
# EXTERNAL FUNCTIONS |
2800 |
|
2801 |
modeldirs = env.SConscript(['models/SConscript'],'env') |
2802 |
|
2803 |
if not with_extfns: |
2804 |
print "Skipping... External modules aren't being built:",without_extfns_reason |
2805 |
|
2806 |
env.Alias('extfns',env['extfns']) |
2807 |
|
2808 |
#------------------------------------------------------ |
2809 |
# CREATE ASCEND-CONFIG scriptlet |
2810 |
|
2811 |
ascendconfig = env.SubstInFile('ascend-config.in') |
2812 |
|
2813 |
#------------------------------------------------------ |
2814 |
# INSTALLATION |
2815 |
|
2816 |
if env.get('CAN_INSTALL'): |
2817 |
|
2818 |
dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE','INSTALL_DOC','INSTALL_PYTHON'] |
2819 |
install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs] |
2820 |
install_dirs += modeldirs + [Dir(env.subst("$INSTALL_ROOT$INSTALL_SOLVERS"))] |
2821 |
|
2822 |
#env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend) |
2823 |
|
2824 |
libname = "${INSTALL_LIB}/%s%s" % (soname_full,soname_minor) |
2825 |
install_lib = env.InstallLibraryAs("${INSTALL_ROOT}"+libname, [libascend]) |
2826 |
if env['ABSOLUTE_PATHS']: |
2827 |
link_target = libname |
2828 |
else: |
2829 |
link_target = "%s%s" % (soname_full,soname_minor) |
2830 |
|
2831 |
link1 = "${INSTALL_LIB}/%s" % soname_clean |
2832 |
install_link1 = None |
2833 |
if env.subst(link1) != env.subst(libname): |
2834 |
# v--link to create v--file to link to command |
2835 |
install_link1 = env.Command("${INSTALL_ROOT}"+link1,install_lib |
2836 |
# v-- command to do it (note the trick about |
2837 |
,"ln -f -s %s $TARGET" % link_target |
2838 |
) |
2839 |
|
2840 |
link2 = "${INSTALL_LIB}/%s" % soname_full |
2841 |
install_link2 = None |
2842 |
if soname_minor: |
2843 |
install_link2 = env.Command("${INSTALL_ROOT}"+link2,install_lib |
2844 |
,"ln -f -s %s $TARGET" % link_target |
2845 |
) |
2846 |
|
2847 |
env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig) |
2848 |
|
2849 |
# MAC OS X INSTALL STUFF |
2850 |
# in this case, we're installing to INSTALL_PREFIX, assumed to be a folder |
2851 |
# created using Disk Utility as a new DMG which will be distributed. |
2852 |
if platform.system()=="Darwin": |
2853 |
# extra stuff for inside the .app |
2854 |
env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),"mac/Info.plist") |
2855 |
env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN/Resources/")),"mac/ascend.icns") |
2856 |
|
2857 |
# related files the .dmg folder |
2858 |
env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_PREFIX")),"README-osx.txt") |
2859 |
env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_PREFIX")),"LICENSE.txt") |
2860 |
env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_PREFIX")),"CHANGELOG.txt") |
2861 |
env.Command("$INSTALL_ROOT$INSTALL_PREFIX/Applications Folder","/Applications","ln -f -s $SOURCE $TARGET") |
2862 |
install_dirs += [Dir(env.subst("$INSTALL_ROOT$INSTALL_PREFIX"))] |
2863 |
|
2864 |
# GTK libraries and related files |
2865 |
gtkfiles = [] |
2866 |
gtksource = "dist/PyGTK.bundle/" |
2867 |
def visit(gtkfiles,dirname,fnames): |
2868 |
gtkfiles += Glob("%s/*" % dirname) |
2869 |
os.path.walk(gtksource,visit,gtkfiles) |
2870 |
|
2871 |
print "GTKFILES =" |
2872 |
|
2873 |
for f in gtkfiles: |
2874 |
r = os.path.commonprefix([gtksource,f.path]) |
2875 |
dirname,filename = os.path.split(f.path[len(r):]) |
2876 |
dest = os.path.join(env.subst("$INSTALL_ROOT$INSTALL_BIN/PyGTK.bundle"),dirname) |
2877 |
print "%s --> %s" %(f,dest) |
2878 |
env.Install(Dir(dest),f) |
2879 |
|
2880 |
# ALIAS FOR ALL INSTALLATION |
2881 |
env.Alias('install',install_dirs) |
2882 |
|
2883 |
#------------------------------------------------------ |
2884 |
# WINDOWS INSTALLER |
2885 |
|
2886 |
if not env.get('NSIS'): |
2887 |
with_installer = False |
2888 |
without_installer_reason = "NSIS not found" |
2889 |
|
2890 |
if with_installer: |
2891 |
env.Append(NSISDEFINES={ |
2892 |
'OUTFILE':"#dist/"+env['WIN_INSTALLER_NAME'] |
2893 |
,"VERSION":version |
2894 |
,'PYVERSION':pyversion |
2895 |
,'IPOPTDLL':os.path.normpath(env['IPOPT_DLL']) |
2896 |
}) |
2897 |
installer = env.Installer('nsis/installer.nsi') |
2898 |
env.Depends(installer,["pygtk","tcltk","ascend.dll","models","solvers","ascend-config",'pygtk/ascend']) |
2899 |
env.Depends(installer,[os.path.normpath(env['IPOPT_DLL'])]) |
2900 |
env.Alias('installer',installer) |
2901 |
else: |
2902 |
print "Skipping... Windows installer isn't being built:",without_installer_reason |
2903 |
|
2904 |
#------------------------------------------------------ |
2905 |
# CREATE the SPEC file for generation of RPM packages |
2906 |
|
2907 |
if platform.system()=="Linux": |
2908 |
env.SubstInFile('ascend.spec.in') |
2909 |
|
2910 |
#------------------------------------------------------ |
2911 |
# CREATE OMF FILE FOR USE WITH SCROLLKEEPER |
2912 |
|
2913 |
#if with_scrollkeeper: |
2914 |
# #env.SubstInFile('#/pygtk/gnome/ascend.omf.in') |
2915 |
# #env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf") |
2916 |
|
2917 |
#------------------------------------------------------ |
2918 |
# DISTRIBUTION TAR FILE |
2919 |
|
2920 |
env['DISTTAR_FORMAT']='bz2' |
2921 |
env.Append( |
2922 |
DISTTAR_EXCLUDEEXTS=['.o','.os','.so','.a','.dll','.lib','.cc','.cache', |
2923 |
'.pyc','.cvsignore','.dblite','.log','.pl','.out','.exe','.aux','.idx', |
2924 |
'.toc','.lof','.lot','.mm','.warnings','.tm2','.swp',',tmp','.gz', |
2925 |
'.bz2','.7z','.deb','.dsc','.changes','.bak'] |
2926 |
, DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian'] |
2927 |
, DISTTAR_EXCLUDERES=[r"_wrap\.cc?$", r"~$", r"pygtk/ascpy\.py","pygtk/testipopt$" |
2928 |
,r"/lib.*\.so\.[.0-9]+$", r"tcltk/asc4dev$", r"tcltk/interface/typelex\.c$" |
2929 |
,r"ascend/compiler/ascParse\.[ch]$", r"ascend/solver/conoptconfig\.h$" |
2930 |
,r"ascend/utilities/config\.h$", r"pygtk/config\.h$", r"pygtk/config\.py$" |
2931 |
,r"pygtk/ascdev$", r"pygtk/testconopt$", r"ascend/compiler/scanner\.c$" |
2932 |
,r"tcltk/interface/ascend4$",r"pygtk/testslvreq$",r"test/test$" |
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: |