/[ascend]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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