/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4299 - (show annotations)
Mon Mar 11 00:40:09 2013 UTC (6 years, 9 months ago) by caltinay
File size: 27850 byte(s)
Exit with a warning in example files that require unavailable scipy.
bollide->hamster
added warnings to scons for scipy and gdal

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

  ViewVC Help
Powered by ViewVC 1.1.26