/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2882 - (hide annotations)
Thu Jan 28 02:27:49 2010 UTC (9 years, 8 months ago) by caltinay
File size: 39265 byte(s)
Scons now allows to specify which C & C++ compiler to use via cc and cxx
variables. Fixes mantis # 485.

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

  ViewVC Help
Powered by ViewVC 1.1.26