/[escript]/branches/refine/SConstruct
ViewVC logotype

Annotation of /branches/refine/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2387 - (hide annotations)
Wed Apr 15 05:05:27 2009 UTC (10 years, 1 month ago) by jfenwick
Original Path: trunk/SConstruct
File size: 34631 byte(s)
Changed the figure eps->pdf to use a builder to make hypothetical windows doc building easier.
1 ksteube 1811
2     ########################################################
3 jgs 214 #
4 ksteube 1811 # Copyright (c) 2003-2008 by University of Queensland
5     # Earth Systems Science Computational Center (ESSCC)
6     # http://www.uq.edu.au/esscc
7     #
8     # Primary Business: Queensland, Australia
9     # Licensed under the Open Software License version 3.0
10     # http://www.opensource.org/licenses/osl-3.0.php
11     #
12     ########################################################
13 jgs 455
14 ksteube 1811
15 robwdcock 682 EnsureSConsVersion(0,96,91)
16     EnsurePythonVersion(2,3)
17 jgs 214
18 jfenwick 2299 import sys, os, re, socket, platform, stat
19 ksteube 1705
20 robwdcock 682 # Add our extensions
21 ksteube 1705 if os.path.isdir('scons'): sys.path.append('scons')
22 robwdcock 682 import scons_extensions
23 jgs 192
24 ksteube 1705 # Use /usr/lib64 if available, else /usr/lib
25     usr_lib = '/usr/lib'
26     if os.path.isfile('/usr/lib64/libc.so'): usr_lib = '/usr/lib64'
27 gross 1374
28 ksteube 1705 # The string python2.4 or python2.5
29     python_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
30 gross 806
31 ksteube 1705 # MS Windows support, many thanks to PH
32     IS_WINDOWS_PLATFORM = (os.name== "nt")
33 gross 806
34 ksteube 1705 prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
35 ksteube 1217
36 ksteube 1705 # Read configuration options from file scons/<hostname>_options.py
37     hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])
38     tmp = os.path.join("scons",hostname+"_options.py")
39     options_file = ARGUMENTS.get('options_file', tmp)
40 ksteube 1866 if not os.path.isfile(options_file):
41     options_file = False
42 ksteube 1887 print "Options file not found (expected '%s')" % tmp
43 ksteube 1866 else:
44     print "Options file is", options_file
45 ksteube 1217
46 ksteube 1705 # Load options file and command-line arguments
47 gross 1133 opts = Options(options_file, ARGUMENTS)
48 gross 1149
49 ksteube 1705 ############ Load build options ################################
50 ksteube 1312
51 robwdcock 682 opts.AddOptions(
52     # Where to install esys stuff
53 ksteube 1705 ('prefix', 'where everything will be installed', Dir('#.').abspath),
54     ('incinstall', 'where the esys headers will be installed', os.path.join(Dir('#.').abspath,'include')),
55 ksteube 1756 ('bininstall', 'where the esys binaries will be installed', os.path.join(prefix,'bin')),
56 ksteube 1705 ('libinstall', 'where the esys libraries will be installed', os.path.join(prefix,'lib')),
57     ('pyinstall', 'where the esys python modules will be installed', os.path.join(prefix,'esys')),
58 robwdcock 682 # Compilation options
59 ksteube 1705 BoolOption('dodebug', 'For backwards compatibility', 'no'),
60     BoolOption('usedebug', 'Do you want a debug build?', 'no'),
61     BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),
62     ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),
63 phornby 1930 ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
64 ksteube 1705 # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below
65     ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
66     ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),
67     ('cc_debug', 'C compiler debug flags to use', '-DEFAULT_3'),
68     ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),
69     ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
70     ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
71     ('cc_extra', 'Extra C/C++ flags', ''),
72 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
73 ksteube 1705 ('sys_libs', 'System libraries to link with', []),
74     ('ar_flags', 'Static library archiver flags to use', ''),
75 jfenwick 2292 BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'),
76 jfenwick 2026 BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
77     BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),
78 jfenwick 2273 ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
79 robwdcock 682 # Python
80 ksteube 1705 ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
81     ('python_lib_path', 'Path to Python libs', usr_lib),
82     ('python_libs', 'Python libraries to link with', [python_version]),
83 phornby 1243 ('python_cmd', 'Python command', 'python'),
84 robwdcock 682 # Boost
85 ksteube 1705 ('boost_path', 'Path to Boost includes', '/usr/include'),
86     ('boost_lib_path', 'Path to Boost libs', usr_lib),
87     ('boost_libs', 'Boost libraries to link with', ['boost_python']),
88     # NetCDF
89     BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
90     ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
91     ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
92     ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
93 bcumming 759 # MPI
94 ksteube 1705 BoolOption('useMPI', 'For backwards compatibility', 'no'),
95     BoolOption('usempi', 'Compile parallel version using MPI', 'no'),
96 ksteube 1312 ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
97 ksteube 1705 ('mpi_path', 'Path to MPI includes', '/usr/include'),
98     ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
99     ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
100     ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),
101 jfenwick 2338 ('mpi_flavour','Type of MPI execution environment','none'),
102 ksteube 1705 # ParMETIS
103     BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
104     ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
105     ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
106     ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
107     # PAPI
108     BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),
109     ('papi_path', 'Path to PAPI includes', '/usr/include'),
110     ('papi_lib_path', 'Path to PAPI libs', usr_lib),
111     ('papi_libs', 'PAPI libraries to link with', ['papi']),
112     BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
113     # MKL
114     BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),
115     ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
116     ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
117     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
118     # UMFPACK
119 ksteube 1708 BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
120 ksteube 1705 ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
121     ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
122     ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
123     ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
124 caltinay 2184 # Silo
125     BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),
126     ('silo_path', 'Path to Silo includes', '/usr/include'),
127     ('silo_lib_path', 'Path to Silo libs', usr_lib),
128     ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
129 ksteube 1705 # AMD (used by UMFPACK)
130     ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
131     ('amd_lib_path', 'Path to AMD libs', usr_lib),
132     ('amd_libs', 'AMD libraries to link with', ['amd']),
133     # BLAS (used by UMFPACK)
134     ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
135     ('blas_lib_path', 'Path to BLAS libs', usr_lib),
136 phornby 2012 ('blas_libs', 'BLAS libraries to link with', ['blas']),
137     # An option for specifying the compiler tools set (see windows branch).
138 phornby 2054 ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
139     # finer control over library building, intel aggressive global optimisation
140     # works with dynamic libraries on windows.
141     ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
142     ('share_paso', 'control static or dynamic paso lib', False)
143 robwdcock 682 )
144 phornby 1232
145 ksteube 1705 ############ Specify which compilers to use ####################
146    
147     # intelc uses regular expressions improperly and emits a warning about
148     # failing to find the compilers. This warning can be safely ignored.
149    
150 gross 1133 if IS_WINDOWS_PLATFORM:
151 phornby 2012 env = Environment(options = opts)
152     env = Environment(tools = ['default'] + env['tools_names'],
153     options = opts)
154 robwdcock 682 else:
155 ksteube 1559 if socket.gethostname().split('.')[0] == 'service0':
156 gross 1133 env = Environment(tools = ['default', 'intelc'], options = opts)
157 ksteube 1559 elif os.uname()[4]=='ia64':
158     env = Environment(tools = ['default', 'intelc'], options = opts)
159 gross 1133 if env['CXX'] == 'icpc':
160 ksteube 1705 env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
161 gross 1133 else:
162     env = Environment(tools = ['default'], options = opts)
163     Help(opts.GenerateHelpText(env))
164 phornby 1232
165 ksteube 1705 ############ Fill in compiler options if not set above #########
166 ksteube 1312
167 ksteube 1705 # Backwards compatibility: allow dodebug=yes and useMPI=yes
168     if env['dodebug']: env['usedebug'] = 1
169     if env['useMPI']: env['usempi'] = 1
170 gross 1024
171 ksteube 1705 # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
172     # For both C and C++ you get: cc_flags and either the optim flags or debug flags
173 phornby 1243
174 jfenwick 2130 sysheaderopt = "" # how do we indicate that a header is a system header. Use "" for no action.
175    
176 ksteube 1705 if env["CC"] == "icc":
177     # Intel compilers
178     cc_flags = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
179     cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
180 jfenwick 1796 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
181 ksteube 1705 omp_optim = "-openmp -openmp_report0"
182     omp_debug = "-openmp -openmp_report0"
183     omp_libs = ['guide', 'pthread']
184     pedantic = ""
185 jfenwick 2026 fatalwarning = "" # Switch to turn warnings into errors
186 jfenwick 2130 sysheaderopt = ""
187 ksteube 1705 elif env["CC"] == "gcc":
188     # GNU C on any system
189 gross 2208 cc_flags = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
190 jfenwick 2063 #the long long warning occurs on the Mac
191 ksteube 1705 cc_optim = "-O3"
192 jfenwick 1796 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
193 gross 2300 omp_optim = "-fopenmp"
194     omp_debug = "-fopenmp"
195     omp_libs = ['gomp']
196 ksteube 1705 pedantic = "-pedantic-errors -Wno-long-long"
197 jfenwick 2026 fatalwarning = "-Werror"
198 jfenwick 2130 sysheaderopt = "-isystem "
199 ksteube 1705 elif env["CC"] == "cl":
200     # Microsoft Visual C on Windows
201     cc_flags = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
202     cc_optim = "/O2 /Op /MT /W3"
203     cc_debug = "/Od /RTC1 /MTd /ZI -DBOUNDS_CHECK"
204     omp_optim = ""
205     omp_debug = ""
206     omp_libs = []
207     pedantic = ""
208 jfenwick 2026 fatalwarning = ""
209 jfenwick 2130 sysheaderopt = ""
210 phornby 1930 elif env["CC"] == "icl":
211 phornby 2027 # intel C on Windows, see windows_intelc_options.py for a start
212 phornby 1930 pedantic = ""
213 jfenwick 2026 fatalwarning = ""
214 jfenwick 2130 sysheaderopt = ""
215 phornby 1243
216 jfenwick 2130
217 ksteube 1705 # If not specified in hostname_options.py then set them here
218     if env["cc_flags"] == "-DEFAULT_1": env['cc_flags'] = cc_flags
219     if env["cc_optim"] == "-DEFAULT_2": env['cc_optim'] = cc_optim
220     if env["cc_debug"] == "-DEFAULT_3": env['cc_debug'] = cc_debug
221     if env["omp_optim"] == "-DEFAULT_4": env['omp_optim'] = omp_optim
222     if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
223     if env["omp_libs"] == "-DEFAULT_6": env['omp_libs'] = omp_libs
224 ksteube 1312
225 jfenwick 2273 #set up the autolazy values
226     if env['forcelazy'] != "leave_alone":
227     if env['forcelazy'] == 'on':
228     env.Append(CPPDEFINES='FAUTOLAZYON')
229     else:
230     if env['forcelazy'] == 'off':
231     env.Append(CPPDEFINES='FAUTOLAZYOFF')
232    
233 ksteube 1705 # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
234     if not env["useopenmp"]:
235     env['omp_optim'] = ""
236     env['omp_debug'] = ""
237     env['omp_libs'] = []
238 gross 1160
239 ksteube 1705 if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
240 ksteube 1312
241 ksteube 1705 ############ Copy environment variables into scons env #########
242 gross 1163
243 ksteube 1705 try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
244     except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
245 phornby 1243
246 gross 2363 try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
247     except KeyError: pass
248    
249     try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
250     except KeyError: pass
251    
252     try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
253     except KeyError: pass
254    
255     try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
256     except KeyError: pass
257    
258 ksteube 1705 try: env['ENV']['PATH'] = os.environ['PATH']
259     except KeyError: pass
260 robwdcock 682
261 ksteube 1705 try: env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
262     except KeyError: pass
263 phornby 1244
264 ksteube 1705 try: env['ENV']['C_INCLUDE_PATH'] = os.environ['C_INCLUDE_PATH']
265     except KeyError: pass
266 robwdcock 682
267 ksteube 1705 try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
268     except KeyError: pass
269 robwdcock 682
270 ksteube 1705 try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
271     except KeyError: pass
272 ksteube 1312
273 ksteube 1705 try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
274     except KeyError: pass
275 ksteube 1312
276 ksteube 1705 try: env['ENV']['DISPLAY'] = os.environ['DISPLAY']
277     except KeyError: pass
278 ksteube 1312
279 ksteube 1705 try: env['ENV']['XAUTHORITY'] = os.environ['XAUTHORITY']
280     except KeyError: pass
281 ksteube 1312
282 ksteube 1705 try: env['ENV']['HOME'] = os.environ['HOME']
283     except KeyError: pass
284 ksteube 1312
285 ksteube 1705 # Configure for test suite
286     env.PrependENVPath('PYTHONPATH', prefix)
287     env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
288 ksteube 1312
289 ksteube 1756 env['ENV']['ESCRIPT_ROOT'] = prefix
290    
291 ksteube 1705 ############ Set up paths for Configure() ######################
292 ksteube 817
293 ksteube 1705 # Make a copy of an environment
294     # Use env.Clone if available, but fall back on env.Copy for older version of scons
295     def clone_env(env):
296     if 'Clone' in dir(env): return env.Clone() # scons-0.98
297     else: return env.Copy() # scons-0.96
298 phornby 1246
299 ksteube 1705 # Add cc option -I<Escript>/trunk/include
300     env.Append(CPPPATH = [Dir('include')])
301 phornby 1634
302 ksteube 1705 # Add cc option -L<Escript>/trunk/lib
303 ksteube 1729 env.Append(LIBPATH = [Dir(env['libinstall'])])
304 ksteube 1705
305     if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
306 ksteube 1771 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
307 ksteube 1705
308     if env['usepedantic']: env.Append(CCFLAGS = pedantic)
309    
310     # MS Windows
311     if IS_WINDOWS_PLATFORM:
312 jfenwick 2334 env.AppendENVPath('PATH', [env['boost_lib_path']])
313     env.AppendENVPath('PATH', [env['libinstall']])
314 phornby 2054 if not env['share_esysUtils'] :
315     env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
316     if not env['share_paso'] :
317     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
318 phornby 2040
319 ksteube 1705 if env['usenetcdf']:
320 jfenwick 2334 env.AppendENVPath('PATH', [env['netCDF_lib_path']])
321 ksteube 1705
322     env.Append(ARFLAGS = env['ar_flags'])
323    
324     # Get the global Subversion revision number for getVersion() method
325 robwdcock 682 try:
326 ksteube 1705 global_revision = os.popen("svnversion -n .").read()
327     global_revision = re.sub(":.*", "", global_revision)
328     global_revision = re.sub("[^0-9]", "", global_revision)
329 ksteube 1312 except:
330 ksteube 1705 global_revision="-1"
331     if global_revision == "": global_revision="-2"
332     env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
333 phornby 1634
334 ksteube 1705 ############ numarray (required) ###############################
335 robwdcock 682
336 ksteube 1705 try:
337     from numarray import identity
338     except ImportError:
339     print "Cannot import numarray, you need to set your PYTHONPATH"
340     sys.exit(1)
341 ksteube 1348
342 ksteube 1705 ############ C compiler (required) #############################
343 gross 700
344 ksteube 1705 # Create a Configure() environment for checking existence of required libraries and headers
345     conf = Configure(clone_env(env))
346 gross 700
347 ksteube 1705 # Test that the compiler is working
348     if not conf.CheckFunc('printf'):
349 gross 2284 print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
350     sys.exit(1)
351 gross 806
352 phornby 1789 if conf.CheckFunc('gethostname'):
353     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
354 gross 806
355 ksteube 1705 ############ python libraries (required) #######################
356 gross 806
357 jfenwick 2130
358     if not sysheaderopt =="":
359     conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
360     else:
361     conf.env.AppendUnique(CPPPATH = [env['python_path']])
362    
363 ksteube 1705 conf.env.AppendUnique(LIBPATH = [env['python_lib_path']])
364     conf.env.AppendUnique(LIBS = [env['python_libs']])
365 gross 805
366 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path']) # The wrapper script needs to find these libs
367 jfenwick 2296 conf.env.PrependENVPath('PYTHONPATH', prefix)
368     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
369 ksteube 1785
370 ksteube 1705 if not conf.CheckCHeader('Python.h'):
371     print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])
372     sys.exit(1)
373 gross 2284 if not conf.CheckFunc('Py_Exit'):
374 ksteube 1705 print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
375     sys.exit(1)
376 gross 805
377 ksteube 1705 ############ boost (required) ##################################
378 gross 805
379 jfenwick 2130 if not sysheaderopt =="":
380 jfenwick 2295 # This is required because we can't -isystem /usr/system because it breaks std includes
381     if os.path.normpath(env['boost_path']) =="/usr/include":
382     conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
383     else:
384     conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
385 jfenwick 2130 else:
386     conf.env.AppendUnique(CPPPATH = [env['boost_path']])
387    
388 ksteube 1705 conf.env.AppendUnique(LIBPATH = [env['boost_lib_path']])
389     conf.env.AppendUnique(LIBS = [env['boost_libs']])
390 ksteube 1312
391 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path']) # The wrapper script needs to find these libs
392 jfenwick 2296 #ensure that our path entries remain at the front
393     conf.env.PrependENVPath('PYTHONPATH', prefix)
394     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
395 ksteube 1785
396 ksteube 1705 if not conf.CheckCXXHeader('boost/python.hpp'):
397     print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
398     sys.exit(1)
399 gross 2284
400 ksteube 1705 if not conf.CheckFunc('PyObject_SetAttr'):
401     print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])
402     sys.exit(1)
403 ksteube 1312
404 ksteube 1705 # Commit changes to environment
405     env = conf.Finish()
406 ksteube 1312
407 ksteube 1705 ############ VTK (optional) ####################################
408 ksteube 1312
409 ksteube 1705 if env['usevtk']:
410     try:
411     import vtk
412     env['usevtk'] = 1
413     except ImportError:
414     env['usevtk'] = 0
415 gross 806
416 ksteube 1705 # Add VTK to environment env if it was found
417     if env['usevtk']:
418     env.Append(CPPDEFINES = ['USE_VTK'])
419 gross 805
420 ksteube 1705 ############ NetCDF (optional) #################################
421 gross 805
422 ksteube 1705 conf = Configure(clone_env(env))
423 gross 806
424 ksteube 1705 if env['usenetcdf']:
425     conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
426     conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
427     conf.env.AppendUnique(LIBS = [env['netCDF_libs']])
428 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path']) # The wrapper script needs to find these libs
429 jfenwick 2296 #ensure that our path entries remain at the front
430     conf.env.PrependENVPath('PYTHONPATH', prefix)
431     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
432 gross 806
433 ksteube 1705 if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
434     if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0
435 ksteube 1312
436 ksteube 1705 # Add NetCDF to environment env if it was found
437     if env['usenetcdf']:
438     env = conf.Finish()
439     env.Append(CPPDEFINES = ['USE_NETCDF'])
440     else:
441     conf.Finish()
442 ksteube 1312
443 ksteube 1705 ############ PAPI (optional) ###################################
444    
445     # Start a new configure environment that reflects what we've already found
446     conf = Configure(clone_env(env))
447    
448     if env['usepapi']:
449     conf.env.AppendUnique(CPPPATH = [env['papi_path']])
450     conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
451     conf.env.AppendUnique(LIBS = [env['papi_libs']])
452 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path']) # The wrapper script needs to find these libs
453 jfenwick 2296 #ensure that our path entries remain at the front
454     conf.env.PrependENVPath('PYTHONPATH', prefix)
455     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
456 ksteube 1705
457     if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
458     if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0
459    
460     # Add PAPI to environment env if it was found
461     if env['usepapi']:
462     env = conf.Finish()
463     env.Append(CPPDEFINES = ['BLOCKPAPI'])
464 ksteube 1312 else:
465 ksteube 1705 conf.Finish()
466 ksteube 1312
467 ksteube 1705 ############ MKL (optional) ####################################
468 gross 806
469 ksteube 1705 # Start a new configure environment that reflects what we've already found
470     conf = Configure(clone_env(env))
471 gross 806
472 ksteube 1705 if env['usemkl']:
473     conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
474     conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
475     conf.env.AppendUnique(LIBS = [env['mkl_libs']])
476 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path']) # The wrapper script needs to find these libs
477 jfenwick 2296 #ensure that our path entries remain at the front
478     conf.env.PrependENVPath('PYTHONPATH', prefix)
479     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
480 gross 805
481 ksteube 1705 if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
482 gross 2358 if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
483 phornby 1246
484 ksteube 1705 # Add MKL to environment env if it was found
485     if env['usemkl']:
486     env = conf.Finish()
487     env.Append(CPPDEFINES = ['MKL'])
488     else:
489     conf.Finish()
490 gross 950
491 ksteube 1705 ############ UMFPACK (optional) ################################
492    
493     # Start a new configure environment that reflects what we've already found
494     conf = Configure(clone_env(env))
495    
496     if env['useumfpack']:
497     conf.env.AppendUnique(CPPPATH = [env['ufc_path']])
498     conf.env.AppendUnique(CPPPATH = [env['umf_path']])
499     conf.env.AppendUnique(LIBPATH = [env['umf_lib_path']])
500     conf.env.AppendUnique(LIBS = [env['umf_libs']])
501     conf.env.AppendUnique(CPPPATH = [env['amd_path']])
502     conf.env.AppendUnique(LIBPATH = [env['amd_lib_path']])
503     conf.env.AppendUnique(LIBS = [env['amd_libs']])
504     conf.env.AppendUnique(CPPPATH = [env['blas_path']])
505     conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
506     conf.env.AppendUnique(LIBS = [env['blas_libs']])
507 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path']) # The wrapper script needs to find these libs
508     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path']) # The wrapper script needs to find these libs
509     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path']) # The wrapper script needs to find these libs
510 jfenwick 2296 #ensure that our path entries remain at the front
511     conf.env.PrependENVPath('PYTHONPATH', prefix)
512     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
513 ksteube 1705
514 gross 2284 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
515 gross 2101 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
516 gross 2284 # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
517 ksteube 1705
518     # Add UMFPACK to environment env if it was found
519     if env['useumfpack']:
520     env = conf.Finish()
521     env.Append(CPPDEFINES = ['UMFPACK'])
522 gross 1023 else:
523 ksteube 1705 conf.Finish()
524 gross 1023
525 caltinay 2184 ############ Silo (optional) ###################################
526    
527     if env['usesilo']:
528     conf = Configure(clone_env(env))
529     conf.env.AppendUnique(CPPPATH = [env['silo_path']])
530     conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
531     conf.env.AppendUnique(LIBS = [env['silo_libs']])
532     if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
533     if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
534     conf.Finish()
535    
536     # Add the path to Silo to environment env if it was found.
537     # Note that we do not add the libs since they are only needed for the
538     # escriptreader library and tools.
539     if env['usesilo']:
540     env.AppendUnique(CPPPATH = [env['silo_path']])
541     env.AppendUnique(LIBPATH = [env['silo_lib_path']])
542     env.Append(CPPDEFINES = ['HAVE_SILO'])
543    
544 ksteube 1705 ############ Add the compiler flags ############################
545 ksteube 1459
546 ksteube 1705 # Enable debug by choosing either cc_debug or cc_optim
547     if env['usedebug']:
548     env.Append(CCFLAGS = env['cc_debug'])
549     env.Append(CCFLAGS = env['omp_debug'])
550     else:
551     env.Append(CCFLAGS = env['cc_optim'])
552     env.Append(CCFLAGS = env['omp_optim'])
553 robwdcock 682
554 ksteube 1705 # Always use cc_flags
555     env.Append(CCFLAGS = env['cc_flags'])
556     env.Append(LIBS = [env['omp_libs']])
557 gross 707
558 jfenwick 2232 ############ Add some custom builders ##########################
559    
560     py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
561     env.Append(BUILDERS = {'PyCompile' : py_builder});
562    
563     runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
564     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
565    
566     runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
567     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
568    
569 jfenwick 2387 epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
570     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
571    
572 ksteube 1705 ############ MPI (optional) ####################################
573 gross 2364 if not env['usempi']: env['mpi_flavour']='none'
574 ksteube 1705
575     # Create a modified environment for MPI programs (identical to env if usempi=no)
576     env_mpi = clone_env(env)
577    
578     # Start a new configure environment that reflects what we've already found
579     conf = Configure(clone_env(env_mpi))
580    
581     if env_mpi['usempi']:
582 gross 2366 VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
583 gross 2356 if not env_mpi['mpi_flavour'] in VALID_MPIs:
584 gross 2358 raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
585 ksteube 1705 conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
586     conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
587     conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']])
588 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path']) # The wrapper script needs to find these libs
589 jfenwick 2296 #ensure that our path entries remain at the front
590     conf.env.PrependENVPath('PYTHONPATH', prefix)
591     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
592 ksteube 1705
593     if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0
594 gross 2308 # if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
595 ksteube 1705
596     # Add MPI to environment env_mpi if it was found
597     if env_mpi['usempi']:
598     env_mpi = conf.Finish()
599     env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
600 ksteube 1312 else:
601 ksteube 1705 conf.Finish()
602 ksteube 1312
603 ksteube 1705 env['usempi'] = env_mpi['usempi']
604 ksteube 1312
605 gross 2364
606 ksteube 1705 ############ ParMETIS (optional) ###############################
607 gross 700
608 ksteube 1705 # Start a new configure environment that reflects what we've already found
609     conf = Configure(clone_env(env_mpi))
610 gross 700
611 ksteube 1705 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
612 gross 700
613 ksteube 1705 if env_mpi['useparmetis']:
614     conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
615     conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
616     conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']])
617 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path']) # The wrapper script needs to find these libs
618 jfenwick 2296 #ensure that our path entries remain at the front
619     conf.env.PrependENVPath('PYTHONPATH', prefix)
620     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
621 gross 707
622 ksteube 1705 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
623     if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
624 elspeth 712
625 ksteube 1705 # Add ParMETIS to environment env_mpi if it was found
626     if env_mpi['useparmetis']:
627     env_mpi = conf.Finish()
628     env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])
629     else:
630     conf.Finish()
631 ksteube 1215
632 ksteube 1705 env['useparmetis'] = env_mpi['useparmetis']
633 ksteube 1247
634 jfenwick 2026 ############ Now we switch on Warnings as errors ###############
635    
636     #this needs to be done after configuration because the scons test files have warnings in them
637    
638     if ((fatalwarning != "") and (env['usewarnings'])):
639     env.Append(CCFLAGS = fatalwarning)
640     env_mpi.Append(CCFLAGS = fatalwarning)
641    
642 ksteube 1705 ############ Summarize our environment #########################
643 phornby 1243
644 ksteube 1705 print ""
645     print "Summary of configuration (see ./config.log for information)"
646     print " Using python libraries"
647     print " Using numarray"
648     print " Using boost"
649     if env['usenetcdf']: print " Using NetCDF"
650     else: print " Not using NetCDF"
651     if env['usevtk']: print " Using VTK"
652     else: print " Not using VTK"
653     if env['usemkl']: print " Using MKL"
654     else: print " Not using MKL"
655     if env['useumfpack']: print " Using UMFPACK"
656     else: print " Not using UMFPACK"
657 caltinay 2184 if env['usesilo']: print " Using Silo"
658     else: print " Not using Silo"
659 ksteube 1705 if env['useopenmp']: print " Using OpenMP"
660     else: print " Not using OpenMP"
661 gross 2356 if env['usempi']: print " Using MPI (flavour = %s)"%env['mpi_flavour']
662 ksteube 1705 else: print " Not using MPI"
663     if env['useparmetis']: print " Using ParMETIS"
664     else: print " Not using ParMETIS (requires MPI)"
665     if env['usepapi']: print " Using PAPI"
666     else: print " Not using PAPI"
667     if env['usedebug']: print " Compiling for debug"
668     else: print " Not compiling for debug"
669     print " Installing in", prefix
670 jfenwick 2026 if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
671     else: print " Not treating warnings as errors"
672 ksteube 1705 print ""
673 phornby 1243
674 ksteube 1756 ############ Delete option-dependent files #####################
675    
676 jfenwick 2324 Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
677     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
678     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
679     Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
680     Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
681     if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
682 ksteube 1756
683 phornby 1243
684 ksteube 1756 ############ Build the subdirectories ##########################
685 robwdcock 682
686 jfenwick 2235 from grouptest import *
687    
688     TestGroups=[]
689    
690 phornby 2027 Export(
691     ["env",
692     "env_mpi",
693     "clone_env",
694 jfenwick 2235 "IS_WINDOWS_PLATFORM",
695     "TestGroups"
696 phornby 2027 ]
697     )
698 ksteube 1705
699 robwdcock 682 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
700 caltinay 2184 env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
701 ksteube 1705 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
702     env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
703 phornby 1628 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
704 robwdcock 682 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
705     env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)
706 gross 707 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)
707 matt 863 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
708 gross 898 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
709 matt 863 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
710 ksteube 1756 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
711 artak 2161 env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
712 phornby 1243
713 jfenwick 2235
714 ksteube 1705 ############ Remember what optimizations we used ###############
715 phornby 1243
716 ksteube 1705 remember_list = []
717 phornby 1243
718 ksteube 1705 if env['usedebug']:
719 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
720 ksteube 1705
721     if env['usempi']:
722 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
723 ksteube 1705
724 jfenwick 2302 if env['useopenmp']:
725 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
726 ksteube 1705
727     env.Alias('remember_options', remember_list)
728    
729 jfenwick 2297
730     ############### Record python interpreter version ##############
731    
732     if not IS_WINDOWS_PLATFORM:
733     versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
734 jfenwick 2302 os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
735 jfenwick 2297
736 jfenwick 2302 ############## Populate the buildvars file #####################
737    
738     buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
739     buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
740    
741     # Find the boost version by extracting it from version.hpp
742     boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
743     boostversion='unknown'
744     try:
745     for line in boosthpp:
746     ver=re.match(r'#define BOOST_VERSION (\d+)',line)
747     if ver:
748     boostversion=ver.group(1)
749     except StopIteration:
750     pass
751     buildvars.write("boost="+boostversion+"\n")
752     buildvars.write("svn_revision="+str(global_revision)+"\n")
753     out="usedebug="
754     if env['usedebug']:
755     out+="y"
756     else:
757     out+="n"
758     out+="\nusempi="
759     if env['usempi']:
760     out+="y"
761     else:
762     out+="n"
763     out+="\nuseopenmp="
764     if env['useopenmp']:
765     out+="y"
766     else:
767     out+="n"
768     buildvars.write(out+"\n")
769 jfenwick 2338 buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
770 jfenwick 2302
771     buildvars.close()
772    
773    
774 ksteube 1705 ############ Targets to build and install libraries ############
775    
776     target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
777     env.Alias('target_init', [target_init])
778    
779     # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>
780     env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])
781     env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])
782    
783     env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
784     env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
785    
786     env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
787     env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
788    
789     env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])
790     env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])
791    
792     # Now gather all the above into a couple easy targets: build_all and install_all
793     build_all_list = []
794     build_all_list += ['build_esysUtils']
795     build_all_list += ['build_paso']
796     build_all_list += ['build_escript']
797     build_all_list += ['build_finley']
798 ksteube 1756 if env['usempi']: build_all_list += ['target_pythonMPI_exe']
799 jfenwick 2294 if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
800 caltinay 2184 if env['usesilo']: build_all_list += ['target_escript2silo']
801 ksteube 1705 env.Alias('build_all', build_all_list)
802    
803     install_all_list = []
804     install_all_list += ['target_init']
805     install_all_list += ['install_esysUtils']
806     install_all_list += ['install_paso']
807     install_all_list += ['install_escript']
808     install_all_list += ['install_finley']
809     install_all_list += ['target_install_pyvisi_py']
810     install_all_list += ['target_install_modellib_py']
811     install_all_list += ['target_install_pycad_py']
812 ksteube 1756 if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
813 jfenwick 2294 if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
814 caltinay 2184 if env['usesilo']: install_all_list += ['target_install_escript2silo']
815 ksteube 1705 install_all_list += ['remember_options']
816     env.Alias('install_all', install_all_list)
817    
818     # Default target is install
819     env.Default('install_all')
820    
821     ############ Targets to build and run the test suite ###########
822    
823     env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])
824     env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
825     env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
826     env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
827 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
828 ksteube 1705
829     ############ Targets to build the documentation ################
830    
831 jfenwick 2334 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
832 ksteube 1705
833 jfenwick 2235 if not IS_WINDOWS_PLATFORM:
834     try:
835     utest=open("utest.sh","w")
836 jfenwick 2276 build_platform=os.name #Sometimes Mac python says it is posix
837     if (build_platform=='posix') and platform.system()=="Darwin":
838     build_platform='darwin'
839     utest.write(GroupTest.makeHeader(build_platform))
840 jfenwick 2235 for tests in TestGroups:
841     utest.write(tests.makeString())
842     utest.close()
843 jfenwick 2299 os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
844 jfenwick 2235 print "utest.sh written"
845     except IOError:
846     print "Error attempting to write unittests file."
847     sys.exit(1)
848    

  ViewVC Help
Powered by ViewVC 1.1.26