/[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 1781 - (hide annotations)
Thu Sep 11 05:03:14 2008 UTC (10 years, 9 months ago) by jfenwick
File size: 24866 byte(s)
Branch commit

Merged changes from trunk version 1695 up to and including version 1779.


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     cc_debug = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"
152     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     cc_debug = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"
161     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 1781 if not conf.CheckFunc('gethostname'):
288     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     if not conf.CheckCHeader('Python.h'):
297     print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])
298     sys.exit(1)
299     if not conf.CheckFunc('Py_Main'):
300     print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
301     sys.exit(1)
302    
303     ############ boost (required) ##################################
304    
305     conf.env.AppendUnique(CPPPATH = [env['boost_path']])
306     conf.env.AppendUnique(LIBPATH = [env['boost_lib_path']])
307     conf.env.AppendUnique(LIBS = [env['boost_libs']])
308    
309     if not conf.CheckCXXHeader('boost/python.hpp'):
310     print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
311     sys.exit(1)
312     if not conf.CheckFunc('PyObject_SetAttr'):
313     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'])
314     sys.exit(1)
315    
316     # Commit changes to environment
317     env = conf.Finish()
318    
319     ############ VTK (optional) ####################################
320    
321     if env['usevtk']:
322     try:
323     import vtk
324     env['usevtk'] = 1
325     except ImportError:
326     env['usevtk'] = 0
327    
328     # Add VTK to environment env if it was found
329     if env['usevtk']:
330     env.Append(CPPDEFINES = ['USE_VTK'])
331    
332     ############ NetCDF (optional) #################################
333    
334     conf = Configure(clone_env(env))
335    
336     if env['usenetcdf']:
337     conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
338     conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
339     conf.env.AppendUnique(LIBS = [env['netCDF_libs']])
340    
341     if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
342     if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0
343    
344     # Add NetCDF to environment env if it was found
345     if env['usenetcdf']:
346     env = conf.Finish()
347     env.Append(CPPDEFINES = ['USE_NETCDF'])
348 matt 863 else:
349 jfenwick 1781 conf.Finish()
350 gross 805
351 jfenwick 1781 ############ PAPI (optional) ###################################
352 gross 805
353 jfenwick 1781 # Start a new configure environment that reflects what we've already found
354     conf = Configure(clone_env(env))
355 gross 805
356 jfenwick 1781 if env['usepapi']:
357     conf.env.AppendUnique(CPPPATH = [env['papi_path']])
358     conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
359     conf.env.AppendUnique(LIBS = [env['papi_libs']])
360    
361     if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
362     if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0
363    
364     # Add PAPI to environment env if it was found
365     if env['usepapi']:
366     env = conf.Finish()
367     env.Append(CPPDEFINES = ['BLOCKPAPI'])
368 gross 806 else:
369 jfenwick 1781 conf.Finish()
370 ksteube 1312
371 jfenwick 1781 ############ MKL (optional) ####################################
372 ksteube 1312
373 jfenwick 1781 # Start a new configure environment that reflects what we've already found
374     conf = Configure(clone_env(env))
375 ksteube 1312
376 jfenwick 1781 if env['usemkl']:
377     conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
378     conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
379     conf.env.AppendUnique(LIBS = [env['mkl_libs']])
380 ksteube 1312
381 jfenwick 1781 if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
382     if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0
383 gross 806
384 jfenwick 1781 # Add MKL to environment env if it was found
385     if env['usemkl']:
386     env = conf.Finish()
387     env.Append(CPPDEFINES = ['MKL'])
388     else:
389     conf.Finish()
390 gross 805
391 jfenwick 1781 ############ UMFPACK (optional) ################################
392 gross 805
393 jfenwick 1781 # Start a new configure environment that reflects what we've already found
394     conf = Configure(clone_env(env))
395 gross 806
396 jfenwick 1781 if env['useumfpack']:
397     conf.env.AppendUnique(CPPPATH = [env['ufc_path']])
398     conf.env.AppendUnique(CPPPATH = [env['umf_path']])
399     conf.env.AppendUnique(LIBPATH = [env['umf_lib_path']])
400     conf.env.AppendUnique(LIBS = [env['umf_libs']])
401     conf.env.AppendUnique(CPPPATH = [env['amd_path']])
402     conf.env.AppendUnique(LIBPATH = [env['amd_lib_path']])
403     conf.env.AppendUnique(LIBS = [env['amd_libs']])
404     conf.env.AppendUnique(CPPPATH = [env['blas_path']])
405     conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
406     conf.env.AppendUnique(LIBS = [env['blas_libs']])
407 gross 806
408 jfenwick 1781 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
409     if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
410 ksteube 1312
411 jfenwick 1781 # Add UMFPACK to environment env if it was found
412     if env['useumfpack']:
413     env = conf.Finish()
414     env.Append(CPPDEFINES = ['UMFPACK'])
415     else:
416     conf.Finish()
417 ksteube 1312
418 jfenwick 1781 ############ Add the compiler flags ############################
419    
420     # Enable debug by choosing either cc_debug or cc_optim
421     if env['usedebug']:
422     env.Append(CCFLAGS = env['cc_debug'])
423     env.Append(CCFLAGS = env['omp_debug'])
424 ksteube 1312 else:
425 jfenwick 1781 env.Append(CCFLAGS = env['cc_optim'])
426     env.Append(CCFLAGS = env['omp_optim'])
427 ksteube 1312
428 jfenwick 1781 # Always use cc_flags
429     env.Append(CCFLAGS = env['cc_flags'])
430     env.Append(LIBS = [env['omp_libs']])
431 gross 806
432 jfenwick 1781 ############ MPI (optional) ####################################
433 gross 806
434 jfenwick 1781 # Create a modified environment for MPI programs (identical to env if usempi=no)
435     env_mpi = clone_env(env)
436 gross 805
437 jfenwick 1781 # Start a new configure environment that reflects what we've already found
438     conf = Configure(clone_env(env_mpi))
439 phornby 1246
440 jfenwick 1781 if env_mpi['usempi']:
441     conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
442     conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
443     conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']])
444 gross 950
445 jfenwick 1781 if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0
446     if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
447    
448     # Add MPI to environment env_mpi if it was found
449     if env_mpi['usempi']:
450     env_mpi = conf.Finish()
451     env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
452 gross 1023 else:
453 jfenwick 1781 conf.Finish()
454 gross 1023
455 jfenwick 1781 env['usempi'] = env_mpi['usempi']
456 ksteube 1459
457 jfenwick 1781 ############ ParMETIS (optional) ###############################
458 robwdcock 682
459 jfenwick 1781 # Start a new configure environment that reflects what we've already found
460     conf = Configure(clone_env(env_mpi))
461 gross 707
462 jfenwick 1781 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
463 ksteube 1312
464 jfenwick 1781 if env_mpi['useparmetis']:
465     conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
466     conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
467     conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']])
468 ksteube 1312
469 jfenwick 1781 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
470     if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
471 gross 700
472 jfenwick 1781 # Add ParMETIS to environment env_mpi if it was found
473     if env_mpi['useparmetis']:
474     env_mpi = conf.Finish()
475     env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])
476     else:
477     conf.Finish()
478 gross 700
479 jfenwick 1781 env['useparmetis'] = env_mpi['useparmetis']
480 gross 700
481 jfenwick 1781 ############ Summarize our environment #########################
482 gross 707
483 jfenwick 1781 print ""
484     print "Summary of configuration (see ./config.log for information)"
485     print " Using python libraries"
486     print " Using numarray"
487     print " Using boost"
488     if env['usenetcdf']: print " Using NetCDF"
489     else: print " Not using NetCDF"
490     if env['usevtk']: print " Using VTK"
491     else: print " Not using VTK"
492     if env['usemkl']: print " Using MKL"
493     else: print " Not using MKL"
494     if env['useumfpack']: print " Using UMFPACK"
495     else: print " Not using UMFPACK"
496     if env['useopenmp']: print " Using OpenMP"
497     else: print " Not using OpenMP"
498     if env['usempi']: print " Using MPI"
499     else: print " Not using MPI"
500     if env['useparmetis']: print " Using ParMETIS"
501     else: print " Not using ParMETIS (requires MPI)"
502     if env['usepapi']: print " Using PAPI"
503     else: print " Not using PAPI"
504     if env['usedebug']: print " Compiling for debug"
505     else: print " Not compiling for debug"
506     print " Installing in", prefix
507     print ""
508 elspeth 712
509 jfenwick 1781 ############ Delete option-dependent files #####################
510 ksteube 1215
511 jfenwick 1781 Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))
512     Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))
513     Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))
514     if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))
515 ksteube 1247
516 jfenwick 1781 ############ Add some custom builders ##########################
517 phornby 1243
518 jfenwick 1781 py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
519     env.Append(BUILDERS = {'PyCompile' : py_builder});
520 phornby 1243
521 jfenwick 1781 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
522     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
523 phornby 1243
524 jfenwick 1781 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
525     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
526 phornby 1243
527 jfenwick 1781 ############ Build the subdirectories ##########################
528 robwdcock 682
529 jfenwick 1781 Export(["env", "env_mpi", "clone_env"])
530 robwdcock 682
531     env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
532 jfenwick 1781 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
533     env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
534 phornby 1628 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
535 robwdcock 682 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
536     env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)
537 gross 707 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)
538 matt 863 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
539 gross 898 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
540 matt 863 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
541 jfenwick 1781 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
542 phornby 1243
543 jfenwick 1781 ############ Remember what optimizations we used ###############
544 phornby 1243
545 jfenwick 1781 remember_list = []
546 phornby 1243
547 jfenwick 1781 if env['usedebug']:
548     remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))
549    
550     if env['usempi']:
551     remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))
552    
553     if env['omp_optim'] != '':
554     remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))
555    
556     env.Alias('remember_options', remember_list)
557    
558     ############ Targets to build and install libraries ############
559    
560     target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
561     env.Alias('target_init', [target_init])
562    
563     # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>
564     env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])
565     env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])
566    
567     env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
568     env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
569    
570     env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
571     env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
572    
573     env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])
574     env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])
575    
576     # Now gather all the above into a couple easy targets: build_all and install_all
577     build_all_list = []
578     build_all_list += ['build_esysUtils']
579     build_all_list += ['build_paso']
580     build_all_list += ['build_escript']
581     build_all_list += ['build_finley']
582     if env['usempi']: build_all_list += ['target_pythonMPI_exe']
583     if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']
584     env.Alias('build_all', build_all_list)
585    
586     install_all_list = []
587     install_all_list += ['target_init']
588     install_all_list += ['install_esysUtils']
589     install_all_list += ['install_paso']
590     install_all_list += ['install_escript']
591     install_all_list += ['install_finley']
592     install_all_list += ['target_install_pyvisi_py']
593     install_all_list += ['target_install_modellib_py']
594     install_all_list += ['target_install_pycad_py']
595     if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
596     if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']
597     install_all_list += ['remember_options']
598     env.Alias('install_all', install_all_list)
599    
600     # Default target is install
601     env.Default('install_all')
602    
603     ############ Targets to build and run the test suite ###########
604    
605     env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])
606     env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
607     env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
608     env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
609    
610     ############ Targets to build the documentation ################
611    
612     env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])
613    

  ViewVC Help
Powered by ViewVC 1.1.26