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

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2334 - (hide annotations)
Thu Mar 26 03:05:33 2009 UTC (10 years, 6 months ago) by jfenwick
Original Path: trunk/SConstruct
File size: 33807 byte(s)
Getting install guide to build.

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 jfenwick 2299 import sys, os, re, socket, platform, stat
19 ksteube 1705
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 jfenwick 2292 BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'),
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 jfenwick 2273 ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
79 robwdcock 682 # Python
80 ksteube 1705 ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
81     ('python_lib_path', 'Path to Python libs', usr_lib),
82     ('python_libs', 'Python libraries to link with', [python_version]),
83 phornby 1243 ('python_cmd', 'Python command', 'python'),
84 robwdcock 682 # Boost
85 ksteube 1705 ('boost_path', 'Path to Boost includes', '/usr/include'),
86     ('boost_lib_path', 'Path to Boost libs', usr_lib),
87     ('boost_libs', 'Boost libraries to link with', ['boost_python']),
88     # NetCDF
89     BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
90     ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
91     ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
92     ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
93 bcumming 759 # MPI
94 ksteube 1705 BoolOption('useMPI', 'For backwards compatibility', 'no'),
95     BoolOption('usempi', 'Compile parallel version using MPI', 'no'),
96 ksteube 1312 ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
97 ksteube 1705 ('mpi_path', 'Path to MPI includes', '/usr/include'),
98     ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
99     ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
100     ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),
101     # ParMETIS
102     BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
103     ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
104     ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
105     ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
106     # PAPI
107     BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),
108     ('papi_path', 'Path to PAPI includes', '/usr/include'),
109     ('papi_lib_path', 'Path to PAPI libs', usr_lib),
110     ('papi_libs', 'PAPI libraries to link with', ['papi']),
111     BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
112     # MKL
113     BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),
114     ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
115     ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
116     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
117     # UMFPACK
118 ksteube 1708 BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
119 ksteube 1705 ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
120     ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
121     ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
122     ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
123 caltinay 2184 # Silo
124     BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),
125     ('silo_path', 'Path to Silo includes', '/usr/include'),
126     ('silo_lib_path', 'Path to Silo libs', usr_lib),
127     ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
128 ksteube 1705 # AMD (used by UMFPACK)
129     ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
130     ('amd_lib_path', 'Path to AMD libs', usr_lib),
131     ('amd_libs', 'AMD libraries to link with', ['amd']),
132     # BLAS (used by UMFPACK)
133     ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
134     ('blas_lib_path', 'Path to BLAS libs', usr_lib),
135 phornby 2012 ('blas_libs', 'BLAS libraries to link with', ['blas']),
136     # An option for specifying the compiler tools set (see windows branch).
137 phornby 2054 ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
138     # finer control over library building, intel aggressive global optimisation
139     # works with dynamic libraries on windows.
140     ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
141     ('share_paso', 'control static or dynamic paso lib', False)
142 robwdcock 682 )
143 phornby 1232
144 ksteube 1705 ############ Specify which compilers to use ####################
145    
146     # intelc uses regular expressions improperly and emits a warning about
147     # failing to find the compilers. This warning can be safely ignored.
148    
149 gross 1133 if IS_WINDOWS_PLATFORM:
150 phornby 2012 env = Environment(options = opts)
151     env = Environment(tools = ['default'] + env['tools_names'],
152     options = opts)
153 robwdcock 682 else:
154 ksteube 1559 if socket.gethostname().split('.')[0] == 'service0':
155 gross 1133 env = Environment(tools = ['default', 'intelc'], options = opts)
156 ksteube 1559 elif os.uname()[4]=='ia64':
157     env = Environment(tools = ['default', 'intelc'], options = opts)
158 gross 1133 if env['CXX'] == 'icpc':
159 ksteube 1705 env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
160 gross 1133 else:
161     env = Environment(tools = ['default'], options = opts)
162     Help(opts.GenerateHelpText(env))
163 phornby 1232
164 ksteube 1705 ############ Fill in compiler options if not set above #########
165 ksteube 1312
166 ksteube 1705 # Backwards compatibility: allow dodebug=yes and useMPI=yes
167     if env['dodebug']: env['usedebug'] = 1
168     if env['useMPI']: env['usempi'] = 1
169 gross 1024
170 ksteube 1705 # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
171     # For both C and C++ you get: cc_flags and either the optim flags or debug flags
172 phornby 1243
173 jfenwick 2130 sysheaderopt = "" # how do we indicate that a header is a system header. Use "" for no action.
174    
175 ksteube 1705 if env["CC"] == "icc":
176     # Intel compilers
177     cc_flags = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
178     cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
179 jfenwick 1796 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
180 ksteube 1705 omp_optim = "-openmp -openmp_report0"
181     omp_debug = "-openmp -openmp_report0"
182     omp_libs = ['guide', 'pthread']
183     pedantic = ""
184 jfenwick 2026 fatalwarning = "" # Switch to turn warnings into errors
185 jfenwick 2130 sysheaderopt = ""
186 ksteube 1705 elif env["CC"] == "gcc":
187     # GNU C on any system
188 gross 2208 cc_flags = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
189 jfenwick 2063 #the long long warning occurs on the Mac
190 ksteube 1705 cc_optim = "-O3"
191 jfenwick 1796 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
192 gross 2300 omp_optim = "-fopenmp"
193     omp_debug = "-fopenmp"
194     omp_libs = ['gomp']
195 ksteube 1705 pedantic = "-pedantic-errors -Wno-long-long"
196 jfenwick 2026 fatalwarning = "-Werror"
197 jfenwick 2130 sysheaderopt = "-isystem "
198 ksteube 1705 elif env["CC"] == "cl":
199     # Microsoft Visual C on Windows
200     cc_flags = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
201     cc_optim = "/O2 /Op /MT /W3"
202     cc_debug = "/Od /RTC1 /MTd /ZI -DBOUNDS_CHECK"
203     omp_optim = ""
204     omp_debug = ""
205     omp_libs = []
206     pedantic = ""
207 jfenwick 2026 fatalwarning = ""
208 jfenwick 2130 sysheaderopt = ""
209 phornby 1930 elif env["CC"] == "icl":
210 phornby 2027 # intel C on Windows, see windows_intelc_options.py for a start
211 phornby 1930 pedantic = ""
212 jfenwick 2026 fatalwarning = ""
213 jfenwick 2130 sysheaderopt = ""
214 phornby 1243
215 jfenwick 2130
216 ksteube 1705 # If not specified in hostname_options.py then set them here
217     if env["cc_flags"] == "-DEFAULT_1": env['cc_flags'] = cc_flags
218     if env["cc_optim"] == "-DEFAULT_2": env['cc_optim'] = cc_optim
219     if env["cc_debug"] == "-DEFAULT_3": env['cc_debug'] = cc_debug
220     if env["omp_optim"] == "-DEFAULT_4": env['omp_optim'] = omp_optim
221     if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
222     if env["omp_libs"] == "-DEFAULT_6": env['omp_libs'] = omp_libs
223 ksteube 1312
224 jfenwick 2273 #set up the autolazy values
225     if env['forcelazy'] != "leave_alone":
226     if env['forcelazy'] == 'on':
227     env.Append(CPPDEFINES='FAUTOLAZYON')
228     else:
229     if env['forcelazy'] == 'off':
230     env.Append(CPPDEFINES='FAUTOLAZYOFF')
231    
232 ksteube 1705 # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
233     if not env["useopenmp"]:
234     env['omp_optim'] = ""
235     env['omp_debug'] = ""
236     env['omp_libs'] = []
237 gross 1160
238 ksteube 1705 if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
239 ksteube 1312
240 ksteube 1705 ############ Copy environment variables into scons env #########
241 gross 1163
242 ksteube 1705 try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
243     except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
244 phornby 1243
245 ksteube 1705 try: env['ENV']['PATH'] = os.environ['PATH']
246     except KeyError: pass
247 robwdcock 682
248 ksteube 1705 try: env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
249     except KeyError: pass
250 phornby 1244
251 ksteube 1705 try: env['ENV']['C_INCLUDE_PATH'] = os.environ['C_INCLUDE_PATH']
252     except KeyError: pass
253 robwdcock 682
254 ksteube 1705 try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
255     except KeyError: pass
256 robwdcock 682
257 ksteube 1705 try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
258     except KeyError: pass
259 ksteube 1312
260 ksteube 1705 try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
261     except KeyError: pass
262 ksteube 1312
263 ksteube 1705 try: env['ENV']['DISPLAY'] = os.environ['DISPLAY']
264     except KeyError: pass
265 ksteube 1312
266 ksteube 1705 try: env['ENV']['XAUTHORITY'] = os.environ['XAUTHORITY']
267     except KeyError: pass
268 ksteube 1312
269 ksteube 1705 try: env['ENV']['HOME'] = os.environ['HOME']
270     except KeyError: pass
271 ksteube 1312
272 ksteube 1705 # Configure for test suite
273     env.PrependENVPath('PYTHONPATH', prefix)
274     env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
275 ksteube 1312
276 ksteube 1756 env['ENV']['ESCRIPT_ROOT'] = prefix
277    
278 ksteube 1705 ############ Set up paths for Configure() ######################
279 ksteube 817
280 ksteube 1705 # Make a copy of an environment
281     # Use env.Clone if available, but fall back on env.Copy for older version of scons
282     def clone_env(env):
283     if 'Clone' in dir(env): return env.Clone() # scons-0.98
284     else: return env.Copy() # scons-0.96
285 phornby 1246
286 ksteube 1705 # Add cc option -I<Escript>/trunk/include
287     env.Append(CPPPATH = [Dir('include')])
288 phornby 1634
289 ksteube 1705 # Add cc option -L<Escript>/trunk/lib
290 ksteube 1729 env.Append(LIBPATH = [Dir(env['libinstall'])])
291 ksteube 1705
292     if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
293 ksteube 1771 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
294 ksteube 1705
295     if env['usepedantic']: env.Append(CCFLAGS = pedantic)
296    
297     # MS Windows
298     if IS_WINDOWS_PLATFORM:
299 jfenwick 2334 env.AppendENVPath('PATH', [env['boost_lib_path']])
300     env.AppendENVPath('PATH', [env['libinstall']])
301 phornby 2054 if not env['share_esysUtils'] :
302     env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
303     if not env['share_paso'] :
304     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
305 phornby 2040
306 ksteube 1705 if env['usenetcdf']:
307 jfenwick 2334 env.AppendENVPath('PATH', [env['netCDF_lib_path']])
308 ksteube 1705
309     env.Append(ARFLAGS = env['ar_flags'])
310    
311     # Get the global Subversion revision number for getVersion() method
312 robwdcock 682 try:
313 ksteube 1705 global_revision = os.popen("svnversion -n .").read()
314     global_revision = re.sub(":.*", "", global_revision)
315     global_revision = re.sub("[^0-9]", "", global_revision)
316 ksteube 1312 except:
317 ksteube 1705 global_revision="-1"
318     if global_revision == "": global_revision="-2"
319     env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
320 phornby 1634
321 ksteube 1705 ############ numarray (required) ###############################
322 robwdcock 682
323 ksteube 1705 try:
324     from numarray import identity
325     except ImportError:
326     print "Cannot import numarray, you need to set your PYTHONPATH"
327     sys.exit(1)
328 ksteube 1348
329 ksteube 1705 ############ C compiler (required) #############################
330 gross 700
331 ksteube 1705 # Create a Configure() environment for checking existence of required libraries and headers
332     conf = Configure(clone_env(env))
333 gross 700
334 ksteube 1705 # Test that the compiler is working
335     if not conf.CheckFunc('printf'):
336 gross 2284 print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
337     sys.exit(1)
338 gross 806
339 phornby 1789 if conf.CheckFunc('gethostname'):
340     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
341 gross 806
342 ksteube 1705 ############ python libraries (required) #######################
343 gross 806
344 jfenwick 2130
345     if not sysheaderopt =="":
346     conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
347     else:
348     conf.env.AppendUnique(CPPPATH = [env['python_path']])
349    
350 ksteube 1705 conf.env.AppendUnique(LIBPATH = [env['python_lib_path']])
351     conf.env.AppendUnique(LIBS = [env['python_libs']])
352 gross 805
353 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path']) # The wrapper script needs to find these libs
354 jfenwick 2296 conf.env.PrependENVPath('PYTHONPATH', prefix)
355     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
356 ksteube 1785
357 ksteube 1705 if not conf.CheckCHeader('Python.h'):
358     print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])
359     sys.exit(1)
360 gross 2284 if not conf.CheckFunc('Py_Exit'):
361 ksteube 1705 print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
362     sys.exit(1)
363 gross 805
364 ksteube 1705 ############ boost (required) ##################################
365 gross 805
366 jfenwick 2130 if not sysheaderopt =="":
367 jfenwick 2295 # This is required because we can't -isystem /usr/system because it breaks std includes
368     if os.path.normpath(env['boost_path']) =="/usr/include":
369     conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
370     else:
371     conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
372 jfenwick 2130 else:
373     conf.env.AppendUnique(CPPPATH = [env['boost_path']])
374    
375 ksteube 1705 conf.env.AppendUnique(LIBPATH = [env['boost_lib_path']])
376     conf.env.AppendUnique(LIBS = [env['boost_libs']])
377 ksteube 1312
378 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path']) # The wrapper script needs to find these libs
379 jfenwick 2296 #ensure that our path entries remain at the front
380     conf.env.PrependENVPath('PYTHONPATH', prefix)
381     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
382 ksteube 1785
383 ksteube 1705 if not conf.CheckCXXHeader('boost/python.hpp'):
384     print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
385     sys.exit(1)
386 gross 2284
387 ksteube 1705 if not conf.CheckFunc('PyObject_SetAttr'):
388     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'])
389     sys.exit(1)
390 ksteube 1312
391 ksteube 1705 # Commit changes to environment
392     env = conf.Finish()
393 ksteube 1312
394 ksteube 1705 ############ VTK (optional) ####################################
395 ksteube 1312
396 ksteube 1705 if env['usevtk']:
397     try:
398     import vtk
399     env['usevtk'] = 1
400     except ImportError:
401     env['usevtk'] = 0
402 gross 806
403 ksteube 1705 # Add VTK to environment env if it was found
404     if env['usevtk']:
405     env.Append(CPPDEFINES = ['USE_VTK'])
406 gross 805
407 ksteube 1705 ############ NetCDF (optional) #################################
408 gross 805
409 ksteube 1705 conf = Configure(clone_env(env))
410 gross 806
411 jfenwick 2334 print "<1<<<<"+str(conf.env['ENV']['LD_LIBRARY_PATH'])
412    
413    
414 ksteube 1705 if env['usenetcdf']:
415     conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
416     conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
417     conf.env.AppendUnique(LIBS = [env['netCDF_libs']])
418 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path']) # The wrapper script needs to find these libs
419 jfenwick 2296 #ensure that our path entries remain at the front
420     conf.env.PrependENVPath('PYTHONPATH', prefix)
421     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
422 gross 806
423 ksteube 1705 if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
424     if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0
425 ksteube 1312
426 jfenwick 2334 print "<2<<<<"+str(conf.env['ENV']['LD_LIBRARY_PATH'])
427    
428 ksteube 1705 # Add NetCDF to environment env if it was found
429     if env['usenetcdf']:
430     env = conf.Finish()
431     env.Append(CPPDEFINES = ['USE_NETCDF'])
432     else:
433     conf.Finish()
434 ksteube 1312
435 jfenwick 2334 print "<A<<<<"+str(env['ENV']['LD_LIBRARY_PATH'])
436    
437 ksteube 1705 ############ PAPI (optional) ###################################
438    
439     # Start a new configure environment that reflects what we've already found
440     conf = Configure(clone_env(env))
441    
442     if env['usepapi']:
443     conf.env.AppendUnique(CPPPATH = [env['papi_path']])
444     conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
445     conf.env.AppendUnique(LIBS = [env['papi_libs']])
446 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path']) # The wrapper script needs to find these libs
447 jfenwick 2296 #ensure that our path entries remain at the front
448     conf.env.PrependENVPath('PYTHONPATH', prefix)
449     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
450 ksteube 1705
451     if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
452     if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0
453    
454     # Add PAPI to environment env if it was found
455     if env['usepapi']:
456     env = conf.Finish()
457     env.Append(CPPDEFINES = ['BLOCKPAPI'])
458 ksteube 1312 else:
459 ksteube 1705 conf.Finish()
460 ksteube 1312
461 ksteube 1705 ############ MKL (optional) ####################################
462 gross 806
463 ksteube 1705 # Start a new configure environment that reflects what we've already found
464     conf = Configure(clone_env(env))
465 gross 806
466 ksteube 1705 if env['usemkl']:
467     conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
468     conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
469     conf.env.AppendUnique(LIBS = [env['mkl_libs']])
470 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path']) # The wrapper script needs to find these libs
471 jfenwick 2296 #ensure that our path entries remain at the front
472     conf.env.PrependENVPath('PYTHONPATH', prefix)
473     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
474 gross 805
475 ksteube 1705 if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
476     if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0
477 phornby 1246
478 ksteube 1705 # Add MKL to environment env if it was found
479     if env['usemkl']:
480     env = conf.Finish()
481     env.Append(CPPDEFINES = ['MKL'])
482     else:
483     conf.Finish()
484 gross 950
485 ksteube 1705 ############ UMFPACK (optional) ################################
486    
487     # Start a new configure environment that reflects what we've already found
488     conf = Configure(clone_env(env))
489    
490     if env['useumfpack']:
491     conf.env.AppendUnique(CPPPATH = [env['ufc_path']])
492     conf.env.AppendUnique(CPPPATH = [env['umf_path']])
493     conf.env.AppendUnique(LIBPATH = [env['umf_lib_path']])
494     conf.env.AppendUnique(LIBS = [env['umf_libs']])
495     conf.env.AppendUnique(CPPPATH = [env['amd_path']])
496     conf.env.AppendUnique(LIBPATH = [env['amd_lib_path']])
497     conf.env.AppendUnique(LIBS = [env['amd_libs']])
498     conf.env.AppendUnique(CPPPATH = [env['blas_path']])
499     conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
500     conf.env.AppendUnique(LIBS = [env['blas_libs']])
501 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path']) # The wrapper script needs to find these libs
502     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path']) # The wrapper script needs to find these libs
503     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path']) # The wrapper script needs to find these libs
504 jfenwick 2296 #ensure that our path entries remain at the front
505     conf.env.PrependENVPath('PYTHONPATH', prefix)
506     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
507 ksteube 1705
508 gross 2284 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
509 gross 2101 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
510 gross 2284 # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
511 ksteube 1705
512     # Add UMFPACK to environment env if it was found
513     if env['useumfpack']:
514     env = conf.Finish()
515     env.Append(CPPDEFINES = ['UMFPACK'])
516 gross 1023 else:
517 ksteube 1705 conf.Finish()
518 gross 1023
519 caltinay 2184 ############ Silo (optional) ###################################
520    
521     if env['usesilo']:
522     conf = Configure(clone_env(env))
523     conf.env.AppendUnique(CPPPATH = [env['silo_path']])
524     conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
525     conf.env.AppendUnique(LIBS = [env['silo_libs']])
526     if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
527     if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
528     conf.Finish()
529    
530     # Add the path to Silo to environment env if it was found.
531     # Note that we do not add the libs since they are only needed for the
532     # escriptreader library and tools.
533     if env['usesilo']:
534     env.AppendUnique(CPPPATH = [env['silo_path']])
535     env.AppendUnique(LIBPATH = [env['silo_lib_path']])
536     env.Append(CPPDEFINES = ['HAVE_SILO'])
537    
538 ksteube 1705 ############ Add the compiler flags ############################
539 ksteube 1459
540 ksteube 1705 # Enable debug by choosing either cc_debug or cc_optim
541     if env['usedebug']:
542     env.Append(CCFLAGS = env['cc_debug'])
543     env.Append(CCFLAGS = env['omp_debug'])
544     else:
545     env.Append(CCFLAGS = env['cc_optim'])
546     env.Append(CCFLAGS = env['omp_optim'])
547 robwdcock 682
548 ksteube 1705 # Always use cc_flags
549     env.Append(CCFLAGS = env['cc_flags'])
550     env.Append(LIBS = [env['omp_libs']])
551 gross 707
552 jfenwick 2232
553     ############ Add some custom builders ##########################
554    
555     py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
556     env.Append(BUILDERS = {'PyCompile' : py_builder});
557    
558     runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
559     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
560    
561     runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
562     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
563    
564 ksteube 1705 ############ MPI (optional) ####################################
565    
566     # Create a modified environment for MPI programs (identical to env if usempi=no)
567     env_mpi = clone_env(env)
568    
569     # Start a new configure environment that reflects what we've already found
570     conf = Configure(clone_env(env_mpi))
571    
572     if env_mpi['usempi']:
573     conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
574     conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
575     conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']])
576 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path']) # The wrapper script needs to find these libs
577 jfenwick 2296 #ensure that our path entries remain at the front
578     conf.env.PrependENVPath('PYTHONPATH', prefix)
579     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
580 ksteube 1705
581     if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0
582 gross 2308 # if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
583 ksteube 1705
584     # Add MPI to environment env_mpi if it was found
585     if env_mpi['usempi']:
586     env_mpi = conf.Finish()
587     env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
588 ksteube 1312 else:
589 ksteube 1705 conf.Finish()
590 ksteube 1312
591 ksteube 1705 env['usempi'] = env_mpi['usempi']
592 ksteube 1312
593 ksteube 1705 ############ ParMETIS (optional) ###############################
594 gross 700
595 ksteube 1705 # Start a new configure environment that reflects what we've already found
596     conf = Configure(clone_env(env_mpi))
597 gross 700
598 ksteube 1705 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
599 gross 700
600 ksteube 1705 if env_mpi['useparmetis']:
601     conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
602     conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
603     conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']])
604 ksteube 1785 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path']) # The wrapper script needs to find these libs
605 jfenwick 2296 #ensure that our path entries remain at the front
606     conf.env.PrependENVPath('PYTHONPATH', prefix)
607     conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
608 gross 707
609 ksteube 1705 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
610     if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
611 elspeth 712
612 ksteube 1705 # Add ParMETIS to environment env_mpi if it was found
613     if env_mpi['useparmetis']:
614     env_mpi = conf.Finish()
615     env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])
616     else:
617     conf.Finish()
618 ksteube 1215
619 ksteube 1705 env['useparmetis'] = env_mpi['useparmetis']
620 ksteube 1247
621 jfenwick 2026 ############ Now we switch on Warnings as errors ###############
622    
623     #this needs to be done after configuration because the scons test files have warnings in them
624    
625     if ((fatalwarning != "") and (env['usewarnings'])):
626     env.Append(CCFLAGS = fatalwarning)
627     env_mpi.Append(CCFLAGS = fatalwarning)
628    
629 ksteube 1705 ############ Summarize our environment #########################
630 phornby 1243
631 ksteube 1705 print ""
632     print "Summary of configuration (see ./config.log for information)"
633     print " Using python libraries"
634     print " Using numarray"
635     print " Using boost"
636     if env['usenetcdf']: print " Using NetCDF"
637     else: print " Not using NetCDF"
638     if env['usevtk']: print " Using VTK"
639     else: print " Not using VTK"
640     if env['usemkl']: print " Using MKL"
641     else: print " Not using MKL"
642     if env['useumfpack']: print " Using UMFPACK"
643     else: print " Not using UMFPACK"
644 caltinay 2184 if env['usesilo']: print " Using Silo"
645     else: print " Not using Silo"
646 ksteube 1705 if env['useopenmp']: print " Using OpenMP"
647     else: print " Not using OpenMP"
648     if env['usempi']: print " Using MPI"
649     else: print " Not using MPI"
650     if env['useparmetis']: print " Using ParMETIS"
651     else: print " Not using ParMETIS (requires MPI)"
652     if env['usepapi']: print " Using PAPI"
653     else: print " Not using PAPI"
654     if env['usedebug']: print " Compiling for debug"
655     else: print " Not compiling for debug"
656     print " Installing in", prefix
657 jfenwick 2026 if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
658     else: print " Not treating warnings as errors"
659 ksteube 1705 print ""
660 phornby 1243
661 ksteube 1756 ############ Delete option-dependent files #####################
662    
663 jfenwick 2324 Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
664     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
665     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
666     Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
667     Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
668     if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
669 ksteube 1756
670 phornby 1243
671 ksteube 1756 ############ Build the subdirectories ##########################
672 robwdcock 682
673 jfenwick 2235 from grouptest import *
674    
675     TestGroups=[]
676    
677 phornby 2027 Export(
678     ["env",
679     "env_mpi",
680     "clone_env",
681 jfenwick 2235 "IS_WINDOWS_PLATFORM",
682     "TestGroups"
683 phornby 2027 ]
684     )
685 ksteube 1705
686 robwdcock 682 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
687 caltinay 2184 env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
688 ksteube 1705 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
689     env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
690 phornby 1628 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
691 robwdcock 682 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
692     env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)
693 gross 707 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)
694 matt 863 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
695 gross 898 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
696 matt 863 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
697 ksteube 1756 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
698 artak 2161 env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
699 phornby 1243
700 jfenwick 2235
701 ksteube 1705 ############ Remember what optimizations we used ###############
702 phornby 1243
703 ksteube 1705 remember_list = []
704 phornby 1243
705 ksteube 1705 if env['usedebug']:
706 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
707 ksteube 1705
708     if env['usempi']:
709 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
710 ksteube 1705
711 jfenwick 2302 if env['useopenmp']:
712 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
713 ksteube 1705
714     env.Alias('remember_options', remember_list)
715    
716 jfenwick 2297
717     ############### Record python interpreter version ##############
718    
719     if not IS_WINDOWS_PLATFORM:
720     versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
721 jfenwick 2302 os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
722 jfenwick 2297
723 jfenwick 2302 ############## Populate the buildvars file #####################
724    
725     buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
726     buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
727    
728     # Find the boost version by extracting it from version.hpp
729     boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
730     boostversion='unknown'
731     try:
732     for line in boosthpp:
733     ver=re.match(r'#define BOOST_VERSION (\d+)',line)
734     if ver:
735     boostversion=ver.group(1)
736     except StopIteration:
737     pass
738     buildvars.write("boost="+boostversion+"\n")
739     buildvars.write("svn_revision="+str(global_revision)+"\n")
740     out="usedebug="
741     if env['usedebug']:
742     out+="y"
743     else:
744     out+="n"
745     out+="\nusempi="
746     if env['usempi']:
747     out+="y"
748     else:
749     out+="n"
750     out+="\nuseopenmp="
751     if env['useopenmp']:
752     out+="y"
753     else:
754     out+="n"
755     buildvars.write(out+"\n")
756    
757     buildvars.close()
758    
759    
760 ksteube 1705 ############ Targets to build and install libraries ############
761    
762     target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
763     env.Alias('target_init', [target_init])
764    
765     # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>
766     env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])
767     env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])
768    
769     env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
770     env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
771    
772     env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
773     env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
774    
775     env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])
776     env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])
777    
778     # Now gather all the above into a couple easy targets: build_all and install_all
779     build_all_list = []
780     build_all_list += ['build_esysUtils']
781     build_all_list += ['build_paso']
782     build_all_list += ['build_escript']
783     build_all_list += ['build_finley']
784 ksteube 1756 if env['usempi']: build_all_list += ['target_pythonMPI_exe']
785 jfenwick 2294 if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
786 caltinay 2184 if env['usesilo']: build_all_list += ['target_escript2silo']
787 ksteube 1705 env.Alias('build_all', build_all_list)
788    
789     install_all_list = []
790     install_all_list += ['target_init']
791     install_all_list += ['install_esysUtils']
792     install_all_list += ['install_paso']
793     install_all_list += ['install_escript']
794     install_all_list += ['install_finley']
795     install_all_list += ['target_install_pyvisi_py']
796     install_all_list += ['target_install_modellib_py']
797     install_all_list += ['target_install_pycad_py']
798 ksteube 1756 if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
799 jfenwick 2294 if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
800 caltinay 2184 if env['usesilo']: install_all_list += ['target_install_escript2silo']
801 ksteube 1705 install_all_list += ['remember_options']
802     env.Alias('install_all', install_all_list)
803    
804     # Default target is install
805     env.Default('install_all')
806    
807     ############ Targets to build and run the test suite ###########
808    
809     env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])
810     env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
811     env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
812     env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
813 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
814 ksteube 1705
815     ############ Targets to build the documentation ################
816    
817 jfenwick 2334 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
818 ksteube 1705
819 jfenwick 2235 if not IS_WINDOWS_PLATFORM:
820     try:
821     utest=open("utest.sh","w")
822 jfenwick 2276 build_platform=os.name #Sometimes Mac python says it is posix
823     if (build_platform=='posix') and platform.system()=="Darwin":
824     build_platform='darwin'
825     utest.write(GroupTest.makeHeader(build_platform))
826 jfenwick 2235 for tests in TestGroups:
827     utest.write(tests.makeString())
828     utest.close()
829 jfenwick 2299 os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
830 jfenwick 2235 print "utest.sh written"
831     except IOError:
832     print "Error attempting to write unittests file."
833     sys.exit(1)
834    

  ViewVC Help
Powered by ViewVC 1.1.26