/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4508 - (show annotations)
Wed Jul 24 04:23:22 2013 UTC (5 years, 9 months ago) by jfenwick
File size: 28160 byte(s)
Moving to escriptcore
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 ('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/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
492
493 #This will pull in the escriptcore/py_src and escriptcore/test
494 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
495 #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
496 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
497 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
498 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
499 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
500 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
501 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
502 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
503 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
504 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
505 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
506 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
507
508
509 ######################## Populate the buildvars file #########################
510
511 write_buildvars(env)
512
513 ################### Targets to build and install libraries ###################
514
515 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
516 env.Alias('target_init', [target_init])
517 # delete buildvars upon cleanup
518 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
519
520 # The headers have to be installed prior to build in order to satisfy
521 # #include <paso/Common.h>
522 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
523 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
524
525 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
526 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
527
528 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
529 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
530
531 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
532 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
533
534 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
535 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
536
537 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
538 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
539
540 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
541 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
542
543 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
544 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
545
546 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
547 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
548
549 # Now gather all the above into some easy targets: build_all and install_all
550 build_all_list = []
551 build_all_list += ['build_esysUtils']
552 build_all_list += ['build_paso']
553 build_all_list += ['build_escript']
554 build_all_list += ['build_pasowrap']
555 build_all_list += ['build_dudley']
556 build_all_list += ['build_finley']
557 build_all_list += ['build_ripley']
558 build_all_list += ['build_weipa']
559 if not IS_WINDOWS: build_all_list += ['build_escriptreader']
560 if env['usempi']: build_all_list += ['build_pythonMPI']
561 build_all_list += ['build_escriptconvert']
562 env.Alias('build_all', build_all_list)
563
564 install_all_list = []
565 install_all_list += ['target_init']
566 install_all_list += ['install_esysUtils']
567 install_all_list += ['install_paso']
568 install_all_list += ['install_escript']
569 install_all_list += ['install_pasowrap']
570 install_all_list += ['install_dudley']
571 install_all_list += ['install_finley']
572 install_all_list += ['install_ripley']
573 install_all_list += ['install_weipa']
574 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
575 install_all_list += ['install_downunder_py']
576 install_all_list += ['install_modellib_py']
577 install_all_list += ['install_pycad_py']
578 if env['usempi']: install_all_list += ['install_pythonMPI']
579 install_all_list += ['install_escriptconvert']
580 env.Alias('install_all', install_all_list)
581
582 # Default target is install
583 env.Default('install_all')
584
585 ################## Targets to build and run the test suite ###################
586
587 if not env['cppunit']:
588 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')
589 env.Alias('run_tests', test_msg)
590 env.Alias('build_tests', '')
591 env.Alias('run_tests', ['install_all'])
592 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
593 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
594 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
595
596 ##################### Targets to build the documentation #####################
597
598 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
599 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
600 env.Alias('docs', ['basedocs', 'sphinxdoc'])
601 env.Alias('release_prep', ['docs', 'install_all'])
602 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
603
604 # The test scripts are always generated, this target allows us to
605 # generate the testscripts without doing a full build
606 env.Alias('testscripts',[])
607
608 if not IS_WINDOWS:
609 generateTestScripts(env, TestGroups)
610
611
612
613 ######################## Summarize our environment ###########################
614 def print_summary():
615 print("")
616 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
617 print("Escript/Finley revision %s"%global_revision)
618 print(" Install prefix: %s"%env['prefix'])
619 print(" Python: %s"%sysconfig.PREFIX)
620 print(" boost: %s"%env['boost_prefix'])
621 if env['numpy_h']:
622 print(" numpy: YES (with headers)")
623 else:
624 print(" numpy: YES (without headers)")
625 if env['usempi']:
626 print(" MPI: YES (flavour: %s)"%env['mpi'])
627 else:
628 print(" MPI: DISABLED")
629 if env['uselapack']:
630 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
631 else:
632 print(" LAPACK: DISABLED")
633 d_list=[]
634 e_list=[]
635 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
636 if env[i]: e_list.append(i)
637 else: d_list.append(i)
638 for i in e_list:
639 print("%16s: YES"%i)
640 for i in d_list:
641 print("%16s: DISABLED"%i)
642 if env['cppunit']:
643 print(" CppUnit: FOUND")
644 else:
645 print(" CppUnit: NOT FOUND")
646 if env['gmsh']=='m':
647 print(" gmsh: FOUND, MPI-ENABLED")
648 elif env['gmsh']=='s':
649 print(" gmsh: FOUND")
650 else:
651 print(" gmsh: NOT FOUND")
652
653 if ((fatalwarning != '') and (env['werror'])):
654 print(" Treating warnings as errors")
655 else:
656 print(" NOT treating warnings as errors")
657 print("")
658 for w in env['warnings']:
659 print("WARNING: %s"%w)
660
661 atexit.register(print_summary)
662

  ViewVC Help
Powered by ViewVC 1.1.26