/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1887 - (hide annotations)
Wed Oct 15 03:26:25 2008 UTC (11 years, 1 month ago) by ksteube
File size: 26224 byte(s)
Fixed two typos that stopped the test suite from running.

Also, gcc 4.3.2 issued several warnings not seen before:
ignoring the return value of fscanf and using the wrong format
with printf.

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

  ViewVC Help
Powered by ViewVC 1.1.26