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

Annotation of /branches/arrayview_from_1695_trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1795 - (hide annotations)
Wed Sep 17 00:59:02 2008 UTC (10 years, 9 months ago) by jfenwick
File size: 26000 byte(s)
Branch commit.

Pulling across changes for trunk revisions 1780:1794.



1 jongui 961 # Copyright 2006 by ACcESS MNRF
2 jgs 214 #
3 matt 863 # http://www.access.edu.au
4     # Primary Business: Queensland, Australia
5     # Licensed under the Open Software License version 3.0
6     # http://www.opensource.org/licenses/osl-3.0.php
7 jgs 455
8 robwdcock 682 EnsureSConsVersion(0,96,91)
9     EnsurePythonVersion(2,3)
10 jgs 214
11 jfenwick 1781 import sys, os, re, socket
12    
13 robwdcock 682 # Add our extensions
14 jfenwick 1781 if os.path.isdir('scons'): sys.path.append('scons')
15 robwdcock 682 import scons_extensions
16 jgs 192
17 jfenwick 1781 # Use /usr/lib64 if available, else /usr/lib
18     usr_lib = '/usr/lib'
19     if os.path.isfile('/usr/lib64/libc.so'): usr_lib = '/usr/lib64'
20 gross 1374
21 jfenwick 1781 # The string python2.4 or python2.5
22     python_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
23 gross 806
24 jfenwick 1781 # MS Windows support, many thanks to PH
25     IS_WINDOWS_PLATFORM = (os.name== "nt")
26 gross 806
27 jfenwick 1781 prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
28 ksteube 1217
29 jfenwick 1781 # Read configuration options from file scons/<hostname>_options.py
30     hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])
31     tmp = os.path.join("scons",hostname+"_options.py")
32     options_file = ARGUMENTS.get('options_file', tmp)
33     if not os.path.isfile(options_file): options_file = False
34     else: print "Options file is", options_file
35 ksteube 1217
36 jfenwick 1781 # Load options file and command-line arguments
37 gross 1133 opts = Options(options_file, ARGUMENTS)
38 gross 1149
39 jfenwick 1781 ############ Load build options ################################
40 ksteube 1312
41 robwdcock 682 opts.AddOptions(
42     # Where to install esys stuff
43 jfenwick 1781 ('prefix', 'where everything will be installed', Dir('#.').abspath),
44     ('incinstall', 'where the esys headers will be installed', os.path.join(Dir('#.').abspath,'include')),
45     ('bininstall', 'where the esys binaries will be installed', os.path.join(prefix,'bin')),
46     ('libinstall', 'where the esys libraries will be installed', os.path.join(prefix,'lib')),
47     ('pyinstall', 'where the esys python modules will be installed', os.path.join(prefix,'esys')),
48 robwdcock 682 # Compilation options
49 jfenwick 1781 BoolOption('dodebug', 'For backwards compatibility', 'no'),
50     BoolOption('usedebug', 'Do you want a debug build?', 'no'),
51     BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),
52     ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),
53     # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below
54     ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
55     ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),
56     ('cc_debug', 'C compiler debug flags to use', '-DEFAULT_3'),
57     ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),
58     ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
59     ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
60     ('cc_extra', 'Extra C/C++ flags', ''),
61     ('ld_extra', 'Extra linker flags', ''),
62     ('sys_libs', 'System libraries to link with', []),
63     ('ar_flags', 'Static library archiver flags to use', ''),
64     BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),
65     BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'yes'),
66 robwdcock 682 # Python
67 jfenwick 1781 ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
68     ('python_lib_path', 'Path to Python libs', usr_lib),
69     ('python_libs', 'Python libraries to link with', [python_version]),
70 phornby 1243 ('python_cmd', 'Python command', 'python'),
71 robwdcock 682 # Boost
72 jfenwick 1781 ('boost_path', 'Path to Boost includes', '/usr/include'),
73     ('boost_lib_path', 'Path to Boost libs', usr_lib),
74     ('boost_libs', 'Boost libraries to link with', ['boost_python']),
75     # NetCDF
76     BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
77     ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
78     ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
79     ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
80 bcumming 759 # MPI
81 jfenwick 1781 BoolOption('useMPI', 'For backwards compatibility', 'no'),
82     BoolOption('usempi', 'Compile parallel version using MPI', 'no'),
83 ksteube 1312 ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
84 jfenwick 1781 ('mpi_path', 'Path to MPI includes', '/usr/include'),
85     ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
86     ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
87     ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),
88     # ParMETIS
89     BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
90     ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
91     ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
92     ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
93     # PAPI
94     BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),
95     ('papi_path', 'Path to PAPI includes', '/usr/include'),
96     ('papi_lib_path', 'Path to PAPI libs', usr_lib),
97     ('papi_libs', 'PAPI libraries to link with', ['papi']),
98     BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
99     # MKL
100     BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),
101     ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
102     ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
103     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
104     # UMFPACK
105     BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
106     ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
107     ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
108     ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
109     ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
110     # AMD (used by UMFPACK)
111     ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
112     ('amd_lib_path', 'Path to AMD libs', usr_lib),
113     ('amd_libs', 'AMD libraries to link with', ['amd']),
114     # BLAS (used by UMFPACK)
115     ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
116     ('blas_lib_path', 'Path to BLAS libs', usr_lib),
117     ('blas_libs', 'BLAS libraries to link with', ['blas'])
118 robwdcock 682 )
119 phornby 1232
120 jfenwick 1781 ############ Specify which compilers to use ####################
121    
122     # intelc uses regular expressions improperly and emits a warning about
123     # failing to find the compilers. This warning can be safely ignored.
124    
125 gross 1133 if IS_WINDOWS_PLATFORM:
126     env = Environment(tools = ['default', 'msvc'], options = opts)
127 robwdcock 682 else:
128 ksteube 1559 if socket.gethostname().split('.')[0] == 'service0':
129 gross 1133 env = Environment(tools = ['default', 'intelc'], options = opts)
130 ksteube 1559 elif os.uname()[4]=='ia64':
131     env = Environment(tools = ['default', 'intelc'], options = opts)
132 gross 1133 if env['CXX'] == 'icpc':
133 jfenwick 1781 env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
134 gross 1133 else:
135     env = Environment(tools = ['default'], options = opts)
136     Help(opts.GenerateHelpText(env))
137 phornby 1232
138 jfenwick 1781 ############ Fill in compiler options if not set above #########
139 ksteube 1312
140 jfenwick 1781 # Backwards compatibility: allow dodebug=yes and useMPI=yes
141     if env['dodebug']: env['usedebug'] = 1
142     if env['useMPI']: env['usempi'] = 1
143 gross 1024
144 jfenwick 1781 # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
145     # For both C and C++ you get: cc_flags and either the optim flags or debug flags
146 phornby 1243
147 jfenwick 1781 if env["CC"] == "icc":
148     # Intel compilers
149     cc_flags = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
150     cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
151 jfenwick 1782 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
152 jfenwick 1781 omp_optim = "-openmp -openmp_report0"
153     omp_debug = "-openmp -openmp_report0"
154     omp_libs = ['guide', 'pthread']
155     pedantic = ""
156     elif env["CC"] == "gcc":
157     # GNU C on any system
158     cc_flags = "-fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER"
159     cc_optim = "-O3"
160 jfenwick 1782 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
161 jfenwick 1781 omp_optim = ""
162     omp_debug = ""
163     omp_libs = []
164     pedantic = "-pedantic-errors -Wno-long-long"
165     elif env["CC"] == "cl":
166     # Microsoft Visual C on Windows
167     cc_flags = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
168     cc_optim = "/O2 /Op /MT /W3"
169     cc_debug = "/Od /RTC1 /MTd /ZI -DBOUNDS_CHECK"
170     omp_optim = ""
171     omp_debug = ""
172     omp_libs = []
173     pedantic = ""
174 phornby 1243
175 jfenwick 1781 # If not specified in hostname_options.py then set them here
176     if env["cc_flags"] == "-DEFAULT_1": env['cc_flags'] = cc_flags
177     if env["cc_optim"] == "-DEFAULT_2": env['cc_optim'] = cc_optim
178     if env["cc_debug"] == "-DEFAULT_3": env['cc_debug'] = cc_debug
179     if env["omp_optim"] == "-DEFAULT_4": env['omp_optim'] = omp_optim
180     if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
181     if env["omp_libs"] == "-DEFAULT_6": env['omp_libs'] = omp_libs
182 ksteube 1312
183 jfenwick 1781 # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
184     if not env["useopenmp"]:
185     env['omp_optim'] = ""
186     env['omp_debug'] = ""
187     env['omp_libs'] = []
188 gross 1160
189 jfenwick 1781 if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
190 ksteube 1312
191 jfenwick 1781 ############ Copy environment variables into scons env #########
192 gross 1163
193 jfenwick 1781 try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
194     except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
195 phornby 1243
196 jfenwick 1781 try: env['ENV']['PATH'] = os.environ['PATH']
197     except KeyError: pass
198 robwdcock 682
199 jfenwick 1781 try: env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
200     except KeyError: pass
201 phornby 1244
202 jfenwick 1781 try: env['ENV']['C_INCLUDE_PATH'] = os.environ['C_INCLUDE_PATH']
203     except KeyError: pass
204 robwdcock 682
205 jfenwick 1781 try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
206     except KeyError: pass
207 robwdcock 682
208 jfenwick 1781 try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
209     except KeyError: pass
210 ksteube 1312
211 jfenwick 1781 try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
212     except KeyError: pass
213 ksteube 1312
214 jfenwick 1781 try: env['ENV']['DISPLAY'] = os.environ['DISPLAY']
215     except KeyError: pass
216 ksteube 1312
217 jfenwick 1781 try: env['ENV']['XAUTHORITY'] = os.environ['XAUTHORITY']
218     except KeyError: pass
219 ksteube 1312
220 jfenwick 1781 try: env['ENV']['HOME'] = os.environ['HOME']
221     except KeyError: pass
222 ksteube 1312
223 jfenwick 1781 # Configure for test suite
224     env.PrependENVPath('PYTHONPATH', prefix)
225     env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
226 ksteube 1312
227 jfenwick 1781 env['ENV']['ESCRIPT_ROOT'] = prefix
228 ksteube 817
229 jfenwick 1781 ############ Set up paths for Configure() ######################
230 phornby 1246
231 jfenwick 1781 # Make a copy of an environment
232     # Use env.Clone if available, but fall back on env.Copy for older version of scons
233     def clone_env(env):
234     if 'Clone' in dir(env): return env.Clone() # scons-0.98
235     else: return env.Copy() # scons-0.96
236 phornby 1634
237 jfenwick 1781 # Add cc option -I<Escript>/trunk/include
238     env.Append(CPPPATH = [Dir('include')])
239    
240     # Add cc option -L<Escript>/trunk/lib
241     env.Append(LIBPATH = [Dir(env['libinstall'])])
242    
243     env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])
244    
245     if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
246     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
247    
248     if env['usepedantic']: env.Append(CCFLAGS = pedantic)
249    
250     # MS Windows
251     if IS_WINDOWS_PLATFORM:
252     env.PrependENVPath('PATH', [env['boost_lib_path']])
253     env.PrependENVPath('PATH', [env['libinstall']])
254     if env['usenetcdf']:
255     env.PrependENVPath('PATH', [env['netCDF_lib_path']])
256    
257     env.Append(ARFLAGS = env['ar_flags'])
258    
259     # Get the global Subversion revision number for getVersion() method
260 robwdcock 682 try:
261 jfenwick 1781 global_revision = os.popen("svnversion -n .").read()
262     global_revision = re.sub(":.*", "", global_revision)
263     global_revision = re.sub("[^0-9]", "", global_revision)
264 ksteube 1312 except:
265 jfenwick 1781 global_revision="-1"
266     if global_revision == "": global_revision="-2"
267     env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
268 phornby 1634
269 jfenwick 1781 ############ numarray (required) ###############################
270 robwdcock 682
271 jfenwick 1781 try:
272     from numarray import identity
273     except ImportError:
274     print "Cannot import numarray, you need to set your PYTHONPATH"
275     sys.exit(1)
276 ksteube 1348
277 jfenwick 1781 ############ C compiler (required) #############################
278 gross 700
279 jfenwick 1781 # Create a Configure() environment for checking existence of required libraries and headers
280     conf = Configure(clone_env(env))
281 gross 700
282 jfenwick 1781 # Test that the compiler is working
283     if not conf.CheckFunc('printf'):
284     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
285     sys.exit(1)
286 gross 806
287 jfenwick 1795 if conf.CheckFunc('gethostname'):
288     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
289 gross 806
290 jfenwick 1781 ############ python libraries (required) #######################
291 gross 806
292 jfenwick 1781 conf.env.AppendUnique(CPPPATH = [env['python_path']])
293     conf.env.AppendUnique(LIBPATH = [env['python_lib_path']])
294     conf.env.AppendUnique(LIBS = [env['python_libs']])
295    
296 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path']) # The wrapper script needs to find these libs
297    
298 jfenwick 1781 if not conf.CheckCHeader('Python.h'):
299     print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])
300     sys.exit(1)
301     if not conf.CheckFunc('Py_Main'):
302     print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
303     sys.exit(1)
304    
305     ############ boost (required) ##################################
306    
307     conf.env.AppendUnique(CPPPATH = [env['boost_path']])
308     conf.env.AppendUnique(LIBPATH = [env['boost_lib_path']])
309     conf.env.AppendUnique(LIBS = [env['boost_libs']])
310    
311 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path']) # The wrapper script needs to find these libs
312    
313 jfenwick 1781 if not conf.CheckCXXHeader('boost/python.hpp'):
314     print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
315     sys.exit(1)
316     if not conf.CheckFunc('PyObject_SetAttr'):
317     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'])
318     sys.exit(1)
319    
320     # Commit changes to environment
321     env = conf.Finish()
322    
323     ############ VTK (optional) ####################################
324    
325     if env['usevtk']:
326     try:
327     import vtk
328     env['usevtk'] = 1
329     except ImportError:
330     env['usevtk'] = 0
331    
332     # Add VTK to environment env if it was found
333     if env['usevtk']:
334     env.Append(CPPDEFINES = ['USE_VTK'])
335    
336     ############ NetCDF (optional) #################################
337    
338     conf = Configure(clone_env(env))
339    
340     if env['usenetcdf']:
341     conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
342     conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
343     conf.env.AppendUnique(LIBS = [env['netCDF_libs']])
344 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path']) # The wrapper script needs to find these libs
345 jfenwick 1781
346     if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
347     if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0
348    
349     # Add NetCDF to environment env if it was found
350     if env['usenetcdf']:
351     env = conf.Finish()
352     env.Append(CPPDEFINES = ['USE_NETCDF'])
353 matt 863 else:
354 jfenwick 1781 conf.Finish()
355 gross 805
356 jfenwick 1781 ############ PAPI (optional) ###################################
357 gross 805
358 jfenwick 1781 # Start a new configure environment that reflects what we've already found
359     conf = Configure(clone_env(env))
360 gross 805
361 jfenwick 1781 if env['usepapi']:
362     conf.env.AppendUnique(CPPPATH = [env['papi_path']])
363     conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
364     conf.env.AppendUnique(LIBS = [env['papi_libs']])
365 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path']) # The wrapper script needs to find these libs
366 jfenwick 1781
367     if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
368     if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0
369    
370     # Add PAPI to environment env if it was found
371     if env['usepapi']:
372     env = conf.Finish()
373     env.Append(CPPDEFINES = ['BLOCKPAPI'])
374 gross 806 else:
375 jfenwick 1781 conf.Finish()
376 ksteube 1312
377 jfenwick 1781 ############ MKL (optional) ####################################
378 ksteube 1312
379 jfenwick 1781 # Start a new configure environment that reflects what we've already found
380     conf = Configure(clone_env(env))
381 ksteube 1312
382 jfenwick 1781 if env['usemkl']:
383     conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
384     conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
385     conf.env.AppendUnique(LIBS = [env['mkl_libs']])
386 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path']) # The wrapper script needs to find these libs
387 ksteube 1312
388 jfenwick 1781 if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
389     if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0
390 gross 806
391 jfenwick 1781 # Add MKL to environment env if it was found
392     if env['usemkl']:
393     env = conf.Finish()
394     env.Append(CPPDEFINES = ['MKL'])
395     else:
396     conf.Finish()
397 gross 805
398 jfenwick 1781 ############ UMFPACK (optional) ################################
399 gross 805
400 jfenwick 1781 # Start a new configure environment that reflects what we've already found
401     conf = Configure(clone_env(env))
402 gross 806
403 jfenwick 1781 if env['useumfpack']:
404     conf.env.AppendUnique(CPPPATH = [env['ufc_path']])
405     conf.env.AppendUnique(CPPPATH = [env['umf_path']])
406     conf.env.AppendUnique(LIBPATH = [env['umf_lib_path']])
407     conf.env.AppendUnique(LIBS = [env['umf_libs']])
408     conf.env.AppendUnique(CPPPATH = [env['amd_path']])
409     conf.env.AppendUnique(LIBPATH = [env['amd_lib_path']])
410     conf.env.AppendUnique(LIBS = [env['amd_libs']])
411     conf.env.AppendUnique(CPPPATH = [env['blas_path']])
412     conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
413     conf.env.AppendUnique(LIBS = [env['blas_libs']])
414 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path']) # The wrapper script needs to find these libs
415     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path']) # The wrapper script needs to find these libs
416     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path']) # The wrapper script needs to find these libs
417 gross 806
418 jfenwick 1781 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
419     if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
420 ksteube 1312
421 jfenwick 1781 # Add UMFPACK to environment env if it was found
422     if env['useumfpack']:
423     env = conf.Finish()
424     env.Append(CPPDEFINES = ['UMFPACK'])
425     else:
426     conf.Finish()
427 ksteube 1312
428 jfenwick 1781 ############ Add the compiler flags ############################
429    
430     # Enable debug by choosing either cc_debug or cc_optim
431     if env['usedebug']:
432     env.Append(CCFLAGS = env['cc_debug'])
433     env.Append(CCFLAGS = env['omp_debug'])
434 ksteube 1312 else:
435 jfenwick 1781 env.Append(CCFLAGS = env['cc_optim'])
436     env.Append(CCFLAGS = env['omp_optim'])
437 ksteube 1312
438 jfenwick 1781 # Always use cc_flags
439     env.Append(CCFLAGS = env['cc_flags'])
440     env.Append(LIBS = [env['omp_libs']])
441 gross 806
442 jfenwick 1781 ############ MPI (optional) ####################################
443 gross 806
444 jfenwick 1781 # Create a modified environment for MPI programs (identical to env if usempi=no)
445     env_mpi = clone_env(env)
446 gross 805
447 jfenwick 1781 # Start a new configure environment that reflects what we've already found
448     conf = Configure(clone_env(env_mpi))
449 phornby 1246
450 jfenwick 1781 if env_mpi['usempi']:
451     conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
452     conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
453     conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']])
454 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path']) # The wrapper script needs to find these libs
455 gross 950
456 jfenwick 1781 if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0
457     if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
458    
459     # Add MPI to environment env_mpi if it was found
460     if env_mpi['usempi']:
461     env_mpi = conf.Finish()
462     env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
463 gross 1023 else:
464 jfenwick 1781 conf.Finish()
465 gross 1023
466 jfenwick 1781 env['usempi'] = env_mpi['usempi']
467 ksteube 1459
468 jfenwick 1781 ############ ParMETIS (optional) ###############################
469 robwdcock 682
470 jfenwick 1781 # Start a new configure environment that reflects what we've already found
471     conf = Configure(clone_env(env_mpi))
472 gross 707
473 jfenwick 1781 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
474 ksteube 1312
475 jfenwick 1781 if env_mpi['useparmetis']:
476     conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
477     conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
478     conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']])
479 jfenwick 1795 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path']) # The wrapper script needs to find these libs
480 ksteube 1312
481 jfenwick 1781 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
482     if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
483 gross 700
484 jfenwick 1781 # Add ParMETIS to environment env_mpi if it was found
485     if env_mpi['useparmetis']:
486     env_mpi = conf.Finish()
487     env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])
488     else:
489     conf.Finish()
490 gross 700
491 jfenwick 1781 env['useparmetis'] = env_mpi['useparmetis']
492 gross 700
493 jfenwick 1781 ############ Summarize our environment #########################
494 gross 707
495 jfenwick 1781 print ""
496     print "Summary of configuration (see ./config.log for information)"
497     print " Using python libraries"
498     print " Using numarray"
499     print " Using boost"
500     if env['usenetcdf']: print " Using NetCDF"
501     else: print " Not using NetCDF"
502     if env['usevtk']: print " Using VTK"
503     else: print " Not using VTK"
504     if env['usemkl']: print " Using MKL"
505     else: print " Not using MKL"
506     if env['useumfpack']: print " Using UMFPACK"
507     else: print " Not using UMFPACK"
508     if env['useopenmp']: print " Using OpenMP"
509     else: print " Not using OpenMP"
510     if env['usempi']: print " Using MPI"
511     else: print " Not using MPI"
512     if env['useparmetis']: print " Using ParMETIS"
513     else: print " Not using ParMETIS (requires MPI)"
514     if env['usepapi']: print " Using PAPI"
515     else: print " Not using PAPI"
516     if env['usedebug']: print " Compiling for debug"
517     else: print " Not compiling for debug"
518     print " Installing in", prefix
519     print ""
520 elspeth 712
521 jfenwick 1781 ############ Delete option-dependent files #####################
522 ksteube 1215
523 jfenwick 1781 Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))
524     Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))
525     Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))
526     if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))
527 ksteube 1247
528 jfenwick 1781 ############ Add some custom builders ##########################
529 phornby 1243
530 jfenwick 1781 py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
531     env.Append(BUILDERS = {'PyCompile' : py_builder});
532 phornby 1243
533 jfenwick 1781 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
534     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
535 phornby 1243
536 jfenwick 1781 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
537     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
538 phornby 1243
539 jfenwick 1781 ############ Build the subdirectories ##########################
540 robwdcock 682
541 jfenwick 1781 Export(["env", "env_mpi", "clone_env"])
542 robwdcock 682
543     env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
544 jfenwick 1781 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
545     env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
546 phornby 1628 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
547 robwdcock 682 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
548     env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)
549 gross 707 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)
550 matt 863 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
551 gross 898 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
552 matt 863 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
553 jfenwick 1781 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
554 phornby 1243
555 jfenwick 1781 ############ Remember what optimizations we used ###############
556 phornby 1243
557 jfenwick 1781 remember_list = []
558 phornby 1243
559 jfenwick 1781 if env['usedebug']:
560     remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))
561    
562     if env['usempi']:
563     remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))
564    
565     if env['omp_optim'] != '':
566     remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))
567    
568     env.Alias('remember_options', remember_list)
569    
570     ############ Targets to build and install libraries ############
571    
572     target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
573     env.Alias('target_init', [target_init])
574    
575     # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>
576     env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])
577     env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])
578    
579     env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
580     env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
581    
582     env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
583     env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
584    
585     env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])
586     env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])
587    
588     # Now gather all the above into a couple easy targets: build_all and install_all
589     build_all_list = []
590     build_all_list += ['build_esysUtils']
591     build_all_list += ['build_paso']
592     build_all_list += ['build_escript']
593     build_all_list += ['build_finley']
594     if env['usempi']: build_all_list += ['target_pythonMPI_exe']
595     if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']
596     env.Alias('build_all', build_all_list)
597    
598     install_all_list = []
599     install_all_list += ['target_init']
600     install_all_list += ['install_esysUtils']
601     install_all_list += ['install_paso']
602     install_all_list += ['install_escript']
603     install_all_list += ['install_finley']
604     install_all_list += ['target_install_pyvisi_py']
605     install_all_list += ['target_install_modellib_py']
606     install_all_list += ['target_install_pycad_py']
607     if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
608     if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']
609     install_all_list += ['remember_options']
610     env.Alias('install_all', install_all_list)
611    
612     # Default target is install
613     env.Default('install_all')
614    
615     ############ Targets to build and run the test suite ###########
616    
617     env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])
618     env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
619     env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
620     env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
621    
622     ############ Targets to build the documentation ################
623    
624     env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])
625    

  ViewVC Help
Powered by ViewVC 1.1.26