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

Annotation of /branches/csiropost2.0/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26