/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26