/[ascend]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 741 - (hide annotations) (download)
Thu Jul 6 08:54:42 2006 UTC (13 years, 5 months ago) by johnpye
File size: 35577 byte(s)
Fixes for MSVC++
1 johnpye 393 import os, commands, platform, distutils.sysconfig, os.path
2 johnpye 385
3 johnpye 663 version = "0.9.5.94"
4 johnpye 439
5 johnpye 385 #------------------------------------------------------
6     # OPTIONS
7 johnpye 392 #
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 johnpye 385
11     opts = Options(['options.cache', 'config.py'])
12 johnpye 464 #print "PLATFORM = ",platform.system()
13 johnpye 385
14 johnpye 464 if platform.system()=="Windows":
15 johnpye 631 default_tcl_lib = "tcl84"
16     default_tk_lib = "tk84"
17 johnpye 464 default_tktable_lib = "Tktable28"
18 johnpye 499 default_install_assets = "glade/"
19     icon_extension = '.png'
20 johnpye 521 default_tcl = "c:\\Tcl"
21 johnpye 643 if os.environ.get('MSYSTEM')=="MINGW32":
22 johnpye 642 default_tcl_libpath="$TCL\\bin"
23     else:
24     default_tcl_libpath="$TCL\\lib"
25 johnpye 627 default_rel_distdir = '.'
26 johnpye 628 default_absolute_paths = False
27 johnpye 739
28     default_ida_prefix = "c:\\MinGW"
29     if not os.path.exists(default_ida_prefix):
30     default_ida_prefix = None
31    
32 johnpye 673 need_libm = False
33 johnpye 683 python_exe = "c:\\Python24\\python.exe"
34 johnpye 464 else:
35 johnpye 673 default_tcl_lib = "tcl8.4"
36     default_tk_lib = "tk8.4"
37 johnpye 464 default_tktable_lib = "Tktable2.8"
38 johnpye 628 default_install_assets = "$INSTALL_ASCDATA/glade/"
39 johnpye 499 icon_extension = '.svg'
40 johnpye 684 default_tcl = '/usr'
41 johnpye 541 default_tcl_libpath = "$TCL/lib"
42 johnpye 627 default_rel_distdir = '../share/ascend'
43 johnpye 628 default_absolute_paths = True
44 johnpye 673 default_ida_prefix="/usr/local"
45     need_libm = True
46 johnpye 551 if not os.path.isdir(default_tcl):
47     default_tcl = '/usr'
48 johnpye 683 python_exe = distutils.sysconfig.EXEC_PREFIX+"/bin/python"
49 johnpye 551
50 johnpye 562 opts.Add(
51     'CC'
52     ,'C Compiler command'
53     ,None
54     )
55    
56     opts.Add(
57     'CXX'
58     ,'C++ Compiler command'
59     ,None
60     )
61    
62 johnpye 591 opts.Add(BoolOption(
63     'GCOV'
64 johnpye 593 , 'Whether to enable coverage testing in object code'
65     , False
66 johnpye 591 ))
67    
68 johnpye 385 # Package linking option
69 johnpye 386 opts.Add(EnumOption(
70     'PACKAGE_LINKING'
71 johnpye 385 , 'Style of linking for external libraries'
72     , 'DYNAMIC_PACKAGES'
73 johnpye 386 , ['DYNAMIC_PACKAGES', 'STATIC_PACKAGES', 'NO_PACKAGES']
74     ))
75 johnpye 385
76 johnpye 526 opts.Add(BoolOption(
77     'WITH_GCCVISIBILITY'
78     ,"Whether to use GCC Visibility features (only applicable if available)"
79     ,True
80     ))
81    
82 johnpye 392 # You can turn off building of Tcl/Tk interface
83 johnpye 386 opts.Add(BoolOption(
84 johnpye 542 'WITH_TCLTK'
85 johnpye 673 ,"Set to False if you don't want to build the original Tcl/Tk GUI."
86 johnpye 542 , True
87 johnpye 386 ))
88    
89 johnpye 392 # You can turn off the building of the Python interface
90 johnpye 387 opts.Add(BoolOption(
91 johnpye 542 'WITH_PYTHON'
92 johnpye 673 ,"Set to False if you don't want to build Python wrappers."
93 johnpye 542 , True
94 johnpye 387 ))
95    
96 johnpye 392 # Which solvers will we allow?
97     opts.Add(ListOption(
98     'WITH_SOLVERS'
99 johnpye 393 ,"List of the solvers you want to build. The default is the minimum that"
100     +" works."
101 johnpye 673 ,["QRSLV","CMSLV","LSOD","IDA"]
102 johnpye 392 ,['QRSLV','MPS','SLV','OPTSQP'
103     ,'NGSLV','CMSLV','LRSLV','MINOS','CONOPT'
104 johnpye 673 ,'LSOD','OPTSQP',"IDA"
105 johnpye 392 ]
106     ))
107    
108 johnpye 393 # Where will the local copy of the help files be kept?
109     opts.Add(PackageOption(
110     'WITH_LOCAL_HELP'
111     , "Directory containing the local copy of the help files (optional)"
112     , "no"
113     ))
114    
115     # Will bintoken support be enabled?
116     opts.Add(BoolOption(
117     'WITH_BINTOKEN'
118     ,"Enable bintoken support? This means compiling models as C-code before"
119     +" running them, to increase solving speed for large models."
120     ,False
121     ))
122    
123 johnpye 398 # What should the default ASCENDLIBRARY path be?
124     # Note: users can change it by editing their ~/.ascend.ini
125 johnpye 393 opts.Add(
126     'DEFAULT_ASCENDLIBRARY'
127     ,"Set the default value of the ASCENDLIBRARY -- the location where"
128     +" ASCEND will look for models when running ASCEND"
129 johnpye 628 ,"$INSTALL_ASCDATA/models"
130 johnpye 393 )
131    
132 johnpye 398 # Where is SWIG?
133     opts.Add(
134     'SWIG'
135     ,"SWIG location, probably only required for MinGW and MSVC users."
136     +" Enter the location as a Windows-style path, for example"
137 johnpye 404 +" 'c:\\msys\\1.0\\home\\john\\swigwin-1.3.29\\swig.exe'."
138 johnpye 398 )
139    
140 johnpye 400 # Build the test suite?
141     opts.Add(BoolOption(
142 johnpye 593 'WITH_CUNIT'
143 johnpye 665 ,"You can disable CUnit tests with this option. This will basically stop"
144     +" SCons from parsing the SConscript files relating to the 'test'"
145     +" target, which just might make things marginally faster. Probably"
146     +" you can just ignore this option though. SCons will sniff for Cunit"
147     +" but build the tests only if you specify the 'test' target."
148     ,True
149 johnpye 400 ))
150 johnpye 393
151 johnpye 400 # Where are the CUnit includes?
152     opts.Add(PackageOption(
153     'CUNIT_CPPPATH'
154     ,"Where are your CUnit include files?"
155 johnpye 459 ,'off'
156 johnpye 400 ))
157 johnpye 392
158 johnpye 404 # Where are the CUnit libraries?
159 johnpye 400 opts.Add(PackageOption(
160     'CUNIT_LIBPATH'
161 johnpye 404 ,"Where are your CUnit libraries?"
162 johnpye 459 ,'off'
163 johnpye 400 ))
164    
165 johnpye 673 opts.Add(PackageOption(
166     "IDA_PREFIX"
167     ,"Prefix for your IDA install (IDA ./configure --prefix)"
168     ,default_ida_prefix
169     ))
170 johnpye 521
171 johnpye 534 opts.Add(
172 johnpye 673 'IDA_CPPPATH'
173     ,"Where is your ida.h?"
174     ,"$IDA_PREFIX/include"
175     )
176    
177     opts.Add(
178     'IDA_LIBPATH'
179     ,"Where are your SUNDIALS libraries installed?"
180     ,"$IDA_PREFIX/lib"
181     )
182    
183     opts.Add(
184     "IDA_LIB"
185     ,"What libraries to link to for use of IDA (comma-separated). Note that"
186     +" you will need to include the math library in this list (for now)."
187     ,'sundials_ida,sundials_nvecserial,m'
188     )
189    
190     opts.Add(
191     "F2C_LIB"
192     ,"F2C library (eg. g2c, gfortran, f2c)"
193     ,"g2c"
194     )
195    
196     opts.Add(PackageOption(
197     "F2C_LIBPATH"
198     ,"Directory containing F2C library (i.e. g2c, gfortran, f2c, etc.), if not already accessible"
199     ,"off"
200     ))
201    
202     opts.Add(
203 johnpye 521 'TCL'
204     ,'Base of Tcl distribution'
205     ,default_tcl
206 johnpye 534 )
207 johnpye 521
208 johnpye 404 # Where are the Tcl includes?
209 johnpye 534 opts.Add(
210 johnpye 404 'TCL_CPPPATH'
211     ,"Where are your Tcl include files?"
212 johnpye 521 ,"$TCL/include"
213 johnpye 534 )
214 johnpye 404
215     # Where are the Tcl libs?
216 johnpye 534 opts.Add(
217 johnpye 404 'TCL_LIBPATH'
218     ,"Where are your Tcl libraries?"
219 johnpye 541 ,default_tcl_libpath
220 johnpye 534 )
221 johnpye 404
222 johnpye 428 # What is the name of the Tcl lib?
223     opts.Add(
224     'TCL_LIB'
225 johnpye 561 ,"Name of Tcl lib (eg 'tcl' or 'tcl83'), for full path to static library (if STATIC_TCLTK is set)"
226 johnpye 464 ,default_tcl_lib
227 johnpye 428 )
228    
229 johnpye 405 # Where are the Tk includes?
230 johnpye 534 opts.Add(
231 johnpye 405 'TK_CPPPATH'
232     ,"Where are your Tk include files?"
233 johnpye 464 ,'$TCL_CPPPATH'
234 johnpye 534 )
235 johnpye 404
236 johnpye 405 # Where are the Tk libs?
237 johnpye 534 opts.Add(
238 johnpye 405 'TK_LIBPATH'
239     ,"Where are your Tk libraries?"
240 johnpye 464 ,'$TCL_LIBPATH'
241 johnpye 534 )
242 johnpye 405
243 johnpye 428 # What is the name of the Tk lib?
244     opts.Add(
245     'TK_LIB'
246 johnpye 521 ,"Name of Tk lib (eg 'tk' or 'tk83'), or full path to static library"
247 johnpye 464 ,default_tk_lib
248 johnpye 435 )
249    
250 johnpye 460 # Static linking to TkTable
251    
252     opts.Add(BoolOption(
253 johnpye 521 'STATIC_TCLTK'
254 johnpye 554 ,'Set true for static linking for Tcl/Tk and TkTable. EXPERIMENTAL'
255 johnpye 460 ,False
256     ))
257    
258 johnpye 464 opts.Add(
259 johnpye 460 'TKTABLE_LIBPATH'
260     ,'Location of TkTable static library'
261 johnpye 464 ,'$TCL_LIBPATH/Tktable2.8'
262     )
263 johnpye 460
264 johnpye 435 opts.Add(
265 johnpye 460 'TKTABLE_LIB'
266 johnpye 521 ,'Stem name of TkTable (eg tktable2.8, no ".so" or "lib") shared library, or full path of static tktable (/usr/lib/...)'
267 johnpye 464 ,default_tktable_lib
268 johnpye 460 )
269    
270     opts.Add(
271 johnpye 521 'TKTABLE_CPPPATH'
272     ,'Location of TkTable header file'
273     ,'$TCL_CPPPATH'
274     )
275    
276     opts.Add(
277     'X11'
278 johnpye 554 ,'Base X11 directory. Only used when STATIC_TCLTK is turned on. EXPERIMENTAL'
279 johnpye 521 ,'/usr/X11R6'
280     )
281    
282     opts.Add(
283     'X11_LIBPATH'
284 johnpye 554 ,'Location of X11 lib. EXPERIMENTAL'
285 johnpye 521 ,'$X11/lib'
286     )
287    
288     opts.Add(
289     'X11_CPPPATH'
290 johnpye 554 ,'Location of X11 includes. EXPERIMENTAL'
291 johnpye 521 ,'$X11/include'
292     )
293    
294     opts.Add(
295     'X11_LIB'
296 johnpye 554 ,'Name of X11 lib. EXPERIMENTAL'
297 johnpye 521 ,'X11'
298     )
299    
300     opts.Add(
301 johnpye 435 'INSTALL_PREFIX'
302     ,'Root location for installed files'
303 johnpye 449 ,'/usr/local'
304 johnpye 428 )
305    
306 johnpye 435 opts.Add(
307     'INSTALL_BIN'
308     ,'Location to put binaries during installation'
309     ,"$INSTALL_PREFIX/bin"
310     )
311    
312     opts.Add(
313 johnpye 463 'INSTALL_LIB'
314 johnpye 683 ,'Location to put libraries during installation'
315 johnpye 463 ,"$INSTALL_PREFIX/lib"
316     )
317    
318     opts.Add(
319 ben.allan 624 'INSTALL_SHARE'
320 johnpye 628 ,'Common shared-file location on this system'
321     ,"$INSTALL_PREFIX/share"
322 johnpye 435 )
323    
324 johnpye 628
325 johnpye 435 opts.Add(
326 johnpye 628 'INSTALL_ASCDATA'
327     ,"Location of ASCEND shared data (TK, python, models etc)"
328     ,"$INSTALL_SHARE/ascend"
329     )
330    
331     opts.Add(
332 johnpye 435 'INSTALL_INCLUDE'
333     ,'Location to put header files during installation'
334     ,"$INSTALL_PREFIX/include"
335     )
336    
337 johnpye 448 opts.Add(
338 johnpye 455 'PYGTK_ASSETS'
339 johnpye 532 ,'Default location for Glade assets (placed in pygtk/config.py)'
340 johnpye 455 ,default_install_assets
341     )
342    
343 johnpye 508 opts.Add(BoolOption(
344     'DEBUG'
345     ,"Compile source with debugger symbols, eg for use with 'gdb'"
346     ,False
347     ))
348    
349 johnpye 597 opts.Add(BoolOption(
350     'MALLOC_DEBUG'
351     ,"Compile with debugging version of MALLOC. Required for full CUnit testing"
352     ,False
353     ))
354    
355 johnpye 455 opts.Add(
356 johnpye 448 'INSTALL_ROOT'
357     ,'For use by RPM only: location of %{buildroot} during rpmbuild'
358     ,""
359     )
360    
361 johnpye 563 opts.Add(
362     'DISTTAR_NAME'
363     ,"Stem name of the tarball created by 'scons dist'. So for 'ascend-aaa.tar.bz2', set this to 'ascend-aaa'."
364     ,"ascend-"+version
365     )
366    
367 johnpye 656 opts.Add(
368     'RELEASE'
369     ,"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."
370     ,"0"
371     )
372    
373 johnpye 605 opts.Add(BoolOption(
374 johnpye 628 'ABSOLUTE_PATHS'
375 johnpye 605 ,"Whether to use absolute or relative paths in the installed Tcl/Tk interface. If you want to build an RPM, set this to false."
376 johnpye 628 ,default_absolute_paths
377 johnpye 605 ))
378    
379 johnpye 578 opts.Add(
380     'WIN_INSTALLER_NAME'
381     ,"Name of the installer .exe to create under Windows (minus the '.exe')"
382     ,"ascend-"+version
383     )
384    
385 johnpye 594 opts.Add(BoolOption(
386     'WITH_XTERM_COLORS'
387     ,"Set to 0 if you don't want xterm colour codes in the console output"
388     ,True
389     ))
390    
391 johnpye 546 if platform.system()!="Windows":
392     opts.Add(BoolOption(
393     'WITH_GCCVISIBILITY'
394     , 'Whether to use GCC Visibility extensions when building with GCC 4.0'
395     , True
396     ))
397    
398 johnpye 392 # TODO: OTHER OPTIONS?
399     # TODO: flags for optimisation
400 johnpye 393 # TODO: turning on/off bintoken functionality
401 johnpye 427 # TODO: Where will the 'Makefile.bt' file be installed?
402 johnpye 393
403 johnpye 498 # Import the outside environment
404    
405 johnpye 569 if os.environ.get('OSTYPE')=='msys':
406 johnpye 552 env = Environment(
407     ENV=os.environ
408 johnpye 578 , tools=['mingw','lex','yacc','fortran','swig','disttar','nsis']
409 johnpye 552 , toolpath=['scons']
410     )
411 johnpye 529 env['IS_MINGW']=True
412 johnpye 740
413     elif platform.system()=="Windows":
414     #print "ENVIRONMENT =",os.environ
415     print "ENV PATH =",os.environ['PATH']
416    
417     env = Environment(
418     ENV={
419     'PATH':os.environ['PATH']
420     ,'INCLUDE':os.environ['INCLUDE']
421     ,'LIB':os.environ['LIB']
422     ,'MSVS_IGNORE_IDE_PATHS':1
423     }
424     , tools = ['default','lex','yacc','fortran','swig','disttar','nsis']
425     , toolpath = ['scons']
426     )
427     env.Append(CPPDEFINES=['_CRT_SECURE_NO_DEPRECATE'])
428     #env.Append(CCFLAGS=['/Za'])
429     print "INCLUDE = ",env.get('INCLUDE')
430     print "LIB = ",env.get('LIB')
431     print "\nPATH =",env['ENV'].get('PATH')
432    
433 johnpye 498 else:
434 johnpye 552 env = Environment(
435     ENV=os.environ
436 johnpye 740 , tools=['default','lex','yacc','fortran','swig','disttar','nsis']
437 johnpye 552 , toolpath=['scons']
438     )
439 johnpye 498
440 johnpye 740 #if platform.system()=='Windows' and env.has_key('MSVS'):
441     #print "INCLUDE =",env['ENV']['INCLUDE']
442     #print "LIB =",env['ENV']['LIB']
443     #print "PATH =",env['ENV']['PATH']
444     #env.Append(CPPPATH=env['ENV']['INCLUDE'].split(";"))
445     #env.Append(LIBPATH=env['ENV']['LIB'].split(";"))
446 johnpye 498
447 johnpye 385 opts.Update(env)
448     opts.Save('options.cache',env)
449    
450     Help(opts.GenerateHelpText(env))
451    
452 johnpye 551 with_tcltk = env.get('WITH_TCLTK')
453 johnpye 427 without_tcltk_reason = "disabled by options/config.py"
454 johnpye 386
455 johnpye 551 with_python = env.get('WITH_PYTHON')
456 johnpye 427 without_python_reason = "disabled by options/config.py"
457 johnpye 387
458 johnpye 593 with_cunit = env.get('WITH_CUNIT')
459 johnpye 427 without_cunit_reason = "not requested"
460 johnpye 400
461 johnpye 631 if platform.system()=="Windows":
462     with_installer=1
463     else:
464     with_installer=0
465     without_installer_reason = "only possible under Windows"
466    
467 johnpye 673 if 'LSOD' in env['WITH_SOLVERS']:
468     with_lsode=True
469     else:
470     with_lsode=False
471     without_lsode_reason = "not requested (WITH_SOLVERS)"
472    
473     if 'IDA' in env['WITH_SOLVERS']:
474     with_ida=True
475     else:
476     with_ida=False
477     without_ida_reason = "not requested (WITH_SOLVERS)"
478    
479    
480 johnpye 464 #print "SOLVERS:",env['WITH_SOLVERS']
481     #print "WITH_BINTOKEN:",env['WITH_BINTOKEN']
482     #print "DEFAULT_ASCENDLIBRARY:",env['DEFAULT_ASCENDLIBRARY']
483 johnpye 393
484 johnpye 463 can_install = True
485     if platform.system()=='Windows':
486     can_install = False
487    
488     env['CAN_INSTALL']=can_install
489    
490 johnpye 721 env['INSTALL_MODELS']=env['INSTALL_ASCDATA']+"/models/"
491    
492 johnpye 521 print "TCL_CPPPATH =",env['TCL_CPPPATH']
493     print "TCL_LIBPATH =",env['TCL_LIBPATH']
494     print "TCL_LIB =",env['TCL_LIB']
495 johnpye 562 print "CC =",env['CC']
496     print "CXX =",env['CXX']
497 johnpye 673 print "FORTRAN=",env.get('FORTRAN')
498 johnpye 393
499 johnpye 628 print "ABSOLUTE PATHS =",env['ABSOLUTE_PATHS']
500 johnpye 385 #------------------------------------------------------
501 johnpye 398 # SPECIAL CONFIGURATION TESTS
502    
503 johnpye 463 need_fortran = False
504    
505 johnpye 400 #----------------
506     # SWIG
507    
508 johnpye 398 import os,re
509    
510 johnpye 413 def get_swig_version(env):
511 johnpye 403 cmd = env['SWIG']+' -version'
512 johnpye 427 (cin,coutcerr) = os.popen4(cmd)
513 johnpye 403 output = coutcerr.read()
514 johnpye 398
515 johnpye 403 restr = "SWIG\\s+Version\\s+(?P<maj>[0-9]+)\\.(?P<min>[0-9]+)\\.(?P<pat>[0-9]+)\\s*$"
516     expr = re.compile(restr,re.M);
517 johnpye 398 m = expr.search(output);
518     if not m:
519 johnpye 413 return None
520 johnpye 398 maj = int(m.group('maj'))
521     min = int(m.group('min'))
522     pat = int(m.group('pat'))
523 johnpye 413
524     return (maj,min,pat)
525 johnpye 398
526 johnpye 413
527     def CheckSwigVersion(context):
528    
529     try:
530     context.Message("Checking version of SWIG... ")
531     maj,min,pat = get_swig_version(context.env)
532     except:
533     context.Result("Failed to detect version, or failed to run SWIG")
534     return 0;
535    
536 johnpye 478 context.env['SWIGVERSION']=tuple([maj,min,pat])
537    
538 johnpye 398 if maj == 1 and (
539 johnpye 400 min > 3
540     or (min == 3 and pat >= 24)
541 johnpye 398 ):
542     context.Result("ok, %d.%d.%d" % (maj,min,pat))
543     return 1;
544 johnpye 401 else:
545     context.Result("too old, %d.%d.%d" % (maj,min,pat))
546     return 0;
547 johnpye 398
548 johnpye 400 #----------------
549     # General purpose library-and-header test
550    
551 johnpye 404 class KeepContext:
552 johnpye 521 def __init__(self,context,varprefix,static=False):
553 johnpye 404 self.keep = {}
554 johnpye 521 for k in ['LIBS','LIBPATH','CPPPATH','LINKFLAGS']:
555 johnpye 705 #print "Keeping env %s = %s" % (k,context.env.get(k))
556     self.keep[k]=context.env.get(k)
557 johnpye 404
558     if context.env.has_key(varprefix+'_CPPPATH'):
559 johnpye 521 context.env.Append(CPPPATH=[env[varprefix+'_CPPPATH']])
560 johnpye 428 #print "Adding '"+str(cpppath_add)+"' to cpp path"
561    
562 johnpye 521 if static:
563     staticlib=env[varprefix+'_LIB']
564     #print "STATIC LIB = ",staticlib
565     context.env.Append(
566     LINKFLAGS=[staticlib]
567     )
568     else:
569     if context.env.has_key(varprefix+'_LIBPATH'):
570     context.env.Append(LIBPATH=[env[varprefix+'_LIBPATH']])
571     #print "Adding '"+str(libpath_add)+"' to lib path"
572 johnpye 428
573 johnpye 521 if context.env.has_key(varprefix+'_LIB'):
574     context.env.Append(LIBS=[env[varprefix+'_LIB']])
575 johnpye 705 #print "Adding '"+str(env[varprefix+'_LIB'])+"' to libs"
576 johnpye 404
577     def restore(self,context):
578 johnpye 464 #print "RESTORING CONTEXT"
579     #print self.keep
580     #print "..."
581 johnpye 404 for k in self.keep:
582 johnpye 463 if self.keep[k]==None:
583 johnpye 521 if context.env.has_key(k):
584     #print "Clearing "+str(k)
585     del context.env[k];
586 johnpye 463 else:
587 johnpye 705 #print "Restoring %s to '%s'" %(k,self.keep.get(k))
588 johnpye 463 context.env[k]=self.keep[k];
589 johnpye 404
590 johnpye 521 def CheckExtLib(context,libname,text,ext='.c',varprefix=None,static=False):
591 johnpye 400 """This method will check for variables LIBNAME_LIBPATH
592     and LIBNAME_CPPPATH and try to compile and link the
593     file with the provided text, linking with the
594     library libname."""
595    
596 johnpye 521 if static:
597     context.Message( 'Checking for static '+libname+'... ' )
598     else:
599     context.Message( 'Checking for '+libname+'... ' )
600    
601 johnpye 400 if varprefix==None:
602     varprefix = libname.upper()
603    
604 johnpye 705 #print "LIBS is currently:",context.env.get('LIBS')
605 johnpye 521 keep = KeepContext(context,varprefix,static)
606 johnpye 400
607 johnpye 428 if not context.env.has_key(varprefix+'_LIB'):
608 johnpye 463 # if varprefix_LIB were in env, KeepContext would
609     # have appended it already
610 johnpye 705 context.env.Append(LIBS=[libname])
611 johnpye 428
612 johnpye 404 is_ok = context.TryLink(text,ext)
613 johnpye 428
614 johnpye 521 #print "Link success? ",(is_ok != 0)
615 johnpye 400
616 johnpye 405 keep.restore(context)
617 johnpye 400
618 johnpye 428 # print "Restored CPPPATH="+str(context.env['CPPPATH'])
619 johnpye 705 # print "Restored LIBS="+str(context.env['LIBS'])
620 johnpye 428 # print "Restored LIBPATH="+str(context.env['LIBPATH'])
621    
622 johnpye 404 context.Result(is_ok)
623     return is_ok
624    
625     #----------------
626 johnpye 502 # GCC
627    
628     gcc_test_text = """
629     #ifndef __GNUC__
630     # error "Not using GCC"
631     #endif
632    
633     int main(void){
634     return __GNUC__;
635     }
636     """
637    
638     def CheckGcc(context):
639     context.Message("Checking for GCC... ")
640     is_ok = context.TryCompile(gcc_test_text,".c")
641     context.Result(is_ok)
642     return is_ok
643    
644     #----------------
645 johnpye 500 # GCC VISIBILITY feature
646    
647     gccvisibility_test_text = """
648     #if __GNUC__ < 4
649     # error "Require GCC version 4 or newer"
650     #endif
651    
652     __attribute__ ((visibility("default"))) int x;
653    
654     int main(void){
655     extern int x;
656     x = 4;
657     }
658     """
659    
660     def CheckGccVisibility(context):
661     context.Message("Checking for GCC 'visibility' capability... ")
662 johnpye 546 if not context.env.has_key('WITH_GCCVISIBILITY') or not env['WITH_GCCVISIBILITY']:
663     context.Result("disabled")
664     return 0
665 johnpye 500 is_ok = context.TryCompile(gccvisibility_test_text,".c")
666     context.Result(is_ok)
667     return is_ok
668 johnpye 502
669 johnpye 500 #----------------
670 johnpye 502 # YACC
671    
672     yacc_test_text = """
673 johnpye 646 %{
674     #include <stdio.h>
675 johnpye 741
676     /* MSVC++ needs this before it can swallow Bison output */
677     #ifdef _MSC_VER
678     # define __STDC__
679     #endif
680 johnpye 646 %}
681     %token MSG
682 johnpye 502 %start ROOT
683 johnpye 646 %%
684     ROOT:
685     MSG { printf("HELLO"); }
686     ;
687     %%
688 johnpye 502 """
689    
690     def CheckYacc(context):
691 johnpye 644 context.Message("Checking for Yacc ('%s')... " % context.env.get('YACC'))
692 johnpye 502 is_ok = context.TryCompile(yacc_test_text,".y")
693     context.Result(is_ok)
694     return is_ok
695    
696     #----------------
697 johnpye 404 # CUnit test
698    
699 johnpye 400 cunit_test_text = """
700 johnpye 451 #include <CUnit/CUnit.h>
701 johnpye 400 int maxi(int i1, int i2){
702     return (i1 > i2) ? i1 : i2;
703     }
704    
705     void test_maxi(void){
706     CU_ASSERT(maxi(0,2) == 2);
707     CU_ASSERT(maxi(0,-2) == 0);
708     CU_ASSERT(maxi(2,2) == 2);
709    
710     }
711     int main(void){
712     /* CU_initialize_registry() */
713 johnpye 404 return 0;
714 johnpye 400 }
715     """
716    
717     def CheckCUnit(context):
718 johnpye 451 return CheckExtLib(context,'cunit',cunit_test_text)
719 johnpye 400
720 johnpye 404 #----------------
721 johnpye 673 # MATH test
722    
723     math_test_text = """
724 johnpye 705 #ifndef _ALL_SOURCE
725     # define _ALL_SOURCE
726     #endif
727     #ifndef _XOPEN_SOURCE
728     # define _XOPEN_SOURCE
729     #endif
730     #ifndef _XOPEN_SOURCE_EXTENDED
731     # define _XOPEN_SOURCE_EXTENDED 1
732     #endif
733 johnpye 673 #include <math.h>
734     int main(void){
735 johnpye 705 double x = 1.0; double y = 1.0; int i = 1;
736     acosh(x); asinh(x); atanh(x); cbrt(x); expm1(x); erf(x); erfc(x); isnan(x);
737     j0(x); j1(x); jn(i,x); ilogb(x); logb(x); log1p(x); rint(x);
738     y0(x); y1(x); yn(i,x);
739     #ifdef _THREAD_SAFE
740     gamma_r(x,&i);
741     lgamma_r(x,&i);
742     #else
743     gamma(x);
744     lgamma(x);
745     #endif
746     hypot(x,y); nextafter(x,y); remainder(x,y); scalb(x,y);
747 johnpye 673 return 0;
748     }
749     """
750    
751     def CheckMath(context):
752 johnpye 705 context.Message('Checking for IEE math library... ')
753     libsave=context.env.get('LIBS');
754     context.env.AppendUnique(LIBS=['m'])
755     is_ok=context.TryLink(math_test_text,".c")
756     context.Result(is_ok)
757     if not is_ok:
758     context.env['LIBS']=libsave
759     return is_ok
760    
761 johnpye 673 #----------------
762     # IDA test
763    
764     ida_test_text = """
765     #include <ida.h>
766     #include <nvector_serial.h>
767     #include <ida_spgmr.h>
768     int main(){
769     void *ida_mem;
770     ida_mem = IDACreate();
771     }
772     """
773    
774     def CheckIDA(context):
775     context.Message( 'Checking for IDA (SUNDIALS)... ' )
776    
777     # add SUNDIALS subdirectories as well (what a pain)
778     if context.env.get('IDA_CPPPATH'):
779     extra = [context.env['IDA_CPPPATH']+"/ida",context.env['IDA_CPPPATH']+"/sundials"]
780     context.env.Append(CPPPATH=extra)
781    
782     if ',' in context.env.get('IDA_LIB'):
783     context.env['IDA_LIB']=context.env['IDA_LIB'].split(',')
784     #print "IDA_LIB NOW =",context.env['IDA_LIB']
785     else:
786     print "NO COMMA IN IDA_LIB:",context.env['IDA_LIB']
787    
788     keep = KeepContext(context,"IDA")
789    
790     is_ok = context.TryLink(ida_test_text,".c")
791     context.Result(is_ok)
792    
793     keep.restore(context)
794    
795     if is_ok:
796     context.env.Append(IDA_CPPPATH_EXTRA=extra)
797    
798     return is_ok
799    
800     #----------------
801 johnpye 405 # Tcl test
802 johnpye 404
803 johnpye 561 # TCL and TK required version 8.1, 8.2, 8.3, or 8.4:
804     tcltk_minor_newest_acceptable = 4
805     tcltk_major_required = 8
806    
807 johnpye 404 tcl_check_text = r"""
808     #include <tcl.h>
809     #include <stdio.h>
810     int main(void){
811     printf("%s",TCL_PATCH_LEVEL);
812     return 0;
813     }
814     """
815    
816     def CheckTcl(context):
817 johnpye 521 return CheckExtLib(context,'tcl',tcl_check_text,static=env['STATIC_TCLTK'])
818 johnpye 405
819     def CheckTclVersion(context):
820 johnpye 521 keep = KeepContext(context,'TCL',static=env['STATIC_TCLTK'])
821 johnpye 405 context.Message("Checking Tcl version... ")
822     (is_ok,output) = context.TryRun(tcl_check_text,'.c')
823 johnpye 404 keep.restore(context)
824     if not is_ok:
825 johnpye 405 context.Result("failed to run check")
826 johnpye 404 return 0
827 johnpye 405
828 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
829 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
830 johnpye 428 context.Result(output+" (bad version)")
831 johnpye 405 # bad version
832     return 0
833    
834     # good version
835 johnpye 552 context.Result(output+", good")
836 johnpye 404 return 1
837    
838 johnpye 405 #----------------
839 johnpye 463 # Tk test
840 johnpye 405
841     tk_check_text = r"""
842     #include <tk.h>
843     #include <stdio.h>
844     int main(void){
845     printf("%s",TK_PATCH_LEVEL);
846     return 0;
847     }
848     """
849     def CheckTk(context):
850 johnpye 673 return CheckExtLib(context,'tk',tk_check_text,static=env['STATIC_TCLTK'])
851 johnpye 405
852 johnpye 428
853 johnpye 405 def CheckTkVersion(context):
854 johnpye 521 keep = KeepContext(context,'TK',static=context.env['STATIC_TCLTK'])
855 johnpye 405 context.Message("Checking Tk version... ")
856 johnpye 521 #print "LINKFLAGS =",context.env['LINKFLAGS']
857 johnpye 405 (is_ok,output) = context.TryRun(tk_check_text,'.c')
858 johnpye 404 keep.restore(context)
859     if not is_ok:
860     context.Result("failed to run check")
861     return 0
862    
863 wangym 511 major,minor,patch = tuple([int(i) for i in output.split(".")])
864 johnpye 561 if major != tcltk_major_required or minor > tcltk_minor_newest_acceptable:
865 johnpye 404 # bad version
866 johnpye 561 context.Result(output+" (bad version)")
867 johnpye 404 return 0
868 johnpye 400
869 johnpye 404 # good version
870 johnpye 561 context.Result(output+" (good)")
871 johnpye 404 return 1
872 johnpye 485
873     #----------------
874 johnpye 521 # Tktable test
875    
876     tktable_check_text = r"""
877     #include <tkTable.h>
878     #include <stdio.h>
879     int main(void){
880     Table mytable;
881     return 0;
882     }
883     """
884    
885     def CheckTkTable(context):
886     return CheckExtLib(context,'tktable',tktable_check_text,static=env['STATIC_TCLTK'])
887    
888     #---------------
889     # X11 test
890    
891     x11_check_text = r"""
892     #include <X11/Xlib.h>
893     #include <X11/IntrinsicP.h>
894     #include <X11/Intrinsic.h>
895     #include <X11/ObjectP.h>
896     #include <X11/Object.h>
897     int main(void){
898     Object mything;
899     return 0;
900     }
901     """
902    
903     def CheckX11(context):
904     return CheckExtLib(context,'X11',x11_check_text)
905    
906     #----------------
907 johnpye 485 # GCC Version sniffing
908    
909     # TODO FIXME
910    
911     gcc_version4 = False
912    
913 johnpye 398 #------------------------------------------------------
914 johnpye 385 # CONFIGURATION
915    
916     conf = Configure(env
917     , custom_tests = {
918 johnpye 673 'CheckMath' : CheckMath
919     , 'CheckSwigVersion' : CheckSwigVersion
920 johnpye 400 , 'CheckCUnit' : CheckCUnit
921 johnpye 404 , 'CheckTcl' : CheckTcl
922     , 'CheckTclVersion' : CheckTclVersion
923 johnpye 405 , 'CheckTk' : CheckTk
924     , 'CheckTkVersion' : CheckTkVersion
925 johnpye 502 , 'CheckGcc' : CheckGcc
926 johnpye 500 , 'CheckGccVisibility' : CheckGccVisibility
927 johnpye 502 , 'CheckYacc' : CheckYacc
928 johnpye 521 , 'CheckTkTable' : CheckTkTable
929     , 'CheckX11' : CheckX11
930 johnpye 673 , 'CheckIDA' : CheckIDA
931 johnpye 400 # , 'CheckIsNan' : CheckIsNan
932     # , 'CheckCppUnitConfig' : CheckCppUnitConfig
933 johnpye 385 }
934 johnpye 459 # , config_h = "config.h"
935 johnpye 385 )
936    
937 johnpye 740 # stdio -- just to check that compiler is behaving
938 johnpye 398
939 johnpye 740 if not conf.CheckHeader('stdio.h'):
940     print "Did not find 'stdio.h'! Check your compiler configuration."
941     Exit(1)
942    
943 johnpye 385 # Math library
944    
945 johnpye 673 if need_libm:
946     if not conf.CheckMath():
947     print 'Did not find math library, exiting!'
948     Exit(1)
949     #pass
950 johnpye 427
951 johnpye 385 # Where is 'isnan'?
952    
953 johnpye 740 if not conf.CheckFunc('isnan') and not conf.CheckFunc('_isnan'):
954 johnpye 385 print "Didn't find isnan"
955 johnpye 414 # Exit(1)
956 johnpye 385
957 johnpye 500 # GCC visibility
958    
959 johnpye 502 if conf.CheckGcc():
960     conf.env['HAVE_GCC']=True;
961 johnpye 526 if env['WITH_GCCVISIBILITY'] and conf.CheckGccVisibility():
962 johnpye 509 conf.env['HAVE_GCCVISIBILITY']=True;
963     conf.env.Append(CCFLAGS=['-fvisibility=hidden'])
964     conf.env.Append(CPPDEFINES=['HAVE_GCCVISIBILITY'])
965 johnpye 709 conf.env.Append(CCFLAGS=['-Wall'])
966 johnpye 500
967 johnpye 502 # YACC
968    
969 johnpye 506 if not conf.CheckYacc():
970     print "YACC NOT FOUND OR NOT WORKING"
971     else:
972 johnpye 502 conf.env['HAVE_YACC']=True
973    
974     conf.env['HAVE_LEX']=True
975    
976 johnpye 387 # Tcl/Tk
977 johnpye 386
978 johnpye 586 if with_tcltk:
979     if conf.CheckTcl():
980     if conf.CheckTclVersion():
981     if conf.CheckTk():
982     if with_tcltk and conf.CheckTkVersion():
983     if env['STATIC_TCLTK']:
984     if conf.CheckTkTable():
985     pass
986     else:
987     without_tcltk_reason = "TkTable not found"
988     with_tcltk = False
989     else:
990     without_tcltk_reason = "Require Tk version <= 8.4. See 'scons -h'"
991     with_tcltk = False
992 johnpye 521 else:
993 johnpye 586 without_tcltk_reason = "Tk not found."
994 johnpye 551 with_tcltk = False
995 johnpye 428 else:
996 johnpye 586 without_tcltk_reason = "Require Tcl <= 8.4 Tcl."
997 johnpye 551 with_tcltk = False
998 johnpye 586
999 johnpye 428 else:
1000 johnpye 586 without_tcltk_reason = "Tcl not found."
1001 johnpye 551 with_tcltk = False
1002 johnpye 386
1003 johnpye 521 if env['STATIC_TCLTK']:
1004     conf.CheckX11()
1005    
1006 johnpye 395 # Python... obviously we're already running python, so we just need to
1007     # check that we can link to the python library OK:
1008    
1009 johnpye 391 if platform.system()=="Windows":
1010 johnpye 395 python_lib='python24'
1011 johnpye 391 else:
1012 johnpye 395 python_lib='python2.4'
1013 johnpye 391
1014 johnpye 395 # SWIG version
1015    
1016 johnpye 413 if not conf.CheckSwigVersion():
1017     without_python_reason = 'SWIG >= 1.3.24 is required'
1018     with_python = False
1019    
1020 johnpye 400 # CUnit
1021    
1022 johnpye 593 if with_cunit:
1023 johnpye 404 if not conf.CheckCUnit():
1024 johnpye 427 without_cunit_reason = 'CUnit not found'
1025 johnpye 665 with_cunit = False
1026 johnpye 705 #print "CUNIT NOT FOUND, LIBS=",conf.env.get('LIBS')
1027 johnpye 427
1028 johnpye 673 # IDA
1029    
1030     if not with_ida:
1031     without_ida_reason = "Not selected (see config option WITH_SOLVERS)"
1032     elif not conf.CheckIDA():
1033     with_ida = False
1034     without_ida_reason = "IDA not found"
1035    
1036 johnpye 427 # BLAS
1037    
1038 johnpye 459 need_blas=False
1039 johnpye 673
1040     if with_lsode:
1041     need_fortran = True
1042 johnpye 459 need_blas=True
1043 johnpye 673
1044 johnpye 459 if need_blas:
1045     if conf.CheckLib('blas'):
1046     with_local_blas = False
1047     without_local_blas_reason = "Found BLAS installed on system"
1048     else:
1049     with_local_blas = True
1050     need_fortran = True
1051 johnpye 673 else:
1052     with_local_blas= False;
1053     without_local_blas_reason = "BLAS not required"
1054 johnpye 427
1055     # FORTRAN
1056    
1057     if need_fortran:
1058 johnpye 629 conf.env.Tool('fortran')
1059     detect_fortran = conf.env.Detect(['g77','f77','gfortran'])
1060 johnpye 427 if detect_fortran:
1061     # For some reason, g77 doesn't get detected properly on MinGW
1062 johnpye 673 if not env.has_key('F77') and not env.has_key('FORTRAN'):
1063 johnpye 427 conf.env.Replace(F77=detect_fortran)
1064     conf.env.Replace(F77COM='$F77 $F77FLAGS -c -o $TARGET $SOURCE')
1065     conf.env.Replace(F77FLAGS='')
1066 johnpye 428 #print "F77:",conf.env['F77']
1067     #print "F77COM:",conf.env['F77COM']
1068     #print "F77FLAGS:",conf.env['F77FLAGS']
1069 johnpye 427 fortran_builder = Builder(
1070     action='$F77COM'
1071     , suffix='.o'
1072     , src_suffix='.f'
1073     )
1074     conf.env.Append(BUILDERS={'Fortran':fortran_builder})
1075     else:
1076 johnpye 673 with_lsode=False;
1077     without_lsode_reason="FORTRAN-77 required but not found"
1078 johnpye 629
1079 johnpye 464 #else:
1080     # print "FORTRAN not required"
1081 johnpye 400
1082 johnpye 673 # F2C
1083    
1084     if need_fortran:
1085     if platform.system()=="Windows":
1086     conf.env.Append(LIBPATH='c:\mingw\lib')
1087    
1088    
1089 johnpye 385 # TODO: -D_HPUX_SOURCE is needed
1090    
1091     # TODO: check size of void*
1092    
1093 johnpye 393 # TODO: detect if dynamic libraries are possible or not
1094    
1095 johnpye 427 if platform.system()=="Windows" and env.has_key('MSVS'):
1096 johnpye 740 _found_windows_h = conf.CheckHeader('Windows.h')
1097    
1098     if not _found_windows_h:
1099 johnpye 741 print "Could not locate 'Windows.h' in CPPPATH. Check your configuration."
1100 johnpye 740 Exit(1)
1101 johnpye 741
1102 johnpye 534 if with_python and not conf.CheckHeader(['basetsd.h','BaseTsd.h']):
1103 johnpye 427 with_python = 0;
1104     without_python_reason = "Header file 'basetsd.h' not found. Install the MS Platform SDK."
1105    
1106     conf.env.Append(CPPDEFINES=env['PACKAGE_LINKING'])
1107    
1108 johnpye 395 conf.Finish()
1109    
1110     env.Append(PYTHON_LIBPATH=[distutils.sysconfig.PREFIX+"/libs"])
1111     env.Append(PYTHON_LIB=[python_lib])
1112     env.Append(PYTHON_CPPPATH=[distutils.sysconfig.get_python_inc()])
1113    
1114 johnpye 507 #---------------------------------------
1115     # SUBSTITUTION DICTIONARY for .in files
1116    
1117 johnpye 658 release = env.get('RELEASE')
1118     if release=="0.":
1119     release="0"
1120    
1121 johnpye 507 subst_dict = {
1122     '@DEFAULT_ASCENDLIBRARY@':env['DEFAULT_ASCENDLIBRARY']
1123     , '@GLADE_FILE@':'ascend.glade'
1124     , '@HELP_ROOT@':''
1125     , '@ICON_EXTENSION@':icon_extension
1126 johnpye 628 , '@INSTALL_ASCDATA@':env['INSTALL_ASCDATA']
1127 johnpye 507 , '@INSTALL_BIN@':env['INSTALL_BIN']
1128     , '@INSTALL_INCLUDE@':env['INSTALL_INCLUDE']
1129 johnpye 683 , '@INSTALL_LIB@':env['INSTALL_LIB']
1130 johnpye 721 , '@INSTALL_MODELS@':env['INSTALL_MODELS']
1131 johnpye 507 , '@PYGTK_ASSETS@':env['PYGTK_ASSETS']
1132     , '@VERSION@':version
1133 johnpye 658 , '@RELEASE@':release
1134 johnpye 563 , '@DISTTAR_NAME@':env['DISTTAR_NAME']
1135 johnpye 507 , '@WEBHELPROOT@':'http://pye.dyndns.org/ascend/manual/'
1136 johnpye 508 , '@ASC_SHLIBSUFFIX@':env['SHLIBSUFFIX']
1137     , '@ASC_SHLIBPREFIX@':env['SHLIBPREFIX']
1138 johnpye 589 , '@ASC_ENV_TK_DEFAULT@' : '$$ASCENDDIST/tcltk'
1139 johnpye 627 , '@ASC_DISTDIR_REL_BIN@' : default_rel_distdir
1140 johnpye 683 , '@PYTHON@' : python_exe
1141 johnpye 507 }
1142    
1143 johnpye 594 if env.get('WITH_LOCAL_HELP'):
1144 johnpye 507 print "WITH_LOCAL_HELP:",env['WITH_LOCAL_HELP']
1145     subst_dict['@HELP_ROOT@']=env['WITH_LOCAL_HELP']
1146    
1147 johnpye 597 # bool options...
1148 johnpye 673 for k,v in {
1149     'ABSOLUTE_PATHS' : 'ASC_ABSOLUTE_PATHS'
1150     ,'WITH_XTERM_COLORS' : 'ASC_XTERM_COLORS'
1151     ,'MALLOC_DEBUG' : 'MALLOC_DEBUG'
1152 johnpye 605 }.iteritems():
1153 johnpye 597 if env.get(k):
1154 johnpye 673 # subst_dict['@'+v+'@']='1'
1155     subst_dict["/\\* #define "+v+' @'+v+"@ \\*/"]='# define '+v+' 1 '
1156 johnpye 594
1157 johnpye 673 if with_ida:
1158     subst_dict["/\\* #define ASC_WITH_IDA @ASC_WITH_IDA@ \\*/"]='#define ASC_WITH_IDA '
1159    
1160     if with_lsode:
1161     subst_dict["/\\* #define ASC_WITH_LSODE @ASC_WITH_LSODE@ \\*/"]='#define ASC_WITH_LSODE '
1162    
1163 johnpye 507 if with_python:
1164     subst_dict['@ASCXX_USE_PYTHON@']="1"
1165 johnpye 673 env['WITH_PYTHON']=1;
1166 johnpye 507
1167     if env.has_key('HAVE_GCCVISIBILITY'):
1168     subst_dict['@HAVE_GCCVISIBILITY@'] = "1"
1169    
1170     env.Append(SUBST_DICT=subst_dict)
1171    
1172 johnpye 385 #------------------------------------------------------
1173 johnpye 558 # RECIPE: SWIG scanner
1174    
1175     import SCons.Script
1176    
1177     SWIGScanner = SCons.Scanner.ClassicCPP(
1178     "SWIGScan"
1179     , ".i"
1180     , "CPPPATH"
1181     , '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")'
1182     )
1183    
1184     env.Append(SCANNERS=[SWIGScanner])
1185    
1186     #------------------------------------------------------
1187 johnpye 393 # RECIPE: 'SubstInFile', used in pygtk SConscript
1188    
1189     import re
1190 johnpye 395 from SCons.Script import * # the usual scons stuff you get in a SConscript
1191 johnpye 393
1192 johnpye 395 def TOOL_SUBST(env):
1193     """Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
1194     from the source to the target.
1195     The values of SUBST_DICT first have any construction variables expanded
1196     (its keys are not expanded).
1197     If a value of SUBST_DICT is a python callable function, it is called and
1198     the result is expanded as the value.
1199     If there's more than one source and more than one target, each target gets
1200     substituted from the corresponding source.
1201 johnpye 393 """
1202 johnpye 395 env.Append(TOOLS = 'SUBST')
1203     def do_subst_in_file(targetfile, sourcefile, dict):
1204     """Replace all instances of the keys of dict with their values.
1205     For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
1206     then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
1207     """
1208     try:
1209     f = open(sourcefile, 'rb')
1210     contents = f.read()
1211     f.close()
1212     except:
1213     raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
1214     for (k,v) in dict.items():
1215     contents = re.sub(k, v, contents)
1216     try:
1217     f = open(targetfile, 'wb')
1218     f.write(contents)
1219     f.close()
1220     except:
1221     raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
1222     return 0 # success
1223 johnpye 393
1224 johnpye 395 def subst_in_file(target, source, env):
1225     if not env.has_key('SUBST_DICT'):
1226     raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
1227     d = dict(env['SUBST_DICT']) # copy it
1228     for (k,v) in d.items():
1229     if callable(v):
1230     d[k] = env.subst(v())
1231     elif SCons.Util.is_String(v):
1232     d[k]=env.subst(v)
1233     else:
1234     raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
1235     for (t,s) in zip(target, source):
1236     return do_subst_in_file(str(t), str(s), d)
1237 johnpye 393
1238 johnpye 395 def subst_in_file_string(target, source, env):
1239     """This is what gets printed on the console."""
1240     return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
1241     for (t,s) in zip(target, source)])
1242 johnpye 393
1243 johnpye 395 def subst_emitter(target, source, env):
1244     """Add dependency from substituted SUBST_DICT to target.
1245     Returns original target, source tuple unchanged.
1246     """
1247     d = env['SUBST_DICT'].copy() # copy it
1248     for (k,v) in d.items():
1249     if callable(v):
1250     d[k] = env.subst(v())
1251     elif SCons.Util.is_String(v):
1252     d[k]=env.subst(v)
1253     Depends(target, SCons.Node.Python.Value(d))
1254     return target, source
1255 johnpye 393
1256 johnpye 395 subst_action=SCons.Action.Action(subst_in_file, subst_in_file_string)
1257     env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
1258    
1259     TOOL_SUBST(env)
1260    
1261 johnpye 393 #------------------------------------------------------
1262 johnpye 463 # Recipe for 'CHMOD' ACTION
1263 johnpye 439
1264     import SCons
1265     from SCons.Script.SConscript import SConsEnvironment
1266     SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
1267     lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
1268    
1269     def InstallPerm(env, dest, files, perm):
1270     obj = env.Install(dest, files)
1271     for i in obj:
1272     env.AddPostAction(i, env.Chmod(str(i), perm))
1273    
1274     SConsEnvironment.InstallPerm = InstallPerm
1275    
1276     # define wrappers
1277     SConsEnvironment.InstallProgram = lambda env, dest, files: InstallPerm(env, dest, files, 0755)
1278 johnpye 578 SConsEnvironment.InstallHeader = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
1279 johnpye 629 SConsEnvironment.InstallShared = lambda env, dest, files: InstallPerm(env, dest, files, 0644)
1280 johnpye 463
1281 johnpye 439 #------------------------------------------------------
1282 johnpye 463 # BUILD...
1283 johnpye 385
1284 johnpye 463 # so that #include <modulename/headername.h> works across all modules...
1285     env.Append(CPPPATH=['#base/generic'])
1286 johnpye 385
1287 johnpye 508 if env['DEBUG']:
1288     env.Append(CCFLAGS=['-g'])
1289    
1290 johnpye 591 if env['GCOV']:
1291     env.Append(
1292     CPPFLAGS=['-g','-fprofile-arcs','-ftest-coverage']
1293     , LIBS=['gcov']
1294     , LINKFLAGS=['-fprofile-arcs','-ftest-coverage']
1295     )
1296    
1297 johnpye 673 if with_ida:
1298     env.Append(WITH_IDA=1)
1299    
1300 johnpye 463 #-------------
1301     # TCL/TK GUI
1302 johnpye 385
1303 johnpye 551 if with_tcltk:
1304 johnpye 569 env.SConscript(['tcltk/generic/interface/SConscript'],'env')
1305 johnpye 391 else:
1306 johnpye 405 print "Skipping... Tcl/Tk GUI isn't being built:",without_tcltk_reason
1307 johnpye 386
1308 johnpye 463 #-------------
1309     # PYTHON INTERFACE
1310    
1311 johnpye 387 if with_python:
1312 johnpye 532 env.SConscript(['pygtk/SConscript'],'env')
1313 johnpye 391 else:
1314 johnpye 413 print "Skipping... Python GUI isn't being built:",without_python_reason
1315 johnpye 400
1316 johnpye 463 #------------
1317     # BASE/GENERIC SUBDIRECTORIES
1318    
1319 johnpye 673 libascend_env = env.Copy()
1320    
1321 johnpye 463 dirs = ['general','utilities','compiler','solver','packages']
1322    
1323     srcs = []
1324     for d in dirs:
1325 johnpye 673 heresrcs = libascend_env.SConscript('base/generic/'+d+'/SConscript','libascend_env')
1326 johnpye 463 srcs += heresrcs
1327    
1328     #-------------
1329 johnpye 673 # IMPORTED CODE: LSODE, BLAS, etc
1330    
1331     if with_lsode:
1332     srcs += env.SConscript(['lsod/SConscript'],'env')
1333     srcs += env.SConscript(['linpack/SConscript'],'env')
1334     else:
1335     print "Skipping... LSODE won't be built:", without_lsode_reason
1336    
1337     if with_local_blas:
1338     srcs += env.SConscript(['blas/SConscript'],'env')
1339     else:
1340     print "Skipping... BLAS won't be built:", without_local_blas_reason
1341    
1342     if not with_ida:
1343     print "Skipping... IDA won't be built:", without_ida_reason
1344    
1345     #-------------
1346 johnpye 463 # LIBASCEND -- all base/generic functionality
1347    
1348 johnpye 673 libascend = libascend_env.SharedLibrary('ascend',srcs)
1349 johnpye 463
1350 johnpye 673 env.Alias('libascend',libascend)
1351    
1352 johnpye 463 #-------------
1353     # UNIT TESTS
1354    
1355 johnpye 593 if with_cunit:
1356 johnpye 400 testdirs = ['general','solver','utilities']
1357 johnpye 593 testsrcs = []
1358 johnpye 400 for testdir in testdirs:
1359     path = 'base/generic/'+testdir+'/test/'
1360     env.SConscript([path+'SConscript'],'env')
1361 johnpye 593 testsrcs += [i.path for i in env['TESTSRCS_'+testdir.upper()]]
1362    
1363     #print "TESTSRCS =",testsrcs
1364    
1365 johnpye 400 env.SConscript(['test/SConscript'],'env')
1366     env.SConscript(['base/generic/test/SConscript'],'env')
1367 johnpye 593
1368     env.Alias('test',[env.Dir('test'),env.Dir('base/generic/test')])
1369 johnpye 400
1370     else:
1371 johnpye 427 print "Skipping... CUnit tests aren't being built:",without_cunit_reason
1372 johnpye 400
1373 johnpye 463 #------------------------------------------------------
1374 johnpye 683 # CREATE ASCEND-CONFIG scriptlet
1375    
1376     ascendconfig = env.SubstInFile('ascend-config.in')
1377    
1378     #------------------------------------------------------
1379 johnpye 463 # INSTALLATION
1380 johnpye 427
1381 johnpye 552 if env.get('CAN_INSTALL'):
1382 johnpye 463 # the models directory only needs to be processed for installation, no other processing required.
1383     env.SConscript(['models/SConscript'],'env')
1384 johnpye 427
1385 johnpye 721 dirs = ['INSTALL_BIN','INSTALL_ASCDATA','INSTALL_LIB', 'INSTALL_INCLUDE']
1386 johnpye 463 install_dirs = [env['INSTALL_ROOT']+env[d] for d in dirs]
1387 johnpye 449
1388 johnpye 463 # TODO: add install options
1389     env.Alias('install',install_dirs)
1390 johnpye 400
1391 johnpye 629 env.InstallShared(env['INSTALL_ROOT']+env['INSTALL_LIB'],libascend)
1392 johnpye 435
1393 johnpye 683 env.InstallProgram(env['INSTALL_ROOT']+env['INSTALL_BIN'],ascendconfig)
1394    
1395 johnpye 438 #------------------------------------------------------
1396 johnpye 631 # WINDOWS INSTALLER
1397     # For the windows installer, please see pygtk/SConscript
1398    
1399     if with_installer:
1400     pass
1401     else:
1402     print "Skipping... Windows installer isn't being built:",without_installer_reason
1403    
1404     #------------------------------------------------------
1405 johnpye 673 # PROJECT FILE for MSVC
1406    
1407     env.SConscript(['base/msvc/SConscript'],['env','libascend']);
1408    
1409     #------------------------------------------------------
1410 johnpye 438 # CREATE the SPEC file for generation of RPM packages
1411    
1412 johnpye 463 if platform.system()=="Linux":
1413     env.SubstInFile('ascend.spec.in')
1414 johnpye 552
1415     #------------------------------------------------------
1416     # DISTRIBUTION TAR FILE
1417    
1418 johnpye 554 env['DISTTAR_FORMAT']='bz2'
1419 johnpye 556 env.Append(
1420 johnpye 566 DISTTAR_EXCLUDEEXTS=['.o','.os','.so','.a','.dll','.cc','.cache','.pyc','.cvsignore','.dblite','.log','.pl']
1421 johnpye 561 , DISTTAR_EXCLUDEDIRS=['CVS','.svn','.sconf_temp', 'dist']
1422 johnpye 556 )
1423 johnpye 554
1424 johnpye 563 tar = env.DistTar("dist/"+env['DISTTAR_NAME']
1425 johnpye 556 , [env.Dir('#')]
1426 johnpye 554 )
1427    
1428 johnpye 680 env.Depends(tar,'ascend.spec')
1429    
1430 johnpye 554 #------------------------------------------------------
1431     # RPM BUILD
1432    
1433     #if platform.system()=="Linux":
1434     # pass
1435    
1436     #------------------------------------------------------
1437     # DEFAULT TARGETS
1438    
1439 johnpye 673 default_targets =['libascend']
1440 johnpye 629 if with_tcltk:
1441     default_targets.append('tcltk')
1442     if with_python:
1443     default_targets.append('pygtk')
1444 johnpye 631 if with_installer:
1445     default_targets.append('installer')
1446 johnpye 554
1447 johnpye 629 env.Default(default_targets)
1448    
1449     print "Building targets:"," ".join([str(i) for i in BUILD_TARGETS])
1450    
1451 johnpye 705 # vim: set syntax=python:
1452    

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