/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5183 - (show annotations)
Tue Sep 30 05:55:37 2014 UTC (4 years, 7 months ago) by caltinay
File size: 30171 byte(s)
More long-index work. Added scons option 'longindices'.
Parts will not compile yet if set to true.

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

  ViewVC Help
Powered by ViewVC 1.1.26