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

Contents of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5064 - (show annotations)
Fri Jun 20 05:24:53 2014 UTC (4 years, 10 months ago) by caltinay
File size: 29308 byte(s)
only add nvcc tool if cuda enabled. Also bumped opts version.

1 ##############################################################################
2 #
3 # Copyright (c) 2003-2014 by University of Queensland
4 # http://www.uq.edu.au
5 #
6 # Primary Business: Queensland, Australia
7 # Licensed under the Open Software License version 3.0
8 # http://www.opensource.org/licenses/osl-3.0.php
9 #
10 # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11 # Development 2012-2013 by School of Earth Sciences
12 # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13 #
14 ##############################################################################
15
16 EnsureSConsVersion(0,98,1)
17 EnsurePythonVersion(2,5)
18
19 import atexit, sys, os, platform, re
20 from distutils import sysconfig
21 from dependencies import *
22 from site_init import *
23
24 # Version number to check for in options file. Increment when new features are
25 # added or existing options changed.
26 REQUIRED_OPTS_VERSION=202
27
28 # MS Windows support, many thanks to PH
29 IS_WINDOWS = (os.name == 'nt')
30
31 IS_OSX = (os.uname()[0] == 'Darwin')
32
33 ########################## Determine options file ############################
34 # 1. command line
35 # 2. scons/<hostname>_options.py
36 # 3. name as part of a cluster
37 options_file=ARGUMENTS.get('options_file', None)
38 if not options_file:
39 ext_dir = os.path.join(os.getcwd(), 'scons')
40 hostname = platform.node().split('.')[0]
41 for name in hostname, effectiveName(hostname):
42 mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
43 options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
44 if os.path.isfile(options_file): break
45
46 if not os.path.isfile(options_file):
47 print("\nWARNING:\nOptions file %s" % options_file)
48 print("not found! Default options will be used which is most likely suboptimal.")
49 print("We recommend that you copy the most relavent options file in the scons/os/")
50 print("subdirectory and customize it to your needs.\n")
51 options_file = None
52
53 ############################### Build options ################################
54
55 default_prefix='/usr'
56 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57 lapack_flavours=('none', 'clapack', 'mkl')
58
59 vars = Variables(options_file, ARGUMENTS)
60 vars.AddVariables(
61 PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
62 PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
63 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
64 BoolVariable('verbose', 'Output full compile/link lines', False),
65 # Compiler/Linker options
66 ('cxx', 'Path to C++ compiler', 'default'),
67 ('cc_flags', 'Base C++ compiler flags', 'default'),
68 ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
69 ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
70 ('cxx_extra', 'Extra C++ compiler flags', ''),
71 ('ld_extra', 'Extra linker flags', ''),
72 ('nvcc', 'Path to CUDA compiler', 'default'),
73 ('nvccflags', 'Base CUDA compiler flags', 'default'),
74 BoolVariable('werror','Treat compiler warnings as errors', True),
75 BoolVariable('debug', 'Compile with debug flags', False),
76 BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
77 ('omp_flags', 'OpenMP compiler flags', 'default'),
78 ('omp_ldflags', 'OpenMP linker flags', 'default'),
79 # Mandatory libraries
80 ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82 # Mandatory for tests
83 ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84 ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85 # Optional libraries and options
86 EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87 ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
88 ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
89 BoolVariable('netcdf', 'Enable netCDF file support', False),
90 ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
91 ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
92 BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
93 ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
94 ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
95 BoolVariable('papi', 'Enable PAPI', False),
96 ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
97 ('papi_libs', 'PAPI libraries to link with', ['papi']),
98 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
99 BoolVariable('mkl', 'Enable the Math Kernel Library', False),
100 ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
101 ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
102 BoolVariable('umfpack', 'Enable UMFPACK', False),
103 ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
104 ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
105 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
106 ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
107 ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
108 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
109 ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
110 ('lapack_libs', 'LAPACK libraries to link with', []),
111 BoolVariable('silo', 'Enable the Silo file format in weipa', False),
112 ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
113 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
114 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
115 ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
116 ('visit_libs', 'VisIt libraries to link with', ['simV2']),
117 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
118 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
119 ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
120 # Advanced settings
121 #dudley_assemble_flags = -funroll-loops to actually do something
122 ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
123 # To enable passing function pointers through python
124 BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
125 # An option for specifying the compiler tools (see windows branch)
126 ('tools_names', 'Compiler tools to use', ['default']),
127 ('env_export', 'Environment variables to be passed to tools',[]),
128 EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
129 EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
130 # finer control over library building, intel aggressive global optimisation
131 # works with dynamic libraries on windows.
132 ('build_shared', 'Build dynamic libraries only', False),
133 ('sys_libs', 'Extra libraries to link with', []),
134 ('escript_opts_version', 'Version of options file (do not specify on command line)'),
135 ('SVN_VERSION', 'Do not use from options file', -2),
136 ('pythoncmd', 'which python to compile with','python'),
137 ('usepython3', 'Is this a python3 build? (experimental)', False),
138 ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
139 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
140 ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
141 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
142 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
143 ('compression_libs', 'Compression libraries to link with', ['boost_iostreams'])
144 )
145
146 ##################### Create environment and help text #######################
147
148 # Intel's compiler uses regular expressions improperly and emits a warning
149 # about failing to find the compilers. This warning can be safely ignored.
150
151 # PATH is needed so the compiler, linker and tools are found if they are not
152 # in default locations.
153 env = Environment(tools = ['default'], options = vars,
154 ENV = {'PATH': os.environ['PATH']})
155
156 # set the vars for clang
157 def mkclang(env):
158 env['CXX']='clang++'
159
160 if env['tools_names'] != 'default':
161 zz=env['tools_names']
162 if 'clang' in zz:
163 zz.remove('clang')
164 zz.insert(0, mkclang)
165 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
166 ENV = {'PATH' : os.environ['PATH']})
167
168 if options_file:
169 opts_valid=False
170 if 'escript_opts_version' in env.Dictionary() and \
171 int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
172 opts_valid=True
173 if opts_valid:
174 print("Using options in %s." % options_file)
175 else:
176 print("\nOptions file %s" % options_file)
177 print("is outdated! Please update the file by examining one of the TEMPLATE")
178 print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
179 Exit(1)
180
181 # Generate help text (scons -h)
182 Help(vars.GenerateHelpText(env))
183
184 # Check for superfluous options
185 if len(vars.UnknownVariables())>0:
186 for k in vars.UnknownVariables():
187 print("Unknown option '%s'" % k)
188 Exit(1)
189
190 if env['cuda']:
191 env.Tool('nvcc')
192
193 # create dictionary which will be populated with info for buildvars file
194 env['buildvars']={}
195 # create list which will be populated with warnings if there are any
196 env['warnings']=[]
197
198 #################### Make sure install directories exist #####################
199
200 env['BUILD_DIR']=Dir(env['build_dir']).abspath
201 prefix=Dir(env['prefix']).abspath
202 env['buildvars']['prefix']=prefix
203 env['incinstall'] = os.path.join(prefix, 'include')
204 env['bininstall'] = os.path.join(prefix, 'bin')
205 env['libinstall'] = os.path.join(prefix, 'lib')
206 env['pyinstall'] = os.path.join(prefix, 'esys')
207 if not os.path.isdir(env['bininstall']):
208 os.makedirs(env['bininstall'])
209 if not os.path.isdir(env['libinstall']):
210 os.makedirs(env['libinstall'])
211 if not os.path.isdir(env['pyinstall']):
212 os.makedirs(env['pyinstall'])
213
214 env.Append(CPPPATH = [env['incinstall']])
215 env.Append(LIBPATH = [env['libinstall']])
216
217 ################# Fill in compiler options if not set above ##################
218
219 if env['cxx'] != 'default': env['CXX']=env['cxx']
220
221 if env['nvcc'] != 'default':
222 env['NVCC'] = env['nvcc']
223 else:
224 env['NVCC'] = 'nvcc'
225
226 # version >=9 of intel C++ compiler requires use of icpc to link in C++
227 # runtimes (icc does not)
228 if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
229 env['LINK'] = env['CXX']
230
231 # default compiler/linker options
232 cc_flags = ''
233 cc_optim = ''
234 cc_debug = ''
235 omp_flags = ''
236 omp_ldflags = ''
237 fatalwarning = '' # switch to turn warnings into errors
238 sysheaderopt = '' # how to indicate that a header is a system header
239
240 # env['CC'] might be a full path
241 cc_name=os.path.basename(env['CXX'])
242
243 if cc_name == 'icpc':
244 # Intel compiler
245 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
246 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
247 cc_flags = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
248 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
249 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
250 omp_flags = "-openmp"
251 omp_ldflags = "-openmp -openmp_report=1"
252 fatalwarning = "-Werror"
253 elif cc_name[:3] == 'g++':
254 # GNU C on any system
255 # note that -ffast-math is not used because it breaks isnan(),
256 # see mantis #691
257 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
258 cc_optim = "-O3"
259 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
260 omp_flags = "-fopenmp"
261 omp_ldflags = "-fopenmp"
262 fatalwarning = "-Werror"
263 sysheaderopt = "-isystem"
264 elif cc_name == 'cl':
265 # Microsoft Visual C on Windows
266 cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
267 cc_optim = "/O2 /Op /W3"
268 cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
269 fatalwarning = "/WX"
270 elif cc_name == 'icl':
271 # Intel C on Windows
272 cc_flags = '/EHsc /GR /MD'
273 cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
274 cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
275 omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
276 omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
277
278 env['sysheaderopt']=sysheaderopt
279
280 # set defaults if not otherwise specified
281 if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
282 if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
283 if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
284 if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
285 if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
286 if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
287 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
288
289 if env['nvccflags'] != 'default':
290 env['NVCCFLAGS'] = env['nvccflags']
291 env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
292
293 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
294
295 if env['usepython3']:
296 env.Append(CPPDEFINES=['ESPYTHON3'])
297
298 # set up the autolazy values
299 if env['forcelazy'] == 'on':
300 env.Append(CPPDEFINES=['FAUTOLAZYON'])
301 elif env['forcelazy'] == 'off':
302 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
303
304 # set up the collective resolve values
305 if env['forcecollres'] == 'on':
306 env.Append(CPPDEFINES=['FRESCOLLECTON'])
307 elif env['forcecollres'] == 'off':
308 env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
309
310 # allow non-standard C if requested
311 if env['iknowwhatimdoing']:
312 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
313
314 # Disable OpenMP if no flags provided
315 if env['openmp'] and env['omp_flags'] == '':
316 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
317 env['openmp'] = False
318
319 if env['openmp']:
320 env.Append(CCFLAGS = env['omp_flags'])
321 if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
322 else:
323 env['omp_flags']=''
324 env['omp_ldflags']=''
325
326 env['buildvars']['openmp']=int(env['openmp'])
327
328 # add debug/non-debug compiler flags
329 env['buildvars']['debug']=int(env['debug'])
330 if env['debug']:
331 env.Append(CCFLAGS = env['cc_debug'])
332 else:
333 env.Append(CCFLAGS = env['cc_optim'])
334
335 # always add cc_flags
336 env.Append(CCFLAGS = env['cc_flags'])
337
338 # add system libraries
339 env.AppendUnique(LIBS = env['sys_libs'])
340
341 # determine svn revision
342 global_revision=ARGUMENTS.get('SVN_VERSION', None)
343 if global_revision:
344 global_revision = re.sub(':.*', '', global_revision)
345 global_revision = re.sub('[^0-9]', '', global_revision)
346 if global_revision == '': global_revision='-2'
347 else:
348 # Get the global Subversion revision number for the getVersion() method
349 try:
350 global_revision = os.popen('svnversion -n .').read()
351 global_revision = re.sub(':.*', '', global_revision)
352 global_revision = re.sub('[^0-9]', '', global_revision)
353 if global_revision == '': global_revision='-2'
354 except:
355 global_revision = '-1'
356 env['svn_revision']=global_revision
357 env['buildvars']['svn_revision']=global_revision
358 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
359
360 if IS_WINDOWS:
361 if not env['build_shared']:
362 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
363 env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
364
365 # VSL random numbers
366 env['buildvars']['vsl_random']=int(env['vsl_random'])
367 if env['vsl_random']:
368 env.Append(CPPDEFINES = ['MKLRANDOM'])
369
370 env['IS_WINDOWS']=IS_WINDOWS
371
372 ###################### Copy required environment vars ########################
373
374 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
375 if IS_WINDOWS:
376 LD_LIBRARY_PATH_KEY='PATH'
377 env['ENV']['LD_LIBRARY_PATH']=''
378 else:
379 LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
380
381 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
382
383 # the following env variables are exported for the unit tests
384
385 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
386 try:
387 env['ENV'][key] = os.environ[key]
388 except KeyError:
389 env['ENV'][key] = 1
390
391 env_export=env['env_export']
392 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
393
394 for key in set(env_export):
395 try:
396 env['ENV'][key] = os.environ[key]
397 except KeyError:
398 pass
399
400 try:
401 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
402 except KeyError:
403 pass
404
405 if IS_OSX:
406 try:
407 env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
408 except KeyError:
409 pass
410
411
412 # these shouldn't be needed
413 #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
414 # try:
415 # env['ENV'][key] = os.environ[key]
416 # except KeyError:
417 # pass
418
419 try:
420 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
421 except KeyError:
422 pass
423
424 ######################## Add some custom builders ############################
425
426 if env['pythoncmd']=='python':
427 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
428 else:
429 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
430 env.Append(BUILDERS = {'PyCompile' : py_builder});
431
432 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
433 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
434
435 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
436 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
437
438 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 ######## numpy (required) and numpy headers (optional)
453 env=checkNumpy(env)
454
455 ######## CppUnit (required for tests)
456 env=checkCppUnit(env)
457
458 ######## optional python modules (sympy, pyproj)
459 env=checkOptionalModules(env)
460
461 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
462 env=checkOptionalLibraries(env)
463
464 ######## PDFLaTeX (for documentation)
465 env=checkPDFLatex(env)
466
467 # keep some of our install paths first in the list for the unit tests
468 env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
469 env.PrependENVPath('PYTHONPATH', prefix)
470 env['ENV']['ESCRIPT_ROOT'] = prefix
471
472 if not env['verbose']:
473 env['CXXCOMSTR'] = "Compiling $TARGET"
474 env['SHCXXCOMSTR'] = "Compiling $TARGET"
475 env['ARCOMSTR'] = "Linking $TARGET"
476 env['LINKCOMSTR'] = "Linking $TARGET"
477 env['SHLINKCOMSTR'] = "Linking $TARGET"
478 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
479 env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
480 env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
481 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
482 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
483
484 ####################### Configure the subdirectories #########################
485
486 # remove obsolete files
487 if not env['usempi']:
488 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
489 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
490
491 from grouptest import *
492 TestGroups=[]
493
494 # keep an environment without warnings-as-errors
495 dodgy_env=env.Clone()
496
497 # now add warnings-as-errors flags. This needs to be done after configuration
498 # because the scons test files have warnings in them
499 if ((fatalwarning != '') and (env['werror'])):
500 env.Append(CCFLAGS = fatalwarning)
501
502 Export(
503 ['env',
504 'dodgy_env',
505 'IS_WINDOWS',
506 'TestGroups'
507 ]
508 )
509
510 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
511 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
512 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
513 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
514
515 #This will pull in the escriptcore/py_src and escriptcore/test
516 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
517 #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
518 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
519 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
520 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
521 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
522 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
523 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
524 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
525 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
526 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
527 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
528 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
529
530
531 ######################## Populate the buildvars file #########################
532
533 write_buildvars(env)
534
535 ################### Targets to build and install libraries ###################
536
537 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
538 env.Alias('target_init', [target_init])
539 # delete buildvars upon cleanup
540 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
541
542 cusphdr_inst = env.Install(env['incinstall'], Dir('#cusplibrary/cusp'))
543 env.Alias('install_cusp_headers', cusphdr_inst)
544 # The headers have to be installed prior to build in order to satisfy
545 # #include <paso/Common.h>
546 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
547 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
548
549 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
550 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
551
552 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
553 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
554
555 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
556 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
557
558 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
559 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
560
561 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
562 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
563
564 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
565 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
566
567 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
568 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
569
570 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
571 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
572
573 # Now gather all the above into some easy targets: build_all and install_all
574 build_all_list = []
575 build_all_list += ['build_esysUtils']
576 build_all_list += ['build_paso']
577 build_all_list += ['build_escript']
578 build_all_list += ['build_pasowrap']
579 build_all_list += ['build_dudley']
580 build_all_list += ['build_finley']
581 build_all_list += ['build_ripley']
582 build_all_list += ['build_weipa']
583 if not IS_WINDOWS: build_all_list += ['build_escriptreader']
584 if env['usempi']: build_all_list += ['build_pythonMPI']
585 build_all_list += ['build_escriptconvert']
586 env.Alias('build_all', build_all_list)
587
588 install_all_list = []
589 install_all_list += ['target_init']
590 install_all_list += ['install_esysUtils']
591 install_all_list += ['install_paso']
592 install_all_list += ['install_escript']
593 install_all_list += ['install_pasowrap']
594 install_all_list += ['install_dudley']
595 install_all_list += ['install_finley']
596 install_all_list += ['install_ripley']
597 install_all_list += ['install_weipa']
598 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
599 install_all_list += ['install_downunder_py']
600 install_all_list += ['install_modellib_py']
601 install_all_list += ['install_pycad_py']
602 if env['usempi']: install_all_list += ['install_pythonMPI']
603 install_all_list += ['install_escriptconvert']
604 env.Alias('install_all', install_all_list)
605
606 # Default target is install
607 env.Default('install_all')
608
609 ################## Targets to build and run the test suite ###################
610
611 if not env['cppunit']:
612 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
613 env.Alias('run_tests', test_msg)
614 env.Alias('build_tests', '')
615 env.Alias('run_tests', ['install_all'])
616 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
617 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
618 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
619
620 ##################### Targets to build the documentation #####################
621
622 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
623 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
624 env.Alias('docs', ['basedocs', 'sphinxdoc'])
625 env.Alias('release_prep', ['docs', 'install_all'])
626 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
627
628 # The test scripts are always generated, this target allows us to
629 # generate the testscripts without doing a full build
630 env.Alias('testscripts',[])
631
632 if not IS_WINDOWS:
633 generateTestScripts(env, TestGroups)
634
635
636
637 ######################## Summarize our environment ###########################
638 def print_summary():
639 print("")
640 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
641 print("Escript/Finley revision %s"%global_revision)
642 print(" Install prefix: %s"%env['prefix'])
643 print(" Python: %s"%sysconfig.PREFIX)
644 print(" boost: %s"%env['boost_prefix'])
645 if env['numpy_h']:
646 print(" numpy: YES (with headers)")
647 else:
648 print(" numpy: YES (without headers)")
649 if env['usempi']:
650 print(" MPI: YES (flavour: %s)"%env['mpi'])
651 else:
652 print(" MPI: DISABLED")
653 if env['uselapack']:
654 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
655 else:
656 print(" LAPACK: DISABLED")
657 d_list=[]
658 e_list=[]
659 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
660 if env[i]: e_list.append(i)
661 else: d_list.append(i)
662 for i in e_list:
663 print("%16s: YES"%i)
664 for i in d_list:
665 print("%16s: DISABLED"%i)
666 if env['cppunit']:
667 print(" CppUnit: FOUND")
668 else:
669 print(" CppUnit: NOT FOUND")
670 if env['gmsh']=='m':
671 print(" gmsh: FOUND, MPI-ENABLED")
672 elif env['gmsh']=='s':
673 print(" gmsh: FOUND")
674 else:
675 print(" gmsh: NOT FOUND")
676 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
677
678 if ((fatalwarning != '') and (env['werror'])):
679 print(" Treating warnings as errors")
680 else:
681 print(" NOT treating warnings as errors")
682 print("")
683 for w in env['warnings']:
684 print("WARNING: %s"%w)
685 if len(GetBuildFailures()):
686 print("\nERROR: build stopped due to errors\n")
687 else:
688 print("\nSUCCESS: build complete\n")
689
690 atexit.register(print_summary)
691

  ViewVC Help
Powered by ViewVC 1.1.26