/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2026 - (hide annotations)
Tue Nov 11 01:56:54 2008 UTC (11 years ago) by jfenwick
File size: 27352 byte(s)
I have changed the default scons options for gcc to be much more picky about warnings.
By default warnings will be treated as errors; so a program with warnings won't compile.

If you need to turn this off, usewarnings=no will work.

The previous usepedantic oprtion is no longer turned on by default.

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

  ViewVC Help
Powered by ViewVC 1.1.26