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

Annotation of /branches/refine/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2923 - (hide annotations)
Thu Feb 4 04:05:36 2010 UTC (9 years, 4 months ago) by jfenwick
Original Path: trunk/SConstruct
File size: 39485 byte(s)
Bringing non-release specific things from stage3.1 r2922 back to trunk

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

  ViewVC Help
Powered by ViewVC 1.1.26