/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1785 - (hide annotations)
Thu Sep 11 23:35:42 2008 UTC (10 years ago) by ksteube
File size: 25999 byte(s)
Config variables such as boost_lib_path and netcdf_lib_path are stored in
the wrapper script bin/finleypython so the user gets the proper environment
automatically

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

  ViewVC Help
Powered by ViewVC 1.1.26