/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2827 - (hide annotations)
Fri Dec 18 03:41:09 2009 UTC (8 years, 4 months ago) by jfenwick
File size: 38948 byte(s)
There is now a mechanism to pass a C function into escript and invoke it on each datapoint with:

applyBinaryCFunction

Warning in order to use this function your escript must be compiled with 
scons ...  iknowwhatimdoing=yes

---------------------
Because this code relies on casts that the C standard does not allow some code has been moved into Dodgy{.h .cpp}

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

  ViewVC Help
Powered by ViewVC 1.1.26