/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4657 - (show annotations)
Thu Feb 6 06:12:20 2014 UTC (5 years, 5 months ago) by jfenwick
File size: 28150 byte(s)
I changed some files.
Updated copyright notices, added GeoComp.



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=201
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 one of the TEMPLATE files in the scons/")
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 BoolVariable('werror','Treat compiler warnings as errors', True),
73 BoolVariable('debug', 'Compile with debug flags', False),
74 BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
75 ('omp_flags', 'OpenMP compiler flags', 'default'),
76 ('omp_ldflags', 'OpenMP linker flags', 'default'),
77 # Mandatory libraries
78 ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
79 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
80 # Mandatory for tests
81 ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
82 ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
83 # Optional libraries and options
84 EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
85 ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
86 ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
87 BoolVariable('netcdf', 'Enable netCDF file support', False),
88 ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
89 ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
90 BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
91 ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
92 ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
93 BoolVariable('papi', 'Enable PAPI', False),
94 ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
95 ('papi_libs', 'PAPI libraries to link with', ['papi']),
96 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
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 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
116 # Advanced settings
117 #dudley_assemble_flags = -funroll-loops to actually do something
118 ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
119 # To enable passing function pointers through python
120 BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
121 # An option for specifying the compiler tools (see windows branch)
122 ('tools_names', 'Compiler tools to use', ['default']),
123 ('env_export', 'Environment variables to be passed to tools',[]),
124 EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
125 EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
126 # finer control over library building, intel aggressive global optimisation
127 # works with dynamic libraries on windows.
128 ('build_shared', 'Build dynamic libraries only', False),
129 ('sys_libs', 'Extra libraries to link with', []),
130 ('escript_opts_version', 'Version of options file (do not specify on command line)'),
131 ('SVN_VERSION', 'Do not use from options file', -2),
132 ('pythoncmd', 'which python to compile with','python'),
133 ('usepython3', 'Is this a python3 build? (experimental)', False),
134 ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
135 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
136 ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
137 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
138 )
139
140 ##################### Create environment and help text #######################
141
142 # Intel's compiler uses regular expressions improperly and emits a warning
143 # about failing to find the compilers. This warning can be safely ignored.
144
145 # PATH is needed so the compiler, linker and tools are found if they are not
146 # in default locations.
147 env = Environment(tools = ['default'], options = vars,
148 ENV = {'PATH': os.environ['PATH']})
149
150 # set the vars for clang
151 def mkclang(env):
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['cxx'] != 'default': env['CXX']=env['cxx']
211
212 # version >=9 of intel C++ compiler requires use of icpc to link in C++
213 # runtimes (icc does not)
214 if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
215 env['LINK'] = env['CXX']
216
217 # default compiler/linker options
218 cc_flags = ''
219 cc_optim = ''
220 cc_debug = ''
221 omp_flags = ''
222 omp_ldflags = ''
223 fatalwarning = '' # switch to turn warnings into errors
224 sysheaderopt = '' # how to indicate that a header is a system header
225
226 # env['CC'] might be a full path
227 cc_name=os.path.basename(env['CXX'])
228
229 if cc_name == 'icpc':
230 # Intel compiler
231 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
232 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
233 cc_flags = "-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] == 'g++':
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['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
273 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
274
275 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
276
277 if env['usepython3']:
278 env.Append(CPPDEFINES=['ESPYTHON3'])
279
280 # set up the autolazy values
281 if env['forcelazy'] == 'on':
282 env.Append(CPPDEFINES=['FAUTOLAZYON'])
283 elif env['forcelazy'] == 'off':
284 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
285
286 # set up the collective resolve values
287 if env['forcecollres'] == 'on':
288 env.Append(CPPDEFINES=['FRESCOLLECTON'])
289 elif env['forcecollres'] == 'off':
290 env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
291
292 # allow non-standard C if requested
293 if env['iknowwhatimdoing']:
294 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
295
296 # Disable OpenMP if no flags provided
297 if env['openmp'] and env['omp_flags'] == '':
298 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
299 env['openmp'] = False
300
301 if env['openmp']:
302 env.Append(CCFLAGS = env['omp_flags'])
303 if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
304 else:
305 env['omp_flags']=''
306 env['omp_ldflags']=''
307
308 env['buildvars']['openmp']=int(env['openmp'])
309
310 # add debug/non-debug compiler flags
311 env['buildvars']['debug']=int(env['debug'])
312 if env['debug']:
313 env.Append(CCFLAGS = env['cc_debug'])
314 else:
315 env.Append(CCFLAGS = env['cc_optim'])
316
317 # always add cc_flags
318 env.Append(CCFLAGS = env['cc_flags'])
319
320 # add system libraries
321 env.AppendUnique(LIBS = env['sys_libs'])
322
323 # determine svn revision
324 global_revision=ARGUMENTS.get('SVN_VERSION', None)
325 if global_revision:
326 global_revision = re.sub(':.*', '', global_revision)
327 global_revision = re.sub('[^0-9]', '', global_revision)
328 if global_revision == '': global_revision='-2'
329 else:
330 # Get the global Subversion revision number for the getVersion() method
331 try:
332 global_revision = os.popen('svnversion -n .').read()
333 global_revision = re.sub(':.*', '', global_revision)
334 global_revision = re.sub('[^0-9]', '', global_revision)
335 if global_revision == '': global_revision='-2'
336 except:
337 global_revision = '-1'
338 env['svn_revision']=global_revision
339 env['buildvars']['svn_revision']=global_revision
340 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
341
342 if IS_WINDOWS:
343 if not env['build_shared']:
344 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
345 env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
346
347 # VSL random numbers
348 env['buildvars']['vsl_random']=int(env['vsl_random'])
349 if env['vsl_random']:
350 env.Append(CPPDEFINES = ['MKLRANDOM'])
351
352 env['IS_WINDOWS']=IS_WINDOWS
353
354 ###################### Copy required environment vars ########################
355
356 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
357 if IS_WINDOWS:
358 LD_LIBRARY_PATH_KEY='PATH'
359 env['ENV']['LD_LIBRARY_PATH']=''
360 else:
361 LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
362
363 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
364
365 # the following env variables are exported for the unit tests
366
367 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
368 try:
369 env['ENV'][key] = os.environ[key]
370 except KeyError:
371 env['ENV'][key] = 1
372
373 env_export=env['env_export']
374 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP'])
375
376 for key in set(env_export):
377 try:
378 env['ENV'][key] = os.environ[key]
379 except KeyError:
380 pass
381
382 try:
383 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
384 except KeyError:
385 pass
386
387 if IS_OSX:
388 try:
389 env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
390 except KeyError:
391 pass
392
393
394 # these shouldn't be needed
395 #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
396 # try:
397 # env['ENV'][key] = os.environ[key]
398 # except KeyError:
399 # pass
400
401 try:
402 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
403 except KeyError:
404 pass
405
406 ######################## Add some custom builders ############################
407
408 if env['pythoncmd']=='python':
409 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
410 else:
411 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
412 env.Append(BUILDERS = {'PyCompile' : py_builder});
413
414 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
415 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
416
417 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
418 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
419
420 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
421 env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
422
423 ############################ Dependency checks ###############################
424
425 ######## Compiler
426 env=checkCompiler(env)
427
428 ######## Python headers & library (required)
429 env=checkPython(env)
430
431 ######## boost & boost-python (required)
432 env=checkBoost(env)
433
434 ######## numpy (required) and numpy headers (optional)
435 env=checkNumpy(env)
436
437 ######## CppUnit (required for tests)
438 env=checkCppUnit(env)
439
440 ######## optional python modules (sympy, pyproj)
441 env=checkOptionalModules(env)
442
443 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
444 env=checkOptionalLibraries(env)
445
446 ######## PDFLaTeX (for documentation)
447 env=checkPDFLatex(env)
448
449 # keep some of our install paths first in the list for the unit tests
450 env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
451 env.PrependENVPath('PYTHONPATH', prefix)
452 env['ENV']['ESCRIPT_ROOT'] = prefix
453
454 if not env['verbose']:
455 env['CXXCOMSTR'] = "Compiling $TARGET"
456 env['SHCXXCOMSTR'] = "Compiling $TARGET"
457 env['ARCOMSTR'] = "Linking $TARGET"
458 env['LINKCOMSTR'] = "Linking $TARGET"
459 env['SHLINKCOMSTR'] = "Linking $TARGET"
460 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
461 env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
462 env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
463 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
464 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
465
466 ####################### Configure the subdirectories #########################
467
468 # remove obsolete files
469 if not env['usempi']:
470 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
471 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
472
473 from grouptest import *
474 TestGroups=[]
475
476 # keep an environment without warnings-as-errors
477 dodgy_env=env.Clone()
478
479 # now add warnings-as-errors flags. This needs to be done after configuration
480 # because the scons test files have warnings in them
481 if ((fatalwarning != '') and (env['werror'])):
482 env.Append(CCFLAGS = fatalwarning)
483
484 Export(
485 ['env',
486 'dodgy_env',
487 'IS_WINDOWS',
488 'TestGroups'
489 ]
490 )
491
492 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
493 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
494 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
495 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
496
497 #This will pull in the escriptcore/py_src and escriptcore/test
498 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
499 #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
500 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
501 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
502 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
503 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
504 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
505 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
506 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
507 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
508 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
509 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
510 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
511
512
513 ######################## Populate the buildvars file #########################
514
515 write_buildvars(env)
516
517 ################### Targets to build and install libraries ###################
518
519 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
520 env.Alias('target_init', [target_init])
521 # delete buildvars upon cleanup
522 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
523
524 # The headers have to be installed prior to build in order to satisfy
525 # #include <paso/Common.h>
526 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
527 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
528
529 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
530 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
531
532 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
533 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
534
535 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
536 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
537
538 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
539 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
540
541 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
542 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
543
544 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
545 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
546
547 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
548 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
549
550 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
551 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
552
553 # Now gather all the above into some easy targets: build_all and install_all
554 build_all_list = []
555 build_all_list += ['build_esysUtils']
556 build_all_list += ['build_paso']
557 build_all_list += ['build_escript']
558 build_all_list += ['build_pasowrap']
559 build_all_list += ['build_dudley']
560 build_all_list += ['build_finley']
561 build_all_list += ['build_ripley']
562 build_all_list += ['build_weipa']
563 if not IS_WINDOWS: build_all_list += ['build_escriptreader']
564 if env['usempi']: build_all_list += ['build_pythonMPI']
565 build_all_list += ['build_escriptconvert']
566 env.Alias('build_all', build_all_list)
567
568 install_all_list = []
569 install_all_list += ['target_init']
570 install_all_list += ['install_esysUtils']
571 install_all_list += ['install_paso']
572 install_all_list += ['install_escript']
573 install_all_list += ['install_pasowrap']
574 install_all_list += ['install_dudley']
575 install_all_list += ['install_finley']
576 install_all_list += ['install_ripley']
577 install_all_list += ['install_weipa']
578 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
579 install_all_list += ['install_downunder_py']
580 install_all_list += ['install_modellib_py']
581 install_all_list += ['install_pycad_py']
582 if env['usempi']: install_all_list += ['install_pythonMPI']
583 install_all_list += ['install_escriptconvert']
584 env.Alias('install_all', install_all_list)
585
586 # Default target is install
587 env.Default('install_all')
588
589 ################## Targets to build and run the test suite ###################
590
591 if not env['cppunit']:
592 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
593 env.Alias('run_tests', test_msg)
594 env.Alias('build_tests', '')
595 env.Alias('run_tests', ['install_all'])
596 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
597 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
598 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
599
600 ##################### Targets to build the documentation #####################
601
602 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
603 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
604 env.Alias('docs', ['basedocs', 'sphinxdoc'])
605 env.Alias('release_prep', ['docs', 'install_all'])
606 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
607
608 # The test scripts are always generated, this target allows us to
609 # generate the testscripts without doing a full build
610 env.Alias('testscripts',[])
611
612 if not IS_WINDOWS:
613 generateTestScripts(env, TestGroups)
614
615
616
617 ######################## Summarize our environment ###########################
618 def print_summary():
619 print("")
620 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
621 print("Escript/Finley revision %s"%global_revision)
622 print(" Install prefix: %s"%env['prefix'])
623 print(" Python: %s"%sysconfig.PREFIX)
624 print(" boost: %s"%env['boost_prefix'])
625 if env['numpy_h']:
626 print(" numpy: YES (with headers)")
627 else:
628 print(" numpy: YES (without headers)")
629 if env['usempi']:
630 print(" MPI: YES (flavour: %s)"%env['mpi'])
631 else:
632 print(" MPI: DISABLED")
633 if env['uselapack']:
634 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
635 else:
636 print(" LAPACK: DISABLED")
637 d_list=[]
638 e_list=[]
639 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
640 if env[i]: e_list.append(i)
641 else: d_list.append(i)
642 for i in e_list:
643 print("%16s: YES"%i)
644 for i in d_list:
645 print("%16s: DISABLED"%i)
646 if env['cppunit']:
647 print(" CppUnit: FOUND")
648 else:
649 print(" CppUnit: NOT FOUND")
650 if env['gmsh']=='m':
651 print(" gmsh: FOUND, MPI-ENABLED")
652 elif env['gmsh']=='s':
653 print(" gmsh: FOUND")
654 else:
655 print(" gmsh: NOT FOUND")
656
657 if ((fatalwarning != '') and (env['werror'])):
658 print(" Treating warnings as errors")
659 else:
660 print(" NOT treating warnings as errors")
661 print("")
662 for w in env['warnings']:
663 print("WARNING: %s"%w)
664
665 atexit.register(print_summary)
666

  ViewVC Help
Powered by ViewVC 1.1.26