/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1436 - (show annotations) (download)
Mon May 21 09:39:28 2007 UTC (15 years, 4 months ago) by jpye
File size: 53705 byte(s)
Fixed build for SCons 0.96.92. Needs testing.
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_CPPPATH =",env['TCL_CPPPATH']
729 print "TCL_LIBPATH =",env['TCL_LIBPATH']
730 print "TCL_LIB =",env['TCL_LIB']
731 print "CC =",env['CC']
732 print "CXX =",env['CXX']
733 print "FORTRAN=",env.get('FORTRAN')
734
735 print "ABSOLUTE PATHS =",env['ABSOLUTE_PATHS']
736 print "INSTALL_PREFIX =",env['INSTALL_PREFIX']
737 #------------------------------------------------------
738 # SPECIAL CONFIGURATION TESTS
739
740 need_fortran = False
741
742 #----------------
743 # SWIG
744
745 import os,re
746
747 def get_swig_version(env):
748 cmd = env['SWIG']+' -version'
749 (cin,coutcerr) = os.popen4(cmd)
750 output = coutcerr.read()
751
752 restr = "SWIG\\s+Version\\s+(?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<pat>[0-9]+)\\s*$"
753 expr = re.compile(restr,re.M);
754 m = expr.search(output);
755 if not m:
756 return None
757 maj = int(m.group('maj'))
758 min = int(m.group('min'))
759 pat = int(m.group('pat'))
760
761 return (maj,min,pat)
762
763
764 def CheckSwigVersion(context):
765
766 try:
767 context.Message("Checking version of SWIG... ")
768 maj,min,pat = get_swig_version(context.env)
769 except:
770 context.Result("Failed to detect version, or failed to run SWIG")
771 return 0;
772
773 context.env['SWIGVERSION']=tuple([maj,min,pat])
774
775 if maj == 1 and (
776 min > 3
777 or (min == 3 and pat >= 24)
778 ):
779 context.Result("ok, %d.%d.%d" % (maj,min,pat))
780 return 1;
781 else:
782 context.Result("too old, %d.%d.%d" % (maj,min,pat))
783 return 0;
784
785 #----------------
786 # Scrollkeeper (Linux documentation system)
787
788 def get_scrollkeeper_omfdir(env):
789 cmd = 'scrollkeeper-config --omfdir'
790 (cin,coutcerr) = os.popen4(cmd)
791 output = coutcerr.read()
792 return output.strip()
793
794 def CheckScrollkeeperConfig(context):
795 try:
796 context.Message("Checking for scrollkeeper...")
797 dir=get_scrollkeeper_omfdir(context.env)
798 except:
799 context.Result("Failed to run 'scrollkeeper-config'")
800 return 0
801 context.env['OMFDIR']=dir
802 context.Result("OK, %s" % dir)
803 return 1
804
805 #----------------
806 # General purpose library-and-header test
807
808 class KeepContext:
809 def __init__(self,context,varprefix,static=False):
810 self.keep = {}
811 for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']:
812 #print "Keeping env %s = %s" % (k,context.env.get(k))
813 self.keep[k]=context.env.get(k)
814
815 if context.env.has_key(varprefix+'_CPPPATH'):
816 context.env.AppendUnique(CPPPATH=[env[varprefix+'_CPPPATH']])
817 #print "Adding '"+str(env[varprefix+'_CPPPATH'])+"' to cpp path"
818
819 if static:
820 staticlib=env[varprefix+'_LIB']
821 #print "STATIC LIB = ",staticlib
822 context.env.Append(
823 LINKFLAGS=[staticlib]
824 )
825 else:
826 if context.env.has_key(varprefix+'_LIBPATH'):
827 context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']])
828 #print "Adding '"+str(env[varprefix+'_LIBPATH'])+"' to lib path"
829
830 if context.env.has_key(varprefix+'_LIB'):
831 context.env.Append(LIBS=[env[varprefix+'_LIB']])
832 #print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs"
833
834 def restore(self,context):
835 #print "RESTORING CONTEXT"
836 #print self.keep
837 #print "..."
838 for k in self.keep:
839 if self.keep[k]==None:
840 if context.env.has_key(k):
841 #print "Clearing "+str(k)
842 del context.env[k];
843 else:
844 #print "Restoring %s to '%s'" %(k,self.keep.get(k))
845 context.env[k]=self.keep[k];
846
847 def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False):
848 """This method will check for variables LIBNAME_LIBPATH
849 and LIBNAME_CPPPATH and try to compile and link the
850 file with the provided text, linking with the
851 library libname."""
852
853 if static:
854 context.Message( 'Checking for static '+libname+'... ' )
855 else:
856 context.Message( 'Checking for '+libname+'... ' )
857
858 if varprefix==None:
859 varprefix = libname.upper()
860
861 #print "LIBS is currently:",context.env.get('LIBS')
862 keep = KeepContext(context,varprefix,static)
863
864 if not context.env.has_key(varprefix+'_LIB'):
865 # if varprefix_LIB were in env, KeepContext would
866 # have appended it already
867 context.env.Append(LIBS=[libname])
868
869 is_ok = context.TryLink(text,ext)
870
871 #print "Link success? ",(is_ok != 0)
872
873 keep.restore(context)
874
875 # print "Restored CPPPATH="+str(context.env['CPPPATH'])
876 # print "Restored LIBS="+str(context.env['LIBS'])
877 # print "Restored LIBPATH="+str(context.env['LIBPATH'])
878
879 context.Result(is_ok)
880 return is_ok
881
882 #----------------
883 # GCC
884
885 gcc_test_text = """
886 #ifndef __GNUC__
887 # error "Not using GCC"
888 #endif
889
890 int main(void){
891 return __GNUC__;
892 }
893 """
894
895 def CheckGcc(context):
896 context.Message("Checking for GCC... ")
897 is_ok = context.TryCompile(gcc_test_text,".c")
898 context.Result(is_ok)
899 return is_ok
900
901 #----------------
902 # GCC VISIBILITY feature
903
904 gccvisibility_test_text = """
905 #if __GNUC__ < 4
906 # error "Require GCC version 4 or newer"
907 #endif
908
909 __attribute__ ((visibility("default"))) int x;
910
911 int main(void){
912 extern int x;
913 x = 4;
914 }
915 """
916
917 def CheckGccVisibility(context):
918 context.Message("Checking for GCC 'visibility' capability... ")
919 if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']:
920 context.Result("disabled")
921 return 0
922 is_ok = context.TryCompile(gccvisibility_test_text,".c")
923 context.Result(is_ok)
924 return is_ok
925
926 #----------------
927 # YACC
928
929 yacc_test_text = """
930 %{
931 #include <stdio.h>
932
933 /* MSVC++ needs this before it can swallow Bison output */
934 #ifdef _MSC_VER
935 # define __STDC__
936 #endif
937 %}
938 %token MSG
939 %start ROOT
940 %%
941 ROOT:
942 MSG { printf("HELLO"); }
943 ;
944 %%
945 """
946
947 def CheckYacc(context):
948 context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
949 is_ok = context.TryCompile(yacc_test_text,".y")
950 context.Result(is_ok)
951 return is_ok
952
953 #----------------
954 # LEX
955
956 lex_test_text = """
957 %{
958 #include <stdio.h>
959 %}
960 DIGIT [0-9]
961 ID [a-z][a-z0-9]*
962 %%
963 {DIGIT}+ {
964 printf("A digit: %s\\n",yytext);
965 }
966
967 [ \\t\\n]+ /* ignore */
968
969 . {
970 printf("Unrecognized guff");
971 }
972 %%
973 main(){
974 yylex();
975 }
976 """
977
978 def CheckLex(context):
979 context.Message("Checking for Lex ('%s')... " % context.env.get('LEX'))
980 is_ok = context.TryCompile(lex_test_text,".l")
981 context.Result(is_ok)
982 return is_ok
983
984 #----------------
985 # CUnit test
986
987 cunit_test_text = """
988 #include <CUnit/CUnit.h>
989 int maxi(int i1, int i2){
990 return (i1 > i2) ? i1 : i2;
991 }
992
993 void test_maxi(void){
994 CU_ASSERT(maxi(0,2) == 2);
995 CU_ASSERT(maxi(0,-2) == 0);
996 CU_ASSERT(maxi(2,2) == 2);
997
998 }
999 int main(void){
1000 /* CU_initialize_registry() */
1001 return 0;
1002 }
1003 """
1004
1005 def CheckCUnit(context):
1006 return CheckExtLib(context,'cunit',cunit_test_text)
1007
1008 #----------------
1009 # dmalloc test
1010
1011 dmalloc_test_text = """
1012 #include <stdlib.h>
1013 #include <dmalloc.h>
1014
1015 int main(void){
1016 char *c;
1017 c = malloc(100*sizeof(char));
1018 free(c);
1019 return 0;
1020 }
1021 """
1022
1023 def CheckDMalloc(context):
1024 return CheckExtLib(context,'dmalloc',dmalloc_test_text)
1025
1026 #----------------
1027 # mfgraph test
1028
1029 mfgraph_test_text = """
1030 #include <mfgraph/mfg_draw_graph.h>
1031 int main(void){
1032 using namespace mfg;
1033 DrawGraph g;
1034 return 0;
1035 }
1036 """
1037
1038 def CheckMFGraph(context):
1039 return CheckExtLib(context,'mfgraph',mfgraph_test_text,ext=".cpp")
1040
1041 #----------------
1042 # ufsparse test
1043
1044 ufsparse_test_text = """
1045 #include <ufsparse/cs.h>
1046 int main(void){
1047 cs *A,*B,*C;
1048 C = cs_multiply(A,B);
1049 return 0;
1050 }
1051 """
1052
1053 def CheckUFSparse(context):
1054 return CheckExtLib(context
1055 ,libname='cxsparse'
1056 ,varprefix='ufsparse'
1057 ,text=ufsparse_test_text
1058 ,ext=".c"
1059 )
1060
1061 #----------------
1062 # MATH test
1063
1064 math_test_text = """
1065 #ifndef _ALL_SOURCE
1066 # define _ALL_SOURCE
1067 #endif
1068 #ifndef _XOPEN_SOURCE
1069 # define _XOPEN_SOURCE
1070 #endif
1071 #ifndef _XOPEN_SOURCE_EXTENDED
1072 # define _XOPEN_SOURCE_EXTENDED 1
1073 #endif
1074 #include <math.h>
1075 int main(void){
1076 double x = 1.0; double y = 1.0; int i = 1;
1077 acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
1078 j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
1079 y0(x); y1(x); yn(i,x);
1080 /* this part causes problems with crossmingw... */
1081 #ifdef _THREAD_SAFE
1082 gamma_r(x,&i);
1083 lgamma_r(x,&i);
1084 #else
1085 gamma(x);
1086 lgamma(x);
1087 #endif
1088 hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
1089 return 0;
1090 }
1091 """
1092
1093 def CheckMath(context):
1094 context.Message('Checking for IEEE math library... ')
1095 libsave=context.env.get('LIBS');
1096 context.env.AppendUnique(LIBS=['m'])
1097 is_ok=context.TryLink(math_test_text,".c")
1098 context.Result(is_ok)
1099 if not is_ok:
1100 context.env['LIBS']=libsave
1101 return is_ok
1102
1103 #----------------
1104 # libpython test
1105
1106 libpython_test_text = """
1107 #include <Python.h>
1108 int main(void){
1109 PyObject *p;
1110 p = Py_None;
1111 return 0;
1112 }
1113 """
1114
1115 def CheckPythonLib(context):
1116 context.Message('Checking for libpython... ')
1117
1118 if platform.system()=="Windows":
1119 python_lib='python%d%d'
1120 else:
1121 python_lib='python%d.%d'
1122 python_libs = [python_lib % (sys.version_info[0],sys.version_info[1])]
1123
1124 python_cpppath = [distutils.sysconfig.get_python_inc()]
1125 cfig = distutils.sysconfig.get_config_vars()
1126
1127 lastLIBS = context.env.get('LIBS')
1128 lastLIBPATH = context.env.get('LIBPATH')
1129 lastCPPPATH = context.env.get('CPPPATH')
1130 lastLINKFLAGS = context.env.get('LINKFLAGS')
1131
1132 python_libpath = []
1133 python_linkflags = []
1134 if platform.system()=="Windows":
1135 python_libpath+=[cfig['prefix']]
1136 else:
1137 # checked on Linux and SunOS
1138 if cfig['LDLIBRARY']==cfig['LIBRARY']:
1139 sys.stdout.write("(static)")
1140 python_libpath += [cfig['LIBPL']]
1141 python_linkflags += cfig['LIBS'].split(' ')
1142
1143 context.env.AppendUnique(LIBS=python_libs)
1144 context.env.AppendUnique(LIBPATH=python_libpath)
1145 context.env.AppendUnique(CPPPATH=python_cpppath)
1146 context.env.AppendUnique(LINKFLAGS=python_linkflags)
1147 result = context.TryLink(libpython_test_text,".c");
1148
1149 context.Result(result)
1150
1151 if(result):
1152 context.env['PYTHON_LIBPATH']=python_libpath
1153 context.env['PYTHON_LIB']=python_libs
1154 context.env['PYTHON_CPPPATH']=python_cpppath
1155 context.env['PYTHON_LINKFLAGS']=python_linkflags
1156
1157 context.env['LIBS'] = lastLIBS
1158 context.env['LIBPATH'] = lastLIBPATH
1159 context.env['CPPPATH'] = lastCPPPATH
1160 context.env['LINKFLAGS'] = lastLINKFLAGS
1161
1162 return result
1163
1164 #----------------
1165 # IDA test
1166
1167 sundials_version_major_required = 2
1168 sundials_version_minor_min = 2
1169 sundials_version_minor_max = 3
1170
1171 sundials_version_text = """
1172 #include <sundials/sundials_config.h>
1173 #include <stdio.h>
1174 int main(){
1175 printf("%s",SUNDIALS_PACKAGE_VERSION);
1176 return 0;
1177 }
1178 """
1179
1180 ida_test_text = """
1181 #if SUNDIALS_VERSION_MAJOR==2 && SUNDIALS_VERSION_MINOR==2
1182 # include <sundials/sundials_config.h>
1183 # include <sundials/sundials_nvector.h>
1184 # include <nvector_serial.h>
1185 # include <ida.h>
1186 # include <ida/ida_spgmr.h>
1187 #else
1188 # include <sundials/sundials_config.h>
1189 # include <nvector/nvector_serial.h>
1190 # include <ida/ida.h>
1191 #endif
1192 int main(){
1193 void *ida_mem;
1194 ida_mem = IDACreate();
1195 return 0;
1196 }
1197 """
1198
1199 # slightly changed calling convention (IDACalcID) in newer versions of SUNDIALS,
1200 # so detect the version and act accordingly.
1201 def CheckSUNDIALS(context):
1202 keep = KeepContext(context,'SUNDIALS')
1203 context.Message("Checking for SUNDIALS... ")
1204 (is_ok,output) = context.TryRun(sundials_version_text,'.c')
1205 keep.restore(context)
1206 if not is_ok:
1207 context.Result(0)
1208 return 0
1209
1210 major,minor,patch = tuple([int(i) for i in output.split(".")])
1211 context.env['SUNDIALS_VERSION_MAJOR'] = major
1212 context.env['SUNDIALS_VERSION_MINOR'] = minor
1213 if major != sundials_version_major_required \
1214 or minor < sundials_version_minor_min \
1215 or minor > sundials_version_minor_max:
1216 context.Result(output+" (bad version)")
1217 # bad version
1218 return 0
1219
1220 # good version
1221 context.Result("%d.%d.%d, good" % (major,minor,patch))
1222
1223 return 1
1224
1225
1226 def CheckIDA(context):
1227 context.Message( 'Checking for IDA... ' )
1228
1229 keep = KeepContext(context,"SUNDIALS")
1230
1231 major = context.env['SUNDIALS_VERSION_MAJOR']
1232 minor = context.env['SUNDIALS_VERSION_MINOR']
1233
1234 cppdef = context.env.get('CPPDEFINES')
1235
1236 context.env.Append(CPPDEFINES=[
1237 ('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR")
1238 ,('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")
1239 ])
1240
1241 context.env['SUNDIALS_CPPPATH_EXTRA']=[]
1242 if major==2 and minor==2:
1243 context.env.Append(SUNDIALS_CPPPATH_EXTRA = ["$SUNDIALS_CPPPATH/sundials"])
1244
1245 context.env.Append(CPPDEFINES=[('SUNDIALS_VERSION_MAJOR',"$SUNDIALS_VERSION_MAJOR"),('SUNDIALS_VERSION_MINOR',"$SUNDIALS_VERSION_MINOR")])
1246 context.env.AppendUnique(LIBS=context.env['SUNDIALS_LIBS'])
1247 context.env.AppendUnique(CPPPATH=context.env['SUNDIALS_CPPPATH_EXTRA'])
1248
1249 is_ok = context.TryLink(ida_test_text,".c")
1250 context.Result(is_ok)
1251
1252 if cppdef:
1253 context.env['CPPDEFINES']=cppdef
1254 keep.restore(context)
1255
1256 return is_ok
1257
1258
1259 #----------------
1260 # CONOPT test
1261
1262 conopt_test_text = """
1263 #if !defined(_WIN32)
1264 # define FNAME_LCASE_DECOR
1265 #endif
1266
1267 #include <conopt.h>
1268 #include <stdlib.h>
1269 int main(){
1270 int s, *v, e;
1271 s = COIDEF_Size();
1272 v = (int *)malloc(s*sizeof(int));
1273 e = COIDEF_Ini(v);
1274 return e;
1275 }
1276 """
1277
1278 def CheckCONOPT(context):
1279 context.Message( 'Checking for CONOPT... ' )
1280
1281 keep = KeepContext(context,"CONOPT")
1282
1283 is_ok = context.TryLink(conopt_test_text,".c")
1284 context.Result(is_ok)
1285
1286 keep.restore(context)
1287
1288 return is_ok
1289
1290 #----------------
1291 # Tcl test
1292
1293 # TCL and TK required version 8.1, 8.2, 8.3, or 8.4:
1294 tcltk_minor_newest_acceptable = 4
1295 tcltk_major_required = 8
1296
1297 tcl_check_text = r"""
1298 #include <tcl.h>
1299 #include <stdio.h>
1300 int main(void){
1301 printf("%s",TCL_PATCH_LEVEL);
1302 return 0;
1303 }
1304 """
1305
1306 def CheckTcl(context):
1307 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
1308
1309 def CheckTclVersion(context):
1310 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
1311 context.Message("Checking Tcl version... ")
1312 (is_ok,output) = context.TryRun(tcl_check_text,'.c')
1313 keep.restore(context)
1314 if not is_ok:
1315 context.Result("failed to run check")
1316 return 0
1317
1318 major,minor,patch = tuple([int(i) for i in output.split(".")])
1319 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1320 context.Result(output+" (bad version)")
1321 # bad version
1322 return 0
1323
1324 # good version
1325 context.Result(output+", good")
1326 return 1
1327
1328 #----------------
1329 # Tk test
1330
1331 tk_check_text = r"""
1332 #include <tk.h>
1333 #include <stdio.h>
1334 int main(void){
1335 printf("%s",TK_PATCH_LEVEL);
1336 return 0;
1337 }
1338 """
1339 def CheckTk(context):
1340 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
1341
1342
1343 def CheckTkVersion(context):
1344 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
1345 context.Message("Checking Tk version... ")
1346 #print "LINKFLAGS =",context.env['LINKFLAGS']
1347 (is_ok,output) = context.TryRun(tk_check_text,'.c')
1348 keep.restore(context)
1349 if not is_ok:
1350 context.Result("failed to run check")
1351 return 0
1352
1353 major,minor,patch = tuple([int(i) for i in output.split(".")])
1354 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
1355 # bad version
1356 context.Result(output+" (bad version)")
1357 return 0
1358
1359 # good version
1360 context.Result(output+" (good)")
1361 return 1
1362
1363 #----------------
1364 # Tktable test
1365
1366 tktable_check_text = r"""
1367 #include <tkTable.h>
1368 #include <stdio.h>
1369 int main(void){
1370 Table mytable;
1371 return 0;
1372 }
1373 """
1374
1375 def CheckTkTable(context):
1376 return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
1377
1378 #---------------
1379 # X11 test
1380
1381 x11_check_text = r"""
1382 #include <X11/Xlib.h>
1383 #include <X11/IntrinsicP.h>
1384 #include <X11/Intrinsic.h>
1385 #include <X11/ObjectP.h>
1386 #include <X11/Object.h>
1387 int main(void){
1388 Object mything;
1389 return 0;
1390 }
1391 """
1392
1393 def CheckX11(context):
1394 return CheckExtLib(context,'X11',x11_check_text)
1395
1396 #----------------
1397 # Check that we can raise and catch sigint
1398
1399 sigint_test_text = r"""
1400 #include <signal.h>
1401 #include <setjmp.h>
1402 #include <stdlib.h>
1403 static jmp_buf g_jmpenv;
1404 void sighandler(int sig){
1405 longjmp(g_jmpenv,sig);
1406 }
1407 void testsigint(){
1408 raise(SIGINT);
1409 }
1410 int main(void){
1411 signal(SIGINT,&sighandler);
1412 switch(setjmp(g_jmpenv)){
1413 case 0:
1414 testsigint();
1415 exit(1);
1416 case SIGINT:
1417 exit(0);
1418 default:
1419 exit(2);
1420 }
1421 }
1422 """
1423
1424 def CheckSIGINT(context):
1425 context.Message("Checking SIGINT is catchable... ")
1426 (is_ok,output)=context.TryRun(sigint_test_text,".c")
1427 context.Result(is_ok)
1428 return is_ok
1429
1430 #----------------
1431 # Check that we're able to catch floating point errors
1432
1433 sigfpe_test_text = r"""
1434 #include <signal.h>
1435 #include <setjmp.h>
1436 #include <stdlib.h>
1437 #include <fenv.h>
1438 static jmp_buf g_jmpenv;
1439 void fpehandler(int sig){
1440 longjmp(g_jmpenv,sig);
1441 }
1442 int main(void){
1443 fenv_t myfenv;
1444 fegetenv(&myfenv);
1445 fesetenv(&myfenv);
1446 feenableexcept(FE_ALL_EXCEPT);
1447 signal(SIGFPE,&fpehandler);
1448 double x;
1449 switch(setjmp(g_jmpenv)){
1450 case 0:
1451 x = 1.0 / 0.0;
1452 /* failed to catch */
1453 exit(1);
1454 case SIGFPE:
1455 exit(0);
1456 }
1457 }
1458 """
1459
1460 def CheckFPE(context):
1461 context.Message("Checking C99 FPE behaviour... ")
1462 (is_ok,output) = context.TryRun(sigfpe_test_text,'.c')
1463 context.Result(is_ok)
1464 return is_ok
1465
1466 #----------------
1467 # signal reset needed?
1468
1469 sigreset_test_text = r"""
1470 #include <signal.h>
1471 #include <setjmp.h>
1472 #include <stdlib.h>
1473 #include <stdio.h>
1474 typedef void SigHandlerFn(int);
1475 static jmp_buf g_jmpenv;
1476 void sighandler(int sig){
1477 longjmp(g_jmpenv,sig);
1478 }
1479 void testsigint(){
1480 /* fprintf(stderr,"Raising SIGINT\n"); */
1481 raise(SIGINT);
1482 }
1483 int main(void){
1484 SigHandlerFn *last,*saved;
1485 saved = signal(SIGINT,&sighandler);
1486 if(saved!=SIG_DFL){
1487 fprintf(stderr,"Default handler (%p) was not correctly set\n",SIG_DFL);
1488 exit(3);
1489 }
1490 switch(setjmp(g_jmpenv)){
1491 case 0:
1492 testsigint();
1493 fprintf(stderr,"Back from SIGINT\n");
1494 exit(1);
1495 case SIGINT:
1496 break;
1497 default:
1498 exit(2);
1499 };
1500 last = signal(SIGINT,SIG_DFL);
1501 if(last!=&sighandler){
1502 printf("1");
1503 exit(0);
1504 }
1505 printf("0");
1506 exit(0);
1507 }
1508 """
1509
1510 def CheckSigReset(context):
1511 context.Message("Checking signal handler reset... ")
1512 (is_ok,output) = context.TryRun(sigreset_test_text,'.c')
1513 if not is_ok:
1514 context.Result("ERROR")
1515 return False
1516 if int(output)==1:
1517 context.Result("required");
1518 context.env['ASC_RESETNEEDED'] = True
1519 else:
1520 context.Result("not required");
1521 context.env['ASC_RESETNEEDED'] = False
1522 return is_ok
1523
1524 #----------------
1525 # GCC Version sniffing
1526
1527 # TODO FIXME
1528
1529 gcc_version4 = False
1530
1531 #------------------------------------------------------
1532 # CONFIGURATION
1533
1534 conf = Configure(env
1535 , custom_tests = {
1536 'CheckMath' : CheckMath
1537 , 'CheckSwigVersion' : CheckSwigVersion
1538 , 'CheckPythonLib' : CheckPythonLib
1539 , 'CheckCUnit' : CheckCUnit
1540 , 'CheckDMalloc' : CheckDMalloc
1541 , 'CheckMFGraph' : CheckMFGraph
1542 , 'CheckUFSparse' : CheckUFSparse
1543 , 'CheckTcl' : CheckTcl
1544 , 'CheckTclVersion' : CheckTclVersion
1545 , 'CheckTk' : CheckTk
1546 , 'CheckTkVersion' : CheckTkVersion
1547 , 'CheckGcc' : CheckGcc
1548 , 'CheckGccVisibility' : CheckGccVisibility
1549 , 'CheckYacc' : CheckYacc
1550 , 'CheckLex' : CheckLex
1551 , 'CheckTkTable' : CheckTkTable
1552 , 'CheckX11' : CheckX11
1553 , 'CheckIDA' : CheckIDA
1554 , 'CheckSUNDIALS' : CheckSUNDIALS
1555 , 'CheckCONOPT' : CheckCONOPT
1556 , 'CheckScrollkeeperConfig' : CheckScrollkeeperConfig
1557 , 'CheckFPE' : CheckFPE
1558 , 'CheckSIGINT' : CheckSIGINT
1559 , 'CheckSigReset' : CheckSigReset
1560 # , 'CheckIsNan' : CheckIsNan
1561 # , 'CheckCppUnitConfig' : CheckCppUnitConfig
1562 }
1563 # , config_h = "config.h"
1564 )
1565
1566 def sconsversioncheck():
1567
1568 # uncomment the following line to skip the version check:
1569 # return 1
1570
1571 import SCons
1572 v = SCons.__version__.split(".")
1573 if v[0] != '0':
1574 return 0
1575 if int(v[1]) >= 97:
1576 return 1
1577 if v[1] != '96':
1578 return 0
1579 micro = int(v[2])
1580 if micro == 92 or micro == 93 or micro == 96:
1581 return 1;
1582 return 0
1583
1584 if not sconsversioncheck():
1585 print "Scons version is not OK. Please try version 0.96.92 or 0.96.93,"
1586 print "or consult the developers in the case of newer versions. Modify"
1587 print "the function 'sconsversioncheck' in the file SConstruct if you"
1588 print "want to *force* SCons to continue."
1589 Exit(1)
1590
1591 # stdio -- just to check that compiler is behaving
1592
1593 if not conf.CheckHeader('stdio.h'):
1594 print "CPPPATH =",env.get('CPPPATH')
1595 print "Did not find 'stdio.h'! Check your compiler configuration."
1596 print ""
1597 print "You environment is printed here:"
1598 for k,v in os.environ.iteritems():
1599 print "%-30s%s" % ("%s :" % k, v)
1600 Exit(1)
1601
1602 if not conf.CheckFunc('snprintf'):
1603 print "Didn't find snprintf";
1604 exit(1)
1605
1606 # Math library
1607
1608 conf.env['HAVE_IEEE']=True
1609
1610 if need_libm and not conf.CheckMath():
1611 conf.env['HAVE_IEEE']=False
1612 print 'Did not find math library, exiting!'
1613 Exit(1)
1614
1615 # Where is 'isnan'?
1616
1617 if not conf.CheckFunc('isnan') and not conf.CheckFunc('_isnan'):
1618 print "Didn't find isnan"
1619 # Exit(1)
1620
1621 # GCC visibility
1622
1623 if conf.CheckGcc():
1624 conf.env['HAVE_GCC']=True;
1625 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
1626 conf.env['HAVE_GCCVISIBILITY']=True;
1627 conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
1628 conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
1629 conf.env.Append(CCFLAGS=['-Wall'])
1630
1631 # Catching SIGINT
1632
1633 if env['WITH_SIGNALS']:
1634 if not conf.CheckSIGINT():
1635 with_signals = False
1636 without_signals_reason = "SIGINT uncatchable"
1637
1638 # Catching SIGFPE
1639
1640 if conf.CheckFPE():
1641 conf.env['HAVE_C99FPE']=True
1642 else:
1643 conf.env['HAVE_C99FPE']=False
1644
1645 # Checking for signal reset requirement
1646
1647 if not conf.CheckSigReset():
1648 print "Unable to determine if signal reset is required"
1649 Exit(1)
1650
1651 # YACC
1652
1653 if not conf.CheckYacc():
1654 print "YACC NOT FOUND OR NOT WORKING"
1655 else:
1656 conf.env['HAVE_YACC']=True
1657
1658 if not conf.CheckLex():
1659 print "YACC NOT FOUND OR NOT WORKING"
1660 else:
1661 conf.env['HAVE_LEX']=True
1662
1663 # Tcl/Tk
1664
1665 if with_tcltk:
1666 if conf.CheckTcl():
1667 if conf.CheckTclVersion():
1668 if conf.CheckTk():
1669 if with_tcltk and conf.CheckTkVersion():
1670 if env['STATIC_TCLTK']:
1671 if conf.CheckTkTable():
1672 pass
1673 else:
1674 without_tcltk_reason = "TkTable not found"
1675 with_tcltk = False
1676 else:
1677 without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
1678 with_tcltk = False
1679 else:
1680 without_tcltk_reason = "Tk not found."
1681 with_tcltk = False
1682 else:
1683 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
1684 with_tcltk = False
1685
1686 else:
1687 without_tcltk_reason = "Tcl not found."
1688 with_tcltk = False
1689
1690 if env['STATIC_TCLTK']:
1691 conf.CheckX11()
1692
1693 # Python... obviously we're already running python, so we just need to
1694 # check that we can link to the python library OK:
1695
1696 if not conf.CheckPythonLib():
1697 without_python_reason = 'libpython2.x not found or not linkable'
1698 with_python = False
1699 env['WITH_PYTHON']=False
1700
1701 # SWIG version
1702
1703 if with_python and not conf.CheckSwigVersion():
1704 without_python_reason = 'SWIG >= 1.3.24 is required'
1705 with_python = False
1706 env['WITH_PYTHON']=False
1707
1708 # CUnit
1709
1710 if with_cunit:
1711 if not conf.CheckCUnit():
1712 without_cunit_reason = 'CUnit not found'
1713 with_cunit = False
1714 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
1715
1716 # DMALLOC
1717
1718 if with_dmalloc:
1719 if not conf.CheckDMalloc():
1720 without_dmalloc_reason = 'dmalloc not found'
1721 with_dmalloc = False
1722
1723 # MFGRAPH
1724
1725 if with_mfgraph:
1726 if not conf.CheckMFGraph():
1727 without_mfgraph_reason = 'mfgraph not found'
1728 with_mfgraph = False
1729 env['WITH_MFGRAPH'] = False
1730
1731 # UFSPARSE
1732
1733 if with_ufsparse:
1734 if not conf.CheckUFSparse():
1735 without_ufsparse_reason = 'mfgraph not found'
1736 with_ufsparse = False
1737 env['WITH_UFSPARSE'] = False
1738
1739 # IDA
1740
1741 if not with_ida:
1742 without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
1743 elif not conf.CheckSUNDIALS():
1744 with_ida = False
1745 without_ida_reason = "SUNDIALS not found, or bad version"
1746 elif not conf.CheckIDA():
1747 with_ida = False
1748 without_ida_reason = "Unable to compile/link against SUNDIALS/IDA"
1749
1750 # CONOPT
1751
1752 if not with_conopt:
1753 without_conopt_reason = "Not selected (see config option WITH_SOLVERS)"
1754 elif not conf.CheckCONOPT():
1755 with_conopt = False
1756 without_conpt_reason = "CONOPT not found"
1757
1758 # BLAS
1759
1760 need_blas=False
1761
1762 if with_lsode:
1763 need_fortran = True
1764 need_blas=True
1765
1766 if need_blas:
1767 if conf.CheckLib('blas'):
1768 with_local_blas = False
1769 without_local_blas_reason = "Found BLAS installed on system"
1770 else:
1771 with_local_blas = True
1772 need_fortran = True
1773 else:
1774 with_local_blas= False;
1775 without_local_blas_reason = "BLAS not required"
1776
1777 # FORTRAN
1778
1779 if need_fortran:
1780 conf.env.Tool('fortran')
1781 detect_fortran = conf.env.Detect(['gfortran','g77'])
1782 if detect_fortran:
1783 # For some reason, g77 doesn't get detected properly on MinGW
1784 if not env.has_key('F77') and not env.has_key('FORTRAN'):
1785 print "Fixing detection of F77 on MinGW...(?)"
1786 conf.env.Replace(F77=detect_fortran)
1787 conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
1788 conf.env.Replace(F77FLAGS='')
1789 #print "F77:",conf.env['F77']
1790 #print "F77COM:",conf.env['F77COM']
1791 #print "F77FLAGS:",conf.env['F77FLAGS']
1792 fortran_builder = Builder(
1793 action='$F77COM'
1794 , suffix='.o'
1795 , src_suffix='.f'
1796 )
1797 conf.env.Append(BUILDERS={'Fortran':fortran_builder})
1798 if platform.system()=="Linux":
1799 conf.env.Append(SHFORTRANFLAGS=['-fPIC'])
1800 else:
1801 with_lsode=False;
1802 without_lsode_reason="FORTRAN-77 required but not found"
1803
1804 #else:
1805 # print "FORTRAN not required"
1806
1807 # F2C
1808
1809 if need_fortran:
1810 if platform.system()=="Windows":
1811 pass
1812 #conf.env.Append(LIBPATH='c:\mingw\lib')
1813
1814 # scrollkeeper
1815
1816 if with_scrollkeeper:
1817 if not conf.CheckScrollkeeperConfig():
1818 with_scrollkeeper=False
1819 without_scrollkeeper_reason="unable to detect scrollkeeper-config"
1820
1821 # TODO: -D_HPUX_SOURCE is needed
1822
1823 # TODO: check size of void*
1824
1825 # TODO: detect if dynamic libraries are possible or not
1826
1827 if platform.system()=="Windows" and env.has_key('MSVS'):
1828 _found_windows_h = conf.CheckHeader('Windows.h')
1829
1830 if not _found_windows_h:
1831 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
1832 Exit(1)
1833
1834 if with_python and not conf.CheckHeader(['basetsd.h','BaseTsd.h']):
1835 with_python = 0;
1836 without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
1837
1838 conf.env.Append(CPPDEFINES=env['PACKAGE_LINKING'])
1839
1840 conf.Finish()
1841
1842 #---------------------------------------
1843 # SUBSTITUTION DICTIONARY for .in files
1844
1845 release = env.get('RELEASE')
1846 if release=="0.":
1847 release="0"
1848
1849 #print "SUBSTITUTED CONOPT_LIBPATH:",c_escape(env.subst("$CONOPT_LIBPATH"))
1850
1851 subst_dict = {
1852 '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
1853 , '@GLADE_FILE@':'ascend.glade'
1854 , '@HELP_ROOT@':''
1855 , '@ICON_EXTENSION@':icon_extension
1856 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
1857 , '@INSTALL_BIN@':env['INSTALL_BIN']
1858 , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
1859 , '@INSTALL_LIB@':env['INSTALL_LIB']
1860 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
1861 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
1862 , '@VERSION@':version
1863 , '@RELEASE@':release
1864 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
1865 , '@WEBHELPROOT@':'http://pye.dyndns.org/ascend/manual/'
1866 , '@SHLIBSUFFIX@':env['SHLIBSUFFIX']
1867 , '@SHLIBPREFIX@':env['SHLIBPREFIX']
1868 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
1869 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
1870 , '@PYTHON@' : python_exe
1871 , '@ASC_CONOPT_LIB@':env.get('CONOPT_LIB')
1872 , '@ASC_CONOPT_ENVVAR@':env.get('CONOPT_ENVVAR')
1873 , '@ASC_CONOPT_DLPATH@':c_escape(env.subst("$CONOPT_DLPATH"))
1874 , '@SOURCE_ROOT@':c_escape(os.path.abspath(str(env.Dir("#"))))
1875 }
1876
1877 if env.get('WITH_LOCAL_HELP'):
1878 print "WITH_LOCAL_HELP:",env['WITH_LOCAL_HELP']
1879 subst_dict['@HELP_ROOT@']=env['WITH_LOCAL_HELP']
1880
1881 # bool options...
1882 for k,v in {
1883 'ASC_WITH_IDA':with_ida
1884 ,'ASC_WITH_DMALLOC':with_dmalloc
1885 ,'ASC_WITH_MFGRAPH':with_mfgraph
1886 ,'ASC_WITH_UFSPARSE':with_ufsparse
1887 ,'ASC_WITH_CONOPT':with_conopt
1888 ,'ASC_WITH_LSODE':with_lsode
1889 ,'ASC_WITH_MMIO':with_mmio
1890 ,'ASC_SIGNAL_TRAPS':with_signals
1891 ,'ASC_RESETNEEDED':env.get('ASC_RESETNEEDED')
1892 ,'HAVE_C99FPE':env.get('HAVE_C99FPE')
1893 ,'HAVE_IEEE':env.get('HAVE_IEEE')
1894 ,'ASC_ABSOLUTE_PATHS':env.get('ABSOLUTE_PATHS')
1895 ,'ASC_XTERM_COLORS':env.get('WITH_XTERM_COLORS')
1896 ,'MALLOC_DEBUG':env.get('MALLOC_DEBUG')
1897 }.iteritems():
1898
1899 if v: subst_dict["/\\* #define %s @%s@ \\*/" % (k,k)]='# define %s 1 ' % k
1900
1901 if with_python:
1902 subst_dict['@ASCXX_USE_PYTHON@']="1"
1903 env['WITH_PYTHON']=1;
1904
1905 if env.has_key('HAVE_GCCVISIBILITY'):
1906 subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
1907
1908 env.Append(SUBST_DICT=subst_dict)
1909
1910 #for k,v in subst_dict.iteritems():
1911 # print "%-50s%s" % ("'%s'"%k,v)
1912
1913 # REMOVED: long command-line support on Win2k
1914
1915 #------------------------------------------------------
1916 # RECIPE: SWIG scanner
1917
1918 import SCons.Script
1919
1920 SWIGScanner = SCons.Scanner.ClassicCPP(
1921 "SWIGScan"
1922 , ".i"
1923 , "CPPPATH"
1924 , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
1925 )
1926
1927 env.Append(SCANNERS=[SWIGScanner])
1928
1929 #------------------------------------------------------
1930 # RECIPE: 'SubstInFile', used in pygtk SConscript
1931
1932 import re
1933 from SCons.Script import * # the usual scons stuff you get in a SConscript
1934
1935 def TOOL_SUBST(env):
1936 """Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
1937 from the source to the target.
1938 The values of SUBST_DICT first have any construction variables expanded
1939 (its keys are not expanded).
1940 If a value of SUBST_DICT is a python callable function, it is called and
1941 the result is expanded as the value.
1942 If there's more than one source and more than one target, each target gets
1943 substituted from the corresponding source.
1944 """
1945 env.Append(TOOLS = 'SUBST')
1946 def do_subst_in_file(targetfile, sourcefile, dict):
1947 """Replace all instances of the keys of dict with their values.
1948 For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
1949 then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
1950 """
1951 try:
1952 f = open(sourcefile, 'rb')
1953 contents = f.read()
1954 f.close()
1955 except:
1956 raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
1957 for (k,v) in dict.items():
1958 try:
1959 #print "%s ---> %s" % (k,v)
1960 contents = re.sub(k, v, contents)
1961 except Exception,e:
1962 sys.stderr.write("Failed to substute '%s' with '%s': %s\n" % (k,v,e))
1963
1964 try:
1965 f = open(targetfile, 'wb')
1966 f.write(contents)
1967 f.close()
1968 except:
1969 raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
1970 return 0 # success
1971
1972 def subst_in_file(target, source, env):
1973 if not env.has_key('SUBST_DICT'):
1974 raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
1975 d = dict(env['SUBST_DICT']) # copy it
1976 for (k,v) in d.items():
1977 if callable(v):
1978 d[k] = env.subst(v())
1979 elif SCons.Util.is_String(v):
1980 d[k]=env.subst(v)
1981 else:
1982 raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
1983 for (t,s) in zip(target, source):
1984 return do_subst_in_file(str(t), str(s), d)
1985
1986 def subst_in_file_string(target, source, env):
1987 """This is what gets printed on the console."""
1988 return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
1989 for (t,s) in zip(target, source)])
1990
1991 def subst_emitter(target, source, env):
1992 """Add dependency from substituted SUBST_DICT to target.
1993 Returns original target, source tuple unchanged.
1994 """
1995 d = env['SUBST_DICT'].copy() # copy it
1996 for (k,v) in d.items():
1997 if callable(v):
1998 d[k] = env.subst(v())
1999 elif SCons.Util.is_String(v):
2000 d[k]=env.subst(v)
2001 Depends(target, SCons.Node.Python.Value(d))
2002 return target, source
2003
2004 subst_action=SCons.Action.Action(subst_in_file, subst_in_file_string)
2005 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
2006
2007 TOOL_SUBST(env)
2008
2009 #------------------------------------------------------
2010 # Recipe for 'CHMOD' ACTION
2011
2012 import SCons
2013 from SCons.Script.SConscript import SConsEnvironment
2014 SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
2015 lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
2016
2017 def InstallPerm(env, dest, files, perm):
2018 obj = env.Install(dest, files)
2019 for i in obj:
2020 env.AddPostAction(i, env.Chmod(str(i), perm))
2021
2022 SConsEnvironment.InstallPerm = InstallPerm
2023
2024 # define wrappers
2025 SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
2026 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2027 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
2028
2029 #------------------------------------------------------
2030 # BUILD...
2031
2032 # so that #include <modulename/headername.h> works across all modules...
2033 env.AppendUnique(CPPPATH=['#base/generic'])
2034
2035 if env['DEBUG']:
2036 env.Append(CCFLAGS=['-g'])
2037
2038 if env['GCOV']:
2039 env.Append(
2040 CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
2041 , LIBS=['gcov']
2042 , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
2043 )
2044
2045 if with_ida:
2046 env.Append(WITH_IDA=1)
2047
2048 if with_conopt:
2049 env.Append(WITH_CONOPT=1)
2050
2051 #-------------
2052 # TCL/TK GUI
2053
2054 if with_tcltk:
2055 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
2056 else:
2057 print "Skipping... Tcl/Tk bindings aren't being built:",without_tcltk_reason
2058
2059 #-------------
2060 # PYTHON INTERFACE
2061
2062 if with_python:
2063 env.SConscript(['pygtk/SConscript'],'env')
2064 else:
2065 print "Skipping... Python bindings aren't being built:",without_python_reason
2066
2067 #------------
2068 # BASE/GENERIC SUBDIRECTORIES
2069
2070 libascend_env = env.Copy()
2071
2072 dirs = ['general','utilities','compiler','system','solver','integrator','packages','linear']
2073
2074 srcs = []
2075 for d in dirs:
2076 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
2077 srcs += heresrcs
2078
2079 #-------------
2080 # IMPORTED CODE: LSODE, BLAS, etc
2081
2082 if with_lsode:
2083 srcs += env.SConscript(['lsod/SConscript'],'env')
2084 srcs += env.SConscript(['linpack/SConscript'],'env')
2085 else:
2086 print "Skipping... LSODE won't be built:", without_lsode_reason
2087
2088 if with_local_blas:
2089 srcs += env.SConscript(['blas/SConscript'],'env')
2090 else:
2091 print "Skipping... BLAS won't be built:", without_local_blas_reason
2092
2093 if not with_ida:
2094 print "Skipping... IDA won't be built:", without_ida_reason
2095
2096 if with_mmio:
2097 srcs += env.SConscript(['mmio/SConscript'],'env')
2098 else:
2099 print "Skipping... MMIO export won't be built:", without_mmio_reason
2100 #-------------
2101 # LIBASCEND -- all base/generic functionality
2102
2103 if with_dmalloc:
2104 libascend_env.Append(LIBS=['dmalloc'])
2105
2106 if with_ufsparse:
2107 libascend_env.Append(LIBS=['cxsparse'])
2108
2109 libascend = libascend_env.SharedLibrary('ascend',srcs)
2110
2111 env.Alias('libascend',libascend)
2112
2113 #-------------
2114 # UNIT TESTS (C CODE)
2115
2116 if with_cunit:
2117 testdirs = ['general','solver','utilities','linear']
2118 testsrcs = []
2119 for testdir in testdirs:
2120 path = 'base/generic/'+testdir+'/test/'
2121 env.SConscript([path+'SConscript'],'env')
2122 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
2123
2124 #print "TESTSRCS =",testsrcs
2125
2126 env.SConscript(['test/SConscript'],'env')
2127 env.SConscript(['base/generic/test/SConscript'],'env')
2128
2129 env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
2130
2131 else:
2132 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
2133
2134 #-------------
2135 # EXTERNAL FUNCTIONS
2136
2137 env['extfns']=[]
2138 modeldirs = env.SConscript(['models/SConscript'],'env')
2139
2140 if not with_extfns:
2141 print "Skipping... External modules aren't being built:",without_extfns_reason
2142
2143 env.Alias('extfns',env['extfns'])
2144
2145 #------------------------------------------------------
2146 # CREATE ASCEND-CONFIG scriptlet
2147
2148 ascendconfig = env.SubstInFile('ascend-config.in')
2149
2150 #------------------------------------------------------
2151 # INSTALLATION
2152
2153 if env.get('CAN_INSTALL'):
2154
2155 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE']
2156 install_dirs = [Dir(env.subst("$INSTALL_ROOT$"+d)) for d in dirs]
2157 install_dirs += modeldirs
2158
2159 # TODO: add install options
2160 env.Alias('install',install_dirs)
2161
2162 env.InstallShared(Dir(env.subst("$INSTALL_ROOT$INSTALL_LIB")),libascend)
2163
2164 env.InstallProgram(Dir(env.subst("$INSTALL_ROOT$INSTALL_BIN")),ascendconfig)
2165
2166 #------------------------------------------------------
2167 # WINDOWS INSTALLER
2168 # For the windows installer, please see pygtk/SConscript
2169
2170 if with_installer:
2171 pass
2172 else:
2173 print "Skipping... Windows installer isn't being built:",without_installer_reason
2174
2175 #------------------------------------------------------
2176 # PROJECT FILE for MSVC
2177
2178 env.SConscript(['base/msvc/SConscript'],['env','libascend']);
2179
2180 #------------------------------------------------------
2181 # CREATE the SPEC file for generation of RPM packages
2182
2183 if platform.system()=="Linux":
2184 env.SubstInFile('ascend.spec.in')
2185
2186 #------------------------------------------------------
2187 # CREATE OMF FILE FOR USE WITH SCROLLKEEPER
2188
2189 if with_scrollkeeper:
2190 env.SubstInFile('#/pygtk/gnome/ascend.omf.in')
2191 env.InstallShared(env['INSTALL_ROOT']+env['OMFDIR'],"#/pygtk/gnome/ascend.omf")
2192
2193 #------------------------------------------------------
2194 # DISTRIBUTION TAR FILE
2195
2196 env['DISTTAR_FORMAT']='bz2'
2197 env.Append(
2198 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']
2199 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist','debian']
2200 )
2201
2202 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
2203 , [env.Dir('#')]
2204 )
2205
2206 env.Depends(tar,'ascend.spec')
2207
2208 Alias('dist',tar)
2209
2210 #------------------------------------------------------
2211 # USER'S MANUAL
2212
2213 env.SConscript('doc/SConscript',['env'])
2214
2215 #------------------------------------------------------
2216 # LIBASCEND DOXYGEN DOCUMENTATION
2217
2218 env.SConscript('base/doc/SConscript',['env'])
2219
2220 #------------------------------------------------------
2221 # RPM BUILD
2222
2223 # for RPM builds, 'scons dist' then 'rpmbuild -ta dist/ascend-*.tar.bz2'
2224 # (check * for the version number used to create the tarball)
2225
2226 #------------------------------------------------------
2227 # DEFAULT TARGETS
2228
2229 default_targets =['libascend']
2230 if with_tcltk:
2231 default_targets.append('tcltk')
2232 if with_python:
2233 default_targets.append('pygtk')
2234 if with_installer:
2235 default_targets.append('installer')
2236 if with_extfns:
2237 default_targets.append('extfns')
2238
2239 env.Default(default_targets)
2240
2241 print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
2242
2243 # vim: set syntax=python:

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