/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2810 - (hide annotations)
Mon Dec 7 04:13:49 2009 UTC (9 years, 8 months ago) by caltinay
File size: 38366 byte(s)
Reincarnation of the escriptreader as a more flexible escriptexport library:
 - can be initialised with instances of escript::Data and Finley_Mesh
 - is now MPI aware at the EscriptDataset level including Silo writer
 - now uses boost shared pointers
The lib is currently only used by the escriptconvert tool but this is going to
change...

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

  ViewVC Help
Powered by ViewVC 1.1.26