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

Contents of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5144 - (show annotations)
Thu Sep 11 02:56:56 2014 UTC (4 years, 7 months ago) by caltinay
File size: 29611 byte(s)
fix to find changes in cusp automatically from scons.

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 if env['nvcc'] != 'default':
192 env['NVCC'] = env['nvcc']
193 env.Tool('nvcc')
194
195 # create dictionary which will be populated with info for buildvars file
196 env['buildvars']={}
197 # create list which will be populated with warnings if there are any
198 env['warnings']=[]
199
200 #################### Make sure install directories exist #####################
201
202 env['BUILD_DIR']=Dir(env['build_dir']).abspath
203 prefix=Dir(env['prefix']).abspath
204 env['buildvars']['prefix']=prefix
205 env['incinstall'] = os.path.join(prefix, 'include')
206 env['bininstall'] = os.path.join(prefix, 'bin')
207 env['libinstall'] = os.path.join(prefix, 'lib')
208 env['pyinstall'] = os.path.join(prefix, 'esys')
209 if not os.path.isdir(env['bininstall']):
210 os.makedirs(env['bininstall'])
211 if not os.path.isdir(env['libinstall']):
212 os.makedirs(env['libinstall'])
213 if not os.path.isdir(env['pyinstall']):
214 os.makedirs(env['pyinstall'])
215
216 env.Append(CPPPATH = [env['incinstall']])
217 env.Append(LIBPATH = [env['libinstall']])
218
219 ################# Fill in compiler options if not set above ##################
220
221 if env['cxx'] != 'default': env['CXX']=env['cxx']
222
223 # version >=9 of intel C++ compiler requires use of icpc to link in C++
224 # runtimes (icc does not)
225 if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
226 env['LINK'] = env['CXX']
227
228 # default compiler/linker options
229 cc_flags = ''
230 cc_optim = ''
231 cc_debug = ''
232 omp_flags = ''
233 omp_ldflags = ''
234 fatalwarning = '' # switch to turn warnings into errors
235 sysheaderopt = '' # how to indicate that a header is a system header
236
237 # env['CC'] might be a full path
238 cc_name=os.path.basename(env['CXX'])
239
240 if cc_name == 'icpc':
241 # Intel compiler
242 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
243 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
244 cc_flags = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
245 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
246 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247 omp_flags = "-openmp"
248 omp_ldflags = "-openmp -openmp_report=1"
249 fatalwarning = "-Werror"
250 elif cc_name[:3] == 'g++':
251 # GNU C on any system
252 # note that -ffast-math is not used because it breaks isnan(),
253 # see mantis #691
254 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
255 cc_optim = "-O3"
256 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
257 omp_flags = "-fopenmp"
258 omp_ldflags = "-fopenmp"
259 fatalwarning = "-Werror"
260 sysheaderopt = "-isystem"
261 elif cc_name == 'cl':
262 # Microsoft Visual C on Windows
263 cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
264 cc_optim = "/O2 /Op /W3"
265 cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
266 fatalwarning = "/WX"
267 elif cc_name == 'icl':
268 # Intel C on Windows
269 cc_flags = '/EHsc /GR /MD'
270 cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
271 cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
272 omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
273 omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
274
275 env['sysheaderopt']=sysheaderopt
276
277 # set defaults if not otherwise specified
278 if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
279 if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
280 if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
281 if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
282 if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
283 if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
284 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
285
286 if env['nvccflags'] != 'default':
287 env['NVCCFLAGS'] = env['nvccflags']
288 env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
289
290 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
291
292 if env['usepython3']:
293 env.Append(CPPDEFINES=['ESPYTHON3'])
294
295 # set up the autolazy values
296 if env['forcelazy'] == 'on':
297 env.Append(CPPDEFINES=['FAUTOLAZYON'])
298 elif env['forcelazy'] == 'off':
299 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
300
301 # set up the collective resolve values
302 if env['forcecollres'] == 'on':
303 env.Append(CPPDEFINES=['FRESCOLLECTON'])
304 elif env['forcecollres'] == 'off':
305 env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
306
307 # allow non-standard C if requested
308 if env['iknowwhatimdoing']:
309 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
310
311 # Disable OpenMP if no flags provided
312 if env['openmp'] and env['omp_flags'] == '':
313 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
314 env['openmp'] = False
315
316 if env['openmp']:
317 env.Append(CCFLAGS = env['omp_flags'])
318 if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
319 else:
320 env['omp_flags']=''
321 env['omp_ldflags']=''
322
323 env['buildvars']['openmp']=int(env['openmp'])
324
325 # add debug/non-debug compiler flags
326 env['buildvars']['debug']=int(env['debug'])
327 if env['debug']:
328 env.Append(CCFLAGS = env['cc_debug'])
329 else:
330 env.Append(CCFLAGS = env['cc_optim'])
331
332 # always add cc_flags
333 env.Append(CCFLAGS = env['cc_flags'])
334
335 # add system libraries
336 env.AppendUnique(LIBS = env['sys_libs'])
337
338 # determine svn revision
339 global_revision=ARGUMENTS.get('SVN_VERSION', None)
340 if global_revision:
341 global_revision = re.sub(':.*', '', global_revision)
342 global_revision = re.sub('[^0-9]', '', global_revision)
343 if global_revision == '': global_revision='-2'
344 else:
345 # Get the global Subversion revision number for the getVersion() method
346 try:
347 global_revision = os.popen('svnversion -n .').read()
348 global_revision = re.sub(':.*', '', global_revision)
349 global_revision = re.sub('[^0-9]', '', global_revision)
350 if global_revision == '': global_revision='-2'
351 except:
352 global_revision = '-1'
353 env['svn_revision']=global_revision
354 env['buildvars']['svn_revision']=global_revision
355 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
356
357 if IS_WINDOWS:
358 if not env['build_shared']:
359 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
360 env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
361
362 # VSL random numbers
363 env['buildvars']['vsl_random']=int(env['vsl_random'])
364 if env['vsl_random']:
365 env.Append(CPPDEFINES = ['MKLRANDOM'])
366
367 env['IS_WINDOWS']=IS_WINDOWS
368
369 ###################### Copy required environment vars ########################
370
371 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
372 if IS_WINDOWS:
373 LD_LIBRARY_PATH_KEY='PATH'
374 env['ENV']['LD_LIBRARY_PATH']=''
375 else:
376 LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
377
378 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
379
380 # the following env variables are exported for the unit tests
381
382 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
383 try:
384 env['ENV'][key] = os.environ[key]
385 except KeyError:
386 env['ENV'][key] = '1'
387
388 env_export=env['env_export']
389 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
390
391 for key in set(env_export):
392 try:
393 env['ENV'][key] = os.environ[key]
394 except KeyError:
395 pass
396
397 try:
398 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
399 except KeyError:
400 pass
401
402 if IS_OSX:
403 try:
404 env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
405 except KeyError:
406 pass
407
408
409 # these shouldn't be needed
410 #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
411 # try:
412 # env['ENV'][key] = os.environ[key]
413 # except KeyError:
414 # pass
415
416 try:
417 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
418 except KeyError:
419 pass
420
421 ######################## Add some custom builders ############################
422
423 if env['pythoncmd']=='python':
424 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
425 else:
426 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
427 env.Append(BUILDERS = {'PyCompile' : py_builder});
428
429 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
430 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
431
432 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
433 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
434
435 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
436 env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
437
438 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
439 env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
440
441 ############################ Dependency checks ###############################
442
443 ######## Compiler
444 env=checkCompiler(env)
445
446 ######## Python headers & library (required)
447 env=checkPython(env)
448
449 ######## boost & boost-python (required)
450 env=checkBoost(env)
451
452 ######## NVCC version (optional)
453 if env['cuda']:
454 env=checkCudaVersion(env)
455
456 ######## numpy (required) and numpy headers (optional)
457 env=checkNumpy(env)
458
459 ######## CppUnit (required for tests)
460 env=checkCppUnit(env)
461
462 ######## optional python modules (sympy, pyproj)
463 env=checkOptionalModules(env)
464
465 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
466 env=checkOptionalLibraries(env)
467
468 ######## PDFLaTeX (for documentation)
469 env=checkPDFLatex(env)
470
471 # keep some of our install paths first in the list for the unit tests
472 env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
473 env.PrependENVPath('PYTHONPATH', prefix)
474 env['ENV']['ESCRIPT_ROOT'] = prefix
475
476 if not env['verbose']:
477 env['CXXCOMSTR'] = "Compiling $TARGET"
478 env['SHCXXCOMSTR'] = "Compiling $TARGET"
479 env['ARCOMSTR'] = "Linking $TARGET"
480 env['LINKCOMSTR'] = "Linking $TARGET"
481 env['SHLINKCOMSTR'] = "Linking $TARGET"
482 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
483 env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
484 env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
485 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
486 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
487
488 ####################### Configure the subdirectories #########################
489
490 # remove obsolete files
491 if not env['usempi']:
492 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
493 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
494
495 from grouptest import *
496 TestGroups=[]
497
498 # keep an environment without warnings-as-errors
499 dodgy_env=env.Clone()
500
501 # now add warnings-as-errors flags. This needs to be done after configuration
502 # because the scons test files have warnings in them
503 if ((fatalwarning != '') and (env['werror'])):
504 env.Append(CCFLAGS = fatalwarning)
505
506 Export(
507 ['env',
508 'dodgy_env',
509 'IS_WINDOWS',
510 'TestGroups'
511 ]
512 )
513
514 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
515 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
516 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
517 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
518
519 env.SConscript(dirs = ['cusplibrary'])
520
521 #This will pull in the escriptcore/py_src and escriptcore/test
522 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
523 #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
524 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
525 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
526 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
527 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
528 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
529 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
530 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
531 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
532 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
533 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
534 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
535
536
537 ######################## Populate the buildvars file #########################
538
539 write_buildvars(env)
540
541 ################### Targets to build and install libraries ###################
542
543 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
544 env.Alias('target_init', [target_init])
545 # delete buildvars upon cleanup
546 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
547
548 # The headers have to be installed prior to build in order to satisfy
549 # #include <paso/Common.h>
550 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
551 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
552
553 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
554 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
555
556 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
557 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
558
559 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
560 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
561
562 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
563 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
564
565 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
566 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
567
568 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
569 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
570
571 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
572 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
573
574 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
575 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
576
577 # Now gather all the above into some easy targets: build_all and install_all
578 build_all_list = []
579 build_all_list += ['build_esysUtils']
580 build_all_list += ['build_paso']
581 build_all_list += ['build_escript']
582 build_all_list += ['build_pasowrap']
583 build_all_list += ['build_dudley']
584 build_all_list += ['build_finley']
585 build_all_list += ['build_ripley']
586 build_all_list += ['build_weipa']
587 if not IS_WINDOWS: build_all_list += ['build_escriptreader']
588 if env['usempi']: build_all_list += ['build_pythonMPI']
589 build_all_list += ['build_escriptconvert']
590 env.Alias('build_all', build_all_list)
591
592 install_all_list = []
593 install_all_list += ['target_init']
594 install_all_list += ['install_esysUtils']
595 install_all_list += ['install_paso']
596 install_all_list += ['install_escript']
597 install_all_list += ['install_pasowrap']
598 install_all_list += ['install_dudley']
599 install_all_list += ['install_finley']
600 install_all_list += ['install_ripley']
601 install_all_list += ['install_weipa']
602 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
603 install_all_list += ['install_downunder_py']
604 install_all_list += ['install_modellib_py']
605 install_all_list += ['install_pycad_py']
606 if env['usempi']: install_all_list += ['install_pythonMPI']
607 install_all_list += ['install_escriptconvert']
608 env.Alias('install_all', install_all_list)
609
610 # Default target is install
611 env.Default('install_all')
612
613 ################## Targets to build and run the test suite ###################
614
615 if not env['cppunit']:
616 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
617 env.Alias('run_tests', test_msg)
618 env.Alias('build_tests', '')
619 env.Alias('run_tests', ['install_all'])
620 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
621 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
622 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
623
624 ##################### Targets to build the documentation #####################
625
626 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
627 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
628 env.Alias('docs', ['basedocs', 'sphinxdoc'])
629 env.Alias('release_prep', ['docs', 'install_all'])
630 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
631
632 # The test scripts are always generated, this target allows us to
633 # generate the testscripts without doing a full build
634 env.Alias('testscripts',[])
635
636 if not IS_WINDOWS:
637 generateTestScripts(env, TestGroups)
638
639
640
641 ######################## Summarize our environment ###########################
642 def print_summary():
643 print("")
644 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
645 print("Escript/Finley revision %s"%global_revision)
646 print(" Install prefix: %s"%env['prefix'])
647 print(" Python: %s"%sysconfig.PREFIX)
648 print(" boost: %s"%env['boost_prefix'])
649 if env['numpy_h']:
650 print(" numpy: YES (with headers)")
651 else:
652 print(" numpy: YES (without headers)")
653 if env['usempi']:
654 print(" MPI: YES (flavour: %s)"%env['mpi'])
655 else:
656 print(" MPI: DISABLED")
657 if env['uselapack']:
658 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
659 else:
660 print(" LAPACK: DISABLED")
661 if env['cuda']:
662 print(" CUDA: YES (nvcc: %s)"%env['nvcc_version'])
663 else:
664 print(" CUDA: DISABLED")
665 d_list=[]
666 e_list=[]
667 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
668 if env[i]: e_list.append(i)
669 else: d_list.append(i)
670 for i in e_list:
671 print("%16s: YES"%i)
672 for i in d_list:
673 print("%16s: DISABLED"%i)
674 if env['cppunit']:
675 print(" CppUnit: FOUND")
676 else:
677 print(" CppUnit: NOT FOUND")
678 if env['gmsh']=='m':
679 print(" gmsh: FOUND, MPI-ENABLED")
680 elif env['gmsh']=='s':
681 print(" gmsh: FOUND")
682 else:
683 print(" gmsh: NOT FOUND")
684 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
685
686 if ((fatalwarning != '') and (env['werror'])):
687 print(" Treating warnings as errors")
688 else:
689 print(" NOT treating warnings as errors")
690 print("")
691 for w in env['warnings']:
692 print("WARNING: %s"%w)
693 if len(GetBuildFailures()):
694 print("\nERROR: build stopped due to errors\n")
695 else:
696 print("\nSUCCESS: build complete\n")
697
698 atexit.register(print_summary)
699

  ViewVC Help
Powered by ViewVC 1.1.26