/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2060 - (hide annotations)
Tue Nov 18 00:18:08 2008 UTC (10 years, 7 months ago) by jfenwick
File size: 27958 byte(s)
Okay, so -isystem on the whole /usr/include directory appears to prevent 
compiling.  I suspect this might be something about changing the 
priority of includes.

Fixed.


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

  ViewVC Help
Powered by ViewVC 1.1.26