/[escript]/release/4.0/SConstruct
ViewVC logotype

Contents of /release/4.0/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5379 - (show annotations)
Mon Dec 15 23:58:17 2014 UTC (4 years, 9 months ago) by jfenwick
File size: 32115 byte(s)
branching for release prep

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

  ViewVC Help
Powered by ViewVC 1.1.26