/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1756 - (hide annotations)
Mon Sep 8 01:45:46 2008 UTC (11 years, 1 month ago) by ksteube
File size: 24758 byte(s)
First version of a wrapper script that sets LD_LIBRARY_PATH and PYTHONPATH

Not yet ready for general use

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

  ViewVC Help
Powered by ViewVC 1.1.26