/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2130 - (hide annotations)
Thu Dec 4 05:56:45 2008 UTC (10 years, 11 months ago) by jfenwick
File size: 28273 byte(s)
Modifications to keep both the mac and linux happy.

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

  ViewVC Help
Powered by ViewVC 1.1.26