/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2729 - (hide annotations)
Thu Oct 22 01:45:28 2009 UTC (10 years ago) by jfenwick
File size: 36898 byte(s)
UMFPack and MPI added to guineapig options.
Defaults for omp and mpi removed from SConstruct.

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

  ViewVC Help
Powered by ViewVC 1.1.26