/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1866 - (show annotations)
Thu Oct 9 04:01:06 2008 UTC (11 years, 2 months ago) by ksteube
File size: 26202 byte(s)
Repair to saveVTK similar to revision 1677 (there we got the number of offsets correct
and in this revision we got the number of types correct).
In case of MPI > 1 do not run saveDX tests since saveDX is not MPI parallel.

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

  ViewVC Help
Powered by ViewVC 1.1.26