/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2027 - (hide annotations)
Tue Nov 11 02:52:24 2008 UTC (10 years, 11 months ago) by phornby
File size: 27330 byte(s)
Ensure ESCRIPT_EXPORTS is defined only while compiling escript on windows.
A similar comment applies to FINLEY_EXPORTS.

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

  ViewVC Help
Powered by ViewVC 1.1.26