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

Contents of /branches/3.4.1/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4587 - (show annotations)
Wed Dec 11 06:17:09 2013 UTC (4 years, 10 months ago) by jfenwick
File size: 27919 byte(s)
Preparation begins

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

  ViewVC Help
Powered by ViewVC 1.1.26