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

Annotation of /branches/dirac/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2132 - (hide annotations)
Fri Dec 5 00:18:06 2008 UTC (10 years, 10 months ago) by jfenwick
Original Path: trunk/SConstruct
File size: 28355 byte(s)
So its not just the Mac that needed -Wno-strict-aliasing


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

  ViewVC Help
Powered by ViewVC 1.1.26