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

Annotation of /branches/DataC_2092/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26