/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1771 - (hide annotations)
Mon Sep 8 22:47:55 2008 UTC (10 years, 2 months ago) by ksteube
File size: 24866 byte(s)
Removed failing test until we fix a bug.
Fixed several compiler warnings.

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 ksteube 1705 import sys, os, re, socket
12    
13 robwdcock 682 # Add our extensions
14 ksteube 1705 if os.path.isdir('scons'): sys.path.append('scons')
15 robwdcock 682 import scons_extensions
16 jgs 192
17 ksteube 1705 # 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 ksteube 1705 # 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 ksteube 1705 # MS Windows support, many thanks to PH
25     IS_WINDOWS_PLATFORM = (os.name== "nt")
26 gross 806
27 ksteube 1705 prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
28 ksteube 1217
29 ksteube 1705 # 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 ksteube 1708 else: print "Options file is", options_file
35 ksteube 1217
36 ksteube 1705 # Load options file and command-line arguments
37 gross 1133 opts = Options(options_file, ARGUMENTS)
38 gross 1149
39 ksteube 1705 ############ Load build options ################################
40 ksteube 1312
41 robwdcock 682 opts.AddOptions(
42     # Where to install esys stuff
43 ksteube 1705 ('prefix', 'where everything will be installed', Dir('#.').abspath),
44     ('incinstall', 'where the esys headers will be installed', os.path.join(Dir('#.').abspath,'include')),
45 ksteube 1756 ('bininstall', 'where the esys binaries will be installed', os.path.join(prefix,'bin')),
46 ksteube 1705 ('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 ksteube 1705 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 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
62 ksteube 1705 ('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 ksteube 1705 ('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 ksteube 1705 ('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 ksteube 1705 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 ksteube 1705 ('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 ksteube 1708 BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
106 ksteube 1705 ('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 ksteube 1705 ############ 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 ksteube 1705 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 ksteube 1705 ############ Fill in compiler options if not set above #########
139 ksteube 1312
140 ksteube 1705 # 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 ksteube 1705 # 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 ksteube 1705 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 ksteube 1705 # 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 ksteube 1705 # 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 ksteube 1705 if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
190 ksteube 1312
191 ksteube 1705 ############ Copy environment variables into scons env #########
192 gross 1163
193 ksteube 1705 try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
194     except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
195 phornby 1243
196 ksteube 1705 try: env['ENV']['PATH'] = os.environ['PATH']
197     except KeyError: pass
198 robwdcock 682
199 ksteube 1705 try: env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
200     except KeyError: pass
201 phornby 1244
202 ksteube 1705 try: env['ENV']['C_INCLUDE_PATH'] = os.environ['C_INCLUDE_PATH']
203     except KeyError: pass
204 robwdcock 682
205 ksteube 1705 try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
206     except KeyError: pass
207 robwdcock 682
208 ksteube 1705 try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
209     except KeyError: pass
210 ksteube 1312
211 ksteube 1705 try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
212     except KeyError: pass
213 ksteube 1312
214 ksteube 1705 try: env['ENV']['DISPLAY'] = os.environ['DISPLAY']
215     except KeyError: pass
216 ksteube 1312
217 ksteube 1705 try: env['ENV']['XAUTHORITY'] = os.environ['XAUTHORITY']
218     except KeyError: pass
219 ksteube 1312
220 ksteube 1705 try: env['ENV']['HOME'] = os.environ['HOME']
221     except KeyError: pass
222 ksteube 1312
223 ksteube 1705 # Configure for test suite
224     env.PrependENVPath('PYTHONPATH', prefix)
225     env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
226 ksteube 1312
227 ksteube 1756 env['ENV']['ESCRIPT_ROOT'] = prefix
228    
229 ksteube 1705 ############ Set up paths for Configure() ######################
230 ksteube 817
231 ksteube 1705 # 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 1246
237 ksteube 1705 # Add cc option -I<Escript>/trunk/include
238     env.Append(CPPPATH = [Dir('include')])
239 phornby 1634
240 ksteube 1705 # Add cc option -L<Escript>/trunk/lib
241 ksteube 1729 env.Append(LIBPATH = [Dir(env['libinstall'])])
242 ksteube 1705
243     env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])
244    
245     if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
246 ksteube 1771 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
247 ksteube 1705
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 ksteube 1705 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 ksteube 1705 global_revision="-1"
266     if global_revision == "": global_revision="-2"
267     env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
268 phornby 1634
269 ksteube 1705 ############ numarray (required) ###############################
270 robwdcock 682
271 ksteube 1705 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 ksteube 1705 ############ C compiler (required) #############################
278 gross 700
279 ksteube 1705 # Create a Configure() environment for checking existence of required libraries and headers
280     conf = Configure(clone_env(env))
281 gross 700
282 ksteube 1705 # 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 ksteube 1705 if not conf.CheckFunc('gethostname'):
288     env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
289 gross 806
290 ksteube 1705 ############ python libraries (required) #######################
291 gross 806
292 ksteube 1705 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 gross 805
296 ksteube 1705 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 gross 805
303 ksteube 1705 ############ boost (required) ##################################
304 gross 805
305 ksteube 1705 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 ksteube 1312
309 ksteube 1705 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 ksteube 1312
316 ksteube 1705 # Commit changes to environment
317     env = conf.Finish()
318 ksteube 1312
319 ksteube 1705 ############ VTK (optional) ####################################
320 ksteube 1312
321 ksteube 1705 if env['usevtk']:
322     try:
323     import vtk
324     env['usevtk'] = 1
325     except ImportError:
326     env['usevtk'] = 0
327 gross 806
328 ksteube 1705 # Add VTK to environment env if it was found
329     if env['usevtk']:
330     env.Append(CPPDEFINES = ['USE_VTK'])
331 gross 805
332 ksteube 1705 ############ NetCDF (optional) #################################
333 gross 805
334 ksteube 1705 conf = Configure(clone_env(env))
335 gross 806
336 ksteube 1705 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 gross 806
341 ksteube 1705 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 ksteube 1312
344 ksteube 1705 # Add NetCDF to environment env if it was found
345     if env['usenetcdf']:
346     env = conf.Finish()
347     env.Append(CPPDEFINES = ['USE_NETCDF'])
348     else:
349     conf.Finish()
350 ksteube 1312
351 ksteube 1705 ############ PAPI (optional) ###################################
352    
353     # Start a new configure environment that reflects what we've already found
354     conf = Configure(clone_env(env))
355    
356     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 ksteube 1312 else:
369 ksteube 1705 conf.Finish()
370 ksteube 1312
371 ksteube 1705 ############ MKL (optional) ####################################
372 gross 806
373 ksteube 1705 # Start a new configure environment that reflects what we've already found
374     conf = Configure(clone_env(env))
375 gross 806
376 ksteube 1705 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 gross 805
381 ksteube 1705 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 phornby 1246
384 ksteube 1705 # 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 950
391 ksteube 1705 ############ UMFPACK (optional) ################################
392    
393     # Start a new configure environment that reflects what we've already found
394     conf = Configure(clone_env(env))
395    
396     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    
408     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    
411     # Add UMFPACK to environment env if it was found
412     if env['useumfpack']:
413     env = conf.Finish()
414     env.Append(CPPDEFINES = ['UMFPACK'])
415 gross 1023 else:
416 ksteube 1705 conf.Finish()
417 gross 1023
418 ksteube 1705 ############ Add the compiler flags ############################
419 ksteube 1459
420 ksteube 1705 # 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     else:
425     env.Append(CCFLAGS = env['cc_optim'])
426     env.Append(CCFLAGS = env['omp_optim'])
427 robwdcock 682
428 ksteube 1705 # Always use cc_flags
429     env.Append(CCFLAGS = env['cc_flags'])
430     env.Append(LIBS = [env['omp_libs']])
431 gross 707
432 ksteube 1705 ############ MPI (optional) ####################################
433    
434     # Create a modified environment for MPI programs (identical to env if usempi=no)
435     env_mpi = clone_env(env)
436    
437     # Start a new configure environment that reflects what we've already found
438     conf = Configure(clone_env(env_mpi))
439    
440     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    
445     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 ksteube 1312 else:
453 ksteube 1705 conf.Finish()
454 ksteube 1312
455 ksteube 1705 env['usempi'] = env_mpi['usempi']
456 ksteube 1312
457 ksteube 1705 ############ ParMETIS (optional) ###############################
458 gross 700
459 ksteube 1705 # Start a new configure environment that reflects what we've already found
460     conf = Configure(clone_env(env_mpi))
461 gross 700
462 ksteube 1705 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
463 gross 700
464 ksteube 1705 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 gross 707
469 ksteube 1705 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 elspeth 712
472 ksteube 1705 # 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 ksteube 1215
479 ksteube 1705 env['useparmetis'] = env_mpi['useparmetis']
480 ksteube 1247
481 ksteube 1705 ############ Summarize our environment #########################
482 phornby 1243
483 ksteube 1705 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 phornby 1243
509 ksteube 1756 ############ Delete option-dependent files #####################
510    
511     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    
516 ksteube 1705 ############ Add some custom builders ##########################
517 phornby 1243
518 ksteube 1705 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 ksteube 1705 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
522     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
523 robwdcock 682
524 ksteube 1705 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
525     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
526 robwdcock 682
527 ksteube 1756 ############ Build the subdirectories ##########################
528 robwdcock 682
529 ksteube 1705 Export(["env", "env_mpi", "clone_env"])
530    
531 robwdcock 682 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
532 ksteube 1705 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 ksteube 1756 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
542 phornby 1243
543 ksteube 1705 ############ Remember what optimizations we used ###############
544 phornby 1243
545 ksteube 1705 remember_list = []
546 phornby 1243
547 ksteube 1705 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 ksteube 1756 if env['usempi']: build_all_list += ['target_pythonMPI_exe']
583     if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']
584 ksteube 1705 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 ksteube 1756 if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
596     if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']
597 ksteube 1705 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