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

Annotation of /branches/schroedinger_upto1946/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1811 - (hide annotations)
Thu Sep 25 23:11:13 2008 UTC (10 years, 2 months ago) by ksteube
Original Path: trunk/SConstruct
File size: 26165 byte(s)
Copyright updated in all files

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

  ViewVC Help
Powered by ViewVC 1.1.26