/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2026 - (show annotations)
Tue Nov 11 01:56:54 2008 UTC (10 years, 5 months ago) by jfenwick
File size: 27352 byte(s)
I have changed the default scons options for gcc to be much more picky about warnings.
By default warnings will be treated as errors; so a program with warnings won't compile.

If you need to turn this off, usewarnings=no will work.

The previous usepedantic oprtion is no longer turned on by default.

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

  ViewVC Help
Powered by ViewVC 1.1.26