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

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5084 - (hide annotations)
Sun Jun 29 23:29:51 2014 UTC (4 years, 8 months ago) by caltinay
File size: 29489 byte(s)
Fast forward to latest trunk which has had an impressive number of changes...

1 jfenwick 3982 ##############################################################################
2 jgs 214 #
3 jfenwick 4657 # Copyright (c) 2003-2014 by University of Queensland
4 jfenwick 3982 # http://www.uq.edu.au
5 ksteube 1811 #
6     # Primary Business: Queensland, Australia
7     # Licensed under the Open Software License version 3.0
8     # http://www.opensource.org/licenses/osl-3.0.php
9     #
10 jfenwick 3982 # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11 jfenwick 4657 # Development 2012-2013 by School of Earth Sciences
12     # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13 jfenwick 3982 #
14     ##############################################################################
15 jgs 455
16 jfenwick 3259 EnsureSConsVersion(0,98,1)
17     EnsurePythonVersion(2,5)
18 ksteube 1811
19 caltinay 4295 import atexit, sys, os, platform, re
20 jfenwick 3259 from distutils import sysconfig
21 caltinay 4295 from dependencies import *
22 jfenwick 3259 from site_init import *
23 jgs 214
24 jfenwick 3259 # Version number to check for in options file. Increment when new features are
25     # added or existing options changed.
26 caltinay 5064 REQUIRED_OPTS_VERSION=202
27 ksteube 1705
28     # MS Windows support, many thanks to PH
29 jfenwick 3259 IS_WINDOWS = (os.name == 'nt')
30 gross 806
31 jfenwick 4640 IS_OSX = (os.uname()[0] == 'Darwin')
32    
33 jfenwick 3259 ########################## Determine options file ############################
34     # 1. command line
35     # 2. scons/<hostname>_options.py
36     # 3. name as part of a cluster
37 jfenwick 2391 options_file=ARGUMENTS.get('options_file', None)
38     if not options_file:
39 jfenwick 3259 ext_dir = os.path.join(os.getcwd(), 'scons')
40     hostname = platform.node().split('.')[0]
41     for name in hostname, effectiveName(hostname):
42     mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
43     options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
44     if os.path.isfile(options_file): break
45 jfenwick 2391
46 ksteube 1866 if not os.path.isfile(options_file):
47 jfenwick 3259 print("\nWARNING:\nOptions file %s" % options_file)
48     print("not found! Default options will be used which is most likely suboptimal.")
49 jduplessis 4889 print("We recommend that you copy the most relavent options file in the scons/os/")
50 jfenwick 3259 print("subdirectory and customize it to your needs.\n")
51     options_file = None
52 ksteube 1217
53 jfenwick 3259 ############################### Build options ################################
54 gross 1149
55 jfenwick 3259 default_prefix='/usr'
56 jfenwick 3618 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57 jfenwick 3259 lapack_flavours=('none', 'clapack', 'mkl')
58 jfenwick 2430
59 jfenwick 3259 vars = Variables(options_file, ARGUMENTS)
60     vars.AddVariables(
61     PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
62     PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
63 caltinay 3349 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
64 jfenwick 3259 BoolVariable('verbose', 'Output full compile/link lines', False),
65     # Compiler/Linker options
66     ('cxx', 'Path to C++ compiler', 'default'),
67 caltinay 4520 ('cc_flags', 'Base C++ compiler flags', 'default'),
68     ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
69     ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
70 caltinay 2967 ('cxx_extra', 'Extra C++ compiler flags', ''),
71 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
72 caltinay 5053 ('nvcc', 'Path to CUDA compiler', 'default'),
73     ('nvccflags', 'Base CUDA compiler flags', 'default'),
74 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
75     BoolVariable('debug', 'Compile with debug flags', False),
76     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
77     ('omp_flags', 'OpenMP compiler flags', 'default'),
78     ('omp_ldflags', 'OpenMP linker flags', 'default'),
79     # Mandatory libraries
80     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82 caltinay 3597 # Mandatory for tests
83     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85 jfenwick 3259 # Optional libraries and options
86     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
88     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
89     BoolVariable('netcdf', 'Enable netCDF file support', False),
90     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
91     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
92     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
93     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
94     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
95     BoolVariable('papi', 'Enable PAPI', False),
96     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
97 ksteube 1705 ('papi_libs', 'PAPI libraries to link with', ['papi']),
98 jfenwick 3259 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
99     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
100     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
101     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
102     BoolVariable('umfpack', 'Enable UMFPACK', False),
103     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
104     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
105 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
106     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
107     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
108 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
109     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
110     ('lapack_libs', 'LAPACK libraries to link with', []),
111     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
112     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
113 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
114 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
115     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
116     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
117 jfenwick 3506 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
118 caltinay 5053 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
119     ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
120 jfenwick 3259 # Advanced settings
121     #dudley_assemble_flags = -funroll-loops to actually do something
122     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
123     # To enable passing function pointers through python
124     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
125     # An option for specifying the compiler tools (see windows branch)
126     ('tools_names', 'Compiler tools to use', ['default']),
127     ('env_export', 'Environment variables to be passed to tools',[]),
128     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
129     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
130     # finer control over library building, intel aggressive global optimisation
131     # works with dynamic libraries on windows.
132 caltinay 3598 ('build_shared', 'Build dynamic libraries only', False),
133 jfenwick 3259 ('sys_libs', 'Extra libraries to link with', []),
134     ('escript_opts_version', 'Version of options file (do not specify on command line)'),
135 jfenwick 3618 ('SVN_VERSION', 'Do not use from options file', -2),
136 jfenwick 3851 ('pythoncmd', 'which python to compile with','python'),
137 jfenwick 3892 ('usepython3', 'Is this a python3 build? (experimental)', False),
138     ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
139 jfenwick 3942 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
140     ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
141 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
142 sshaw 4738 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
143     ('compression_libs', 'Compression libraries to link with', ['boost_iostreams'])
144 robwdcock 682 )
145 phornby 1232
146 jfenwick 3259 ##################### Create environment and help text #######################
147 jfenwick 3078
148 jfenwick 3259 # Intel's compiler uses regular expressions improperly and emits a warning
149     # about failing to find the compilers. This warning can be safely ignored.
150 jfenwick 3078
151 caltinay 3319 # PATH is needed so the compiler, linker and tools are found if they are not
152     # in default locations.
153     env = Environment(tools = ['default'], options = vars,
154     ENV = {'PATH': os.environ['PATH']})
155 jfenwick 3967
156 caltinay 4295 # set the vars for clang
157 jfenwick 3967 def mkclang(env):
158 caltinay 4295 env['CXX']='clang++'
159    
160 caltinay 5084 if env['tools_names'] != ['default']:
161 jfenwick 3967 zz=env['tools_names']
162     if 'clang' in zz:
163     zz.remove('clang')
164     zz.insert(0, mkclang)
165 caltinay 3319 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
166     ENV = {'PATH' : os.environ['PATH']})
167 jfenwick 3078
168 jfenwick 3259 if options_file:
169     opts_valid=False
170     if 'escript_opts_version' in env.Dictionary() and \
171     int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
172     opts_valid=True
173     if opts_valid:
174     print("Using options in %s." % options_file)
175     else:
176     print("\nOptions file %s" % options_file)
177     print("is outdated! Please update the file by examining one of the TEMPLATE")
178     print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
179     Exit(1)
180 jfenwick 3078
181 jfenwick 3259 # Generate help text (scons -h)
182     Help(vars.GenerateHelpText(env))
183 jfenwick 3078
184 jfenwick 3259 # Check for superfluous options
185 caltinay 3268 if len(vars.UnknownVariables())>0:
186     for k in vars.UnknownVariables():
187     print("Unknown option '%s'" % k)
188     Exit(1)
189 jfenwick 3078
190 caltinay 5064 if env['cuda']:
191     env.Tool('nvcc')
192 caltinay 5053
193 caltinay 4295 # create dictionary which will be populated with info for buildvars file
194     env['buildvars']={}
195     # create list which will be populated with warnings if there are any
196     env['warnings']=[]
197    
198 jfenwick 3259 #################### Make sure install directories exist #####################
199 ksteube 1705
200 caltinay 4046 env['BUILD_DIR']=Dir(env['build_dir']).abspath
201 jfenwick 3259 prefix=Dir(env['prefix']).abspath
202 caltinay 4295 env['buildvars']['prefix']=prefix
203 jfenwick 3259 env['incinstall'] = os.path.join(prefix, 'include')
204     env['bininstall'] = os.path.join(prefix, 'bin')
205     env['libinstall'] = os.path.join(prefix, 'lib')
206     env['pyinstall'] = os.path.join(prefix, 'esys')
207 jfenwick 2604 if not os.path.isdir(env['bininstall']):
208     os.makedirs(env['bininstall'])
209     if not os.path.isdir(env['libinstall']):
210     os.makedirs(env['libinstall'])
211     if not os.path.isdir(env['pyinstall']):
212     os.makedirs(env['pyinstall'])
213    
214 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
215     env.Append(LIBPATH = [env['libinstall']])
216 jfenwick 2603
217 jfenwick 3259 ################# Fill in compiler options if not set above ##################
218 ksteube 1312
219 jfenwick 3259 if env['cxx'] != 'default': env['CXX']=env['cxx']
220 gross 1024
221 caltinay 5053 if env['nvcc'] != 'default':
222     env['NVCC'] = env['nvcc']
223     else:
224     env['NVCC'] = 'nvcc'
225    
226 jfenwick 3259 # version >=9 of intel C++ compiler requires use of icpc to link in C++
227     # runtimes (icc does not)
228     if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
229     env['LINK'] = env['CXX']
230 phornby 1243
231 jfenwick 3259 # default compiler/linker options
232     cc_flags = ''
233     cc_optim = ''
234     cc_debug = ''
235     omp_flags = ''
236     omp_ldflags = ''
237     fatalwarning = '' # switch to turn warnings into errors
238     sysheaderopt = '' # how to indicate that a header is a system header
239 jfenwick 2130
240 jfenwick 3259 # env['CC'] might be a full path
241 caltinay 4520 cc_name=os.path.basename(env['CXX'])
242 caltinay 2882
243 caltinay 4520 if cc_name == 'icpc':
244 jfenwick 3259 # Intel compiler
245 caltinay 4090 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
246 jfenwick 4542 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
247 caltinay 4775 cc_flags = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
248 caltinay 4877 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
249 jfenwick 3259 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
250 caltinay 4090 omp_flags = "-openmp"
251     omp_ldflags = "-openmp -openmp_report=1"
252 jfenwick 3259 fatalwarning = "-Werror"
253 caltinay 4520 elif cc_name[:3] == 'g++':
254 jfenwick 3259 # GNU C on any system
255 caltinay 4173 # note that -ffast-math is not used because it breaks isnan(),
256     # see mantis #691
257 caltinay 4775 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
258 jfenwick 3259 cc_optim = "-O3"
259 sshaw 4820 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
260 jfenwick 3259 omp_flags = "-fopenmp"
261     omp_ldflags = "-fopenmp"
262     fatalwarning = "-Werror"
263     sysheaderopt = "-isystem"
264     elif cc_name == 'cl':
265     # Microsoft Visual C on Windows
266     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
267     cc_optim = "/O2 /Op /W3"
268     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
269     fatalwarning = "/WX"
270     elif cc_name == 'icl':
271     # Intel C on Windows
272     cc_flags = '/EHsc /GR /MD'
273     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
274     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
275     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
276     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
277 phornby 1243
278 caltinay 4295 env['sysheaderopt']=sysheaderopt
279    
280 jfenwick 3259 # set defaults if not otherwise specified
281     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
282     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
283     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
284     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
285     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
286     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
287     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
288 jfenwick 2130
289 caltinay 5053 if env['nvccflags'] != 'default':
290     env['NVCCFLAGS'] = env['nvccflags']
291 caltinay 5064 env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
292 caltinay 5053
293 jfenwick 3961 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
294    
295 jfenwick 3892 if env['usepython3']:
296     env.Append(CPPDEFINES=['ESPYTHON3'])
297    
298 jfenwick 3259 # set up the autolazy values
299     if env['forcelazy'] == 'on':
300     env.Append(CPPDEFINES=['FAUTOLAZYON'])
301     elif env['forcelazy'] == 'off':
302     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
303 ksteube 1312
304 jfenwick 3259 # set up the collective resolve values
305     if env['forcecollres'] == 'on':
306     env.Append(CPPDEFINES=['FRESCOLLECTON'])
307     elif env['forcecollres'] == 'off':
308     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
309 jfenwick 2273
310 jfenwick 3259 # allow non-standard C if requested
311 jfenwick 2827 if env['iknowwhatimdoing']:
312 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
313 jfenwick 2827
314 jfenwick 3259 # Disable OpenMP if no flags provided
315     if env['openmp'] and env['omp_flags'] == '':
316 caltinay 4295 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
317 jfenwick 3259 env['openmp'] = False
318 gross 1160
319 jfenwick 3259 if env['openmp']:
320     env.Append(CCFLAGS = env['omp_flags'])
321     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
322     else:
323     env['omp_flags']=''
324     env['omp_ldflags']=''
325 ksteube 1312
326 caltinay 4295 env['buildvars']['openmp']=int(env['openmp'])
327    
328 jfenwick 3259 # add debug/non-debug compiler flags
329 caltinay 4295 env['buildvars']['debug']=int(env['debug'])
330 jfenwick 3259 if env['debug']:
331     env.Append(CCFLAGS = env['cc_debug'])
332 gross 2423 else:
333 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
334 gross 1163
335 jfenwick 3259 # always add cc_flags
336     env.Append(CCFLAGS = env['cc_flags'])
337 phornby 1243
338 jfenwick 3259 # add system libraries
339     env.AppendUnique(LIBS = env['sys_libs'])
340 gross 2363
341 caltinay 4295 # determine svn revision
342 jfenwick 3618 global_revision=ARGUMENTS.get('SVN_VERSION', None)
343     if global_revision:
344     global_revision = re.sub(':.*', '', global_revision)
345     global_revision = re.sub('[^0-9]', '', global_revision)
346     if global_revision == '': global_revision='-2'
347     else:
348     # Get the global Subversion revision number for the getVersion() method
349     try:
350 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
351     global_revision = re.sub(':.*', '', global_revision)
352     global_revision = re.sub('[^0-9]', '', global_revision)
353     if global_revision == '': global_revision='-2'
354 jfenwick 3618 except:
355 jfenwick 3259 global_revision = '-1'
356 caltinay 3271 env['svn_revision']=global_revision
357 caltinay 4295 env['buildvars']['svn_revision']=global_revision
358 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
359 gross 2363
360 jfenwick 3259 if IS_WINDOWS:
361 caltinay 3602 if not env['build_shared']:
362 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
363     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
364 gross 2363
365 caltinay 4295 # VSL random numbers
366     env['buildvars']['vsl_random']=int(env['vsl_random'])
367     if env['vsl_random']:
368     env.Append(CPPDEFINES = ['MKLRANDOM'])
369    
370     env['IS_WINDOWS']=IS_WINDOWS
371    
372 jfenwick 3259 ###################### Copy required environment vars ########################
373 gross 2363
374 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
375     if IS_WINDOWS:
376     LD_LIBRARY_PATH_KEY='PATH'
377     env['ENV']['LD_LIBRARY_PATH']=''
378     else:
379     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
380 robwdcock 682
381 caltinay 4295 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
382    
383 caltinay 3319 # the following env variables are exported for the unit tests
384 phornby 1244
385 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
386     try:
387     env['ENV'][key] = os.environ[key]
388     except KeyError:
389 caltinay 5084 env['ENV'][key] = '1'
390 robwdcock 682
391 jfenwick 3259 env_export=env['env_export']
392 caltinay 4917 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
393 robwdcock 682
394 jfenwick 3259 for key in set(env_export):
395     try:
396     env['ENV'][key] = os.environ[key]
397     except KeyError:
398     pass
399 ksteube 1312
400 jfenwick 3259 try:
401     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
402     except KeyError:
403     pass
404 ksteube 1312
405 jfenwick 4640 if IS_OSX:
406     try:
407     env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
408     except KeyError:
409     pass
410    
411    
412 jfenwick 3259 # these shouldn't be needed
413     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
414     # try:
415     # env['ENV'][key] = os.environ[key]
416     # except KeyError:
417     # pass
418 ksteube 1312
419 jfenwick 3259 try:
420     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
421     except KeyError:
422     pass
423 ksteube 1312
424 jfenwick 3259 ######################## Add some custom builders ############################
425 ksteube 1312
426 jfenwick 3851 if env['pythoncmd']=='python':
427     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
428     else:
429 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
430 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
431 gross 2423
432 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
433     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
434 gross 2423
435 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
436     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
437 ksteube 1756
438 caltinay 5084 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
439     env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
440    
441 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
442     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
443 ksteube 817
444 jfenwick 3259 ############################ Dependency checks ###############################
445 phornby 1246
446 caltinay 4295 ######## Compiler
447     env=checkCompiler(env)
448 phornby 1634
449 jfenwick 3259 ######## Python headers & library (required)
450 caltinay 4295 env=checkPython(env)
451 gross 806
452 caltinay 4295 ######## boost & boost-python (required)
453     env=checkBoost(env)
454 jfenwick 3892
455 caltinay 4295 ######## numpy (required) and numpy headers (optional)
456     env=checkNumpy(env)
457 jfenwick 3892
458 caltinay 3597 ######## CppUnit (required for tests)
459 caltinay 4295 env=checkCppUnit(env)
460 caltinay 3597
461 caltinay 4295 ######## optional python modules (sympy, pyproj)
462     env=checkOptionalModules(env)
463 caltinay 3597
464 caltinay 4295 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
465     env=checkOptionalLibraries(env)
466 caltinay 3975
467 caltinay 3604 ######## PDFLaTeX (for documentation)
468 caltinay 4295 env=checkPDFLatex(env)
469 caltinay 3604
470 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
471     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
472     env.PrependENVPath('PYTHONPATH', prefix)
473     env['ENV']['ESCRIPT_ROOT'] = prefix
474 ksteube 1705
475 jfenwick 3259 if not env['verbose']:
476     env['CXXCOMSTR'] = "Compiling $TARGET"
477     env['SHCXXCOMSTR'] = "Compiling $TARGET"
478     env['ARCOMSTR'] = "Linking $TARGET"
479     env['LINKCOMSTR'] = "Linking $TARGET"
480     env['SHLINKCOMSTR'] = "Linking $TARGET"
481 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
482     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
483     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
484     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
485 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
486 ksteube 1705
487 jfenwick 3259 ####################### Configure the subdirectories #########################
488 ksteube 1247
489 caltinay 4295 # remove obsolete files
490     if not env['usempi']:
491     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
492     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
493    
494 jfenwick 2235 from grouptest import *
495     TestGroups=[]
496    
497 jfenwick 3259 # keep an environment without warnings-as-errors
498     dodgy_env=env.Clone()
499 jfenwick 2827
500 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
501     # because the scons test files have warnings in them
502     if ((fatalwarning != '') and (env['werror'])):
503     env.Append(CCFLAGS = fatalwarning)
504 jfenwick 2827
505 phornby 2027 Export(
506 jfenwick 3259 ['env',
507     'dodgy_env',
508     'IS_WINDOWS',
509     'TestGroups'
510     ]
511     )
512 ksteube 1705
513 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
514     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
515     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
516 jfenwick 4508 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
517    
518     #This will pull in the escriptcore/py_src and escriptcore/test
519     env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
520     #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
521 caltinay 3349 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
522 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
523 caltinay 3349 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
524     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
525 caltinay 3792 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
526 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
527 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
528     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
529     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
530 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
531 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
532 phornby 1243
533 jfenwick 3892
534 jfenwick 3259 ######################## Populate the buildvars file #########################
535 jfenwick 2235
536 caltinay 4295 write_buildvars(env)
537 phornby 1243
538 jfenwick 3259 ################### Targets to build and install libraries ###################
539 jfenwick 2302
540 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
541 ksteube 1705 env.Alias('target_init', [target_init])
542 caltinay 3604 # delete buildvars upon cleanup
543     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
544 ksteube 1705
545 caltinay 5053 cusphdr_inst = env.Install(env['incinstall'], Dir('#cusplibrary/cusp'))
546     env.Alias('install_cusp_headers', cusphdr_inst)
547 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
548     # #include <paso/Common.h>
549     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
550     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
551 ksteube 1705
552 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
553     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
554 ksteube 1705
555 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
556 jfenwick 4508 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
557 caltinay 2810
558 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
559     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
560    
561 jfenwick 3259 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
562     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
563 caltinay 3096
564 jfenwick 3259 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
565     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
566 caltinay 2910
567 caltinay 5053 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
568 caltinay 3792 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
569    
570 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
571     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
572 ksteube 1705
573 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
574     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
575 ksteube 1705
576 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
577 ksteube 1705 build_all_list = []
578     build_all_list += ['build_esysUtils']
579     build_all_list += ['build_paso']
580     build_all_list += ['build_escript']
581 jfenwick 3675 build_all_list += ['build_pasowrap']
582 jfenwick 3259 build_all_list += ['build_dudley']
583 ksteube 1705 build_all_list += ['build_finley']
584 caltinay 3792 build_all_list += ['build_ripley']
585 jfenwick 3259 build_all_list += ['build_weipa']
586     if not IS_WINDOWS: build_all_list += ['build_escriptreader']
587     if env['usempi']: build_all_list += ['build_pythonMPI']
588     build_all_list += ['build_escriptconvert']
589 ksteube 1705 env.Alias('build_all', build_all_list)
590    
591     install_all_list = []
592     install_all_list += ['target_init']
593     install_all_list += ['install_esysUtils']
594     install_all_list += ['install_paso']
595     install_all_list += ['install_escript']
596 jfenwick 3675 install_all_list += ['install_pasowrap']
597 jfenwick 3259 install_all_list += ['install_dudley']
598 ksteube 1705 install_all_list += ['install_finley']
599 caltinay 3792 install_all_list += ['install_ripley']
600 jfenwick 3259 install_all_list += ['install_weipa']
601     if not IS_WINDOWS: install_all_list += ['install_escriptreader']
602 caltinay 3947 install_all_list += ['install_downunder_py']
603 jfenwick 3259 install_all_list += ['install_modellib_py']
604     install_all_list += ['install_pycad_py']
605     if env['usempi']: install_all_list += ['install_pythonMPI']
606     install_all_list += ['install_escriptconvert']
607 ksteube 1705 env.Alias('install_all', install_all_list)
608    
609     # Default target is install
610     env.Default('install_all')
611    
612 jfenwick 3259 ################## Targets to build and run the test suite ###################
613 ksteube 1705
614 caltinay 3597 if not env['cppunit']:
615 caltinay 4520 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
616 caltinay 3597 env.Alias('run_tests', test_msg)
617 caltinay 4249 env.Alias('build_tests', '')
618 caltinay 3597 env.Alias('run_tests', ['install_all'])
619     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
620 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
621 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
622 ksteube 1705
623 jfenwick 3259 ##################### Targets to build the documentation #####################
624 artak 2820
625 jfenwick 4244 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
626     env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
627 jfenwick 4167 env.Alias('docs', ['basedocs', 'sphinxdoc'])
628 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
629 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
630 ksteube 1705
631 jfenwick 4078 # The test scripts are always generated, this target allows us to
632     # generate the testscripts without doing a full build
633     env.Alias('testscripts',[])
634    
635 jfenwick 3259 if not IS_WINDOWS:
636 caltinay 4295 generateTestScripts(env, TestGroups)
637 jfenwick 2879
638 caltinay 3604
639 jfenwick 2235
640 caltinay 4295 ######################## Summarize our environment ###########################
641     def print_summary():
642     print("")
643 caltinay 4299 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
644 caltinay 4295 print("Escript/Finley revision %s"%global_revision)
645     print(" Install prefix: %s"%env['prefix'])
646     print(" Python: %s"%sysconfig.PREFIX)
647     print(" boost: %s"%env['boost_prefix'])
648 caltinay 4299 if env['numpy_h']:
649     print(" numpy: YES (with headers)")
650     else:
651     print(" numpy: YES (without headers)")
652 caltinay 4295 if env['usempi']:
653     print(" MPI: YES (flavour: %s)"%env['mpi'])
654     else:
655     print(" MPI: DISABLED")
656     if env['uselapack']:
657     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
658     else:
659     print(" LAPACK: DISABLED")
660     d_list=[]
661     e_list=[]
662 caltinay 4300 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
663 caltinay 4295 if env[i]: e_list.append(i)
664     else: d_list.append(i)
665     for i in e_list:
666     print("%16s: YES"%i)
667     for i in d_list:
668     print("%16s: DISABLED"%i)
669     if env['cppunit']:
670     print(" CppUnit: FOUND")
671     else:
672     print(" CppUnit: NOT FOUND")
673     if env['gmsh']=='m':
674     print(" gmsh: FOUND, MPI-ENABLED")
675     elif env['gmsh']=='s':
676     print(" gmsh: FOUND")
677     else:
678     print(" gmsh: NOT FOUND")
679 sshaw 4738 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
680 caltinay 4299
681 caltinay 4295 if ((fatalwarning != '') and (env['werror'])):
682     print(" Treating warnings as errors")
683     else:
684     print(" NOT treating warnings as errors")
685     print("")
686     for w in env['warnings']:
687     print("WARNING: %s"%w)
688 sshaw 4726 if len(GetBuildFailures()):
689     print("\nERROR: build stopped due to errors\n")
690     else:
691     print("\nSUCCESS: build complete\n")
692 caltinay 4295
693     atexit.register(print_summary)
694    

  ViewVC Help
Powered by ViewVC 1.1.26