/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1437 - (show annotations) (download)
Mon May 21 10:05:00 2007 UTC (17 years, 6 months ago) by jpye
File size: 53729 byte(s)
Fixed problem with tcl/tk in 'scons install' for SCons 0.96.92
1 import sys, os, commands, platform, distutils.sysconfig, os.path, re
2
3 version = "0.9.5.110"
4
5 #------------------------------------------------------
6 # OPTIONS
7 #
8 # Note that if you set the options via the command line, they will be
9 # remembered in the file 'options.cache'. It's a feature ;-)
10
11 opts = Options(['options.cache', 'config.py'])
12 #print "PLATFORM = ",platform.system()
13
14 if platform.system()=="Windows":
15 default_tcl_lib = "tcl84"
16 default_tk_lib = "tk84"
17 default_tktable_lib = "Tktable28"
18 default_install_assets = "glade/"
19 icon_extension = '.png'
20 default_tcl = "c:\\Tcl"
21 if os.environ.get('MSYSTEM')=="MINGW32":
22 default_tcl_libpath="$TCL\\bin"
23 else:
24 default_tcl_libpath="$TCL\\lib"
25 default_rel_distdir = '.'
26 default_absolute_paths = False
27
28 default_ida_prefix = "c:\\MinGW"
29 if not os.path.exists(default_ida_prefix):
30 default_ida_prefix = None
31
32 default_conopt_prefix = "c:\\Program Files\\CONOPT"
33 default_conopt_libpath="$CONOPT_PREFIX"
34 default_conopt_cpppath="$CONOPT_PREFIX"
35 default_conopt_dlpath="$CONOPT_PREFIX"
36 default_conopt_lib="conopt3"
37 default_conopt_envvar="CONOPT_PATH"
38
39 default_prefix="c:\\MinGW"
40 default_libpath="$DEFAULT_PREFIX\\lib"
41 default_cpppath="$DEFAULT_PREFIX\\include"
42
43 if not os.path.exists(default_conopt_prefix):
44 default_conopt_prefix = None
45
46 need_libm = False
47 python_exe = "c:\\Python24\\python.exe"
48 default_with_scrollkeeper=False
49 else:
50 default_tcl_lib = "tcl8.4"
51 default_tk_lib = "tk8.4"
52 default_tktable_lib = "Tktable2.8"
53 default_install_assets = "$INSTALL_ASCDATA/glade/"
54 icon_extension = '.svg'
55 default_tcl = '/usr'
56 default_tcl_libpath = "$TCL/lib"
57 default_rel_distdir = '../share/ascend'
58 default_absolute_paths = True
59 default_ida_prefix="/usr"
60 default_conopt_prefix="/usr"
61 default_conopt_libpath="$CONOPT_PREFIX/lib"
62 default_conopt_cpppath="$CONOPT_PREFIX/include"
63 default_conopt_dlpath= default_conopt_libpath + ":/usr/local/lib"
64 default_conopt_lib="consub3"
65 default_conopt_envvar="CONOPT_PATH"
66
67 default_prefix="/usr"
68 default_libpath="$DEFAULT_PREFIX/lib"
69 default_cpppath="$DEFAULT_PREFIX/include"
70
71 need_libm = True
72 if not os.path.isdir(default_tcl):
73 default_tcl = '/usr'
74 python_exe = distutils.sysconfig.EXEC_PREFIX+"/bin/python"
75 default_with_scrollkeeper=False
76
77 opts.Add(
78 'CC'
79 ,'C Compiler command'
80 ,None
81 )
82
83 opts.Add(
84 'CXX'
85 ,'C++ Compiler command'
86 ,None
87 )
88
89 opts.Add(BoolOption(
90 'GCOV'
91 , 'Whether to enable coverage testing in object code'
92 , False
93 ))
94
95 # Package linking option
96 opts.Add(EnumOption(
97 'PACKAGE_LINKING'
98 , 'Style of linking for external libraries'
99 , 'DYNAMIC_PACKAGES'
100 , ['DYNAMIC_PACKAGES', 'STATIC_PACKAGES', 'NO_PACKAGES']
101 ))
102
103 opts.Add(BoolOption(
104 'WITH_GCCVISIBILITY'
105 ,"Whether to use GCC Visibility features (only applicable if available)"
106 ,True
107 ))
108
109 opts.Add(BoolOption(
110 'WITH_SIGNALS'
111 ,"Whether to permit use of signals for flow control in the C-level code"
112 ,True
113 ))
114
115 # You can turn off building of Tcl/Tk interface
116 opts.Add(BoolOption(
117 'WITH_TCLTK'
118 ,"Set to False if you don't want to build the original Tcl/Tk GUI."
119 , True
120 ))
121
122 # You can turn off the building of the Python interface
123 opts.Add(BoolOption(
124 'WITH_PYTHON'
125 ,"Set to False if you don't want to build Python wrappers."
126 , True
127 ))
128
129 # Which solvers will we allow?
130 opts.Add(ListOption(
131 'WITH_SOLVERS'
132 ,"List of the solvers you want to build. The default is the minimum that"
133 +" works."
134 ,["QRSLV","CMSLV","LSOD","IDA","CONOPT","LRSLV"]
135 ,['QRSLV','MPS','SLV','OPTSQP'
136 ,'NGSLV','CMSLV','LRSLV','MINOS','CONOPT'
137 ,'LSOD','OPTSQP',"IDA"
138 ]
139 ))
140
141 # Where will the local copy of the help files be kept?
142 opts.Add(PackageOption(
143 'WITH_LOCAL_HELP'
144 , "Directory containing the local copy of the help files (optional)"
145 , "no"
146 ))
147
148 # Will bintoken support be enabled?
149 opts.Add(BoolOption(
150 'WITH_BINTOKEN'
151 ,"Enable bintoken support? This means compiling models as C-code before"
152 +" running them, to increase solving speed for large models."
153 ,False
154 ))
155
156 # What should the default ASCENDLIBRARY path be?
157 # Note: users can change it by editing their ~/.ascend.ini
158 opts.Add(
159 'DEFAULT_ASCENDLIBRARY'
160 ,"Set the default value of the ASCENDLIBRARY -- the location where"
161 +" ASCEND will look for models when running ASCEND"
162 ,"$INSTALL_ASCDATA/models"
163 )
164
165 # Where is SWIG?
166 opts.Add(
167 'SWIG'
168 ,"SWIG location, probably only required for MinGW and MSVC users."
169 +" Enter the location as a Windows-style path, for example"
170 +" 'c:\\msys\\1.0\\home\\john\\swigwin-1.3.29\\swig.exe'."
171 )
172
173 # Build the test suite?
174 opts.Add(BoolOption(
175 'WITH_CUNIT'
176 ,"You can disable CUnit tests with this option. This will basically stop"
177 +" SCons from parsing the SConscript files relating to the 'test'"
178 +" target, which just might make things marginally faster. Probably"
179 +" you can just ignore this option though. SCons will sniff for Cunit"
180 +" but build the tests only if you specify the 'test' target."
181 ,True
182 ))
183
184 # Build with MMIO matrix export support?
185 opts.Add(BoolOption(
186 'WITH_MMIO'
187 ,"Include support for exporting matrices in Matrix Market format"
188 ,True
189 ))
190
191 #----- default paths -----
192 opts.Add(PackageOption(
193 'DEFAULT_PREFIX'
194 ,"Where are most of the shared libraries located on your system?"
195 ,default_prefix
196 ))
197
198 #------ install location for python extensions ------
199
200 # (removed for the moment)
201
202 #------ cunit --------
203 # Where was CUNIT installed?
204 opts.Add(PackageOption(
205 'CUNIT_PREFIX'
206 ,"Where are your CUnit files?"
207 ,"$DEFAULT_PREFIX"
208 ))
209
210 # Where are the CUnit includes?
211 opts.Add(PackageOption(
212 'CUNIT_CPPPATH'
213 ,"Where are your CUnit include files?"
214 ,"$CUNIT_PREFIX/include"
215 ))
216
217 # Where are the CUnit libraries?
218 opts.Add(PackageOption(
219 'CUNIT_LIBPATH'
220 ,"Where are your CUnit libraries?"
221 ,"$CUNIT_PREFIX/lib"
222 ))
223
224 #-------- ida -------
225
226 opts.Add(PackageOption(
227 "SUNDIALS_PREFIX"
228 ,"Prefix for your IDA install (IDA ./configure --prefix)"
229 ,default_ida_prefix
230 ))
231
232 opts.Add(
233 'SUNDIALS_CPPPATH'
234 ,"Where is your ida.h?"
235 ,"$SUNDIALS_PREFIX/include"
236 )
237
238 #
239 opts.Add(
240 'SUNDIALS_LIBPATH'
241 ,"Where are your SUNDIALS libraries installed?"
242 ,"$SUNDIALS_PREFIX/lib"
243 )
244
245 opts.Add(
246 'SUNDIALS_LIBS'
247 ,"Where are your SUNDIALS libraries installed?"
248 ,['sundials_nvecserial','sundials_ida','m']
249 )
250
251 # ----- conopt-----
252
253 opts.Add(PackageOption(
254 "CONOPT_PREFIX"
255 ,"Prefix for your CONOPT install (CONOPT ./configure --prefix)"
256 ,default_conopt_prefix
257 ))
258
259 opts.Add(
260 "CONOPT_LIB"
261 ,"Library linked to for CONOPT"
262 ,default_conopt_lib
263 )
264
265 opts.Add(
266 'CONOPT_CPPPATH'
267 ,"Where is your conopt.h?"
268 ,default_conopt_cpppath
269 )
270
271 opts.Add(
272 'CONOPT_LIBPATH'
273 ,"Where is your CONOPT library installed?"
274 ,default_conopt_libpath
275 )
276
277 opts.Add(
278 'CONOPT_DLPATH'
279 ,"What is the default search path that ASCEND should use when dlopening the CONOPT library at runtime?"
280 ,default_conopt_dlpath
281 )
282
283 opts.Add(
284 'CONOPT_ENVVAR'
285 ,"What environment variable should be used at runtime to override the default search location for CONOPT DLL/SO?"
286 ,default_conopt_envvar
287 )
288
289 #-------- f2c ------
290
291 opts.Add(
292 "F2C_LIB"
293 ,"F2C library (eg. g2c, gfortran, f2c)"
294 ,"gfortran" # the default is gfortran now
295 )
296
297 opts.Add(PackageOption(
298 "F2C_LIBPATH"
299 ,"Directory containing F2C library (i.e. g2c, gfortran, f2c, etc.), if not already accessible"
300 ,"off"
301 ))
302
303 opts.Add(
304 "FORTRAN"
305 ,"Fortran compiler (eg g77, gfortran)"
306 ,"gfortran"
307 )
308
309 #------- tcl/tk --------
310
311 opts.Add(
312 'TCL'
313 ,'Base of Tcl distribution'
314 ,default_tcl
315 )
316
317 # Where are the Tcl includes?
318 opts.Add(
319 'TCL_CPPPATH'
320 ,"Where are your Tcl include files?"
321 ,"$TCL/include"
322 )
323
324 # Where are the Tcl libs?
325 opts.Add(
326 'TCL_LIBPATH'
327 ,"Where are your Tcl libraries?"
328 ,default_tcl_libpath
329 )
330
331 # What is the name of the Tcl lib?
332 opts.Add(
333 'TCL_LIB'
334 ,"Name of Tcl lib (eg 'tcl' or 'tcl83'), for full path to static library (if STATIC_TCLTK is set)"
335 ,default_tcl_lib
336 )
337
338 # Where are the Tk includes?
339 opts.Add(
340 'TK_CPPPATH'
341 ,"Where are your Tk include files?"
342 ,'$TCL_CPPPATH'
343 )
344
345 # Where are the Tk libs?
346 opts.Add(
347 'TK_LIBPATH'
348 ,"Where are your Tk libraries?"
349 ,'$TCL_LIBPATH'
350 )
351
352 # What is the name of the Tk lib?
353 opts.Add(
354 'TK_LIB'
355 ,"Name of Tk lib (eg 'tk' or 'tk83'), or full path to static library"
356 ,default_tk_lib
357 )
358
359 # Static linking to TkTable
360
361 opts.Add(BoolOption(
362 'STATIC_TCLTK'
363 ,'Set true for static linking for Tcl/Tk and TkTable. EXPERIMENTAL'
364 ,False
365 ))
366
367 opts.Add(
368 'TKTABLE_LIBPATH'
369 ,'Location of TkTable static library'
370 ,'$TCL_LIBPATH/Tktable2.8'
371 )
372
373 opts.Add(
374 'TKTABLE_LIB'
375 ,'Stem name of TkTable (eg tktable2.8, no ".so" or "lib") shared library, or full path of static tktable (/usr/lib/...)'
376 ,default_tktable_lib
377 )
378
379 opts.Add(
380 'TKTABLE_CPPPATH'
381 ,'Location of TkTable header file'
382 ,'$TCL_CPPPATH'
383 )
384
385 opts.Add(
386 'X11'
387 ,'Base X11 directory. Only used when STATIC_TCLTK is turned on. EXPERIMENTAL'
388 ,'/usr/X11R6'
389 )
390
391 opts.Add(
392 'X11_LIBPATH'
393 ,'Location of X11 lib. EXPERIMENTAL'
394 ,'$X11/lib'
395 )
396
397 opts.Add(
398 'X11_CPPPATH'
399 ,'Location of X11 includes. EXPERIMENTAL'
400 ,'$X11/include'
401 )
402
403 opts.Add(
404 'X11_LIB'
405 ,'Name of X11 lib. EXPERIMENTAL'
406 ,'X11'
407 )
408
409 #----- installed file locations (for 'scons install') -----
410
411 opts.Add(
412 'INSTALL_PREFIX'
413 ,'Root location for installed files'
414 ,'/usr/local'
415 )
416
417 opts.Add(
418 'INSTALL_BIN'
419 ,'Location to put binaries during installation'
420 ,"$INSTALL_PREFIX/bin"
421 )
422
423 opts.Add(
424 'INSTALL_LIB'
425 ,'Location to put libraries during installation'
426 ,"$INSTALL_PREFIX/lib"
427 )
428
429 opts.Add(
430 'INSTALL_SHARE'
431 ,'Common shared-file location on this system'
432 ,"$INSTALL_PREFIX/share"
433 )
434
435 opts.Add(
436 'INSTALL_ASCDATA'
437 ,"Location of ASCEND shared data (TK, python, models etc)"
438 ,"$INSTALL_SHARE/ascend"
439 )
440
441 opts.Add(
442 'INSTALL_INCLUDE'
443 ,'Location to put header files during installation'
444 ,"$INSTALL_PREFIX/include"
445 )
446
447
448 opts.Add(
449 'INSTALL_ROOT'
450 ,'For use by RPM only: location of %{buildroot} during rpmbuild'
451 ,""
452 )
453
454 #----------------------
455
456 opts.Add(
457 'PYGTK_ASSETS'
458 ,'Default location for Glade assets (placed in pygtk/config.py)'
459 ,default_install_assets
460 )
461
462 opts.Add(BoolOption(
463 'DEBUG'
464 ,"Compile source with debugger symbols, eg for use with 'gdb'"
465 ,False
466 ))
467
468 opts.Add(BoolOption(
469 'MALLOC_DEBUG'
470 ,"Compile with debugging version of MALLOC. Required for full CUnit testing"
471 ,False
472 ))
473
474 #------ dmalloc --------
475 opts.Add(PackageOption(
476 'DMALLOC_PREFIX'
477 ,"Where are your dmalloc files?"
478 ,default_prefix
479 ))
480
481 opts.Add(PackageOption(
482 'DMALLOC_CPPPATH'
483 ,"Where are your dmalloc include files?"
484 ,default_cpppath
485 ))
486
487 opts.Add(PackageOption(
488 'DMALLOC_LIBPATH'
489 ,"Where are your dmalloc libraries?"
490 ,default_libpath
491 ))
492
493 opts.Add(BoolOption(
494 'WITH_DMALLOC'
495 ,"Link to the DMALLOC library (if available) for debugging of memory usage."
496 ,False
497 ))
498
499 #------ f --------
500 opts.Add(PackageOption(
501 'MFGRAPH_PREFIX'
502 ,"Where are your MFGRAPH files?"
503 ,default_prefix
504 ))
505
506 opts.Add(PackageOption(
507 'MFGRAPH_CPPPATH'
508 ,"Where are your MFGRAPH include files?"
509 ,default_cpppath
510 ))
511
512 opts.Add(PackageOption(
513 'MFGRAPH_LIBPATH'
514 ,"Where are your MFGRAPH libraries?"
515 ,default_libpath
516 ))
517
518 opts.Add(BoolOption(
519 'WITH_MFGRAPH'
520 ,"Link to the MFGRAPH library (if available, for generating incidence graphs)"
521 ,True
522 ))
523
524
525 #------ ufsparse --------
526 opts.Add(PackageOption(
527 'UFSPARSE_PREFIX'
528 ,"Where are your UFSPARSE files?"
529 ,default_prefix
530 ))
531
532 opts.Add(PackageOption(
533 'UFSPARSE_CPPPATH'
534 ,"Where are your UFSPARSE include files?"
535 ,default_cpppath
536 ))
537
538 opts.Add(PackageOption(
539 'UFSPARSE_LIBPATH'
540 ,"Where are your UFSPARSE libraries?"
541 ,default_libpath
542 ))
543
544 opts.Add(BoolOption(
545 'WITH_UFSPARSE'
546 ,"Link to the UFSPARSE library (if available, for additional sparse matrix routines)"
547 ,True
548 ))
549
550 #-----------------------
551
552 opts.Add(
553 'DISTTAR_NAME'
554 ,"Stem name of the tarball created by 'scons dist'. So for 'ascend-aaa.tar.bz2', set this to 'ascend-aaa'."
555 ,"ascend-"+version
556 )
557
558 opts.Add(
559 'RELEASE'
560 ,"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."
561 ,"0"
562 )
563
564 opts.Add(BoolOption(
565 'ABSOLUTE_PATHS'
566 ,"Whether to use absolute or relative paths in the installed Tcl/Tk interface. If you want to build an RPM, set this to false."
567 ,default_absolute_paths
568 ))
569
570 opts.Add(
571 'WIN_INSTALLER_NAME'
572 ,"Name of the installer .exe to create under Windows (minus the '.exe')"
573 ,"ascend-"+version
574 )
575
576 opts.Add(BoolOption(
577 'WITH_XTERM_COLORS'
578 ,"Set to 0 if you don't want xterm colour codes in the console output"
579 ,True
580 ))
581
582 opts.Add(BoolOption(
583 'WITH_EXTFNS'
584 ,"Set to 0 if you don't want to attempt to build external modules bundled"
585 + " with ASCEND."
586 ,True
587 ))
588
589 opts.Add(BoolOption(
590 'WITH_SCROLLKEEPER'
591 ,"Set to to 1 if you want to install an OMF file that can be read by scrollkeeper (eg Yelp on GNOME)"
592 ,default_with_scrollkeeper
593 ))
594
595 if platform.system()!="Windows":
596 opts.Add(BoolOption(
597 'WITH_GCCVISIBILITY'
598 , 'Whether to use GCC Visibility extensions when building with GCC 4.0'
599 , True
600 ))
601
602
603
604 # TODO: OTHER OPTIONS?
605 # TODO: flags for optimisation
606 # TODO: turning on/off bintoken functionality
607 # TODO: Where will the 'Makefile.bt' file be installed?
608
609 # Import the outside environment
610
611 def c_escape(str):
612 return re.sub("\\\\","/",str)
613
614 envadditional={}
615
616 if platform.system()=="Windows":
617 if os.environ.get('OSTYPE')=='msys' or os.environ.get('MSYSTEM'):
618 envenv = os.environ;
619 tools = ['mingw','lex','yacc','fortran','swig','disttar','nsis']
620 #TODO removed 'doxygen' for SCons 0.96.93
621 envadditional['IS_MINGW']=True
622 else:
623 print "Assuming VC++ build environment (Note: MinGW is preferred)"
624 envenv = {
625 'PATH':os.environ['PATH']
626 ,'INCLUDE':os.environ['INCLUDE']
627 ,'LIB':os.environ['LIB']
628 ,'MSVS_IGNORE_IDE_PATHS':1
629 }
630 tools=['default','lex','yacc','fortran','swig','disttar','nsis']
631 #TODO removed 'doxygen' for SCons 0.96.93
632 envadditional['CPPDEFINES']=['_CRT_SECURE_NO_DEPRECATE']
633 else:
634 if os.environ.get('TARGET')=='mingw':
635 envenv = os.environ
636 tools=['crossmingw','nsis']
637 envadditional['CPPPATH']=['/usr/lib/gcc/i586-mingw32msvc/3.4.5/include','/usr/include']
638 envadditional['LIBS']=['gcc']
639 else:
640 envenv = os.environ
641 tools=['default','lex','yacc','fortran','swig','disttar','nsis']
642 #TODO removed 'doxygen' for SCons 0.96.93
643
644
645 env = Environment(
646 ENV=envenv
647 , toolpath=['scons']
648 , tools=tools
649 , **envadditional
650 )
651
652 #print "PATH =",os.environ['PATH']
653 #print "PROGSUFFIX =",env['PROGSUFFIX']
654 #print "CPPPATH =",env['CPPPATH']
655
656 opts.Update(env)
657 opts.Save('options.cache',env)
658
659 Help(opts.GenerateHelpText(env))
660
661 with_tcltk = env.get('WITH_TCLTK')
662 without_tcltk_reason = "disabled by options/config.py"
663
664 with_python = env.get('WITH_PYTHON')
665 without_python_reason = "disabled by options/config.py"
666
667 with_cunit = env.get('WITH_CUNIT')
668 without_cunit_reason = "not requested"
669
670 with_extfns = env.get('WITH_EXTFNS')
671 without_extfn_reason = "disabled by options/config.py"
672
673 with_scrollkeeper = env.get('WITH_SCROLLKEEPER')
674 without_scrollkeeper_reason = "disabled by options/config.py"
675
676 with_dmalloc = env.get('WITH_DMALLOC')
677 without_dmalloc_reason = "disabled by options/config.py"
678
679 with_mfgraph = env.get('WITH_MFGRAPH')
680 without_mfgraph_reason = "disabled by options/config.py"
681
682 with_ufsparse = env.get('WITH_UFSPARSE')
683 without_ufsparse_reason = "disabled by options/config.py"
684
685 with_mmio = env.get('WITH_MMIO')
686 without_mmio_reason = "disabled by options/config.py"
687
688 with_signals = env.get('WITH_SIGNALS')
689 without_signals_reason = "disabled by options/config.py"
690
691 if platform.system()=="Windows":
692 with_installer=1
693 else:
694 with_installer=0
695 without_installer_reason = "only possible under Windows"
696
697 if 'LSOD' in env['WITH_SOLVERS']:
698 with_lsode=True
699 else:
700 with_lsode=False
701 without_lsode_reason = "not requested (WITH_SOLVERS)"
702
703 if 'IDA' in env['WITH_SOLVERS']:
704 with_ida=True
705 else:
706 with_ida=False
707 without_ida_reason = "not requested (WITH_SOLVERS)"
708
709
710 if 'CONOPT' in env['WITH_SOLVERS']:
711 with_conopt=True
712 else:
713 with_conopt=False
714 without_conopt_reason = "not requested (WITH_SOLVERS)"
715
716
717 #print "SOLVERS:",env['WITH_SOLVERS']
718 #print "WITH_BINTOKEN:",env['WITH_BINTOKEN']
719 #print "DEFAULT_ASCENDLIBRARY:",env['DEFAULT_ASCENDLIBRARY']
720
721 can_install = True
722 if platform.system()=='Windows':
723 can_install = False
724
725 env['CAN_INSTALL']=can_install
726 env['INSTALL_MODELS']=env['INSTALL_ASCDATA']+"/models/"
727
728 print "TCL=",env['TCL']
729 print "TCL_CPPPATH =",env['TCL_CPPPATH']
730 print "TCL_LIBPATH =",env['TCL_LIBPATH']
731 print "TCL_LIB =",env['TCL_LIB']
732 print "CC =",env['CC']
733 print "CXX =",env['CXX']
734 print "FORTRAN=",env.get('FORTRAN')
735
736 print "ABSOLUTE PATHS =",env['ABSOLUTE_PATHS']
737 print "INSTALL_PREFIX =",env['INSTALL_PREFIX']
738 #------------------------------------------------------
739 # SPECIAL CONFIGURATION TESTS
740
741 need_fortran = False
742
743 #----------------
744 # SWIG
745
746 import os,re
747
748 def get_swig_version(env):
749 cmd = env['SWIG']+' -version'
750 (cin,coutcerr) = os.popen4(cmd)
751 output = coutcerr.read()
752
753 restr = "SWIG\\s+Version\\s+(?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<pat>[0-9]+)\\s*$"
754 expr = re.compile(restr,re.M);
755 m = expr.search(output);
756 if not m:
757 return None
758 maj = int(m.group('maj'))
759 min = int(m.group('min'))
760 pat = int(m.group('pat'))
761
762 return (maj,min,pat)
763
764
765 def CheckSwigVersion(context):
766
767 try:
768 context.Message("Checking version of SWIG... ")
769 maj,min,pat = get_swig_version(context.env)
770 except:
771 context.Result("Failed to detect version, or failed to run SWIG")
772 return 0;
773
774 context.env['SWIGVERSION']=tuple([maj,min,pat])
775
776 if maj == 1 and (
777 min > 3
778 or (min == 3 and pat >= 24)
779 ):
780 context.Result("ok, %d.%d.%d" % (maj,min,pat))
781 return 1;
782 else:
783 context.Result("too old, %d.%d.%d" % (maj,min,pat))
784 return 0;
785
786 #----------------
787 # Scrollkeeper (Linux documentation system)
788
789 def get_scrollkeeper_omfdir(env):
790 cmd = 'scrollkeeper-config --omfdir'
791 (cin,coutcerr) = os.popen4(cmd)
792 output = coutcerr.read()
793 return output.strip()
794
795 def CheckScrollkeeperConfig(context):
796 try:
797 context.Message("Checking for scrollkeeper...")
798 dir=get_scrollkeeper_omfdir(context.env)
799 except:
800 context.Result("Failed to run 'scrollkeeper-config'")
801 return 0
802 context.env['OMFDIR']=dir
803 context.Result("OK, %s" % dir)
804 return 1
805
806 #----------------
807 # General purpose library-and-header test
808
809 class KeepContext:
810 def __init__(self,context,varprefix,static=False):
811 self.keep = {}
812 for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']:
813 #print "Keeping env %s = %s" % (k,context.env.get(k))
814 self.keep[k]=context.env.get(k)
815
816 if context.env.has_key(varprefix+'_CPPPATH'):
817 context.env.AppendUnique(CPPPATH=[env[varprefix+'_CPPPATH']])
818 #print "Adding '"+str(env[varprefix+'_CPPPATH'])+"' to cpp path"
819
820 if static:
821 staticlib=env[varprefix+'_LIB']
822 #print "STATIC LIB = ",staticlib
823 context.env.Append(
824 LINKFLAGS=[staticlib]
825 )
826 else:
827 if context.env.has_key(varprefix+'_LIBPATH'):
828 context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']])
829 #print "Adding '"+str(env[varprefix+'_LIBPATH'])+"' to lib path"
830
831 if context.env.has_key(varprefix+'_LIB'):
832 context.env.Append(LIBS=[env[varprefix+'_LIB']])
833 #print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs"
834
835 def restore(self,context):
836 #print "RESTORING CONTEXT"
837 #print self.keep
838 #print "..."
839 for k in self.keep:
840 if self.keep[k]==None:
841 if context.env.has_key(k):
842 #print "Clearing "+str(k)
843 del context.env[k];
844 else:
845 #print "Restoring %s to '%s'" %(k,self.keep.get(k))
846 context.env[k]=self.keep[k];
847
848 def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False):
849 """This method will check for variables LIBNAME_LIBPATH
850 and LIBNAME_CPPPATH and try to compile and link the
851 file with the provided text, linking with the
852 library libname."""
853
854 if static:
855 context.Message( 'Checking for static '+libname+'... ' )
856 else:
857 context.Message( 'Checking for '+libname+'... ' )
858
859 if varprefix==None:
860 varprefix = libname.upper()
861
862 #print "LIBS is currently:",context.env.get('LIBS')
863 keep = KeepContext(context,varprefix,static)
864
865 if not context.env.has_key(varprefix+'_LIB'):
866 # if varprefix_LIB were in env, KeepContext would
867 # have appended it already
868 context.env.Append(LIBS=[libname])
869
870 is_ok = context.TryLink(text,ext)
871
872 #print "Link success? ",(is_ok != 0)
873
874 keep.restore(context)
875
876 # print "Restored CPPPATH="+str(context.env['CPPPATH'])
877 # print "Restored LIBS="+str(context.env['LIBS'])
878 # print "Restored LIBPATH="+str(context.env['LIBPATH'])
879
880 context.Result(is_ok)
881 return is_ok
882
883 #----------------
884 # GCC
885
886 gcc_test_text = """
887 #ifndef __GNUC__
888 # error "Not using GCC"
889 #endif
890
891 int main(void){
892 return __GNUC__;
893 }
894 """
895
896 def CheckGcc(context):
897 context.Message("Checking for GCC... ")
898 is_ok = context.TryCompile(gcc_test_text,".c")
899 context.Result(is_ok)
900 return is_ok
901
902 #----------------
903 # GCC VISIBILITY feature
904
905 gccvisibility_test_text = """
906 #if __GNUC__ < 4
907 # error "Require GCC version 4 or newer"
908 #endif
909
910 __attribute__ ((visibility("default"))) int x;
911
912 int main(void){
913 extern int x;
914 x = 4;
915 }
916 """
917
918 def CheckGccVisibility(context):
919 context.Message("Checking for GCC 'visibility' capability... ")
920 if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']:
921 context.Result("disabled")
922 return 0
923 is_ok = context.TryCompile(gccvisibility_test_text,".c")
924 context.Result(is_ok)
925 return is_ok
926
927 #----------------
928 # YACC
929
930 yacc_test_text = """
931 %{
932 #include <stdio.h>
933
934 /* MSVC++ needs this before it can swallow Bison output */
935 #ifdef _MSC_VER
936 # define __STDC__
937 #endif
938 %}
939 %token MSG
940 %start ROOT
941 %%
942 ROOT:
943 MSG { printf("HELLO"); }
944 ;
945 %%
946 """
947
948 def CheckYacc(context):
949 context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
950 is_ok = context.TryCompile(yacc_test_text,".y")
951 context.Result(is_ok)
952 return is_ok
953
954 #----------------
955 # LEX
956
957 lex_test_text = """
958 %{
959 #include <stdio.h>
960 %}
961 DIGIT [0-9]
962 ID [a-z][a-z0-9]*
963 %%
964 {DIGIT}+ {
965 printf("A digit: %s\\n",yytext);
966 }
967
968 [ \\t\\n]+ /* ignore */
969
970 . {
971 printf("Unrecognized guff");
972 }
973 %%
974 main(){
975 yylex();
976 }
977 """
978
979 def CheckLex(context):
980 context.Message("Checking for Lex ('%s')... " % context.env.get('LEX'))
981 is_ok = context.TryCompile(lex_test_text,".l")
982 context.Result(is_ok)
983 return is_ok
984
985 #----------------
986 # CUnit test
987
988 cunit_test_text = """
989 #include <CUnit/CUnit.h>
990 int maxi(int i1, int i2){
991 return (i1 > i2) ? i1 : i2;
992 }
993
994 void test_maxi(void){
995 CU_ASSERT(maxi(0,2) == 2);
996 CU_ASSERT(maxi(0,-2) == 0);
997 CU_ASSERT(maxi(2,2) == 2);
998
999 }
1000 int main(void){
1001 /* CU_initialize_registry() */
1002 return 0;
1003 }
1004 """
1005
1006 def CheckCUnit(context):
1007 return CheckExtLib(context,'cunit',cunit_test_text)
1008
1009 #----------------
1010 # dmalloc test
1011
1012 dmalloc_test_text = """
1013 #include <stdlib.h>
1014 #include <dmalloc.h>
1015
1016 int main(void){
1017 char *c;
1018 c = malloc(100*sizeof(char));
1019 free(c);
1020 return 0;
1021 }
1022 """
1023
1024 def CheckDMalloc(context):
1025 return CheckExtLib(context,'dmalloc',dmalloc_test_text)
1026
1027 #----------------
1028 # mfgraph test
1029
1030 mfgraph_test_text = """
1031 #include <mfgraph/mfg_draw_graph.h>
1032 int main(void){
1033 using namespace mfg;
1034 DrawGraph g;
1035 return 0;
1036 }
1037 """
1038
1039 def CheckMFGraph(context):
1040 return CheckExtLib(context,'mfgraph',mfgraph_test_text,ext=".cpp")
1041
1042 #----------------
1043 # ufsparse test
1044
1045 ufsparse_test_text = """
1046 #include <ufsparse/cs.h>
1047 int main(void){
1048 cs *A,*B,*C;
1049 C = cs_multiply(A,B);
1050 return 0;
1051 }
1052 """
1053
1054 def CheckUFSparse(context):
1055 return CheckExtLib(context
1056 ,libname='cxsparse'
1057 ,varprefix='ufsparse'
1058 ,text=ufsparse_test_text
1059 ,ext=".c"
1060 )
1061
1062 #----------------
1063 # MATH test
1064
1065 math_test_text = """
1066 #ifndef _ALL_SOURCE
1067 # define _ALL_SOURCE
1068 #endif
1069 #ifndef _XOPEN_SOURCE
1070 # define _XOPEN_SOURCE
1071 #endif
1072 #ifndef _XOPEN_SOURCE_EXTENDED
1073 # define _XOPEN_SOURCE_EXTENDED 1
1074 #endif
1075 #include <math.h>
1076 int main(void){
1077 double x = 1.0; double y = 1.0; int i = 1;
1078 acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
1079 j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
1080 y0(x); y1(x); yn(i,x);
1081 /* this part causes problems with crossmingw... */
1082 #ifdef _THREAD_SAFE
1083 gamma_r(x,&i);
1084 lgamma_r(x,&i);
1085 #else
1086 gamma(x);
1087 lgamma(x);
1088 #endif
1089 hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
1090 return 0;
1091 }
1092 """
1093
1094 def CheckMath(context):
1095 context.Message('Checking for IEEE math library... ')
1096 libsave=context.env.get('LIBS');
1097 context.env.AppendUnique(LIBS=['m'])
1098 is_ok=context.TryLink(math_test_text,".c")
1099 context.Result(is_ok)
1100 if not is_ok:
1101 context.env['LIBS']=libsave
1102 return is_ok
1103
1104 #----------------
1105 # libpython test
1106
1107 libpython_test_text = """
1108 #include <Python.h>
1109 int main(void){
1110 PyObject *p;
1111 p = Py_None;
1112 return 0;
1113 }
1114 """
1115
1116 def CheckPythonLib(context):
1117 context.Message('Checking for libpython... ')
1118
1119 if platform.system()=="Windows":
1120 python_lib='python%d%d'
1121 else:
1122 python_lib='python%d.%d'
1123 python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])]
1124
1125 python_cpppath = [distutils.sysconfig.get_python_inc()]
1126 cfig = distutils.sysconfig.get_config_vars()
1127
1128 lastLIBS = context.env.get('LIBS')
1129 lastLIBPATH = context.env.get('LIBPATH')
1130 lastCPPPATH = context.env.get('CPPPATH')
1131 lastLINKFLAGS = context.env.get('LINKFLAGS')
1132
1133 python_libpath = []
1134 python_linkflags = []
1135 if platform.system()=="Windows":
1136 python_libpath+=[cfig['prefix']]
1137 else:
1138 # checked on Linux and SunOS
1139 if cfig['LDLIBRARY']==cfig['LIBRARY']:
1140 sys.stdout.write("(static)")
1141 python_libpath += [cfig['LIBPL']]
1142 python_linkflags += cfig['LIBS'].split(' ')
1143
1144 context.env.AppendUnique(LIBS=python_libs)
1145 context.env.AppendUnique(LIBPATH=python_libpath)
1146 context.env.AppendUnique(CPPPATH=python_cpppath)
1147 context.env.AppendUnique(LINKFLAGS=python_linkflags)
1148 result = context.TryLink(libpython_test_text,".c");
1149
1150 context.Result(result)
1151
1152 if(result):
1153 context.env['PYTHON_LIBPATH']=python_libpath
1154 context.env['PYTHON_LIB']=python_libs
1155 context.env['PYTHON_CPPPATH']=python_cpppath
1156 context.env['PYTHON_LINKFLAGS']=python_linkflags
1157
1158 context.env['LIBS'] = lastLIBS
1159 context.env['LIBPATH'] = lastLIBPATH
1160 context.env['CPPPATH'] = lastCPPPATH
1161 context.env['LINKFLAGS'] = lastLINKFLAGS
1162
1163 return result
1164
1165 #----------------
1166 # IDA test
1167
1168 sundials_version_major_required = 2
1169 sundials_version_minor_min = 2
1170 sundials_version_minor_max = 3
1171
1172 sundials_version_text = """
1173 #include <sundials/sundials_config.h>
1174 #include <stdio.h>
1175 int main(){
1176 printf("%s",SUNDIALS_PACKAGE_VERSION);
1177 return 0;
1178 }
1179 """
1180
1181 ida_test_text = """
1182 #if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2
1183 # include <sundials/sundials_config.h>
1184 # include <sundials/sundials_nvector.h>
1185 # include <nvector_serial.h>
1186 # include <ida.h>
1187 # include <ida/ida_spgmr.h>
1188 #else
1189 # include <sundials/sundials_config.h>
1190 # include <nvector/nvector_serial.h>
1191 # include <ida/ida.h>
1192 #endif
1193 int main(){
1194 void *ida_mem;
1195 ida_mem = IDACreate();
1196 return 0;
1197 }
1198 """
1199
1200 # slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS,
1201 # so detect the version and act accordingly.
1202 def CheckSUNDIALS(context):
1203 keep = KeepContext(context,'SUNDIALS')
1204 context.Message("Checking for SUNDIALS... ")
1205 (is_ok,output) = context.TryRun(sundials_version_text,'.c')
1206 keep.restore(context)
1207 if not is_ok:
1208 context.Result(0)
1209 return 0
1210
1211 major,minor,patch = tuple([int(i) for i in output.split(".")])
1212 context.env['SUNDIALS_VERSION_MAJOR'] = major
1213 context.env['SUNDIALS_VERSION_MINOR'] = minor
1214 if major != sundials_version_major_required \
1215 or minor < sundials_version_minor_min \
1216 or minor > sundials_version_minor_max:
1217 context.Result(output+" (bad version)")
1218 # bad version
1219 return 0
1220
1221 # good version
1222 context.Result("%d.%d.%d, good" % (major,minor,patch))
1223
1224 return 1
1225
1226
1227 def CheckIDA(context):
1228 context.Message( 'Checking for IDA... ' )
1229
1230 keep = KeepContext(context,"SUNDIALS")
1231
1232 major = context.env['SUNDIALS_VERSION_MAJOR']
1233 minor = context.env['SUNDIALS_VERSION_MINOR']
1234
1235 cppdef = context.env.get('CPPDEFINES')
1236
1237 context.env.Append(CPPDEFINES=[
1238 ('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR")
1239 ,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")
1240 ])
1241
1242 context.env['SUNDIALS_CPPPATH_EXTRA']=[]
1243 if major==2 and minor==2:
1244 context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"])
1245
1246 context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")])
1247 context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS'])
1248 context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA'])
1249
1250 is_ok = context.TryLink(ida_test_text,".c")
1251 context.Result(is_ok)
1252
1253 if cppdef:
1254 context.env['CPPDEFINES']=cppdef
1255 keep.restore(context)
1256
1257 return is_ok
1258
1259
1260 #----------------
1261 # CONOPT test
1262
1263 conopt_test_text = """
1264 #if !defined(_WIN32)
1265 # define FNAME_LCASE_DECOR
1266 #endif
1267
1268 #include <conopt.h>
1269 #include <stdlib.h>
1270 int main(){
1271 int s, *v, e;
1272 s = COIDEF_Size();
1273 v = (int *)malloc(s*sizeof(int));
1274 e = COIDEF_Ini(v);
1275 return e;
1276 }
1277 """
1278
1279 def CheckCONOPT(context):
1280 context.Message( 'Checking for CONOPT... ' )
1281
1282 keep = KeepContext(context,"CONOPT")
1283
1284 is_ok = context.TryLink(conopt_test_text,".c")
1285 context.Result(is_ok)
1286
1287 keep.restore(context)
1288
1289 return is_ok
1290
1291 #----------------
1292 # Tcl test
1293
1294 # TCL and TK required version 8.1, 8.2, 8.3, or 8.4:
1295 tcltk_minor_newest_acceptable = 4
1296 tcltk_major_required = 8
1297
1298 tcl_check_text = r"""
1299 #include <tcl.h>
1300 #include <stdio.h>
1301 int main(void){
1302 printf("%s",TCL_PATCH_LEVEL);
1303 return 0;
1304 }
1305 """
1306
1307 def CheckTcl(context):
1308 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
1309
1310 def CheckTclVersion(context):
1311 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
1312 context.Message("Checking Tcl version... ")
1313 (is_ok,output) = context.TryRun(tcl_check_text,'.c')
1314 keep.restore(context)
1315 if not is_ok:
1316 context.Result("failed to run check")
1317 return 0
1318
1319 major,minor,patch = tuple([int(i) for i in output.split(".")])
1320 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1321 context.Result(output+" (bad version)")
1322 # bad version
1323 return 0
1324
1325 # good version
1326 context.Result(output+", good")
1327 return 1
1328
1329 #----------------
1330 # Tk test
1331
1332 tk_check_text = r"""
1333 #include <tk.h>
1334 #include <stdio.h>
1335 int main(void){
1336 printf("%s",TK_PATCH_LEVEL);
1337 return 0;
1338 }
1339 """
1340 def CheckTk(context):
1341 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
1342
1343
1344 def CheckTkVersion(context):
1345 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
1346 context.Message("Checking Tk version... ")
1347 #print "LINKFLAGS =",context.env['LINKFLAGS']
1348 (is_ok,output) = context.TryRun(tk_check_text,'.c')
1349 keep.restore(context)
1350 if not is_ok:
1351 context.Result("failed to run check")
1352 return 0
1353
1354 major,minor,patch = tuple([int(i) for i in output.split(".")])
1355 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1356 # bad version
1357 context.Result(output+" (bad version)")
1358 return 0
1359
1360 # good version
1361 context.Result(output+" (good)")
1362 return 1
1363
1364 #----------------
1365 # Tktable test
1366
1367 tktable_check_text = r"""
1368 #include <tkTable.h>
1369 #include <stdio.h>
1370 int main(void){
1371 Table mytable;
1372 return 0;
1373 }
1374 """
1375
1376 def CheckTkTable(context):
1377 return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
1378
1379 #---------------
1380 # X11 test
1381
1382 x11_check_text = r"""
1383 #include <X11/Xlib.h>
1384 #include <X11/IntrinsicP.h>
1385 #include <X11/Intrinsic.h>
1386 #include <X11/ObjectP.h>
1387 #include <X11/Object.h>
1388 int main(void){
1389 Object mything;
1390 return 0;
1391 }
1392 """
1393
1394 def CheckX11(context):
1395 return CheckExtLib(context,'X11',x11_check_text)
1396
1397 #----------------
1398 # Check that we can raise and catch sigint
1399
1400 sigint_test_text = r"""
1401 #include <signal.h>
1402 #include <setjmp.h>
1403 #include <stdlib.h>
1404 static jmp_buf g_jmpenv;
1405 void sighandler(int sig){
1406 longjmp(g_jmpenv,sig);
1407 }
1408 void testsigint(){
1409 raise(SIGINT);
1410 }
1411 int main(void){
1412 signal(SIGINT,&sighandler);
1413 switch(setjmp(g_jmpenv)){
1414 case 0:
1415 testsigint();
1416 exit(1);
1417 case SIGINT:
1418 exit(0);
1419 default:
1420 exit(2);
1421 }
1422 }
1423 """
1424
1425 def CheckSIGINT(context):
1426 context.Message("Checking SIGINT is catchable... ")
1427 (is_ok,output)=context.TryRun(sigint_test_text,".c")
1428 context.Result(is_ok)
1429 return is_ok
1430
1431 #----------------
1432 # Check that we're able to catch floating point errors
1433
1434 sigfpe_test_text = r"""
1435 #include <signal.h>
1436 #include <setjmp.h>
1437 #include <stdlib.h>
1438 #include <fenv.h>
1439 static jmp_buf g_jmpenv;
1440 void fpehandler(int sig){
1441 longjmp(g_jmpenv,sig);
1442 }
1443 int main(void){
1444 fenv_t myfenv;
1445 fegetenv(&myfenv);
1446 fesetenv(&myfenv);
1447 feenableexcept(FE_ALL_EXCEPT);
1448 signal(SIGFPE,&fpehandler);
1449 double x;
1450 switch(setjmp(g_jmpenv)){
1451 case 0:
1452 x = 1.0 / 0.0;
1453 /* failed to catch */
1454 exit(1);
1455 case SIGFPE:
1456 exit(0);
1457 }
1458 }
1459 """
1460
1461 def CheckFPE(context):
1462 context.Message("Checking C99 FPE behaviour... ")
1463 (is_ok,output) = context.TryRun(sigfpe_test_text,'.c')
1464 context.Result(is_ok)
1465 return is_ok
1466
1467 #----------------
1468 # signal reset needed?
1469
1470 sigreset_test_text = r"""
1471 #include <signal.h>
1472 #include <setjmp.h>
1473 #include <stdlib.h>
1474 #include <stdio.h>
1475 typedef void SigHandlerFn(int);
1476 static jmp_buf g_jmpenv;
1477 void sighandler(int sig){
1478 longjmp(g_jmpenv,sig);
1479 }
1480 void testsigint(){
1481 /* fprintf(stderr,"Raising SIGINT\n"); */
1482 raise(SIGINT);
1483 }
1484 int main(void){
1485 SigHandlerFn *last,*saved;
1486 saved = signal(SIGINT,&sighandler);
1487 if(saved!=SIG_DFL){
1488 fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL);
1489 exit(3);
1490 }
1491 switch(setjmp(g_jmpenv)){
1492 case 0:
1493 testsigint();
1494 fprintf(stderr,"Back from SIGINT\n");
1495 exit(1);
1496 case SIGINT:
1497 break;
1498 default:
1499 exit(2);
1500 };
1501 last = signal(SIGINT,SIG_DFL);
1502 if(last!=&sighandler){
1503 printf("1");
1504 exit(0);
1505 }
1506 printf("0");
1507 exit(0);
1508 }
1509 """
1510
1511 def CheckSigReset(context):
1512 context.Message("Checking signal handler reset... ")
1513 (is_ok,output) = context.TryRun(sigreset_test_text,'.c')
1514 if not is_ok:
1515 context.Result("ERROR")
1516 return False
1517 if int(output)==1:
1518 context.Result("required");
1519 context.env['ASC_RESETNEEDED'] = True
1520 else:
1521 context.Result("not required");
1522 context.env['ASC_RESETNEEDED'] = False
1523 return is_ok
1524
1525 #----------------
1526 # GCC Version sniffing
1527
1528 # TODO FIXME
1529
1530 gcc_version4 = False
1531
1532 #------------------------------------------------------
1533 # CONFIGURATION
1534
1535 conf = Configure(env
1536 , custom_tests = {
1537 'CheckMath' : CheckMath
1538 , 'CheckSwigVersion' : CheckSwigVersion
1539 , 'CheckPythonLib' : CheckPythonLib
1540 , 'CheckCUnit' : CheckCUnit
1541 , 'CheckDMalloc' : CheckDMalloc
1542 , 'CheckMFGraph' : CheckMFGraph
1543 , 'CheckUFSparse' : CheckUFSparse
1544 , 'CheckTcl' : CheckTcl
1545 , 'CheckTclVersion' : CheckTclVersion
1546 , 'CheckTk' : CheckTk
1547 , 'CheckTkVersion' : CheckTkVersion
1548 , 'CheckGcc' : CheckGcc
1549 , 'CheckGccVisibility' : CheckGccVisibility
1550 , 'CheckYacc' : CheckYacc
1551 , 'CheckLex' : CheckLex
1552 , 'CheckTkTable' : CheckTkTable
1553 , 'CheckX11' : CheckX11
1554 , 'CheckIDA' : CheckIDA
1555 , 'CheckSUNDIALS' : CheckSUNDIALS
1556 , 'CheckCONOPT' : CheckCONOPT
1557 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
1558 , 'CheckFPE' : CheckFPE
1559 , 'CheckSIGINT' : CheckSIGINT
1560 , 'CheckSigReset' : CheckSigReset
1561 # , 'CheckIsNan' : CheckIsNan
1562 # , 'CheckCppUnitConfig' : CheckCppUnitConfig
1563 }
1564 # , config_h = "config.h"
1565 )
1566
1567 def sconsversioncheck():
1568
1569 # uncomment the following line to skip the version check:
1570 # return 1
1571
1572 import SCons
1573 v = SCons.__version__.split(".")
1574 if v[0] != '0':
1575 return 0
1576 if int(v[1]) >= 97:
1577 return 1
1578 if v[1] != '96':
1579 return 0
1580 micro = int(v[2])
1581 if micro == 92 or micro == 93 or micro == 96:
1582 return 1;
1583 return 0
1584
1585 if not sconsversioncheck():
1586 print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
1587 print "or consult the developers in the case of newer versions. Modify"
1588 print "the function 'sconsversioncheck' in the file SConstruct if you"
1589 print "want to *force* SCons to continue."
1590 Exit(1)
1591
1592 # stdio -- just to check that compiler is behaving
1593
1594 if not conf.CheckHeader('stdio.h'):
1595 print "CPPPATH =",env.get('CPPPATH')
1596 print "Did not find 'stdio.h'! Check your compiler configuration."
1597 print ""
1598 print "You environment is printed here:"
1599 for k,v in os.environ.iteritems():
1600 print "%-30s%s" % ("%s :" % k, v)
1601 Exit(1)
1602
1603 if not conf.CheckFunc('snprintf'):
1604 print "Didn't find snprintf";
1605 exit(1)
1606
1607 # Math library
1608
1609 conf.env['HAVE_IEEE']=True
1610
1611 if need_libm and not conf.CheckMath():
1612 conf.env['HAVE_IEEE']=False
1613 print 'Did not find math library, exiting!'
1614 Exit(1)
1615
1616 # Where is 'isnan'?
1617
1618 if not conf.CheckFunc('isnan') and not conf.CheckFunc('_isnan'):
1619 print "Didn't find isnan"
1620 # Exit(1)
1621
1622 # GCC visibility
1623
1624 if conf.CheckGcc():
1625 conf.env['HAVE_GCC']=True;
1626 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
1627 conf.env['HAVE_GCCVISIBILITY']=True;
1628 conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
1629 conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
1630 conf.env.Append(CCFLAGS=['-Wall'])
1631
1632 # Catching SIGINT
1633
1634 if env['WITH_SIGNALS']:
1635 if not conf.CheckSIGINT():
1636 with_signals = False
1637 without_signals_reason = "SIGINT uncatchable"
1638
1639 # Catching SIGFPE
1640
1641 if conf.CheckFPE():
1642 conf.env['HAVE_C99FPE']=True
1643 else:
1644 conf.env['HAVE_C99FPE']=False
1645
1646 # Checking for signal reset requirement
1647
1648 if not conf.CheckSigReset():
1649 print "Unable to determine if signal reset is required"
1650 Exit(1)
1651
1652 # YACC
1653
1654 if not conf.CheckYacc():
1655 print "YACC NOT FOUND OR NOT WORKING"
1656 else:
1657 conf.env['HAVE_YACC']=True
1658
1659 if not conf.CheckLex():
1660 print "YACC NOT FOUND OR NOT WORKING"
1661 else:
1662 conf.env['HAVE_LEX']=True
1663
1664 # Tcl/Tk
1665
1666 if with_tcltk:
1667 if conf.CheckTcl():
1668 if conf.CheckTclVersion():
1669 if conf.CheckTk():
1670 if with_tcltk and conf.CheckTkVersion():
1671 if env['STATIC_TCLTK']:
1672 if conf.CheckTkTable():
1673 pass
1674 else:
1675 without_tcltk_reason = "TkTable not found"
1676 with_tcltk = False
1677 else:
1678 without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
1679 with_tcltk = False
1680 else:
1681 without_tcltk_reason = "Tk not found."
1682 with_tcltk = False
1683 else:
1684 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
1685 with_tcltk = False
1686
1687 else:
1688 without_tcltk_reason = "Tcl not found."
1689 with_tcltk = False
1690
1691 if env['STATIC_TCLTK']:
1692 conf.CheckX11()
1693
1694 # Python... obviously we're already running python, so we just need to
1695 # check that we can link to the python library OK:
1696
1697 if not conf.CheckPythonLib():
1698 without_python_reason = 'libpython2.x not found or not linkable'
1699 with_python = False
1700 env['WITH_PYTHON']=False
1701
1702 # SWIG version
1703
1704 if with_python and not conf.CheckSwigVersion():
1705 without_python_reason = 'SWIG >= 1.3.24 is required'
1706 with_python = False
1707 env['WITH_PYTHON']=False
1708
1709 # CUnit
1710
1711 if with_cunit:
1712 if not conf.CheckCUnit():
1713 without_cunit_reason = 'CUnit not found'
1714 with_cunit = False
1715 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
1716
1717 # DMALLOC
1718
1719 if with_dmalloc:
1720 if not conf.CheckDMalloc():
1721 without_dmalloc_reason = 'dmalloc not found'
1722 with_dmalloc = False
1723
1724 # MFGRAPH
1725
1726 if with_mfgraph:
1727 if not conf.CheckMFGraph():
1728 without_mfgraph_reason = 'mfgraph not found'
1729 with_mfgraph = False
1730 env['WITH_MFGRAPH'] = False
1731
1732 # UFSPARSE
1733
1734 if with_ufsparse:
1735 if not conf.CheckUFSparse():
1736 without_ufsparse_reason = 'mfgraph not found'
1737 with_ufsparse = False
1738 env['WITH_UFSPARSE'] = False
1739
1740 # IDA
1741
1742 if not with_ida:
1743 without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
1744 elif not conf.CheckSUNDIALS():
1745 with_ida = False
1746 without_ida_reason = "SUNDIALS not found, or bad version"
1747 elif not conf.CheckIDA():
1748 with_ida = False
1749 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
1750
1751 # CONOPT
1752
1753 if not with_conopt:
1754 without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
1755 elif not conf.CheckCONOPT():
1756 with_conopt = False
1757 without_conpt_reason = "CONOPT not found"
1758
1759 # BLAS
1760
1761 need_blas=False
1762
1763 if with_lsode:
1764 need_fortran = True
1765 need_blas=True
1766
1767 if need_blas:
1768 if conf.CheckLib('blas'):
1769 with_local_blas = False
1770 without_local_blas_reason = "Found BLAS installed on system"
1771 else:
1772 with_local_blas = True
1773 need_fortran = True
1774 else:
1775 with_local_blas= False;
1776 without_local_blas_reason = "BLAS not required"
1777
1778 # FORTRAN
1779
1780 if need_fortran:
1781 conf.env.Tool('fortran')
1782 detect_fortran = conf.env.Detect(['gfortran','g77'])
1783 if detect_fortran:
1784 # For some reason, g77 doesn't get detected properly on MinGW
1785 if not env.has_key('F77') and not env.has_key('FORTRAN'):
1786 print "Fixing detection of F77 on MinGW...(?)"
1787 conf.env.Replace(F77=detect_fortran)
1788 conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
1789 conf.env.Replace(F77FLAGS='')
1790 #print "F77:",conf.env['F77']
1791 #print "F77COM:",conf.env['F77COM']
1792 #print "F77FLAGS:",conf.env['F77FLAGS']
1793 fortran_builder = Builder(
1794 action='$F77COM'
1795 , suffix='.o'
1796 , src_suffix='.f'
1797 )
1798 conf.env.Append(BUILDERS={'Fortran':fortran_builder})
1799 if platform.system()=="Linux":
1800 conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
1801 else:
1802 with_lsode=False;
1803 without_lsode_reason="FORTRAN-77 required but not found"
1804
1805 #else:
1806 # print "FORTRAN not required"
1807
1808 # F2C
1809
1810 if need_fortran:
1811 if platform.system()=="Windows":
1812 pass
1813 #conf.env.Append(LIBPATH='c:\mingw\lib')
1814
1815 # scrollkeeper
1816
1817 if with_scrollkeeper:
1818 if not conf.CheckScrollkeeperConfig():
1819 with_scrollkeeper=False
1820 without_scrollkeeper_reason="unable to detect scrollkeeper-config"
1821
1822 # TODO: -D_HPUX_SOURCE is needed
1823
1824 # TODO: check size of void*
1825
1826 # TODO: detect if dynamic libraries are possible or not
1827
1828 if platform.system()=="Windows" and env.has_key('MSVS'):
1829 _found_windows_h = conf.CheckHeader('Windows.h')
1830
1831 if not _found_windows_h:
1832 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
1833 Exit(1)
1834
1835 if with_python and not conf.CheckHeader(['basetsd.h','BaseTsd.h']):
1836 with_python = 0;
1837 without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
1838
1839 conf.env.Append(CPPDEFINES=env['PACKAGE_LINKING'])
1840
1841 conf.Finish()
1842
1843 #---------------------------------------
1844 # SUBSTITUTION DICTIONARY for .in files
1845
1846 release = env.get('RELEASE')
1847 if release=="0.":
1848 release="0"
1849
1850 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
1851
1852 subst_dict = {
1853 '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
1854 , '@GLADE_FILE@':'ascend.glade'
1855 , '@HELP_ROOT@':''
1856 , '@ICON_EXTENSION@':icon_extension
1857 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
1858 , '@INSTALL_BIN@':env['INSTALL_BIN']
1859 , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
1860 , '@INSTALL_LIB@':env['INSTALL_LIB']
1861 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
1862 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
1863 , '@VERSION@':version
1864 , '@RELEASE@':release
1865 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
1866 , '@WEBHELPROOT@':'http://pye.dyndns.org/ascend/manual/'
1867 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
1868 , '@SHLIBPREFIX@':env['SHLIBPREFIX']
1869 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
1870 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
1871 , '@PYTHON@' : python_exe
1872 , '@ASC_CONOPT_LIB@':env.get('CONOPT_LIB')
1873 , '@ASC_CONOPT_ENVVAR@':env.get('CONOPT_ENVVAR')
1874 , '@ASC_CONOPT_DLPATH@':c_escape(env.subst("$CONOPT_DLPATH"))
1875 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
1876 }
1877
1878 if env.get('WITH_LOCAL_HELP'):
1879 print "WITH_LOCAL_HELP:",env['WITH_LOCAL_HELP']
1880 subst_dict['@HELP_ROOT@']=env['WITH_LOCAL_HELP']
1881
1882 # bool options...
1883 for k,v in {
1884 'ASC_WITH_IDA':with_ida
1885 ,'ASC_WITH_DMALLOC':with_dmalloc
1886 ,'ASC_WITH_MFGRAPH':with_mfgraph
1887 ,'ASC_WITH_UFSPARSE':with_ufsparse
1888 ,'ASC_WITH_CONOPT':with_conopt
1889 ,'ASC_WITH_LSODE':with_lsode
1890 ,'ASC_WITH_MMIO':with_mmio
1891 ,'ASC_SIGNAL_TRAPS':with_signals
1892 ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
1893 ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
1894 ,'HAVE_IEEE':env.get('HAVE_IEEE')
1895 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
1896 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
1897 ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
1898 }.iteritems():
1899
1900 if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
1901
1902 if with_python:
1903 subst_dict['@ASCXX_USE_PYTHON@']="1"
1904 env['WITH_PYTHON']=1;
1905
1906 if env.has_key('HAVE_GCCVISIBILITY'):
1907 subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
1908
1909 env.Append(SUBST_DICT=subst_dict)
1910
1911 #for k,v in subst_dict.iteritems():
1912 # print "%-50s%s" % ("'%s'"%k,v)
1913
1914 # REMOVED: long command-line support on Win2k
1915
1916 #------------------------------------------------------
1917 # RECIPE: SWIG scanner
1918
1919 import SCons.Script
1920
1921 SWIGScanner = SCons.Scanner.ClassicCPP(
1922 "SWIGScan"
1923 , ".i"
1924 , "CPPPATH"
1925 , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
1926 )
1927
1928 env.Append(SCANNERS=[SWIGScanner])
1929
1930 #------------------------------------------------------
1931 # RECIPE: 'SubstInFile', used in pygtk SConscript
1932
1933 import re
1934 from SCons.Script import * # the usual scons stuff you get in a SConscript
1935
1936 def TOOL_SUBST(env):
1937 """Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
1938 from the source to the target.
1939 The values of SUBST_DICT first have any construction variables expanded
1940 (its keys are not expanded).
1941 If a value of SUBST_DICT is a python callable function, it is called and
1942 the result is expanded as the value.
1943 If there's more than one source and more than one target, each target gets
1944 substituted from the corresponding source.
1945 """
1946 env.Append(TOOLS = 'SUBST')
1947 def do_subst_in_file(targetfile, sourcefile, dict):
1948 """Replace all instances of the keys of dict with their values.
1949 For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
1950 then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
1951 """
1952 try:
1953 f = open(sourcefile, 'rb')
1954 contents = f.read()
1955 f.close()
1956 except:
1957 raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
1958 for (k,v) in dict.items():
1959 try:
1960 #print "%s ---> %s" % (k,v)
1961 contents = re.sub(k, v, contents)
1962 except Exception,e:
1963 sys.stderr.write("Failed to substute '%s' with '%s': %s\n" % (k,v,e))
1964
1965 try:
1966 f = open(targetfile, 'wb')
1967 f.write(contents)
1968 f.close()
1969 except:
1970 raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
1971 return 0 # success
1972
1973 def subst_in_file(target, source, env):
1974 if not env.has_key('SUBST_DICT'):
1975 raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
1976 d = dict(env['SUBST_DICT']) # copy it
1977 for (k,v) in d.items():
1978 if callable(v):
1979 d[k] = env.subst(v())
1980 elif SCons.Util.is_String(v):
1981 d[k]=env.subst(v)
1982 else:
1983 raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
1984 for (t,s) in zip(target, source):
1985 return do_subst_in_file(str(t), str(s), d)
1986
1987 def subst_in_file_string(target, source, env):
1988 """This is what gets printed on the console."""
1989 return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
1990 for (t,s) in zip(target, source)])
1991
1992 def subst_emitter(target, source, env):
1993 """Add dependency from substituted SUBST_DICT to target.
1994 Returns original target, source tuple unchanged.
1995 """
1996 d = env['SUBST_DICT'].copy() # copy it
1997 for (k,v) in d.items():
1998 if callable(v):
1999 d[k] = env.subst(v())
2000 elif SCons.Util.is_String(v):
2001 d[k]=env.subst(v)
2002 Depends(target, SCons.Node.Python.Value(d))
2003 return target, source
2004
2005 subst_action=SCons.Action.Action(subst_in_file, subst_in_file_string)
2006 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
2007
2008 TOOL_SUBST(env)
2009
2010 #------------------------------------------------------
2011 # Recipe for 'CHMOD' ACTION
2012
2013 import SCons
2014 from SCons.Script.SConscript import SConsEnvironment
2015 SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2016 lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2017
2018 def InstallPerm(env, dest, files, perm):
2019 obj = env.Install(dest, files)
2020 for i in obj:
2021 env.AddPostAction(i, env.Chmod(str(i), perm))
2022
2023 SConsEnvironment.InstallPerm = InstallPerm
2024
2025 # define wrappers
2026 SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2027 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2028 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2029
2030 #------------------------------------------------------
2031 # BUILD...
2032
2033 # so that #include <modulename/headername.h> works across all modules...
2034 env.AppendUnique(CPPPATH=['#base/generic'])
2035
2036 if env['DEBUG']:
2037 env.Append(CCFLAGS=['-g'])
2038
2039 if env['GCOV']:
2040 env.Append(
2041 CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2042 , LIBS=['gcov']
2043 , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2044 )
2045
2046 if with_ida:
2047 env.Append(WITH_IDA=1)
2048
2049 if with_conopt:
2050 env.Append(WITH_CONOPT=1)
2051
2052 #-------------
2053 # TCL/TK GUI
2054
2055 if with_tcltk:
2056 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2057 else:
2058 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2059
2060 #-------------
2061 # PYTHON INTERFACE
2062
2063 if with_python:
2064 env.SConscript(['pygtk/SConscript'],'env')
2065 else:
2066 print "Skipping... Python bindings aren't being built:",without_python_reason
2067
2068 #------------
2069 # BASE/GENERIC SUBDIRECTORIES
2070
2071 libascend_env = env.Copy()
2072
2073 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2074
2075 srcs = []
2076 for d in dirs:
2077 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2078 srcs += heresrcs
2079
2080 #-------------
2081 # IMPORTED CODE: LSODE, BLAS, etc
2082
2083 if with_lsode:
2084 srcs += env.SConscript(['lsod/SConscript'],'env')
2085 srcs += env.SConscript(['linpack/SConscript'],'env')
2086 else:
2087 print "Skipping... LSODE won't be built:", without_lsode_reason
2088
2089 if with_local_blas:
2090 srcs += env.SConscript(['blas/SConscript'],'env')
2091 else:
2092 print "Skipping... BLAS won't be built:", without_local_blas_reason
2093
2094 if not with_ida:
2095 print "Skipping... IDA won't be built:", without_ida_reason
2096
2097 if with_mmio:
2098 srcs += env.SConscript(['mmio/SConscript'],'env')
2099 else:
2100 print "Skipping... MMIO export won't be built:", without_mmio_reason
2101 #-------------
2102 # LIBASCEND -- all base/generic functionality
2103
2104 if with_dmalloc:
2105 libascend_env.Append(LIBS=['dmalloc'])
2106
2107 if with_ufsparse:
2108 libascend_env.Append(LIBS=['cxsparse'])
2109
2110 libascend = libascend_env.SharedLibrary('ascend',srcs)
2111
2112 env.Alias('libascend',libascend)
2113
2114 #-------------
2115 # UNIT TESTS (C CODE)
2116
2117 if with_cunit:
2118 testdirs = ['general','solver','utilities','linear']
2119 testsrcs = []
2120 for testdir in testdirs:
2121 path = 'base/generic/'+testdir+'/test/'
2122 env.SConscript([path+'SConscript'],'env')
2123 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2124
2125 #print "TESTSRCS =",testsrcs
2126
2127 env.SConscript(['test/SConscript'],'env')
2128 env.SConscript(['base/generic/test/SConscript'],'env')
2129
2130 env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2131
2132 else:
2133 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2134
2135 #-------------
2136 # EXTERNAL FUNCTIONS
2137
2138 env['extfns']=[]
2139 modeldirs = env.SConscript(['models/SConscript'],'env')
2140
2141 if not with_extfns:
2142 print "Skipping... External modules aren't being built:",without_extfns_reason
2143
2144 env.Alias('extfns',env['extfns'])
2145
2146 #------------------------------------------------------
2147 # CREATE ASCEND-CONFIG scriptlet
2148
2149 ascendconfig = env.SubstInFile('ascend-config.in')
2150
2151 #------------------------------------------------------
2152 # INSTALLATION
2153
2154 if env.get('CAN_INSTALL'):
2155
2156 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE']
2157 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2158 install_dirs += modeldirs
2159
2160 # TODO: add install options
2161 env.Alias('install',install_dirs)
2162
2163 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2164
2165 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2166
2167 #------------------------------------------------------
2168 # WINDOWS INSTALLER
2169 # For the windows installer, please see pygtk/SConscript
2170
2171 if with_installer:
2172 pass
2173 else:
2174 print "Skipping... Windows installer isn't being built:",without_installer_reason
2175
2176 #------------------------------------------------------
2177 # PROJECT FILE for MSVC
2178
2179 env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2180
2181 #------------------------------------------------------
2182 # CREATE the SPEC file for generation of RPM packages
2183
2184 if platform.system()=="Linux":
2185 env.SubstInFile('ascend.spec.in')
2186
2187 #------------------------------------------------------
2188 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2189
2190 if with_scrollkeeper:
2191 env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2192 env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2193
2194 #------------------------------------------------------
2195 # DISTRIBUTION TAR FILE
2196
2197 env['DISTTAR_FORMAT']='bz2'
2198 env.Append(
2199 DISTTAR_EXCLUDEEXTS=['.o','.os','.so','.a','.dll','.lib','.cc','.cache','.pyc','.cvsignore','.dblite','.log','.pl','.out','.exe','.aux','.idx','.toc','.lof','.lot','.mm','.warnings','.tm2']
2200 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2201 )
2202
2203 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2204 , [env.Dir('#')]
2205 )
2206
2207 env.Depends(tar,'ascend.spec')
2208
2209 Alias('dist',tar)
2210
2211 #------------------------------------------------------
2212 # USER'S MANUAL
2213
2214 env.SConscript('doc/SConscript',['env'])
2215
2216 #------------------------------------------------------
2217 # LIBASCEND DOXYGEN DOCUMENTATION
2218
2219 env.SConscript('base/doc/SConscript',['env'])
2220
2221 #------------------------------------------------------
2222 # RPM BUILD
2223
2224 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2225 # (check * for the version number used to create the tarball)
2226
2227 #------------------------------------------------------
2228 # DEFAULT TARGETS
2229
2230 default_targets =['libascend']
2231 if with_tcltk:
2232 default_targets.append('tcltk')
2233 if with_python:
2234 default_targets.append('pygtk')
2235 if with_installer:
2236 default_targets.append('installer')
2237 if with_extfns:
2238 default_targets.append('extfns')
2239
2240 env.Default(default_targets)
2241
2242 print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2243
2244 # vim: set syntax=python:

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