/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3039 - (hide annotations)
Tue Jun 15 07:21:56 2010 UTC (8 years, 8 months ago) by caltinay
File size: 39852 byte(s)
Fix the NetCDF 4.1 issue (hopefully) - MPICH and IntelMPI have the required
definition.

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 3037 # weipa 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 caltinay 3039 # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
710     # On the other hand MPT and OpenMPI don't define the latter so we have to
711     # do that here
712     if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
713     env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
714 ksteube 1312 else:
715 ksteube 1705 conf.Finish()
716 ksteube 1312
717 ksteube 1705 env['usempi'] = env_mpi['usempi']
718 ksteube 1312
719 ksteube 1705 ############ ParMETIS (optional) ###############################
720 gross 700
721 ksteube 1705 # Start a new configure environment that reflects what we've already found
722     conf = Configure(clone_env(env_mpi))
723 gross 700
724 ksteube 1705 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0
725 gross 700
726 ksteube 1705 if env_mpi['useparmetis']:
727     conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
728     conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
729     conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']])
730 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_lib_path']) # The wrapper script needs to find these libs
731 jfenwick 2296 #ensure that our path entries remain at the front
732     conf.env.PrependENVPath('PYTHONPATH', prefix)
733 gross 2423 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
734 gross 707
735 ksteube 1705 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
736     if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
737 elspeth 712
738 ksteube 1705 # Add ParMETIS to environment env_mpi if it was found
739     if env_mpi['useparmetis']:
740     env_mpi = conf.Finish()
741     env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])
742     else:
743     conf.Finish()
744 ksteube 1215
745 ksteube 1705 env['useparmetis'] = env_mpi['useparmetis']
746 ksteube 1247
747 ksteube 1705 ############ Summarize our environment #########################
748 phornby 1243
749 ksteube 1705 print ""
750     print "Summary of configuration (see ./config.log for information)"
751     print " Using python libraries"
752 jfenwick 2458 print " Using numpy"
753 ksteube 1705 print " Using boost"
754     if env['usenetcdf']: print " Using NetCDF"
755     else: print " Not using NetCDF"
756     if env['usevtk']: print " Using VTK"
757     else: print " Not using VTK"
758     if env['usemkl']: print " Using MKL"
759     else: print " Not using MKL"
760     if env['useumfpack']: print " Using UMFPACK"
761     else: print " Not using UMFPACK"
762 caltinay 2184 if env['usesilo']: print " Using Silo"
763     else: print " Not using Silo"
764 ksteube 1705 if env['useopenmp']: print " Using OpenMP"
765     else: print " Not using OpenMP"
766 gross 2356 if env['usempi']: print " Using MPI (flavour = %s)"%env['mpi_flavour']
767 ksteube 1705 else: print " Not using MPI"
768     if env['useparmetis']: print " Using ParMETIS"
769     else: print " Not using ParMETIS (requires MPI)"
770     if env['usepapi']: print " Using PAPI"
771     else: print " Not using PAPI"
772 jfenwick 2787 if env['uselapack']: print " Using Lapack"
773     else: print " Not using Lapack"
774 ksteube 1705 if env['usedebug']: print " Compiling for debug"
775     else: print " Not compiling for debug"
776     print " Installing in", prefix
777 jfenwick 2026 if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
778     else: print " Not treating warnings as errors"
779 ksteube 1705 print ""
780 phornby 1243
781 ksteube 1756 ############ Delete option-dependent files #####################
782    
783 jfenwick 2324 Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
784     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
785     Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
786     Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
787     Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
788     if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
789 ksteube 1756
790 phornby 1243
791 ksteube 1756 ############ Build the subdirectories ##########################
792 robwdcock 682
793 jfenwick 2827 if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
794    
795    
796 jfenwick 2235 from grouptest import *
797    
798     TestGroups=[]
799    
800 jfenwick 2827 dodgy_env=clone_env(env_mpi) # Environment without pedantic options
801    
802     ############ Now we switch on Warnings as errors ###############
803    
804     #this needs to be done after configuration because the scons test files have warnings in them
805    
806     if ((fatalwarning != "") and (env['usewarnings'])):
807     env.Append(CCFLAGS = fatalwarning)
808     env_mpi.Append(CCFLAGS = fatalwarning)
809    
810    
811 phornby 2027 Export(
812     ["env",
813     "env_mpi",
814     "clone_env",
815 jfenwick 2827 "dodgy_env",
816 jfenwick 2235 "IS_WINDOWS_PLATFORM",
817     "TestGroups"
818 phornby 2027 ]
819     )
820 ksteube 1705
821 robwdcock 682 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
822 caltinay 2810 env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
823 ksteube 1705 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
824 caltinay 3037 env.SConscript(dirs = ['weipa/src'], build_dir='build/$PLATFORM/weipa', duplicate=0)
825 ksteube 1705 env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
826 phornby 1628 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
827 robwdcock 682 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
828     env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)
829 gross 707 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)
830 matt 863 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
831 gross 898 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
832 matt 863 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
833 ksteube 1756 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
834 artak 2161 env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
835 phornby 1243
836 jfenwick 2235
837 ksteube 1705 ############ Remember what optimizations we used ###############
838 phornby 1243
839 ksteube 1705 remember_list = []
840 phornby 1243
841 ksteube 1705 if env['usedebug']:
842 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
843 ksteube 1705
844     if env['usempi']:
845 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
846 ksteube 1705
847 jfenwick 2302 if env['useopenmp']:
848 jfenwick 2324 remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
849 ksteube 1705
850     env.Alias('remember_options', remember_list)
851    
852 jfenwick 2297
853     ############### Record python interpreter version ##############
854    
855     if not IS_WINDOWS_PLATFORM:
856 gross 2748
857 jfenwick 2297 versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
858 gross 2748 if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
859 jfenwick 2302 os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
860 jfenwick 2297
861 jfenwick 2302 ############## Populate the buildvars file #####################
862    
863     buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
864     buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
865    
866     # Find the boost version by extracting it from version.hpp
867     boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
868     boostversion='unknown'
869     try:
870     for line in boosthpp:
871     ver=re.match(r'#define BOOST_VERSION (\d+)',line)
872     if ver:
873     boostversion=ver.group(1)
874     except StopIteration:
875     pass
876     buildvars.write("boost="+boostversion+"\n")
877     buildvars.write("svn_revision="+str(global_revision)+"\n")
878     out="usedebug="
879     if env['usedebug']:
880     out+="y"
881     else:
882     out+="n"
883     out+="\nusempi="
884     if env['usempi']:
885     out+="y"
886     else:
887     out+="n"
888     out+="\nuseopenmp="
889     if env['useopenmp']:
890     out+="y"
891     else:
892     out+="n"
893     buildvars.write(out+"\n")
894 jfenwick 2338 buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
895 caltinay 2810 out="lapack="
896 jfenwick 2742 if env['uselapack']:
897 caltinay 2810 out+="y"
898 jfenwick 2742 else:
899 caltinay 2810 out+="n"
900     out+="\nsilo="
901     if env['usesilo']:
902     out+="y"
903     else:
904     out+="n"
905     buildvars.write(out+"\n")
906 jfenwick 2302 buildvars.close()
907    
908    
909 ksteube 1705 ############ Targets to build and install libraries ############
910    
911     target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
912     env.Alias('target_init', [target_init])
913    
914     # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>
915     env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])
916     env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])
917    
918     env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
919     env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
920    
921 caltinay 3037 env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
922     env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
923 caltinay 2810
924 caltinay 3037 env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
925 caltinay 2910 env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
926    
927 ksteube 1705 env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
928     env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
929    
930     env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])
931     env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])
932    
933     # Now gather all the above into a couple easy targets: build_all and install_all
934     build_all_list = []
935     build_all_list += ['build_esysUtils']
936     build_all_list += ['build_paso']
937 caltinay 3037 build_all_list += ['build_weipa']
938 ksteube 1705 build_all_list += ['build_escript']
939     build_all_list += ['build_finley']
940 ksteube 1756 if env['usempi']: build_all_list += ['target_pythonMPI_exe']
941 jfenwick 2409 #if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
942 caltinay 2930 build_all_list += ['target_escriptconvert']
943 ksteube 1705 env.Alias('build_all', build_all_list)
944    
945     install_all_list = []
946     install_all_list += ['target_init']
947     install_all_list += ['install_esysUtils']
948     install_all_list += ['install_paso']
949 caltinay 3037 install_all_list += ['install_weipa']
950 ksteube 1705 install_all_list += ['install_escript']
951     install_all_list += ['install_finley']
952     install_all_list += ['target_install_pyvisi_py']
953     install_all_list += ['target_install_modellib_py']
954     install_all_list += ['target_install_pycad_py']
955 ksteube 1756 if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']
956 jfenwick 2409 #if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
957 caltinay 2810 if env['usesilo']: install_all_list += ['target_install_escriptconvert']
958 ksteube 1705 install_all_list += ['remember_options']
959     env.Alias('install_all', install_all_list)
960    
961     # Default target is install
962     env.Default('install_all')
963    
964     ############ Targets to build and run the test suite ###########
965    
966     env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])
967     env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
968     env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
969     env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
970 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
971 ksteube 1705
972 artak 2820
973 ksteube 1705 ############ Targets to build the documentation ################
974    
975 jfenwick 2531 env.Alias('api_epydoc','install_all')
976    
977 jfenwick 2923 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
978 ksteube 1705
979 jfenwick 2879 build_platform=os.name
980    
981 jfenwick 2235 if not IS_WINDOWS_PLATFORM:
982     try:
983     utest=open("utest.sh","w")
984 jfenwick 2879 #Sometimes Mac python says it is posix
985 jfenwick 2276 if (build_platform=='posix') and platform.system()=="Darwin":
986     build_platform='darwin'
987     utest.write(GroupTest.makeHeader(build_platform))
988 jfenwick 2235 for tests in TestGroups:
989     utest.write(tests.makeString())
990     utest.close()
991 jfenwick 2299 os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
992 jfenwick 2235 print "utest.sh written"
993     except IOError:
994     print "Error attempting to write unittests file."
995     sys.exit(1)
996    
997 jfenwick 2604 #Make sure that the escript wrapper is in place
998     if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
999     print "Copying escript wrapper"
1000     shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1001 artak 2820
1002     ############ Targets to build PasoTests suite ################
1003    
1004     env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1005 jfenwick 2923
1006 caltinay 2930 env.Alias('release_prep', ['docs', 'install_all'])

  ViewVC Help
Powered by ViewVC 1.1.26