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

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3024 - (hide annotations)
Wed May 5 01:12:32 2010 UTC (9 years, 5 months ago) by jfenwick
Original Path: trunk/SConstruct
File size: 39679 byte(s)
Some savanna fixes but not complete

1 ksteube 1811
2     ########################################################
3 jgs 214 #
4 jfenwick 2881 # Copyright (c) 2003-2010 by University of Queensland
5 ksteube 1811 # 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 jfenwick 2604 # For copy()
20     import shutil
21 ksteube 1705
22 robwdcock 682 # Add our extensions
23 ksteube 1705 if os.path.isdir('scons'): sys.path.append('scons')
24 robwdcock 682 import scons_extensions
25 jgs 192
26 ksteube 1705 # Use /usr/lib64 if available, else /usr/lib
27     usr_lib = '/usr/lib'
28     if os.path.isfile('/usr/lib64/libc.so'): usr_lib = '/usr/lib64'
29 gross 1374
30 ksteube 1705 # The string python2.4 or python2.5
31     python_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
32 gross 806
33 ksteube 1705 # MS Windows support, many thanks to PH
34     IS_WINDOWS_PLATFORM = (os.name== "nt")
35 gross 806
36 ksteube 1705 prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
37 ksteube 1217
38 jfenwick 2603 #Holds names of variables from the calling environment which need to be passed
39     #to tools
40     env_export=[]
41    
42 jfenwick 2391 #Determine where to read options from use:
43     #1. command line
44     #2. scons/<hostname>_options.py
45     #3. name as part of a cluster
46     options_file=ARGUMENTS.get('options_file', None)
47 jfenwick 2603 effective_hostname=socket.gethostname().split('.')[0]
48 jfenwick 2391 if not options_file:
49 jfenwick 2603 mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
50     options_file = os.path.join("scons",mangledhostname+"_options.py")
51 jfenwick 2391 #If there is no options file with that name see if there is a substitute
52     if not os.path.isfile(options_file):
53 jfenwick 2603 effective_hostname = scons_extensions.effectiveName(effective_hostname)
54     mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
55     options_file = os.path.join("scons",mangledhostname+"_options.py")
56 jfenwick 2391
57 ksteube 1866 if not os.path.isfile(options_file):
58 jfenwick 2391 print "Options file not found (expected '%s')" % options_file
59 ksteube 1866 options_file = False
60     else:
61     print "Options file is", options_file
62 ksteube 1217
63 jfenwick 2430 #Does our scons support the newer Variables class or do we need to use Options?
64 gross 1149
65 jfenwick 2430 try:
66     dummyvar=Variables
67     opts = Variables(options_file, ARGUMENTS)
68     adder = opts.AddVariables
69     except:
70     opts = Options(options_file, ARGUMENTS)
71     adder = opts.AddOptions
72     BoolVariable = BoolOption
73    
74 ksteube 1705 ############ Load build options ################################
75 ksteube 1312
76 jfenwick 2430 adder(
77     #opts.AddOptions(
78 robwdcock 682 # Where to install esys stuff
79 ksteube 1705 ('prefix', 'where everything will be installed', Dir('#.').abspath),
80     ('incinstall', 'where the esys headers will be installed', os.path.join(Dir('#.').abspath,'include')),
81 ksteube 1756 ('bininstall', 'where the esys binaries will be installed', os.path.join(prefix,'bin')),
82 ksteube 1705 ('libinstall', 'where the esys libraries will be installed', os.path.join(prefix,'lib')),
83     ('pyinstall', 'where the esys python modules will be installed', os.path.join(prefix,'esys')),
84 robwdcock 682 # Compilation options
85 jfenwick 2430 BoolVariable('dodebug', 'For backwards compatibility', 'no'),
86     BoolVariable('usedebug', 'Do you want a debug build?', 'no'),
87     BoolVariable('usevtk', 'Do you want to use VTK?', 'yes'),
88 ksteube 1705 ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),
89 caltinay 2882 ('cc', 'path to C compiler', 'DEFAULT'),
90     ('cxx', 'path to C++ compiler', 'DEFAULT'),
91 phornby 1930 ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
92 ksteube 1705 # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below
93 caltinay 2967 ('cc_flags', 'C/C++ compiler flags to use', '-DEFAULT_1'),
94     ('cc_optim', 'C/C++ optimization flags to use', '-DEFAULT_2'),
95     ('cc_debug', 'C/C++ debug flags to use', '-DEFAULT_3'),
96 ksteube 1705 ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),
97     ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
98     ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
99 caltinay 2967 ('cc_extra', 'Extra C compiler flags', ''),
100     ('cxx_extra', 'Extra C++ compiler flags', ''),
101 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
102 ksteube 1705 ('sys_libs', 'System libraries to link with', []),
103     ('ar_flags', 'Static library archiver flags to use', ''),
104 jfenwick 2430 BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
105     BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
106     BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
107 jfenwick 2273 ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
108 jfenwick 2721 ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
109 robwdcock 682 # Python
110 ksteube 1705 ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
111     ('python_lib_path', 'Path to Python libs', usr_lib),
112     ('python_libs', 'Python libraries to link with', [python_version]),
113 phornby 1243 ('python_cmd', 'Python command', 'python'),
114 robwdcock 682 # Boost
115 ksteube 1705 ('boost_path', 'Path to Boost includes', '/usr/include'),
116     ('boost_lib_path', 'Path to Boost libs', usr_lib),
117     ('boost_libs', 'Boost libraries to link with', ['boost_python']),
118     # NetCDF
119 jfenwick 2430 BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
120 ksteube 1705 ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
121     ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
122     ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
123 bcumming 759 # MPI
124 jfenwick 2430 BoolVariable('useMPI', 'For backwards compatibility', 'no'),
125     BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
126 ksteube 1312 ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
127 ksteube 1705 ('mpi_path', 'Path to MPI includes', '/usr/include'),
128     ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
129     ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
130 jfenwick 2729 ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', []),
131 jfenwick 2338 ('mpi_flavour','Type of MPI execution environment','none'),
132 ksteube 1705 # ParMETIS
133 jfenwick 2430 BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
134 ksteube 1705 ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
135     ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
136     ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
137     # PAPI
138 jfenwick 2430 BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
139 ksteube 1705 ('papi_path', 'Path to PAPI includes', '/usr/include'),
140     ('papi_lib_path', 'Path to PAPI libs', usr_lib),
141     ('papi_libs', 'PAPI libraries to link with', ['papi']),
142 jfenwick 2430 BoolVariable('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
143 ksteube 1705 # MKL
144 jfenwick 2430 BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
145 ksteube 1705 ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
146     ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
147     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
148     # UMFPACK
149 jfenwick 2430 BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
150 ksteube 1705 ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
151     ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
152     ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
153     ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
154 caltinay 2184 # Silo
155 jfenwick 2430 BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
156 caltinay 2184 ('silo_path', 'Path to Silo includes', '/usr/include'),
157     ('silo_lib_path', 'Path to Silo libs', usr_lib),
158     ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
159 ksteube 1705 # AMD (used by UMFPACK)
160     ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
161     ('amd_lib_path', 'Path to AMD libs', usr_lib),
162     ('amd_libs', 'AMD libraries to link with', ['amd']),
163     # BLAS (used by UMFPACK)
164     ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
165     ('blas_lib_path', 'Path to BLAS libs', usr_lib),
166 phornby 2012 ('blas_libs', 'BLAS libraries to link with', ['blas']),
167 jfenwick 2742 #Lapack options
168     BoolVariable('uselapack','switch on/off use of Lapack','no'),
169     ('lapack_path', 'Path to Lapack includes','/usr/include'),
170     ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
171     ('lapack_libs', 'Lapack libraries to link with', []),
172     ('lapack_type', '{clapack,mkl}','clapack'),
173 phornby 2012 # An option for specifying the compiler tools set (see windows branch).
174 phornby 2054 ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
175     # finer control over library building, intel aggressive global optimisation
176     # works with dynamic libraries on windows.
177     ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
178 jfenwick 2603 ('share_paso', 'control static or dynamic paso lib', False),
179 jfenwick 2827 ('env_export','Environment variables to be passed to children',[]),
180     #To enable passing function pointers through python
181     BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
182 robwdcock 682 )
183 phornby 1232
184 jfenwick 2604
185    
186 ksteube 1705 ############ Specify which compilers to use ####################
187    
188     # intelc uses regular expressions improperly and emits a warning about
189     # failing to find the compilers. This warning can be safely ignored.
190    
191 gross 1133 if IS_WINDOWS_PLATFORM:
192 phornby 2012 env = Environment(options = opts)
193     env = Environment(tools = ['default'] + env['tools_names'],
194     options = opts)
195 robwdcock 682 else:
196 jfenwick 3024 if effective_hostname == 'savanna':
197 gross 1133 env = Environment(tools = ['default', 'intelc'], options = opts)
198 ksteube 1559 elif os.uname()[4]=='ia64':
199     env = Environment(tools = ['default', 'intelc'], options = opts)
200 gross 1133 if env['CXX'] == 'icpc':
201 ksteube 1705 env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
202 gross 1133 else:
203     env = Environment(tools = ['default'], options = opts)
204 caltinay 2882
205     # Override compiler choice if provided
206     if env['cc'] != 'DEFAULT': env['CC']=env['cc']
207     if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
208    
209 gross 1133 Help(opts.GenerateHelpText(env))
210 phornby 1232
211 jfenwick 2604 ############ Make sure target directories exist ################
212    
213     if not os.path.isdir(env['bininstall']):
214     os.makedirs(env['bininstall'])
215     if not os.path.isdir(env['libinstall']):
216     os.makedirs(env['libinstall'])
217     if not os.path.isdir(env['pyinstall']):
218     os.makedirs(env['pyinstall'])
219    
220 jfenwick 2603 ########## Copy required environment vars ######################
221    
222     for i in env['env_export']:
223     env.Append(ENV = {i:os.environ[i]})
224    
225 ksteube 1705 ############ Fill in compiler options if not set above #########
226 ksteube 1312
227 ksteube 1705 # Backwards compatibility: allow dodebug=yes and useMPI=yes
228     if env['dodebug']: env['usedebug'] = 1
229     if env['useMPI']: env['usempi'] = 1
230 gross 1024
231 ksteube 1705 # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
232     # For both C and C++ you get: cc_flags and either the optim flags or debug flags
233 phornby 1243
234 jfenwick 2130 sysheaderopt = "" # how do we indicate that a header is a system header. Use "" for no action.
235    
236 caltinay 2882 cc_flags = ""
237     cc_optim = ""
238     cc_debug = ""
239     omp_optim = ""
240     omp_debug = ""
241     omp_libs = []
242    
243 ksteube 1705 if env["CC"] == "icc":
244     # Intel compilers
245 jfenwick 2884 cc_flags = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
246 ksteube 1705 cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
247 jfenwick 1796 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
248 ksteube 1705 omp_optim = "-openmp -openmp_report0"
249     omp_debug = "-openmp -openmp_report0"
250     omp_libs = ['guide', 'pthread']
251     pedantic = ""
252 jfenwick 2026 fatalwarning = "" # Switch to turn warnings into errors
253 jfenwick 2130 sysheaderopt = ""
254 caltinay 2882 elif env["CC"][:3] == "gcc":
255 ksteube 1705 # GNU C on any system
256 jfenwick 2884 cc_flags = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
257 jfenwick 2063 #the long long warning occurs on the Mac
258 ksteube 1705 cc_optim = "-O3"
259 jfenwick 1796 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
260 gross 2300 omp_optim = "-fopenmp"
261     omp_debug = "-fopenmp"
262 jfenwick 2729 omp_libs = []
263 ksteube 1705 pedantic = "-pedantic-errors -Wno-long-long"
264 jfenwick 2026 fatalwarning = "-Werror"
265 jfenwick 2130 sysheaderopt = "-isystem "
266 ksteube 1705 elif env["CC"] == "cl":
267     # Microsoft Visual C on Windows
268     cc_flags = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
269     cc_optim = "/O2 /Op /MT /W3"
270     cc_debug = "/Od /RTC1 /MTd /ZI -DBOUNDS_CHECK"
271     omp_optim = ""
272     omp_debug = ""
273     omp_libs = []
274     pedantic = ""
275 jfenwick 2026 fatalwarning = ""
276 jfenwick 2130 sysheaderopt = ""
277 phornby 1930 elif env["CC"] == "icl":
278 phornby 2027 # intel C on Windows, see windows_intelc_options.py for a start
279 phornby 1930 pedantic = ""
280 jfenwick 2026 fatalwarning = ""
281 jfenwick 2130 sysheaderopt = ""
282 phornby 1243
283 jfenwick 2130
284 ksteube 1705 # If not specified in hostname_options.py then set them here
285     if env["cc_flags"] == "-DEFAULT_1": env['cc_flags'] = cc_flags
286     if env["cc_optim"] == "-DEFAULT_2": env['cc_optim'] = cc_optim
287     if env["cc_debug"] == "-DEFAULT_3": env['cc_debug'] = cc_debug
288     if env["omp_optim"] == "-DEFAULT_4": env['omp_optim'] = omp_optim
289     if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
290     if env["omp_libs"] == "-DEFAULT_6": env['omp_libs'] = omp_libs
291 ksteube 1312
292 jfenwick 2273 #set up the autolazy values
293     if env['forcelazy'] != "leave_alone":
294     if env['forcelazy'] == 'on':
295 jfenwick 2721 env.Append(CPPDEFINES=['FAUTOLAZYON'])
296 jfenwick 2273 else:
297     if env['forcelazy'] == 'off':
298 jfenwick 2721 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
299 jfenwick 2273
300 jfenwick 2721 #set up the colective resolve values
301     if env['forcecollres'] != "leave_alone":
302     print env['forcecollres']
303     if env['forcecollres'] == 'on':
304     env.Append(CPPDEFINES=['FRESCOLLECTON'])
305     else:
306     if env['forcecollres'] == 'off':
307     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
308    
309    
310 jfenwick 2827 if env['iknowwhatimdoing']:
311     env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
312    
313 ksteube 1705 # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
314     if not env["useopenmp"]:
315     env['omp_optim'] = ""
316     env['omp_debug'] = ""
317     env['omp_libs'] = []
318 gross 1160
319 ksteube 1705 if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
320 ksteube 1312
321 gross 2423 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
322     if IS_WINDOWS_PLATFORM:
323     LD_LIBRARY_PATH_KEY='PATH'
324     env['ENV']['LD_LIBRARY_PATH']=''
325     else:
326     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
327 ksteube 1705 ############ Copy environment variables into scons env #########
328 gross 1163
329 ksteube 1705 try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
330     except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
331 phornby 1243
332 gross 2363 try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
333     except KeyError: pass
334    
335     try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
336 gross 2416 except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
337 gross 2363
338     try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
339 gross 2416 except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
340 gross 2363
341     try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
342     except KeyError: pass
343    
344 ksteube 1705 try: env['ENV']['PATH'] = os.environ['PATH']
345     except KeyError: pass
346 robwdcock 682
347 ksteube 1705 try: env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
348     except KeyError: pass
349 phornby 1244
350 ksteube 1705 try: env['ENV']['C_INCLUDE_PATH'] = os.environ['C_INCLUDE_PATH']
351     except KeyError: pass
352 robwdcock 682
353 ksteube 1705 try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
354     except KeyError: pass
355 robwdcock 682
356 gross 2424 try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
357 ksteube 1705 except KeyError: pass
358 ksteube 1312
359 ksteube 1705 try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
360     except KeyError: pass
361 ksteube 1312
362 ksteube 1705 try: env['ENV']['DISPLAY'] = os.environ['DISPLAY']
363     except KeyError: pass
364 ksteube 1312
365 ksteube 1705 try: env['ENV']['XAUTHORITY'] = os.environ['XAUTHORITY']
366     except KeyError: pass
367 ksteube 1312
368 ksteube 1705 try: env['ENV']['HOME'] = os.environ['HOME']
369     except KeyError: pass
370 ksteube 1312
371 ksteube 1705 # Configure for test suite
372 gross 2423
373    
374     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
375 ksteube 1705 env.PrependENVPath('PYTHONPATH', prefix)
376 ksteube 1756 env['ENV']['ESCRIPT_ROOT'] = prefix
377    
378 ksteube 1705 ############ Set up paths for Configure() ######################
379 ksteube 817
380 ksteube 1705 # Make a copy of an environment
381     # Use env.Clone if available, but fall back on env.Copy for older version of scons
382     def clone_env(env):
383     if 'Clone' in dir(env): return env.Clone() # scons-0.98
384     else: return env.Copy() # scons-0.96
385 phornby 1246
386 ksteube 1705 # Add cc option -I<Escript>/trunk/include
387     env.Append(CPPPATH = [Dir('include')])
388 phornby 1634
389 ksteube 1705 # Add cc option -L<Escript>/trunk/lib
390 ksteube 1729 env.Append(LIBPATH = [Dir(env['libinstall'])])
391 ksteube 1705
392 caltinay 2967 if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
393     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
394 ksteube 1771 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
395 ksteube 1705
396     if env['usepedantic']: env.Append(CCFLAGS = pedantic)
397    
398     # MS Windows
399     if IS_WINDOWS_PLATFORM:
400 jfenwick 2334 env.AppendENVPath('PATH', [env['boost_lib_path']])
401     env.AppendENVPath('PATH', [env['libinstall']])
402 phornby 2054 if not env['share_esysUtils'] :
403     env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
404     if not env['share_paso'] :
405     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
406 phornby 2040
407 ksteube 1705 if env['usenetcdf']:
408 jfenwick 2334 env.AppendENVPath('PATH', [env['netCDF_lib_path']])
409 ksteube 1705
410     env.Append(ARFLAGS = env['ar_flags'])
411    
412     # Get the global Subversion revision number for getVersion() method
413 robwdcock 682 try:
414 ksteube 1705 global_revision = os.popen("svnversion -n .").read()
415     global_revision = re.sub(":.*", "", global_revision)
416     global_revision = re.sub("[^0-9]", "", global_revision)
417 ksteube 1312 except:
418 ksteube 1705 global_revision="-1"
419     if global_revision == "": global_revision="-2"
420     env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
421 phornby 1634
422 jfenwick 2455 ############ numpy (required) ###############################
423 robwdcock 682
424 ksteube 1705 try:
425 jfenwick 2455 from numpy import identity
426 ksteube 1705 except ImportError:
427 jfenwick 2455 print "Cannot import numpy, you need to set your PYTHONPATH"
428 ksteube 1705 sys.exit(1)
429 ksteube 1348
430 ksteube 1705 ############ C compiler (required) #############################
431 gross 700
432 ksteube 1705 # Create a Configure() environment for checking existence of required libraries and headers
433     conf = Configure(clone_env(env))
434 gross 700
435 ksteube 1705 # Test that the compiler is working
436     if not conf.CheckFunc('printf'):
437 gross 2284 print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
438     sys.exit(1)
439 gross 806
440 phornby 1789 if conf.CheckFunc('gethostname'):
441     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
442 gross 806
443 ksteube 1705 ############ python libraries (required) #######################
444 gross 806
445 jfenwick 2130
446     if not sysheaderopt =="":
447     conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
448     else:
449     conf.env.AppendUnique(CPPPATH = [env['python_path']])
450    
451 ksteube 1705 conf.env.AppendUnique(LIBPATH = [env['python_lib_path']])
452     conf.env.AppendUnique(LIBS = [env['python_libs']])
453 gross 805
454 jfenwick 2296 conf.env.PrependENVPath('PYTHONPATH', prefix)
455 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path']) # The wrapper script needs to find these libs
456     conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
457 ksteube 1785
458 ksteube 1705 if not conf.CheckCHeader('Python.h'):
459     print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])
460     sys.exit(1)
461 gross 2284 if not conf.CheckFunc('Py_Exit'):
462 ksteube 1705 print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
463     sys.exit(1)
464 gross 805
465 ksteube 1705 ############ boost (required) ##################################
466 gross 805
467 jfenwick 2130 if not sysheaderopt =="":
468 jfenwick 2295 # This is required because we can't -isystem /usr/system because it breaks std includes
469     if os.path.normpath(env['boost_path']) =="/usr/include":
470     conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
471     else:
472     conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
473 jfenwick 2130 else:
474     conf.env.AppendUnique(CPPPATH = [env['boost_path']])
475    
476 ksteube 1705 conf.env.AppendUnique(LIBPATH = [env['boost_lib_path']])
477     conf.env.AppendUnique(LIBS = [env['boost_libs']])
478 ksteube 1312
479 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['boost_lib_path']) # The wrapper script needs to find these libs
480 jfenwick 2296 #ensure that our path entries remain at the front
481     conf.env.PrependENVPath('PYTHONPATH', prefix)
482 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
483 ksteube 1785
484 gross 2284
485 trankine 2924 #Yep we still cant figure this one out. - working on it.
486     if not IS_WINDOWS_PLATFORM:
487     if not conf.CheckCXXHeader('boost/python.hpp'):
488     print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
489     sys.exit(1)
490 ksteube 1312
491 trankine 2924 if not conf.CheckFunc('PyObject_SetAttr'):
492     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'])
493     sys.exit(1)
494    
495    
496 ksteube 1705 # Commit changes to environment
497     env = conf.Finish()
498 ksteube 1312
499 ksteube 1705 ############ VTK (optional) ####################################
500 ksteube 1312
501 ksteube 1705 if env['usevtk']:
502     try:
503     import vtk
504     env['usevtk'] = 1
505     except ImportError:
506     env['usevtk'] = 0
507 gross 806
508 ksteube 1705 # Add VTK to environment env if it was found
509     if env['usevtk']:
510     env.Append(CPPDEFINES = ['USE_VTK'])
511 gross 805
512 ksteube 1705 ############ NetCDF (optional) #################################
513 gross 805
514 ksteube 1705 conf = Configure(clone_env(env))
515 gross 806
516 ksteube 1705 if env['usenetcdf']:
517     conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
518     conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
519     conf.env.AppendUnique(LIBS = [env['netCDF_libs']])
520 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['netCDF_lib_path']) # The wrapper script needs to find these libs
521 jfenwick 2296 #ensure that our path entries remain at the front
522     conf.env.PrependENVPath('PYTHONPATH', prefix)
523 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
524 gross 806
525 ksteube 1705 if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
526     if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0
527 ksteube 1312
528 ksteube 1705 # Add NetCDF to environment env if it was found
529     if env['usenetcdf']:
530     env = conf.Finish()
531     env.Append(CPPDEFINES = ['USE_NETCDF'])
532     else:
533     conf.Finish()
534 ksteube 1312
535 ksteube 1705 ############ PAPI (optional) ###################################
536    
537     # Start a new configure environment that reflects what we've already found
538     conf = Configure(clone_env(env))
539    
540     if env['usepapi']:
541     conf.env.AppendUnique(CPPPATH = [env['papi_path']])
542     conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
543     conf.env.AppendUnique(LIBS = [env['papi_libs']])
544 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['papi_lib_path']) # The wrapper script needs to find these libs
545 jfenwick 2296 #ensure that our path entries remain at the front
546     conf.env.PrependENVPath('PYTHONPATH', prefix)
547 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
548 ksteube 1705
549     if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
550     if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0
551    
552     # Add PAPI to environment env if it was found
553     if env['usepapi']:
554     env = conf.Finish()
555     env.Append(CPPDEFINES = ['BLOCKPAPI'])
556 ksteube 1312 else:
557 ksteube 1705 conf.Finish()
558 ksteube 1312
559 ksteube 1705 ############ MKL (optional) ####################################
560 gross 806
561 ksteube 1705 # Start a new configure environment that reflects what we've already found
562     conf = Configure(clone_env(env))
563 gross 806
564 ksteube 1705 if env['usemkl']:
565     conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
566     conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
567     conf.env.AppendUnique(LIBS = [env['mkl_libs']])
568 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mkl_lib_path']) # The wrapper script needs to find these libs
569 jfenwick 2296 #ensure that our path entries remain at the front
570     conf.env.PrependENVPath('PYTHONPATH', prefix)
571 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
572 gross 805
573 ksteube 1705 if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
574 gross 2358 if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
575 phornby 1246
576 jfenwick 2787
577 ksteube 1705 # Add MKL to environment env if it was found
578     if env['usemkl']:
579     env = conf.Finish()
580     env.Append(CPPDEFINES = ['MKL'])
581     else:
582     conf.Finish()
583 gross 950
584 ksteube 1705 ############ UMFPACK (optional) ################################
585    
586     # Start a new configure environment that reflects what we've already found
587     conf = Configure(clone_env(env))
588    
589     if env['useumfpack']:
590     conf.env.AppendUnique(CPPPATH = [env['ufc_path']])
591     conf.env.AppendUnique(CPPPATH = [env['umf_path']])
592     conf.env.AppendUnique(LIBPATH = [env['umf_lib_path']])
593     conf.env.AppendUnique(LIBS = [env['umf_libs']])
594     conf.env.AppendUnique(CPPPATH = [env['amd_path']])
595     conf.env.AppendUnique(LIBPATH = [env['amd_lib_path']])
596     conf.env.AppendUnique(LIBS = [env['amd_libs']])
597     conf.env.AppendUnique(CPPPATH = [env['blas_path']])
598     conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
599     conf.env.AppendUnique(LIBS = [env['blas_libs']])
600 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['umf_lib_path']) # The wrapper script needs to find these libs
601     conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['amd_lib_path']) # The wrapper script needs to find these libs
602     conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['blas_lib_path']) # The wrapper script needs to find these libs
603 jfenwick 2296 #ensure that our path entries remain at the front
604     conf.env.PrependENVPath('PYTHONPATH', prefix)
605 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
606 ksteube 1705
607 gross 2474 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
608 gross 2284 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
609     # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
610 ksteube 1705
611     # Add UMFPACK to environment env if it was found
612     if env['useumfpack']:
613     env = conf.Finish()
614     env.Append(CPPDEFINES = ['UMFPACK'])
615 gross 1023 else:
616 ksteube 1705 conf.Finish()
617 gross 1023
618 caltinay 2184 ############ Silo (optional) ###################################
619    
620     if env['usesilo']:
621     conf = Configure(clone_env(env))
622     conf.env.AppendUnique(CPPPATH = [env['silo_path']])
623     conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
624     conf.env.AppendUnique(LIBS = [env['silo_libs']])
625     if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
626     if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
627     conf.Finish()
628    
629     # Add the path to Silo to environment env if it was found.
630     # Note that we do not add the libs since they are only needed for the
631 caltinay 2810 # escriptexport library and tools.
632 caltinay 2184 if env['usesilo']:
633     env.AppendUnique(CPPPATH = [env['silo_path']])
634     env.AppendUnique(LIBPATH = [env['silo_lib_path']])
635    
636 jfenwick 2742 ########### Lapack (optional) ##################################
637    
638     if env['uselapack']:
639     env.AppendUnique(CPPDEFINES='USE_LAPACK')
640     env.AppendUnique(CPPPATH = [env['lapack_path']])
641     env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
642    
643     env.Append(LIBPATH = '/usr/lib/atlas')
644     env.Append(LIBS = [env['lapack_libs']])
645     if env['lapack_type']=='mkl':
646 jfenwick 2787 if not env['usemkl']:
647     env['uselapack']=0
648     print "mkl_lapack requires mkl"
649     else:
650     env.AppendUnique(CPPDEFINES='MKL_LAPACK')
651    
652 jfenwick 2742
653 ksteube 1705 ############ Add the compiler flags ############################
654 ksteube 1459
655 ksteube 1705 # Enable debug by choosing either cc_debug or cc_optim
656     if env['usedebug']:
657     env.Append(CCFLAGS = env['cc_debug'])
658     env.Append(CCFLAGS = env['omp_debug'])
659     else:
660     env.Append(CCFLAGS = env['cc_optim'])
661     env.Append(CCFLAGS = env['omp_optim'])
662 robwdcock 682
663 ksteube 1705 # Always use cc_flags
664     env.Append(CCFLAGS = env['cc_flags'])
665     env.Append(LIBS = [env['omp_libs']])
666 gross 707
667 jfenwick 2232 ############ Add some custom builders ##########################
668    
669     py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
670     env.Append(BUILDERS = {'PyCompile' : py_builder});
671    
672     runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
673     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
674    
675     runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
676     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
677    
678 jfenwick 2387 epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
679     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
680    
681 ksteube 1705 ############ MPI (optional) ####################################
682 gross 2364 if not env['usempi']: env['mpi_flavour']='none'
683 ksteube 1705
684     # Create a modified environment for MPI programs (identical to env if usempi=no)
685     env_mpi = clone_env(env)
686    
687     # Start a new configure environment that reflects what we've already found
688     conf = Configure(clone_env(env_mpi))
689    
690     if env_mpi['usempi']:
691 gross 2366 VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
692 gross 2356 if not env_mpi['mpi_flavour'] in VALID_MPIs:
693 gross 2358 raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
694 ksteube 1705 conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
695     conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
696     conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']])
697 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mpi_lib_path']) # The wrapper script needs to find these libs
698 jfenwick 2296 #ensure that our path entries remain at the front
699     conf.env.PrependENVPath('PYTHONPATH', prefix)
700 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
701 ksteube 1705
702     if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0
703 gross 2308 # if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
704 ksteube 1705
705     # Add MPI to environment env_mpi if it was found
706     if env_mpi['usempi']:
707     env_mpi = conf.Finish()
708     env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
709 ksteube 1312 else:
710 ksteube 1705 conf.Finish()
711 ksteube 1312
712 ksteube 1705 env['usempi'] = env_mpi['usempi']
713 ksteube 1312
714 ksteube 1705 ############ ParMETIS (optional) ###############################
715 gross 700
716 ksteube 1705 # Start a new configure environment that reflects what we've already found
717     conf = Configure(clone_env(env_mpi))
718 gross 700
719 ksteube 1705 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
720 gross 700
721 ksteube 1705 if env_mpi['useparmetis']:
722     conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
723     conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
724     conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']])
725 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_lib_path']) # The wrapper script needs to find these libs
726 jfenwick 2296 #ensure that our path entries remain at the front
727     conf.env.PrependENVPath('PYTHONPATH', prefix)
728 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
729 gross 707
730 ksteube 1705 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
731     if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
732 elspeth 712
733 ksteube 1705 # Add ParMETIS to environment env_mpi if it was found
734     if env_mpi['useparmetis']:
735     env_mpi = conf.Finish()
736     env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])
737     else:
738     conf.Finish()
739 ksteube 1215
740 ksteube 1705 env['useparmetis'] = env_mpi['useparmetis']
741 ksteube 1247
742 ksteube 1705 ############ Summarize our environment #########################
743 phornby 1243
744 ksteube 1705 print ""
745     print "Summary of configuration (see ./config.log for information)"
746     print " Using python libraries"
747 jfenwick 2458 print " Using numpy"
748 ksteube 1705 print " Using boost"
749     if env['usenetcdf']: print " Using NetCDF"
750     else: print " Not using NetCDF"
751     if env['usevtk']: print " Using VTK"
752     else: print " Not using VTK"
753     if env['usemkl']: print " Using MKL"
754     else: print " Not using MKL"
755     if env['useumfpack']: print " Using UMFPACK"
756     else: print " Not using UMFPACK"
757 caltinay 2184 if env['usesilo']: print " Using Silo"
758     else: print " Not using Silo"
759 ksteube 1705 if env['useopenmp']: print " Using OpenMP"
760     else: print " Not using OpenMP"
761 gross 2356 if env['usempi']: print " Using MPI (flavour = %s)"%env['mpi_flavour']
762 ksteube 1705 else: print " Not using MPI"
763     if env['useparmetis']: print " Using ParMETIS"
764     else: print " Not using ParMETIS (requires MPI)"
765     if env['usepapi']: print " Using PAPI"
766     else: print " Not using PAPI"
767 jfenwick 2787 if env['uselapack']: print " Using Lapack"
768     else: print " Not using Lapack"
769 ksteube 1705 if env['usedebug']: print " Compiling for debug"
770     else: print " Not compiling for debug"
771     print " Installing in", prefix
772 jfenwick 2026 if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
773     else: print " Not treating warnings as errors"
774 ksteube 1705 print ""
775 phornby 1243
776 ksteube 1756 ############ Delete option-dependent files #####################
777    
778 jfenwick 2324 Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
779     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
780     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
781     Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
782     Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
783     if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
784 ksteube 1756
785 phornby 1243
786 ksteube 1756 ############ Build the subdirectories ##########################
787 robwdcock 682
788 jfenwick 2827 if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
789    
790    
791 jfenwick 2235 from grouptest import *
792    
793     TestGroups=[]
794    
795 jfenwick 2827 dodgy_env=clone_env(env_mpi) # Environment without pedantic options
796    
797     ############ Now we switch on Warnings as errors ###############
798    
799     #this needs to be done after configuration because the scons test files have warnings in them
800    
801     if ((fatalwarning != "") and (env['usewarnings'])):
802     env.Append(CCFLAGS = fatalwarning)
803     env_mpi.Append(CCFLAGS = fatalwarning)
804    
805    
806 phornby 2027 Export(
807     ["env",
808     "env_mpi",
809     "clone_env",
810 jfenwick 2827 "dodgy_env",
811 jfenwick 2235 "IS_WINDOWS_PLATFORM",
812     "TestGroups"
813 phornby 2027 ]
814     )
815 ksteube 1705
816 robwdcock 682 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
817 caltinay 2810 env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
818 ksteube 1705 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
819 caltinay 2810 env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
820 ksteube 1705 env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
821 phornby 1628 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
822 robwdcock 682 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
823     env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)
824 gross 707 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)
825 matt 863 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
826 gross 898 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
827 matt 863 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
828 ksteube 1756 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
829 artak 2161 env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
830 phornby 1243
831 jfenwick 2235
832 ksteube 1705 ############ Remember what optimizations we used ###############
833 phornby 1243
834 ksteube 1705 remember_list = []
835 phornby 1243
836 ksteube 1705 if env['usedebug']:
837 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
838 ksteube 1705
839     if env['usempi']:
840 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
841 ksteube 1705
842 jfenwick 2302 if env['useopenmp']:
843 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
844 ksteube 1705
845     env.Alias('remember_options', remember_list)
846    
847 jfenwick 2297
848     ############### Record python interpreter version ##############
849    
850     if not IS_WINDOWS_PLATFORM:
851 gross 2748
852 jfenwick 2297 versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
853 gross 2748 if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
854 jfenwick 2302 os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
855 jfenwick 2297
856 jfenwick 2302 ############## Populate the buildvars file #####################
857    
858     buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
859     buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
860    
861     # Find the boost version by extracting it from version.hpp
862     boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
863     boostversion='unknown'
864     try:
865     for line in boosthpp:
866     ver=re.match(r'#define BOOST_VERSION (\d+)',line)
867     if ver:
868     boostversion=ver.group(1)
869     except StopIteration:
870     pass
871     buildvars.write("boost="+boostversion+"\n")
872     buildvars.write("svn_revision="+str(global_revision)+"\n")
873     out="usedebug="
874     if env['usedebug']:
875     out+="y"
876     else:
877     out+="n"
878     out+="\nusempi="
879     if env['usempi']:
880     out+="y"
881     else:
882     out+="n"
883     out+="\nuseopenmp="
884     if env['useopenmp']:
885     out+="y"
886     else:
887     out+="n"
888     buildvars.write(out+"\n")
889 jfenwick 2338 buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
890 caltinay 2810 out="lapack="
891 jfenwick 2742 if env['uselapack']:
892 caltinay 2810 out+="y"
893 jfenwick 2742 else:
894 caltinay 2810 out+="n"
895     out+="\nsilo="
896     if env['usesilo']:
897     out+="y"
898     else:
899     out+="n"
900     buildvars.write(out+"\n")
901 jfenwick 2302 buildvars.close()
902    
903    
904 ksteube 1705 ############ Targets to build and install libraries ############
905    
906     target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
907     env.Alias('target_init', [target_init])
908    
909     # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>
910     env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])
911     env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])
912    
913     env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
914     env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
915    
916 caltinay 2812 env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
917     env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
918 caltinay 2810
919 caltinay 2910 env.Alias('build_escriptreader', ['target_install_escriptexport_headers', 'target_escriptreader_a'])
920     env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
921    
922 ksteube 1705 env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
923     env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
924    
925     env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])
926     env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])
927    
928     # Now gather all the above into a couple easy targets: build_all and install_all
929     build_all_list = []
930     build_all_list += ['build_esysUtils']
931     build_all_list += ['build_paso']
932 caltinay 2810 build_all_list += ['build_dataexporter']
933 ksteube 1705 build_all_list += ['build_escript']
934     build_all_list += ['build_finley']
935 ksteube 1756 if env['usempi']: build_all_list += ['target_pythonMPI_exe']
936 jfenwick 2409 #if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
937 caltinay 2930 build_all_list += ['target_escriptconvert']
938 ksteube 1705 env.Alias('build_all', build_all_list)
939    
940     install_all_list = []
941     install_all_list += ['target_init']
942     install_all_list += ['install_esysUtils']
943     install_all_list += ['install_paso']
944 caltinay 2810 install_all_list += ['install_dataexporter']
945 ksteube 1705 install_all_list += ['install_escript']
946     install_all_list += ['install_finley']
947     install_all_list += ['target_install_pyvisi_py']
948     install_all_list += ['target_install_modellib_py']
949     install_all_list += ['target_install_pycad_py']
950 ksteube 1756 if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
951 jfenwick 2409 #if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
952 caltinay 2810 if env['usesilo']: install_all_list += ['target_install_escriptconvert']
953 ksteube 1705 install_all_list += ['remember_options']
954     env.Alias('install_all', install_all_list)
955    
956     # Default target is install
957     env.Default('install_all')
958    
959     ############ Targets to build and run the test suite ###########
960    
961     env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])
962     env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
963     env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
964     env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
965 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
966 ksteube 1705
967 artak 2820
968 ksteube 1705 ############ Targets to build the documentation ################
969    
970 jfenwick 2531 env.Alias('api_epydoc','install_all')
971    
972 jfenwick 2923 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
973 ksteube 1705
974 jfenwick 2879 build_platform=os.name
975    
976 jfenwick 2235 if not IS_WINDOWS_PLATFORM:
977     try:
978     utest=open("utest.sh","w")
979 jfenwick 2879 #Sometimes Mac python says it is posix
980 jfenwick 2276 if (build_platform=='posix') and platform.system()=="Darwin":
981     build_platform='darwin'
982     utest.write(GroupTest.makeHeader(build_platform))
983 jfenwick 2235 for tests in TestGroups:
984     utest.write(tests.makeString())
985     utest.close()
986 jfenwick 2299 os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
987 jfenwick 2235 print "utest.sh written"
988     except IOError:
989     print "Error attempting to write unittests file."
990     sys.exit(1)
991    
992 jfenwick 2604 #Make sure that the escript wrapper is in place
993     if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
994     print "Copying escript wrapper"
995     shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
996 artak 2820
997     ############ Targets to build PasoTests suite ################
998    
999     env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1000 jfenwick 2923
1001 caltinay 2930 env.Alias('release_prep', ['docs', 'install_all'])

  ViewVC Help
Powered by ViewVC 1.1.26