/[escript]/branches/4.0fordebian/SConstruct
ViewVC logotype

Contents of /branches/4.0fordebian/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5250 - (show annotations)
Mon Nov 10 04:05:11 2014 UTC (4 years, 5 months ago) by caltinay
Original Path: trunk/SConstruct
File size: 30394 byte(s)
Updated wheezy template options file and made our rodents import from there.
Had to rename scons/os -> scons/templates to avoid import conflicts.
Removed obsolete option vsl_random and added new options.
Other templates are yet to be updated.

1 ##############################################################################
2 #
3 # Copyright (c) 2003-2014 by University of Queensland
4 # http://www.uq.edu.au
5 #
6 # Primary Business: Queensland, Australia
7 # Licensed under the Open Software License version 3.0
8 # http://www.opensource.org/licenses/osl-3.0.php
9 #
10 # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11 # Development 2012-2013 by School of Earth Sciences
12 # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13 #
14 ##############################################################################
15
16 EnsureSConsVersion(0,98,1)
17 EnsurePythonVersion(2,5)
18
19 import atexit, sys, os, platform, re
20 from distutils import sysconfig
21 from dependencies import *
22 from site_init import *
23
24 # Version number to check for in options file. Increment when new features are
25 # added or existing options changed.
26 REQUIRED_OPTS_VERSION=202
27
28 # MS Windows support, many thanks to PH
29 IS_WINDOWS = (os.name == 'nt')
30
31 IS_OSX = (os.uname()[0] == 'Darwin')
32
33 ########################## Determine options file ############################
34 # 1. command line
35 # 2. scons/<hostname>_options.py
36 # 3. name as part of a cluster
37 options_file=ARGUMENTS.get('options_file', None)
38 if not options_file:
39 ext_dir = os.path.join(os.getcwd(), 'scons')
40 hostname = platform.node().split('.')[0]
41 for name in hostname, effectiveName(hostname):
42 mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
43 options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
44 if os.path.isfile(options_file): break
45
46 if not os.path.isfile(options_file):
47 print("\nWARNING:\nOptions file %s" % options_file)
48 print("not found! Default options will be used which is most likely suboptimal.")
49 print("We recommend that you copy the most relavent options file in the scons/os/")
50 print("subdirectory and customize it to your needs.\n")
51 options_file = None
52
53 ############################### Build options ################################
54
55 default_prefix='/usr'
56 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57 lapack_flavours=('none', 'clapack', 'mkl')
58
59 vars = Variables(options_file, ARGUMENTS)
60 vars.AddVariables(
61 PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
62 PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
63 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
64 BoolVariable('verbose', 'Output full compile/link lines', False),
65 # Compiler/Linker options
66 ('cxx', 'Path to C++ compiler', 'default'),
67 ('cc_flags', 'Base C++ compiler flags', 'default'),
68 ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
69 ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
70 ('cxx_extra', 'Extra C++ compiler flags', ''),
71 ('ld_extra', 'Extra linker flags', ''),
72 ('nvcc', 'Path to CUDA compiler', 'default'),
73 ('nvccflags', 'Base CUDA compiler flags', 'default'),
74 BoolVariable('werror','Treat compiler warnings as errors', True),
75 BoolVariable('debug', 'Compile with debug flags', False),
76 BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
77 ('omp_flags', 'OpenMP compiler flags', 'default'),
78 ('omp_ldflags', 'OpenMP linker flags', 'default'),
79 # Mandatory libraries
80 ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82 # Mandatory for tests
83 ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84 ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85 # Optional libraries and options
86 EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87 ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
88 ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
89 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
90 ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
91 BoolVariable('netcdf', 'Enable netCDF file support', False),
92 ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
93 ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
94 BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
95 ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
96 ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
97 BoolVariable('mkl', 'Enable the Math Kernel Library', False),
98 ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
99 ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
100 BoolVariable('umfpack', 'Enable UMFPACK', False),
101 ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
102 ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
103 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
104 ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
105 ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
106 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
107 ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
108 ('lapack_libs', 'LAPACK libraries to link with', []),
109 BoolVariable('silo', 'Enable the Silo file format in weipa', False),
110 ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
111 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
112 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
113 ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
114 ('visit_libs', 'VisIt libraries to link with', ['simV2']),
115 ListVariable('domains', 'Which domains to build', 'all',\
116 ['dudley','finley','ripley','speckley']),
117 # Advanced settings
118 #dudley_assemble_flags = -funroll-loops to actually do something
119 ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
120 # To enable passing function pointers through python
121 BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
122 # An option for specifying the compiler tools (see windows branch)
123 ('tools_names', 'Compiler tools to use', ['default']),
124 ('env_export', 'Environment variables to be passed to tools',[]),
125 EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
126 EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
127 ('build_shared', 'Build dynamic libraries only', False),
128 ('sys_libs', 'Extra libraries to link with', []),
129 ('escript_opts_version', 'Version of options file (do not specify on command line)'),
130 ('SVN_VERSION', 'Do not use from options file', -2),
131 ('pythoncmd', 'which python to compile with','python'),
132 ('usepython3', 'Is this a python3 build? (experimental)', False),
133 ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
134 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
135 ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
136 BoolVariable('longindices', 'use long indices (for very large matrices)', False),
137 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
138 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
139 ('compression_libs', 'Compression libraries to link with', ['boost_iostreams']),
140 BoolVariable('papi', 'Enable PAPI', False),
141 ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
142 ('papi_libs', 'PAPI libraries to link with', ['papi']),
143 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False)
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 #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
257 cc_debug = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
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 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 #do not auto build
515 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
516 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
517 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
518 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
519
520 env.SConscript(dirs = ['cusplibrary'])
521
522 #This will pull in the escriptcore/py_src and escriptcore/test
523 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', 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 if 'dudley' in env['domains']:
527 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
528 if 'finley' in env['domains']:
529 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
530 if 'ripley' in env['domains']:
531 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
532 if 'speckley' in env['domains']:
533 env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
534 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
535 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
536 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
537 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
538 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
539 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
540
541
542 ######################## Populate the buildvars file #########################
543
544 write_buildvars(env)
545
546 ################### Targets to build and install libraries ###################
547
548 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
549 env.Alias('target_init', [target_init])
550 # delete buildvars upon cleanup
551 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
552
553 # The headers have to be installed prior to build in order to satisfy
554 # #include <paso/Common.h>
555 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
556 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
557
558 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
559 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
560
561 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
562 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
563
564 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
565 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
566
567 if 'dudley' in env['domains']:
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 if 'finley' in env['domains']:
572 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
573 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
574
575 if 'ripley' in env['domains']:
576 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
577 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
578
579 if 'speckley' in env['domains']:
580 env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
581 env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
582
583 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
584 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
585
586 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
587 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
588
589 # Now gather all the above into some easy targets: build_all and install_all
590 build_all_list = []
591 build_all_list += ['build_esysUtils']
592 build_all_list += ['build_paso']
593 build_all_list += ['build_escript']
594 build_all_list += ['build_pasowrap']
595 if 'dudley' in env['domains']: build_all_list += ['build_dudley']
596 if 'finley' in env['domains']: build_all_list += ['build_finley']
597 if 'ripley' in env['domains']: build_all_list += ['build_ripley']
598 if 'speckley' in env['domains']: build_all_list += ['build_speckley']
599 build_all_list += ['build_weipa']
600 if not IS_WINDOWS and 'finley' in env['domains']:
601 build_all_list += ['build_escriptreader']
602 if env['usempi']: build_all_list += ['build_pythonMPI']
603 env.Alias('build_all', build_all_list)
604
605 install_all_list = []
606 install_all_list += ['target_init']
607 install_all_list += ['install_esysUtils']
608 install_all_list += ['install_paso']
609 install_all_list += ['install_escript']
610 install_all_list += ['install_pasowrap']
611 if 'dudley' in env['domains']: install_all_list += ['install_dudley']
612 if 'finley' in env['domains']: install_all_list += ['install_finley']
613 if 'ripley' in env['domains']: install_all_list += ['install_ripley']
614 if 'speckley' in env['domains']: install_all_list += ['install_speckley']
615 install_all_list += ['install_weipa']
616 if not IS_WINDOWS and 'finley' in env['domains']:
617 install_all_list += ['install_escriptreader']
618 install_all_list += ['install_downunder_py']
619 install_all_list += ['install_modellib_py']
620 install_all_list += ['install_pycad_py']
621 if env['usempi']: install_all_list += ['install_pythonMPI']
622 env.Alias('install_all', install_all_list)
623
624 # Default target is install
625 env.Default('install_all')
626
627 ################## Targets to build and run the test suite ###################
628
629 if not env['cppunit']:
630 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
631 env.Alias('run_tests', test_msg)
632 env.Alias('build_tests', '')
633 env.Alias('run_tests', ['install_all'])
634 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
635 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
636 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
637
638 ##################### Targets to build the documentation #####################
639
640 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
641 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
642 env.Alias('docs', ['basedocs', 'sphinxdoc'])
643 env.Alias('release_prep', ['docs', 'install_all'])
644 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
645
646 # The test scripts are always generated, this target allows us to
647 # generate the testscripts without doing a full build
648 env.Alias('testscripts',[])
649
650 if not IS_WINDOWS:
651 generateTestScripts(env, TestGroups)
652
653
654 ######################## Summarize our environment ###########################
655 def print_summary():
656 print("")
657 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
658 print("Escript/Finley revision %s"%global_revision)
659 print(" Install prefix: %s"%env['prefix'])
660 print(" Python: %s"%sysconfig.PREFIX)
661 print(" boost: %s"%env['boost_prefix'])
662 if env['numpy_h']:
663 print(" numpy: YES (with headers)")
664 else:
665 print(" numpy: YES (without headers)")
666 if env['usempi']:
667 print(" MPI: YES (flavour: %s)"%env['mpi'])
668 else:
669 print(" MPI: NO")
670 if env['uselapack']:
671 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
672 else:
673 print(" LAPACK: NO")
674 if env['cuda']:
675 print(" CUDA: YES (nvcc: %s)"%env['nvcc_version'])
676 else:
677 print(" CUDA: NO")
678 d_list=[]
679 e_list=[]
680 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit':
681 if env[i]: e_list.append(i)
682 else: d_list.append(i)
683 for i in e_list:
684 print("%16s: YES"%i)
685 for i in d_list:
686 print("%16s: NO"%i)
687 if env['cppunit']:
688 print(" CppUnit: YES")
689 else:
690 print(" CppUnit: NO")
691 if env['gmsh']=='m':
692 print(" gmsh: YES, MPI-ENABLED")
693 elif env['gmsh']=='s':
694 print(" gmsh: YES")
695 else:
696 print(" gmsh: NO")
697 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
698
699 if ((fatalwarning != '') and (env['werror'])):
700 print(" Treating warnings as errors")
701 else:
702 print(" NOT treating warnings as errors")
703 print("")
704 for w in env['warnings']:
705 print("WARNING: %s"%w)
706 if len(GetBuildFailures()):
707 print("\nERROR: build stopped due to errors\n")
708 else:
709 print("\nSUCCESS: build complete\n")
710
711 atexit.register(print_summary)
712

  ViewVC Help
Powered by ViewVC 1.1.26