/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4520 - (show annotations)
Thu Aug 22 06:42:57 2013 UTC (5 years, 8 months ago) by caltinay
File size: 27846 byte(s)
Removing spurious usage of C compiler:
-Changed all scons tests to use C++ compiler
-Renamed paso profiling files (unused)
-Updated most options files (removal of options and updated comments)

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 cc_flags = "-std=c99 -fPIC -w2 -wd1875 -Wno-unknown-pragmas -DBLOCKTIMER -DCORE_ID1"
230 cc_optim = "-O3 -ftz -fno-alias -ipo -xHost"
231 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
232 omp_flags = "-openmp"
233 omp_ldflags = "-openmp -openmp_report=1"
234 fatalwarning = "-Werror"
235 elif cc_name[:3] == 'g++':
236 # GNU C on any system
237 # note that -ffast-math is not used because it breaks isnan(),
238 # see mantis #691
239 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -DBLOCKTIMER -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
240 cc_optim = "-O3"
241 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
242 omp_flags = "-fopenmp"
243 omp_ldflags = "-fopenmp"
244 fatalwarning = "-Werror"
245 sysheaderopt = "-isystem"
246 elif cc_name == 'cl':
247 # Microsoft Visual C on Windows
248 cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
249 cc_optim = "/O2 /Op /W3"
250 cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
251 fatalwarning = "/WX"
252 elif cc_name == 'icl':
253 # Intel C on Windows
254 cc_flags = '/EHsc /GR /MD'
255 cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
256 cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
257 omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
258 omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
259
260 env['sysheaderopt']=sysheaderopt
261
262 # set defaults if not otherwise specified
263 if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
264 if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
265 if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
266 if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
267 if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
268 if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
269 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
270
271 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
272
273 if env['usepython3']:
274 env.Append(CPPDEFINES=['ESPYTHON3'])
275
276 # set up the autolazy values
277 if env['forcelazy'] == 'on':
278 env.Append(CPPDEFINES=['FAUTOLAZYON'])
279 elif env['forcelazy'] == 'off':
280 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
281
282 # set up the collective resolve values
283 if env['forcecollres'] == 'on':
284 env.Append(CPPDEFINES=['FRESCOLLECTON'])
285 elif env['forcecollres'] == 'off':
286 env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
287
288 # allow non-standard C if requested
289 if env['iknowwhatimdoing']:
290 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
291
292 # Disable OpenMP if no flags provided
293 if env['openmp'] and env['omp_flags'] == '':
294 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
295 env['openmp'] = False
296
297 if env['openmp']:
298 env.Append(CCFLAGS = env['omp_flags'])
299 if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
300 else:
301 env['omp_flags']=''
302 env['omp_ldflags']=''
303
304 env['buildvars']['openmp']=int(env['openmp'])
305
306 # add debug/non-debug compiler flags
307 env['buildvars']['debug']=int(env['debug'])
308 if env['debug']:
309 env.Append(CCFLAGS = env['cc_debug'])
310 else:
311 env.Append(CCFLAGS = env['cc_optim'])
312
313 # always add cc_flags
314 env.Append(CCFLAGS = env['cc_flags'])
315
316 # add system libraries
317 env.AppendUnique(LIBS = env['sys_libs'])
318
319 # determine svn revision
320 global_revision=ARGUMENTS.get('SVN_VERSION', None)
321 if global_revision:
322 global_revision = re.sub(':.*', '', global_revision)
323 global_revision = re.sub('[^0-9]', '', global_revision)
324 if global_revision == '': global_revision='-2'
325 else:
326 # Get the global Subversion revision number for the getVersion() method
327 try:
328 global_revision = os.popen('svnversion -n .').read()
329 global_revision = re.sub(':.*', '', global_revision)
330 global_revision = re.sub('[^0-9]', '', global_revision)
331 if global_revision == '': global_revision='-2'
332 except:
333 global_revision = '-1'
334 env['svn_revision']=global_revision
335 env['buildvars']['svn_revision']=global_revision
336 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
337
338 if IS_WINDOWS:
339 if not env['build_shared']:
340 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
341 env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
342
343 # VSL random numbers
344 env['buildvars']['vsl_random']=int(env['vsl_random'])
345 if env['vsl_random']:
346 env.Append(CPPDEFINES = ['MKLRANDOM'])
347
348 env['IS_WINDOWS']=IS_WINDOWS
349
350 ###################### Copy required environment vars ########################
351
352 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
353 if IS_WINDOWS:
354 LD_LIBRARY_PATH_KEY='PATH'
355 env['ENV']['LD_LIBRARY_PATH']=''
356 else:
357 LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
358
359 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
360
361 # the following env variables are exported for the unit tests
362
363 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
364 try:
365 env['ENV'][key] = os.environ[key]
366 except KeyError:
367 env['ENV'][key] = 1
368
369 env_export=env['env_export']
370 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP'])
371
372 for key in set(env_export):
373 try:
374 env['ENV'][key] = os.environ[key]
375 except KeyError:
376 pass
377
378 try:
379 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
380 except KeyError:
381 pass
382
383 # these shouldn't be needed
384 #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
385 # try:
386 # env['ENV'][key] = os.environ[key]
387 # except KeyError:
388 # pass
389
390 try:
391 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
392 except KeyError:
393 pass
394
395 ######################## Add some custom builders ############################
396
397 if env['pythoncmd']=='python':
398 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
399 else:
400 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
401 env.Append(BUILDERS = {'PyCompile' : py_builder});
402
403 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
404 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
405
406 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
407 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
408
409 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
410 env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
411
412 ############################ Dependency checks ###############################
413
414 ######## Compiler
415 env=checkCompiler(env)
416
417 ######## Python headers & library (required)
418 env=checkPython(env)
419
420 ######## boost & boost-python (required)
421 env=checkBoost(env)
422
423 ######## numpy (required) and numpy headers (optional)
424 env=checkNumpy(env)
425
426 ######## CppUnit (required for tests)
427 env=checkCppUnit(env)
428
429 ######## optional python modules (sympy, pyproj)
430 env=checkOptionalModules(env)
431
432 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
433 env=checkOptionalLibraries(env)
434
435 ######## PDFLaTeX (for documentation)
436 env=checkPDFLatex(env)
437
438 # keep some of our install paths first in the list for the unit tests
439 env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
440 env.PrependENVPath('PYTHONPATH', prefix)
441 env['ENV']['ESCRIPT_ROOT'] = prefix
442
443 if not env['verbose']:
444 env['CXXCOMSTR'] = "Compiling $TARGET"
445 env['SHCXXCOMSTR'] = "Compiling $TARGET"
446 env['ARCOMSTR'] = "Linking $TARGET"
447 env['LINKCOMSTR'] = "Linking $TARGET"
448 env['SHLINKCOMSTR'] = "Linking $TARGET"
449 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
450 env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
451 env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
452 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
453 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
454
455 ####################### Configure the subdirectories #########################
456
457 # remove obsolete files
458 if not env['usempi']:
459 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
460 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
461
462 from grouptest import *
463 TestGroups=[]
464
465 # keep an environment without warnings-as-errors
466 dodgy_env=env.Clone()
467
468 # now add warnings-as-errors flags. This needs to be done after configuration
469 # because the scons test files have warnings in them
470 if ((fatalwarning != '') and (env['werror'])):
471 env.Append(CCFLAGS = fatalwarning)
472
473 Export(
474 ['env',
475 'dodgy_env',
476 'IS_WINDOWS',
477 'TestGroups'
478 ]
479 )
480
481 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
482 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
483 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
484 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
485
486 #This will pull in the escriptcore/py_src and escriptcore/test
487 env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
488 #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
489 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
490 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
491 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
492 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
493 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
494 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
495 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
496 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
497 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
498 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
499 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
500
501
502 ######################## Populate the buildvars file #########################
503
504 write_buildvars(env)
505
506 ################### Targets to build and install libraries ###################
507
508 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
509 env.Alias('target_init', [target_init])
510 # delete buildvars upon cleanup
511 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
512
513 # The headers have to be installed prior to build in order to satisfy
514 # #include <paso/Common.h>
515 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
516 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
517
518 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
519 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
520
521 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
522 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
523
524 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
525 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
526
527 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
528 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
529
530 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
531 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
532
533 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
534 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
535
536 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
537 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
538
539 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
540 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
541
542 # Now gather all the above into some easy targets: build_all and install_all
543 build_all_list = []
544 build_all_list += ['build_esysUtils']
545 build_all_list += ['build_paso']
546 build_all_list += ['build_escript']
547 build_all_list += ['build_pasowrap']
548 build_all_list += ['build_dudley']
549 build_all_list += ['build_finley']
550 build_all_list += ['build_ripley']
551 build_all_list += ['build_weipa']
552 if not IS_WINDOWS: build_all_list += ['build_escriptreader']
553 if env['usempi']: build_all_list += ['build_pythonMPI']
554 build_all_list += ['build_escriptconvert']
555 env.Alias('build_all', build_all_list)
556
557 install_all_list = []
558 install_all_list += ['target_init']
559 install_all_list += ['install_esysUtils']
560 install_all_list += ['install_paso']
561 install_all_list += ['install_escript']
562 install_all_list += ['install_pasowrap']
563 install_all_list += ['install_dudley']
564 install_all_list += ['install_finley']
565 install_all_list += ['install_ripley']
566 install_all_list += ['install_weipa']
567 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
568 install_all_list += ['install_downunder_py']
569 install_all_list += ['install_modellib_py']
570 install_all_list += ['install_pycad_py']
571 if env['usempi']: install_all_list += ['install_pythonMPI']
572 install_all_list += ['install_escriptconvert']
573 env.Alias('install_all', install_all_list)
574
575 # Default target is install
576 env.Default('install_all')
577
578 ################## Targets to build and run the test suite ###################
579
580 if not env['cppunit']:
581 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
582 env.Alias('run_tests', test_msg)
583 env.Alias('build_tests', '')
584 env.Alias('run_tests', ['install_all'])
585 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
586 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
587 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
588
589 ##################### Targets to build the documentation #####################
590
591 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
592 env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
593 env.Alias('docs', ['basedocs', 'sphinxdoc'])
594 env.Alias('release_prep', ['docs', 'install_all'])
595 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
596
597 # The test scripts are always generated, this target allows us to
598 # generate the testscripts without doing a full build
599 env.Alias('testscripts',[])
600
601 if not IS_WINDOWS:
602 generateTestScripts(env, TestGroups)
603
604
605
606 ######################## Summarize our environment ###########################
607 def print_summary():
608 print("")
609 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
610 print("Escript/Finley revision %s"%global_revision)
611 print(" Install prefix: %s"%env['prefix'])
612 print(" Python: %s"%sysconfig.PREFIX)
613 print(" boost: %s"%env['boost_prefix'])
614 if env['numpy_h']:
615 print(" numpy: YES (with headers)")
616 else:
617 print(" numpy: YES (without headers)")
618 if env['usempi']:
619 print(" MPI: YES (flavour: %s)"%env['mpi'])
620 else:
621 print(" MPI: DISABLED")
622 if env['uselapack']:
623 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
624 else:
625 print(" LAPACK: DISABLED")
626 d_list=[]
627 e_list=[]
628 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
629 if env[i]: e_list.append(i)
630 else: d_list.append(i)
631 for i in e_list:
632 print("%16s: YES"%i)
633 for i in d_list:
634 print("%16s: DISABLED"%i)
635 if env['cppunit']:
636 print(" CppUnit: FOUND")
637 else:
638 print(" CppUnit: NOT FOUND")
639 if env['gmsh']=='m':
640 print(" gmsh: FOUND, MPI-ENABLED")
641 elif env['gmsh']=='s':
642 print(" gmsh: FOUND")
643 else:
644 print(" gmsh: NOT FOUND")
645
646 if ((fatalwarning != '') and (env['werror'])):
647 print(" Treating warnings as errors")
648 else:
649 print(" NOT treating warnings as errors")
650 print("")
651 for w in env['warnings']:
652 print("WARNING: %s"%w)
653
654 atexit.register(print_summary)
655

  ViewVC Help
Powered by ViewVC 1.1.26