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

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26