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

Contents of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

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('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 ('papi_libs', 'PAPI libraries to link with', ['papi']),
98 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 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 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 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
114 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 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
118 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
119 ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
120 # 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 ('build_shared', 'Build dynamic libraries only', False),
133 ('sys_libs', 'Extra libraries to link with', []),
134 ('escript_opts_version', 'Version of options file (do not specify on command line)'),
135 ('SVN_VERSION', 'Do not use from options file', -2),
136 ('pythoncmd', 'which python to compile with','python'),
137 ('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 ('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 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
142 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
143 ('compression_libs', 'Compression libraries to link with', ['boost_iostreams'])
144 )
145
146 ##################### Create environment and help text #######################
147
148 # 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
151 # 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
156 # set the vars for clang
157 def mkclang(env):
158 env['CXX']='clang++'
159
160 if env['tools_names'] != ['default']:
161 zz=env['tools_names']
162 if 'clang' in zz:
163 zz.remove('clang')
164 zz.insert(0, mkclang)
165 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
166 ENV = {'PATH' : os.environ['PATH']})
167
168 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
181 # Generate help text (scons -h)
182 Help(vars.GenerateHelpText(env))
183
184 # Check for superfluous options
185 if len(vars.UnknownVariables())>0:
186 for k in vars.UnknownVariables():
187 print("Unknown option '%s'" % k)
188 Exit(1)
189
190 if env['cuda']:
191 env.Tool('nvcc')
192
193 # 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 #################### Make sure install directories exist #####################
199
200 env['BUILD_DIR']=Dir(env['build_dir']).abspath
201 prefix=Dir(env['prefix']).abspath
202 env['buildvars']['prefix']=prefix
203 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 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 env.Append(CPPPATH = [env['incinstall']])
215 env.Append(LIBPATH = [env['libinstall']])
216
217 ################# Fill in compiler options if not set above ##################
218
219 if env['cxx'] != 'default': env['CXX']=env['cxx']
220
221 if env['nvcc'] != 'default':
222 env['NVCC'] = env['nvcc']
223 else:
224 env['NVCC'] = 'nvcc'
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 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
260 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
278 env['sysheaderopt']=sysheaderopt
279
280 # 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
289 if env['nvccflags'] != 'default':
290 env['NVCCFLAGS'] = env['nvccflags']
291 env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
292
293 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
294
295 if env['usepython3']:
296 env.Append(CPPDEFINES=['ESPYTHON3'])
297
298 # 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
304 # 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
310 # allow non-standard C if requested
311 if env['iknowwhatimdoing']:
312 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
313
314 # Disable OpenMP if no flags provided
315 if env['openmp'] and env['omp_flags'] == '':
316 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
317 env['openmp'] = False
318
319 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
326 env['buildvars']['openmp']=int(env['openmp'])
327
328 # add debug/non-debug compiler flags
329 env['buildvars']['debug']=int(env['debug'])
330 if env['debug']:
331 env.Append(CCFLAGS = env['cc_debug'])
332 else:
333 env.Append(CCFLAGS = env['cc_optim'])
334
335 # always add cc_flags
336 env.Append(CCFLAGS = env['cc_flags'])
337
338 # add system libraries
339 env.AppendUnique(LIBS = env['sys_libs'])
340
341 # determine svn revision
342 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 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 except:
355 global_revision = '-1'
356 env['svn_revision']=global_revision
357 env['buildvars']['svn_revision']=global_revision
358 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
359
360 if IS_WINDOWS:
361 if not env['build_shared']:
362 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
363 env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
364
365 # 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 ###################### Copy required environment vars ########################
373
374 # 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
381 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
382
383 # the following env variables are exported for the unit tests
384
385 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 env['ENV'][key] = '1'
390
391 env_export=env['env_export']
392 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
393
394 for key in set(env_export):
395 try:
396 env['ENV'][key] = os.environ[key]
397 except KeyError:
398 pass
399
400 try:
401 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
402 except KeyError:
403 pass
404
405 if IS_OSX:
406 try:
407 env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
408 except KeyError:
409 pass
410
411
412 # 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
419 try:
420 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
421 except KeyError:
422 pass
423
424 ######################## Add some custom builders ############################
425
426 if env['pythoncmd']=='python':
427 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
428 else:
429 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
430 env.Append(BUILDERS = {'PyCompile' : py_builder});
431
432 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
433 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
434
435 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
436 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
437
438 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
439 env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
440
441 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
442 env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
443
444 ############################ Dependency checks ###############################
445
446 ######## Compiler
447 env=checkCompiler(env)
448
449 ######## Python headers & library (required)
450 env=checkPython(env)
451
452 ######## boost & boost-python (required)
453 env=checkBoost(env)
454
455 ######## numpy (required) and numpy headers (optional)
456 env=checkNumpy(env)
457
458 ######## CppUnit (required for tests)
459 env=checkCppUnit(env)
460
461 ######## optional python modules (sympy, pyproj)
462 env=checkOptionalModules(env)
463
464 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
465 env=checkOptionalLibraries(env)
466
467 ######## PDFLaTeX (for documentation)
468 env=checkPDFLatex(env)
469
470 # 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
475 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 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 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
486
487 ####################### Configure the subdirectories #########################
488
489 # 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 from grouptest import *
495 TestGroups=[]
496
497 # keep an environment without warnings-as-errors
498 dodgy_env=env.Clone()
499
500 # 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
505 Export(
506 ['env',
507 'dodgy_env',
508 'IS_WINDOWS',
509 'TestGroups'
510 ]
511 )
512
513 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 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 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
522 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
523 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 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
526 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
527 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 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
531 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
532
533
534 ######################## Populate the buildvars file #########################
535
536 write_buildvars(env)
537
538 ################### Targets to build and install libraries ###################
539
540 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
541 env.Alias('target_init', [target_init])
542 # delete buildvars upon cleanup
543 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
544
545 cusphdr_inst = env.Install(env['incinstall'], Dir('#cusplibrary/cusp'))
546 env.Alias('install_cusp_headers', cusphdr_inst)
547 # 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
552 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
553 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
554
555 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
556 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
557
558 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 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
564 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
567 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
568 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
569
570 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
573 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
574 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
575
576 # Now gather all the above into some easy targets: build_all and install_all
577 build_all_list = []
578 build_all_list += ['build_esysUtils']
579 build_all_list += ['build_paso']
580 build_all_list += ['build_escript']
581 build_all_list += ['build_pasowrap']
582 build_all_list += ['build_dudley']
583 build_all_list += ['build_finley']
584 build_all_list += ['build_ripley']
585 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 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 install_all_list += ['install_pasowrap']
597 install_all_list += ['install_dudley']
598 install_all_list += ['install_finley']
599 install_all_list += ['install_ripley']
600 install_all_list += ['install_weipa']
601 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
602 install_all_list += ['install_downunder_py']
603 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 env.Alias('install_all', install_all_list)
608
609 # Default target is install
610 env.Default('install_all')
611
612 ################## Targets to build and run the test suite ###################
613
614 if not env['cppunit']:
615 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
616 env.Alias('run_tests', test_msg)
617 env.Alias('build_tests', '')
618 env.Alias('run_tests', ['install_all'])
619 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
620 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
621 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
622
623 ##################### Targets to build the documentation #####################
624
625 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
626 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
627 env.Alias('docs', ['basedocs', 'sphinxdoc'])
628 env.Alias('release_prep', ['docs', 'install_all'])
629 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
630
631 # 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 if not IS_WINDOWS:
636 generateTestScripts(env, TestGroups)
637
638
639
640 ######################## Summarize our environment ###########################
641 def print_summary():
642 print("")
643 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
644 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 if env['numpy_h']:
649 print(" numpy: YES (with headers)")
650 else:
651 print(" numpy: YES (without headers)")
652 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 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
663 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 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
680
681 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 if len(GetBuildFailures()):
689 print("\nERROR: build stopped due to errors\n")
690 else:
691 print("\nSUCCESS: build complete\n")
692
693 atexit.register(print_summary)
694

  ViewVC Help
Powered by ViewVC 1.1.26