/[escript]/branches/csiropost2.0/SConstruct
ViewVC logotype

Annotation of /branches/csiropost2.0/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26