/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2604 - (hide annotations)
Wed Aug 12 01:21:46 2009 UTC (9 years, 6 months ago) by jfenwick
File size: 36532 byte(s)
The prefix option for building escript now works correctly.
This fixes mantis issue #362.

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

  ViewVC Help
Powered by ViewVC 1.1.26