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

Annotation of /branches/refine/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3076 - (hide annotations)
Mon Aug 2 05:21:40 2010 UTC (8 years, 10 months ago) by jfenwick
Original Path: trunk/SConstruct
File size: 39855 byte(s)
Removing hardcoded savanna from the SConstruct file.

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

  ViewVC Help
Powered by ViewVC 1.1.26