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

Contents of /branches/trilinos_from_5897/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6009 - (show annotations)
Wed Mar 2 04:13:26 2016 UTC (3 years, 1 month ago) by caltinay
File size: 34164 byte(s)
Much needed sync with trunk...

1 ##############################################################################
2 #
3 # Copyright (c) 2003-2016 by The University of Queensland
4 # http://www.uq.edu.au
5 #
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 # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11 # Development 2012-2013 by School of Earth Sciences
12 # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13 #
14 ##############################################################################
15
16 EnsureSConsVersion(0,98,1)
17 EnsurePythonVersion(2,5)
18
19 import atexit, sys, os, platform, re
20 from distutils import sysconfig
21 from dependencies import *
22 from site_init import *
23
24 # Version number to check for in options file. Increment when new features are
25 # added or existing options changed.
26 REQUIRED_OPTS_VERSION=202
27
28 # MS Windows support, many thanks to PH
29 IS_WINDOWS = (os.name == 'nt')
30
31 IS_OSX = (os.uname()[0] == 'Darwin')
32
33 ########################## Determine options file ############################
34 # 1. command line
35 # 2. scons/<hostname>_options.py
36 # 3. name as part of a cluster
37 options_file=ARGUMENTS.get('options_file', None)
38 if not options_file:
39 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
46 if not os.path.isfile(options_file):
47 print("\nWARNING:\nOptions file %s" % options_file)
48 print("not found! Default options will be used which is most likely suboptimal.")
49 print("We recommend that you copy the most relavent options file in the scons/template/")
50 print("subdirectory and customize it to your needs.\n")
51 options_file = None
52
53 ############################### Build options ################################
54
55 default_prefix='/usr'
56 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57 lapack_flavours=('none', 'clapack', 'mkl')
58
59 #Note that scons construction vars the the following purposes:
60 # CPPFLAGS -> to the preprocessor
61 # CCFLAGS -> flags for _both_ C and C++
62 # CXXFLAGS -> flags for c++ _only_
63 # CFLAGS -> flags for c only
64
65 vars = Variables(options_file, ARGUMENTS)
66 vars.AddVariables(
67 PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
68 PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
69 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
70 BoolVariable('verbose', 'Output full compile/link lines', False),
71 # Compiler/Linker options
72 ('cxx', 'Path to C++ compiler', 'default'),
73 ('cc_flags', 'Base (C and C++) compiler flags', 'default'),
74 ('cc_optim', 'Additional (C and C++) flags for a non-debug build', 'default'),
75 ('cc_debug', 'Additional (C and C++) flags for a debug build', 'default'),
76 ('cxx_extra', 'Extra C++ compiler flags', ''),
77 ('cpp_flags', 'C Pre-processor flags', ''),
78 ('cpp_extra', 'Extra C Pre-processor flags', ''),
79 ('ld_extra', 'Extra linker flags', ''),
80 ('nvcc', 'Path to CUDA compiler', 'default'),
81 ('nvccflags', 'Base CUDA compiler flags', 'default'),
82 BoolVariable('werror','Treat compiler warnings as errors', True),
83 BoolVariable('debug', 'Compile with debug flags', False),
84 BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
85 ('omp_flags', 'OpenMP compiler flags', 'default'),
86 ('omp_ldflags', 'OpenMP linker flags', 'default'),
87 # Mandatory libraries
88 ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
89 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
90 # Mandatory for tests
91 ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
92 ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
93 # Optional libraries and options
94 EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
95 ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
96 ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
97 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
98 ('cuda_prefix', 'Prefix/Paths to NVidia CUDA installation', default_prefix),
99 BoolVariable('netcdf', 'Enable netCDF file support', False),
100 ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
101 ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
102 BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
103 ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
104 ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
105 BoolVariable('mkl', 'Enable the Math Kernel Library', False),
106 ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
107 ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
108 BoolVariable('umfpack', 'Enable UMFPACK', False),
109 ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
110 ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
111 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
112 ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
113 ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
114 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
115 ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
116 ('lapack_libs', 'LAPACK libraries to link with', []),
117 BoolVariable('silo', 'Enable the Silo file format in weipa', False),
118 ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
119 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
120 BoolVariable('trilinos', 'Enable the Trilinos solvers', False),
121 ('trilinos_prefix', 'Prefix/Paths to Trilinos installation', default_prefix),
122 ('trilinos_libs', 'Trilinos libraries to link with', []),
123 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
124 ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
125 ('visit_libs', 'VisIt libraries to link with', ['simV2']),
126 ListVariable('domains', 'Which domains to build', 'all',\
127 ['dudley','finley','ripley','speckley']),
128 # Advanced settings
129 ('launcher', 'Launcher command (e.g. mpirun)', 'default'),
130 ('prelaunch', 'Command to execute before launcher (e.g. mpdboot)', 'default'),
131 ('postlaunch', 'Command to execute after launcher (e.g. mpdexit)', 'default'),
132 #dudley_assemble_flags = -funroll-loops to actually do something
133 ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
134 # To enable passing function pointers through python
135 BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
136 # An option for specifying the compiler tools
137 ('tools_names', 'Compiler tools to use', ['default']),
138 ('env_export', 'Environment variables to be passed to tools',[]),
139 EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
140 EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
141 ('build_shared', 'Build dynamic libraries only (ignored)', True),
142 ('sys_libs', 'Extra libraries to link with', []),
143 ('escript_opts_version', 'Version of options file (do not specify on command line)'),
144 ('SVN_VERSION', 'Do not use from options file', -2),
145 ('pythoncmd', 'which python to compile with','python'),
146 ('usepython3', 'Is this a python3 build?', False),
147 ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
148 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
149 ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
150 BoolVariable('longindices', 'use long indices (for very large matrices)', False),
151 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
152 ('compression_libs', 'Compression libraries to link with', ['boost_iostreams']),
153 BoolVariable('papi', 'Enable PAPI', False),
154 ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
155 ('papi_libs', 'PAPI libraries to link with', ['papi']),
156 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
157 BoolVariable('osx_dependency_fix', 'Fix dependencies for libraries to have absolute paths (OSX)',
158 False)
159 )
160
161 ##################### Create environment and help text #######################
162
163 # Intel's compiler uses regular expressions improperly and emits a warning
164 # about failing to find the compilers. This warning can be safely ignored.
165
166 # PATH is needed so the compiler, linker and tools are found if they are not
167 # in default locations.
168 env = Environment(tools = ['default'], options = vars,
169 ENV = {'PATH': os.environ['PATH']})
170
171 # set the vars for clang
172 def mkclang(env):
173 env['CXX']='clang++'
174
175 if env['tools_names'] != ['default']:
176 zz=env['tools_names']
177 if 'clang' in zz:
178 zz.remove('clang')
179 zz.insert(0, mkclang)
180 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
181 ENV = {'PATH' : os.environ['PATH']})
182
183 if options_file:
184 opts_valid=False
185 if 'escript_opts_version' in env.Dictionary() and \
186 int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
187 opts_valid=True
188 if opts_valid:
189 print("Using options in %s." % options_file)
190 else:
191 print("\nOptions file %s" % options_file)
192 print("is outdated! Please update the file by examining one of the TEMPLATE")
193 print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
194 Exit(1)
195
196 # Generate help text (scons -h)
197 Help(vars.GenerateHelpText(env))
198
199 # Check for superfluous options
200 if len(vars.UnknownVariables())>0:
201 for k in vars.UnknownVariables():
202 print("Unknown option '%s'" % k)
203 Exit(1)
204
205 if env['cuda']:
206 if env['nvcc'] != 'default':
207 env['NVCC'] = env['nvcc']
208 env.Tool('nvcc')
209
210 if 'dudley' in env['domains']:
211 env['domains'].append('finley')
212
213 # create dictionary which will be populated with info for buildvars file
214 env['buildvars']={}
215 # create list which will be populated with warnings if there are any
216 env['warnings']=[]
217
218 #################### Make sure install directories exist #####################
219
220 env['BUILD_DIR']=Dir(env['build_dir']).abspath
221 prefix=Dir(env['prefix']).abspath
222 env['buildvars']['prefix']=prefix
223 env['incinstall'] = os.path.join(prefix, 'include')
224 env['bininstall'] = os.path.join(prefix, 'bin')
225 env['libinstall'] = os.path.join(prefix, 'lib')
226 env['pyinstall'] = os.path.join(prefix, 'esys')
227 if not os.path.isdir(env['bininstall']):
228 os.makedirs(env['bininstall'])
229 if not os.path.isdir(env['libinstall']):
230 os.makedirs(env['libinstall'])
231 if not os.path.isdir(env['pyinstall']):
232 os.makedirs(env['pyinstall'])
233
234 env.Append(CPPPATH = [env['incinstall']])
235 env.Append(LIBPATH = [env['libinstall']])
236
237 ################# Fill in compiler options if not set above ##################
238
239 if env['cxx'] != 'default': env['CXX']=env['cxx']
240
241 # version >=9 of intel C++ compiler requires use of icpc to link in C++
242 # runtimes (icc does not)
243 if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
244 env['LINK'] = env['CXX']
245
246 # default compiler/linker options
247 cc_flags = ''
248 cc_optim = ''
249 cc_debug = ''
250 omp_flags = ''
251 omp_ldflags = ''
252 fatalwarning = '' # switch to turn warnings into errors
253 sysheaderopt = '' # how to indicate that a header is a system header
254
255 # env['CC'] might be a full path
256 cc_name=os.path.basename(env['CXX'])
257
258 if cc_name == 'icpc':
259 # Intel compiler
260 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
261 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
262 cc_flags = "-std=c++11 -fPIC -w2 -wd1875 -Wno-unknown-pragmas"
263 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
264 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
265 omp_flags = "-openmp"
266 omp_ldflags = "-openmp -openmp_report=1"
267 fatalwarning = "-Werror"
268 elif cc_name[:3] == 'g++':
269 # GNU C++ on any system
270 # note that -ffast-math is not used because it breaks isnan(),
271 # see mantis #691
272 cc_flags = "-std=c++11 -pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
273 cc_optim = "-O3"
274 #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
275 cc_debug = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
276 omp_flags = "-fopenmp"
277 omp_ldflags = "-fopenmp"
278 fatalwarning = "-Werror"
279 sysheaderopt = "-isystem"
280 elif cc_name == 'cl':
281 # Microsoft Visual C on Windows
282 cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
283 cc_optim = "/O2 /Op /W3"
284 cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
285 fatalwarning = "/WX"
286 elif cc_name == 'icl':
287 # Intel C on Windows
288 cc_flags = '/EHsc /GR /MD'
289 cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
290 cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
291 omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
292 omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
293
294 env['sysheaderopt']=sysheaderopt
295
296 # set defaults if not otherwise specified
297 if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
298 if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
299 if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
300 if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
301 if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
302 if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
303 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
304 if env['cpp_flags'] != '': env.Append(CPPFLAGS = env['cpp_flags'])
305 if env['cpp_extra'] != '': env.Append(CPPFLAGS = " "+env['cpp_extra'])
306
307 if env['nvccflags'] != 'default':
308 env['NVCCFLAGS'] = env['nvccflags']
309 env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
310
311 if env['longindices']:
312 env.Append(CPPDEFINES = ['ESYS_INDEXTYPE_LONG'])
313
314 if env['usepython3']:
315 env.Append(CPPDEFINES=['ESPYTHON3'])
316
317 # set up the autolazy values
318 if env['forcelazy'] == 'on':
319 env.Append(CPPDEFINES=['FAUTOLAZYON'])
320 elif env['forcelazy'] == 'off':
321 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
322
323 # set up the collective resolve values
324 if env['forcecollres'] == 'on':
325 env.Append(CPPDEFINES=['FRESCOLLECTON'])
326 elif env['forcecollres'] == 'off':
327 env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
328
329 # allow non-standard C if requested
330 if env['iknowwhatimdoing']:
331 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
332
333 # Disable OpenMP if no flags provided
334 if env['openmp'] and env['omp_flags'] == '':
335 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
336 env['openmp'] = False
337
338 if env['openmp']:
339 env.Append(CCFLAGS = env['omp_flags'])
340 if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
341 else:
342 env['omp_flags']=''
343 env['omp_ldflags']=''
344
345 env['buildvars']['openmp']=int(env['openmp'])
346
347 # add debug/non-debug compiler flags
348 env['buildvars']['debug']=int(env['debug'])
349 if env['debug']:
350 env.Append(CCFLAGS = env['cc_debug'])
351 else:
352 env.Append(CCFLAGS = env['cc_optim'])
353
354 # always add cc_flags
355 env.Append(CCFLAGS = env['cc_flags'])
356
357 # add system libraries
358 env.AppendUnique(LIBS = env['sys_libs'])
359
360 # set defaults for launchers if not otherwise specified
361 if env['prelaunch'] == 'default':
362 if env['mpi'] == 'INTELMPI' and env['openmp']:
363 env['prelaunch'] = "export I_MPI_PIN_DOMAIN=omp"
364 elif env['mpi'] == 'OPENMPI':
365 # transform comma-separated list to '-x a -x b -x c ...'
366 env['prelaunch'] = "EE=$(echo -x %e|sed -e 's/,/ -x /g')"
367 elif env['mpi'] == 'MPT':
368 env['prelaunch'] = "export MPI_NUM_MEMORY_REGIONS=0"
369 elif env['mpi'] == 'MPICH2':
370 env['prelaunch'] = "mpdboot -n %n -r ssh -f %f"
371 else:
372 env['prelaunch'] = ""
373
374 if env['launcher'] == 'default':
375 if env['mpi'] == 'INTELMPI':
376 env['launcher'] = "mpirun -hostfile %f -n %N -ppn %p %b"
377 elif env['mpi'] == 'OPENMPI':
378 env['launcher'] = "mpirun ${AGENTOVERRIDE} --gmca mpi_warn_on_fork 0 ${EE} --host %h -bynode -bind-to-core --cpus-per-rank %t -np %N %b"
379 elif env['mpi'] == 'MPT':
380 env['launcher'] = "mpirun %h -np %p %b"
381 elif env['mpi'] == 'MPICH':
382 env['launcher'] = "mpirun -machinefile %f -np %N %b"
383 elif env['mpi'] == 'MPICH2':
384 env['launcher'] = "mpiexec -genvlist %e -np %N %b"
385 else:
386 env['launcher'] = "%b"
387
388 if env['postlaunch'] == 'default':
389 if env['mpi'] == 'MPICH2':
390 env['postlaunch'] = "mpdallexit"
391 else:
392 env['postlaunch'] = ""
393
394 # determine svn revision
395 global_revision=ARGUMENTS.get('SVN_VERSION', None)
396 if global_revision:
397 global_revision = re.sub(':.*', '', global_revision)
398 global_revision = re.sub('[^0-9]', '', global_revision)
399 if global_revision == '': global_revision='-2'
400 else:
401 # Get the global Subversion revision number for the getVersion() method
402 try:
403 global_revision = os.popen('svnversion -n .').read()
404 global_revision = re.sub(':.*', '', global_revision)
405 global_revision = re.sub('[^0-9]', '', global_revision)
406 if global_revision == '': global_revision='-2'
407 except:
408 global_revision = '-1'
409 env['svn_revision']=global_revision
410 env['buildvars']['svn_revision']=global_revision
411 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
412
413 env['IS_WINDOWS']=IS_WINDOWS
414 env['IS_OSX']=IS_OSX
415
416 ###################### Copy required environment vars ########################
417
418 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
419 if IS_WINDOWS:
420 LD_LIBRARY_PATH_KEY='PATH'
421 env['ENV']['LD_LIBRARY_PATH']=''
422 else:
423 LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
424
425 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
426
427 # the following env variables are exported for the unit tests
428
429 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
430 try:
431 env['ENV'][key] = os.environ[key]
432 except KeyError:
433 env['ENV'][key] = '1'
434
435 env_export=env['env_export']
436 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
437
438 for key in set(env_export):
439 try:
440 env['ENV'][key] = os.environ[key]
441 except KeyError:
442 pass
443
444 for key in os.environ.keys():
445 if key.startswith("SLURM_"):
446 env['ENV'][key] = os.environ[key]
447
448 try:
449 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
450 except KeyError:
451 pass
452
453 if IS_OSX:
454 try:
455 env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
456 except KeyError:
457 pass
458
459
460 # these shouldn't be needed
461 #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
462 # try:
463 # env['ENV'][key] = os.environ[key]
464 # except KeyError:
465 # pass
466
467 try:
468 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
469 except KeyError:
470 pass
471
472 ######################## Add some custom builders ############################
473
474 if env['pythoncmd']=='python':
475 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
476 else:
477 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
478 env.Append(BUILDERS = {'PyCompile' : py_builder});
479
480 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
481 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
482
483 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
484 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
485
486 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
487 env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
488
489 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
490 env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
491
492 ############################ Dependency checks ###############################
493
494 ######## Compiler
495 env=checkCompiler(env)
496
497 ######## Python headers & library (required)
498 env=checkPython(env)
499
500 ######## boost & boost-python (required)
501 env=checkBoost(env)
502
503 ######## NVCC version (optional)
504 if env['cuda']:
505 env=checkCudaVersion(env)
506 env=checkCUDA(env)
507
508 ######## numpy (required) and numpy headers (optional)
509 env=checkNumpy(env)
510
511 ######## CppUnit (required for tests)
512 env=checkCppUnit(env)
513
514 ######## optional python modules (sympy, pyproj)
515 env=checkOptionalModules(env)
516
517 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
518 env=checkOptionalLibraries(env)
519
520 #use gmsh info to set some defines
521 if env['gmsh'] == 's':
522 env.Append(CPPDEFINES=['GMSH'])
523 elif env['gmsh'] == 'm':
524 env.Append(CPPDEFINES=['GMSH','GMSH_MPI'])
525
526 ######## PDFLaTeX (for documentation)
527 env=checkPDFLatex(env)
528
529 # keep some of our install paths first in the list for the unit tests
530 env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
531 env.PrependENVPath('PYTHONPATH', prefix)
532 env['ENV']['ESCRIPT_ROOT'] = prefix
533
534 if not env['verbose']:
535 env['CXXCOMSTR'] = "Compiling $TARGET"
536 env['SHCXXCOMSTR'] = "Compiling $TARGET"
537 env['ARCOMSTR'] = "Linking $TARGET"
538 env['LINKCOMSTR'] = "Linking $TARGET"
539 env['SHLINKCOMSTR'] = "Linking $TARGET"
540 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
541 env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
542 env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
543 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
544 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
545
546 ####################### Configure the subdirectories #########################
547
548 # remove obsolete files
549 if not env['usempi']:
550 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
551 Execute(Delete(os.path.join(env['bininstall'], 'escript-overlord')))
552 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
553
554 from grouptest import *
555 TestGroups=[]
556
557 # keep an environment without warnings-as-errors
558 dodgy_env=env.Clone()
559
560 # now add warnings-as-errors flags. This needs to be done after configuration
561 # because the scons test files have warnings in them
562 if ((fatalwarning != '') and (env['werror'])):
563 env.Append(CCFLAGS = fatalwarning)
564
565 Export(
566 ['env',
567 'dodgy_env',
568 'IS_WINDOWS',
569 'TestGroups'
570 ]
571 )
572
573 #do not auto build
574 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
575 env.SConscript(dirs = ['tools/overlord'], variant_dir='$BUILD_DIR/$PLATFORM/tools/overlord', duplicate=0)
576 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
577 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
578 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
579
580 env.SConscript(dirs = ['cusplibrary'])
581
582 #This will pull in the escriptcore/py_src and escriptcore/test
583 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
584 if env['trilinos']:
585 env.SConscript(dirs = ['trilinoswrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/trilinoswrap', duplicate=0)
586 if 'dudley' in env['domains']:
587 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
588 if 'finley' in env['domains']:
589 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
590 if 'ripley' in env['domains']:
591 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
592 if 'speckley' in env['domains']:
593 env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
594 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
595 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
596 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
597 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
598 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
599 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
600
601
602 ######################## Populate the buildvars file #########################
603
604 write_buildvars(env)
605
606 write_launcher(env)
607
608 ################### Targets to build and install libraries ###################
609
610 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
611 env.Alias('target_init', [target_init])
612 # delete buildvars upon cleanup
613 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
614
615 # The headers have to be installed prior to build
616
617 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
618 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
619
620 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
621 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
622
623 if env['trilinos']:
624 env.Alias('build_trilinoswrap', ['install_trilinoswrap_headers', 'build_trilinoswrap_lib'])
625 env.Alias('install_trilinoswrap', ['build_trilinoswrap', 'install_trilinoswrap_lib'])
626
627 if 'dudley' in env['domains']:
628 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
629 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
630
631 if 'finley' in env['domains']:
632 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
633 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
634
635 if 'ripley' in env['domains']:
636 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
637 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
638
639 if 'speckley' in env['domains']:
640 env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
641 env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
642
643 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
644 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
645
646 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
647 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
648
649 # Now gather all the above into some easy targets: build_all and install_all
650 build_all_list = []
651 build_all_list += ['build_paso']
652 build_all_list += ['build_escript']
653 if env['trilinos']: build_all_list += ['build_trilinoswrap']
654 if 'dudley' in env['domains']: build_all_list += ['build_dudley']
655 if 'finley' in env['domains']: build_all_list += ['build_finley']
656 if 'ripley' in env['domains']: build_all_list += ['build_ripley']
657 if 'speckley' in env['domains']: build_all_list += ['build_speckley']
658 build_all_list += ['build_weipa']
659 if not IS_WINDOWS and 'finley' in env['domains']:
660 build_all_list += ['build_escriptreader']
661 if env['usempi']:
662 build_all_list += ['build_pythonMPI', 'build_overlord']
663 env.Alias('build_all', build_all_list)
664
665 install_all_list = []
666 install_all_list += ['target_init']
667 install_all_list += ['install_paso']
668 install_all_list += ['install_escript']
669 if env['trilinos']: install_all_list += ['install_trilinoswrap']
670 if 'dudley' in env['domains']: install_all_list += ['install_dudley']
671 if 'finley' in env['domains']: install_all_list += ['install_finley']
672 if 'ripley' in env['domains']: install_all_list += ['install_ripley']
673 if 'speckley' in env['domains']: install_all_list += ['install_speckley']
674 install_all_list += ['install_weipa']
675 if not IS_WINDOWS and 'finley' in env['domains']:
676 install_all_list += ['install_escriptreader']
677 install_all_list += ['install_downunder_py']
678 install_all_list += ['install_modellib_py']
679 install_all_list += ['install_pycad_py']
680 if env['usempi']:
681 install_all_list += ['install_pythonMPI', 'install_overlord']
682 install_all_list += ['install_weipa_py']
683 install_all_list += [env.Install(os.path.join(env['build_dir'],'scripts'), os.path.join('scripts', 'release_sanity.py'))]
684
685
686 if env['osx_dependency_fix']:
687 print("Require dependency fix")
688 install_all=env.Command('install_all',install_all_list,'scripts/moveall.sh')
689 else:
690 install_all=env.Alias('install_all', install_all_list)
691
692
693
694
695 # Default target is install
696 #env.Default('install_all')
697
698
699 sanity=env.Alias('sanity', env.Command('dummy','',os.path.join(env['prefix'], 'bin', 'run-escript')+' '+os.path.join(env['build_dir'],'scripts', 'release_sanity.py')))
700 env.Depends('dummy', install_all)
701 if env['usempi']:
702 #env.Requires('dummy', ['build_pythonMPI', 'install_pythonMPI'])
703 #env.Requires('dummy', env['prefix']+"/lib/pythonMPI")
704 env.Depends('dummy', ['build_pythonMPI', 'install_pythonMPI'])
705 env.Depends('dummy', env['prefix']+"/lib/pythonMPI")
706
707 if 'install_dudley' in install_all_list and \
708 'install_finley' in install_all_list and \
709 'install_ripley' in install_all_list and \
710 'install_speckley' in install_all_list:
711 env.AlwaysBuild('sanity')
712 env.Default('sanity')
713 else:
714 env.Default('install_all')
715
716 ################## Targets to build and run the test suite ###################
717
718 if not env['cppunit']:
719 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
720 env.Alias('run_tests', test_msg)
721 env.Alias('build_tests', '')
722 env.Alias('run_tests', ['install_all'])
723 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
724 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
725 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
726 Requires('py_tests', 'install_all')
727
728 ##################### Targets to build the documentation #####################
729
730 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
731 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
732 env.Alias('docs', ['basedocs', 'sphinxdoc'])
733 env.Alias('release_prep', ['docs', 'install_all'])
734 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
735
736 # The test scripts are always generated, this target allows us to
737 # generate the testscripts without doing a full build
738 env.Alias('testscripts',[])
739
740 if not IS_WINDOWS:
741 generateTestScripts(env, TestGroups)
742
743
744 ######################## Summarize our environment ###########################
745 def print_summary():
746 print("")
747 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
748 print("Escript/Finley revision %s"%global_revision)
749 print(" Install prefix: %s"%env['prefix'])
750 print(" Python: %s"%sysconfig.PREFIX)
751 print(" boost: %s (Version %s)"%(env['boost_prefix'],env['boost_version']))
752 if env['numpy_h']:
753 print(" numpy: YES (with headers)")
754 else:
755 print(" numpy: YES (without headers)")
756 if env['usempi']:
757 print(" MPI: YES (flavour: %s)"%env['mpi'])
758 else:
759 print(" MPI: NO")
760 if env['parmetis']:
761 print(" ParMETIS: %s (Version %s)"%(env['parmetis_prefix'],env['parmetis_version']))
762 else:
763 print(" ParMETIS: NO")
764 if env['uselapack']:
765 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
766 else:
767 print(" LAPACK: NO")
768 if env['cuda']:
769 print(" CUDA: YES (nvcc: %s)"%env['nvcc_version'])
770 else:
771 print(" CUDA: NO")
772 d_list=[]
773 e_list=[]
774 for i in 'debug','openmp','boomeramg','cppunit','gdal','mkl','netcdf','papi','pyproj','scipy','silo','sympy','trilinos','umfpack','visit':
775 if env[i]: e_list.append(i)
776 else: d_list.append(i)
777 for i in e_list:
778 print("%16s: YES"%i)
779 for i in d_list:
780 print("%16s: NO"%i)
781 if env['gmshpy']:
782 gmshpy=" + python module"
783 else:
784 gmshpy=""
785 if env['gmsh']=='m':
786 print(" gmsh: YES, MPI-ENABLED"+gmshpy)
787 elif env['gmsh']=='s':
788 print(" gmsh: YES"+gmshpy)
789 else:
790 if env['gmshpy']:
791 print(" gmsh: python module only")
792 else:
793 print(" gmsh: NO")
794 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
795
796 if ((fatalwarning != '') and (env['werror'])):
797 print(" Treating warnings as errors")
798 else:
799 print(" NOT treating warnings as errors")
800 print("")
801 for w in env['warnings']:
802 print("WARNING: %s"%w)
803 if len(GetBuildFailures()):
804 print("\nERROR: build stopped due to errors\n")
805 else:
806 print("\nSUCCESS: build complete\n")
807
808 atexit.register(print_summary)
809

  ViewVC Help
Powered by ViewVC 1.1.26