/[escript]/branches/stage3.1/SConstruct
ViewVC logotype

Annotation of /branches/stage3.1/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2901 - (hide annotations)
Mon Feb 1 06:20:24 2010 UTC (10 years ago) by jfenwick
File size: 38533 byte(s)
Package will now register its doco with debian.
The dependency on doc-base has been added.

There is now a release_prep target on scons which builds both 
libraries and doco.

Most of the use of chdir= in scons has been removed.
Options files added for generic debian python 2.5 and 2.6

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

  ViewVC Help
Powered by ViewVC 1.1.26