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

Contents of /branches/py3_attempt2/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3880 - (show annotations)
Wed Mar 21 10:21:26 2012 UTC (7 years, 3 months ago) by jfenwick
File size: 39318 byte(s)
Splitting the utils tests.
Fixed more stuff

1 ########################################################
2 #
3 # Copyright (c) 2003-2010 by University of Queensland
4 # Earth Systems Science Computational Center (ESSCC)
5 # http://www.uq.edu.au/esscc
6 #
7 # Primary Business: Queensland, Australia
8 # Licensed under the Open Software License version 3.0
9 # http://www.opensource.org/licenses/osl-3.0.php
10 #
11 ########################################################
12
13 EnsureSConsVersion(0,98,1)
14 EnsurePythonVersion(2,5)
15
16 import sys, os, platform, re
17 from distutils import sysconfig
18 from site_init import *
19 import subprocess
20 from subprocess import PIPE, Popen
21
22 # Version number to check for in options file. Increment when new features are
23 # added or existing options changed.
24 REQUIRED_OPTS_VERSION=201
25
26 # MS Windows support, many thanks to PH
27 IS_WINDOWS = (os.name == 'nt')
28
29 ########################## Determine options file ############################
30 # 1. command line
31 # 2. scons/<hostname>_options.py
32 # 3. name as part of a cluster
33 options_file=ARGUMENTS.get('options_file', None)
34 if not options_file:
35 ext_dir = os.path.join(os.getcwd(), 'scons')
36 hostname = platform.node().split('.')[0]
37 for name in hostname, effectiveName(hostname):
38 mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
39 options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
40 if os.path.isfile(options_file): break
41
42 if not os.path.isfile(options_file):
43 print("\nWARNING:\nOptions file %s" % options_file)
44 print("not found! Default options will be used which is most likely suboptimal.")
45 print("It is recommended that you copy one of the TEMPLATE files in the scons/")
46 print("subdirectory and customize it to your needs.\n")
47 options_file = None
48
49 ############################### Build options ################################
50
51 default_prefix='/usr'
52 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
53 lapack_flavours=('none', 'clapack', 'mkl')
54
55 vars = Variables(options_file, ARGUMENTS)
56 vars.AddVariables(
57 PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
58 PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
59 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
60 BoolVariable('verbose', 'Output full compile/link lines', False),
61 # Compiler/Linker options
62 ('cc', 'Path to C compiler', 'default'),
63 ('cxx', 'Path to C++ compiler', 'default'),
64 ('cc_flags', 'Base C/C++ compiler flags', 'default'),
65 ('cc_optim', 'Additional C/C++ flags for a non-debug build', 'default'),
66 ('cc_debug', 'Additional C/C++ flags for a debug build', 'default'),
67 ('cc_extra', 'Extra C compiler flags', ''),
68 ('cxx_extra', 'Extra C++ compiler flags', ''),
69 ('ld_extra', 'Extra linker flags', ''),
70 BoolVariable('werror','Treat compiler warnings as errors', True),
71 BoolVariable('debug', 'Compile with debug flags', False),
72 BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
73 ('omp_flags', 'OpenMP compiler flags', 'default'),
74 ('omp_ldflags', 'OpenMP linker flags', 'default'),
75 # Mandatory libraries
76 ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
77 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
78 # Mandatory for tests
79 ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
80 ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
81 # Optional libraries and options
82 EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
83 ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
84 ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
85 BoolVariable('netcdf', 'Enable netCDF file support', False),
86 ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
87 ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
88 BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
89 ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
90 ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
91 BoolVariable('papi', 'Enable PAPI', False),
92 ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
93 ('papi_libs', 'PAPI libraries to link with', ['papi']),
94 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
95 BoolVariable('mkl', 'Enable the Math Kernel Library', False),
96 ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
97 ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
98 BoolVariable('umfpack', 'Enable UMFPACK', False),
99 ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
100 ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
101 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
102 ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
103 ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
104 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
105 ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
106 ('lapack_libs', 'LAPACK libraries to link with', []),
107 BoolVariable('silo', 'Enable the Silo file format in weipa', False),
108 ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
109 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
110 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
111 ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
112 ('visit_libs', 'VisIt libraries to link with', ['simV2']),
113 BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', False),
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 )
133
134 ##################### Create environment and help text #######################
135
136 # Intel's compiler uses regular expressions improperly and emits a warning
137 # about failing to find the compilers. This warning can be safely ignored.
138
139 # PATH is needed so the compiler, linker and tools are found if they are not
140 # in default locations.
141 env = Environment(tools = ['default'], options = vars,
142 ENV = {'PATH': os.environ['PATH']})
143 if env['tools_names'] != 'default':
144 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
145 ENV = {'PATH' : os.environ['PATH']})
146
147 if options_file:
148 opts_valid=False
149 if 'escript_opts_version' in env.Dictionary() and \
150 int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
151 opts_valid=True
152 if opts_valid:
153 print("Using options in %s." % options_file)
154 else:
155 print("\nOptions file %s" % options_file)
156 print("is outdated! Please update the file by examining one of the TEMPLATE")
157 print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
158 Exit(1)
159
160 # Generate help text (scons -h)
161 Help(vars.GenerateHelpText(env))
162
163 # Check for superfluous options
164 if len(vars.UnknownVariables())>0:
165 for k in vars.UnknownVariables():
166 print("Unknown option '%s'" % k)
167 Exit(1)
168
169 #################### Make sure install directories exist #####################
170
171 env['BUILD_DIR']=env['build_dir']
172 prefix=Dir(env['prefix']).abspath
173 env['incinstall'] = os.path.join(prefix, 'include')
174 env['bininstall'] = os.path.join(prefix, 'bin')
175 env['libinstall'] = os.path.join(prefix, 'lib')
176 env['pyinstall'] = os.path.join(prefix, 'esys')
177 if not os.path.isdir(env['bininstall']):
178 os.makedirs(env['bininstall'])
179 if not os.path.isdir(env['libinstall']):
180 os.makedirs(env['libinstall'])
181 if not os.path.isdir(env['pyinstall']):
182 os.makedirs(env['pyinstall'])
183
184 env.Append(CPPPATH = [env['incinstall']])
185 env.Append(LIBPATH = [env['libinstall']])
186
187 ################# Fill in compiler options if not set above ##################
188
189 if env['cc'] != 'default': env['CC']=env['cc']
190 if env['cxx'] != 'default': env['CXX']=env['cxx']
191
192 # version >=9 of intel C++ compiler requires use of icpc to link in C++
193 # runtimes (icc does not)
194 if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
195 env['LINK'] = env['CXX']
196
197 # default compiler/linker options
198 cc_flags = ''
199 cc_optim = ''
200 cc_debug = ''
201 omp_flags = ''
202 omp_ldflags = ''
203 fatalwarning = '' # switch to turn warnings into errors
204 sysheaderopt = '' # how to indicate that a header is a system header
205
206 # env['CC'] might be a full path
207 cc_name=os.path.basename(env['CC'])
208
209 if cc_name == 'icc':
210 # Intel compiler
211 cc_flags = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
212 cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"
213 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
214 omp_flags = "-openmp -openmp_report0"
215 omp_ldflags = "-openmp -openmp_report0 -lpthread"
216 fatalwarning = "-Werror"
217 elif cc_name[:3] == 'gcc':
218 # GNU C on any system
219 cc_flags = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
220 cc_optim = "-O3"
221 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
222 omp_flags = "-fopenmp"
223 omp_ldflags = "-fopenmp"
224 fatalwarning = "-Werror"
225 sysheaderopt = "-isystem"
226 elif cc_name == 'cl':
227 # Microsoft Visual C on Windows
228 cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
229 cc_optim = "/O2 /Op /W3"
230 cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
231 fatalwarning = "/WX"
232 elif cc_name == 'icl':
233 # Intel C on Windows
234 cc_flags = '/EHsc /GR /MD'
235 cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
236 cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
237 omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
238 omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
239
240 # set defaults if not otherwise specified
241 if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
242 if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
243 if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
244 if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
245 if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
246 if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
247 if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
248 if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
249
250
251 env.Append(CPPDEFINES=['ESPYTHON3'])
252
253 # set up the autolazy values
254 if env['forcelazy'] == 'on':
255 env.Append(CPPDEFINES=['FAUTOLAZYON'])
256 elif env['forcelazy'] == 'off':
257 env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
258
259 # set up the collective resolve values
260 if env['forcecollres'] == 'on':
261 env.Append(CPPDEFINES=['FRESCOLLECTON'])
262 elif env['forcecollres'] == 'off':
263 env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
264
265 # allow non-standard C if requested
266 if env['iknowwhatimdoing']:
267 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
268
269 # Disable OpenMP if no flags provided
270 if env['openmp'] and env['omp_flags'] == '':
271 print("OpenMP requested but no flags provided - disabling OpenMP!")
272 env['openmp'] = False
273
274 if env['openmp']:
275 env.Append(CCFLAGS = env['omp_flags'])
276 if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
277 else:
278 env['omp_flags']=''
279 env['omp_ldflags']=''
280
281 # add debug/non-debug compiler flags
282 if env['debug']:
283 env.Append(CCFLAGS = env['cc_debug'])
284 else:
285 env.Append(CCFLAGS = env['cc_optim'])
286
287 # always add cc_flags
288 env.Append(CCFLAGS = env['cc_flags'])
289
290 # add system libraries
291 env.AppendUnique(LIBS = env['sys_libs'])
292
293
294 global_revision=ARGUMENTS.get('SVN_VERSION', None)
295 if global_revision:
296 global_revision = re.sub(':.*', '', global_revision)
297 global_revision = re.sub('[^0-9]', '', global_revision)
298 if global_revision == '': global_revision='-2'
299 else:
300 # Get the global Subversion revision number for the getVersion() method
301 try:
302 global_revision = os.popen('svnversion -n .').read()
303 global_revision = re.sub(':.*', '', global_revision)
304 global_revision = re.sub('[^0-9]', '', global_revision)
305 if global_revision == '': global_revision='-2'
306 except:
307 global_revision = '-1'
308 env['svn_revision']=global_revision
309 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
310
311 if IS_WINDOWS:
312 if not env['build_shared']:
313 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
314 env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
315
316 ###################### Copy required environment vars ########################
317
318 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
319 if IS_WINDOWS:
320 LD_LIBRARY_PATH_KEY='PATH'
321 env['ENV']['LD_LIBRARY_PATH']=''
322 else:
323 LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
324
325 # the following env variables are exported for the unit tests
326
327 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
328 try:
329 env['ENV'][key] = os.environ[key]
330 except KeyError:
331 env['ENV'][key] = 1
332
333 env_export=env['env_export']
334 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','TMPDIR','TEMP','TMP'])
335
336 for key in set(env_export):
337 try:
338 env['ENV'][key] = os.environ[key]
339 except KeyError:
340 pass
341
342 try:
343 env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
344 except KeyError:
345 pass
346
347 # these shouldn't be needed
348 #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
349 # try:
350 # env['ENV'][key] = os.environ[key]
351 # except KeyError:
352 # pass
353
354 try:
355 env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
356 except KeyError:
357 pass
358
359 ######################## Add some custom builders ############################
360
361 if env['pythoncmd']=='python':
362 py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
363 else:
364 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
365 env.Append(BUILDERS = {'PyCompile' : py_builder});
366
367 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
368 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
369
370 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
371 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
372
373 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
374 env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
375
376 ############################ Dependency checks ###############################
377
378 # Create a Configure() environment to check for compilers and python
379 conf = Configure(env.Clone())
380
381 ######## Test that the compilers work
382
383 if 'CheckCC' in dir(conf): # exists since scons 1.1.0
384 if not conf.CheckCC():
385 print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
386 Exit(1)
387 if not conf.CheckCXX():
388 print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
389 Exit(1)
390 else:
391 if not conf.CheckFunc('printf', language='c'):
392 print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
393 Exit(1)
394 if not conf.CheckFunc('printf', language='c++'):
395 print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
396 Exit(1)
397
398 if conf.CheckFunc('gethostname'):
399 conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
400
401 ######## Python headers & library (required)
402
403 python_inc_path=sysconfig.get_python_inc()
404 if IS_WINDOWS:
405 python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
406 elif env['PLATFORM']=='darwin':
407 python_lib_path=sysconfig.get_config_var('LIBPL')
408 else:
409 python_lib_path=sysconfig.get_config_var('LIBDIR')
410 #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
411 if IS_WINDOWS:
412 python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
413 else:
414 python_libs=['python'+sysconfig.get_python_version()]
415
416 #if we want to use a python other than the one scons is running
417 if env['pythoncmd']!='python':
418 print "Need to try to use LDLIBRARY config variable to get real name of library if the setup fails ... may need to remove the old lib (or copy before adding)"
419 py3scons=False # Is scons running on python3?
420 initstring='from __future__ import print_function;from distutils import sysconfig;'
421 if IS_WINDOWS:
422 cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
423 else:
424 cmd='print("python"+sysconfig.get_python_version())'
425 p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
426 python_libs=p.stdout.readline()
427 if type(python_libs)!=str():
428 py3scons=True
429 python_libs=python_libs.encode()
430 p.wait()
431 python_libs=python_libs.strip()
432 python_libs="python3.2mu"
433
434 # Now we know whether we are using python3 or not
435 p=Popen([env['pythoncmd'], '-c', initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
436 python_inc_path=p.stdout.readline()
437 if py3scons:
438 python_inc_path=python_inc_path.encode()
439 p.wait()
440 python_inc_path=python_inc_path.strip()
441 if IS_WINDOWS:
442 cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
443 elif env['PLATFORM']=='darwin':
444 cmd="sysconfig.get_config_var(\"LIBPL\")"
445 else:
446 cmd="sysconfig.get_config_var(\"LIBDIR\")"
447
448 p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
449 python_lib_path=p.stdout.readline()
450 if py3scons:
451 python_lib_path=python_lib_path.decode()
452 p.wait()
453 python_lib_path=python_lib_path.strip()
454
455 if sysheaderopt == '':
456 conf.env.AppendUnique(CPPPATH = [python_inc_path])
457 else:
458 conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])
459
460 conf.env.AppendUnique(LIBPATH = [python_lib_path])
461 conf.env.AppendUnique(LIBS = python_libs)
462 # The wrapper script needs to find the libs
463 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)
464
465 if not conf.CheckCHeader('Python.h'):
466 print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))
467 Exit(1)
468 if not conf.CheckFunc('Py_Exit'):
469 print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))
470 Exit(1)
471
472 ## reuse conf to check for numpy header (optional)
473 #if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
474 # conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
475 # conf.env['numpy_h']=True
476 #else:
477 # conf.env['numpy_h']=False
478
479
480 # This is until we can work out how to make the checks in python 3
481 conf.env['numpy_h']=False
482
483
484 # Commit changes to environment
485 env = conf.Finish()
486
487 ######## boost (required)
488
489 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')
490 if sysheaderopt == '':
491 env.AppendUnique(CPPPATH = [boost_inc_path])
492 else:
493 # This is required because we can't -isystem /usr/include since it breaks
494 # std includes
495 if os.path.normpath(boost_inc_path) == '/usr/include':
496 conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])
497 else:
498 env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])
499
500 env.AppendUnique(LIBPATH = [boost_lib_path])
501 env.AppendUnique(LIBS = env['boost_libs'])
502 env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)
503
504 ######## numpy (required)
505
506 if env['pythoncmd']=='python':
507 try:
508 from numpy import identity
509 except ImportError:
510 print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
511 Exit(1)
512 else:
513 p=subprocess.call([env['pythoncmd'],'-c','import numpy'])
514 if p!=0:
515 print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
516 Exit(1)
517
518 ######## CppUnit (required for tests)
519
520 try:
521 cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
522 env.AppendUnique(CPPPATH = [cppunit_inc_path])
523 env.AppendUnique(LIBPATH = [cppunit_lib_path])
524 env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
525 env['cppunit']=True
526 except:
527 env['cppunit']=False
528
529 ######## VTK (optional)
530
531 if env['pyvisi']:
532 try:
533 import vtk
534 env['pyvisi'] = True
535 except ImportError:
536 print("Cannot import vtk, disabling pyvisi.")
537 env['pyvisi'] = False
538
539 ######## netCDF (optional)
540
541 netcdf_inc_path=''
542 netcdf_lib_path=''
543 if env['netcdf']:
544 netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')
545 env.AppendUnique(CPPPATH = [netcdf_inc_path])
546 env.AppendUnique(LIBPATH = [netcdf_lib_path])
547 env.AppendUnique(LIBS = env['netcdf_libs'])
548 env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)
549 env.Append(CPPDEFINES = ['USE_NETCDF'])
550
551 ######## PAPI (optional)
552
553 papi_inc_path=''
554 papi_lib_path=''
555 if env['papi']:
556 papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')
557 env.AppendUnique(CPPPATH = [papi_inc_path])
558 env.AppendUnique(LIBPATH = [papi_lib_path])
559 env.AppendUnique(LIBS = env['papi_libs'])
560 env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)
561 env.Append(CPPDEFINES = ['BLOCKPAPI'])
562
563 ######## MKL (optional)
564
565 mkl_inc_path=''
566 mkl_lib_path=''
567 if env['mkl']:
568 mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')
569 env.AppendUnique(CPPPATH = [mkl_inc_path])
570 env.AppendUnique(LIBPATH = [mkl_lib_path])
571 env.AppendUnique(LIBS = env['mkl_libs'])
572 env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)
573 env.Append(CPPDEFINES = ['MKL'])
574
575 ######## UMFPACK (optional)
576
577 umfpack_inc_path=''
578 umfpack_lib_path=''
579 if env['umfpack']:
580 umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')
581 env.AppendUnique(CPPPATH = [umfpack_inc_path])
582 env.AppendUnique(LIBPATH = [umfpack_lib_path])
583 env.AppendUnique(LIBS = env['umfpack_libs'])
584 env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)
585 env.Append(CPPDEFINES = ['UMFPACK'])
586
587 ######## LAPACK (optional)
588
589 if env['lapack']=='mkl' and not env['mkl']:
590 print("mkl_lapack requires MKL!")
591 Exit(1)
592
593 env['uselapack'] = env['lapack']!='none'
594 lapack_inc_path=''
595 lapack_lib_path=''
596 if env['uselapack']:
597 header='clapack.h'
598 if env['lapack']=='mkl':
599 env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])
600 header='mkl_lapack.h'
601 lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')
602 env.AppendUnique(CPPPATH = [lapack_inc_path])
603 env.AppendUnique(LIBPATH = [lapack_lib_path])
604 env.AppendUnique(LIBS = env['lapack_libs'])
605 env.Append(CPPDEFINES = ['USE_LAPACK'])
606
607 ######## Silo (optional)
608
609 silo_inc_path=''
610 silo_lib_path=''
611 if env['silo']:
612 silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')
613 env.AppendUnique(CPPPATH = [silo_inc_path])
614 env.AppendUnique(LIBPATH = [silo_lib_path])
615 # Note that we do not add the libs since they are only needed for the
616 # weipa library and tools.
617 #env.AppendUnique(LIBS = [env['silo_libs']])
618
619 ######## VSL random numbers (optional)
620 if env['vsl_random']:
621 env.Append(CPPDEFINES = ['MKLRANDOM'])
622
623 ######## VisIt (optional)
624
625 visit_inc_path=''
626 visit_lib_path=''
627 if env['visit']:
628 visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')
629 env.AppendUnique(CPPPATH = [visit_inc_path])
630 env.AppendUnique(LIBPATH = [visit_lib_path])
631
632 ######## MPI (optional)
633
634 if env['mpi']=='no':
635 env['mpi']='none'
636
637 env['usempi'] = env['mpi']!='none'
638 mpi_inc_path=''
639 mpi_lib_path=''
640 if env['usempi']:
641 mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')
642 env.AppendUnique(CPPPATH = [mpi_inc_path])
643 env.AppendUnique(LIBPATH = [mpi_lib_path])
644 env.AppendUnique(LIBS = env['mpi_libs'])
645 env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)
646 env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])
647 # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
648 # On the other hand MPT and OpenMPI don't define the latter so we have to
649 # do that here
650 if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
651 env.Append(CPPDEFINES = ['MPI_INCLUDED'])
652
653 ######## BOOMERAMG (optional)
654
655 if env['mpi'] == 'none': env['boomeramg'] = False
656
657 boomeramg_inc_path=''
658 boomeramg_lib_path=''
659 if env['boomeramg']:
660 boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
661 env.AppendUnique(CPPPATH = [boomeramg_inc_path])
662 env.AppendUnique(LIBPATH = [boomeramg_lib_path])
663 env.AppendUnique(LIBS = env['boomeramg_libs'])
664 env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
665 env.Append(CPPDEFINES = ['BOOMERAMG'])
666
667 ######## ParMETIS (optional)
668
669 if not env['usempi']: env['parmetis'] = False
670
671 parmetis_inc_path=''
672 parmetis_lib_path=''
673 if env['parmetis']:
674 parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')
675 env.AppendUnique(CPPPATH = [parmetis_inc_path])
676 env.AppendUnique(LIBPATH = [parmetis_lib_path])
677 env.AppendUnique(LIBS = env['parmetis_libs'])
678 env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
679 env.Append(CPPDEFINES = ['USE_PARMETIS'])
680
681 ######## gmsh (optional, for tests)
682
683 try:
684 import subprocess
685 p=subprocess.Popen(['gmsh', '-info'], stderr=subprocess.PIPE)
686 _,e=p.communicate()
687 if e.split().count("MPI"):
688 env['gmsh']='m'
689 else:
690 env['gmsh']='s'
691 except OSError:
692 env['gmsh']=False
693
694 ######## PDFLaTeX (for documentation)
695 if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
696 env['pdflatex']=True
697 else:
698 env['pdflatex']=False
699
700 ######################## Summarize our environment ###########################
701
702 # keep some of our install paths first in the list for the unit tests
703 env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
704 env.PrependENVPath('PYTHONPATH', prefix)
705 env['ENV']['ESCRIPT_ROOT'] = prefix
706
707 if not env['verbose']:
708 env['CCCOMSTR'] = "Compiling $TARGET"
709 env['CXXCOMSTR'] = "Compiling $TARGET"
710 env['SHCCCOMSTR'] = "Compiling $TARGET"
711 env['SHCXXCOMSTR'] = "Compiling $TARGET"
712 env['ARCOMSTR'] = "Linking $TARGET"
713 env['LINKCOMSTR'] = "Linking $TARGET"
714 env['SHLINKCOMSTR'] = "Linking $TARGET"
715 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
716 env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
717 env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
718 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
719 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
720
721 print("")
722 print("*** Config Summary (see config.log and lib/buildvars for details) ***")
723 print("Escript/Finley revision %s"%global_revision)
724 print(" Install prefix: %s"%env['prefix'])
725 print(" Python: %s"%sysconfig.PREFIX)
726 print(" boost: %s"%env['boost_prefix'])
727 print(" numpy: YES")
728 if env['usempi']:
729 print(" MPI: YES (flavour: %s)"%env['mpi'])
730 else:
731 print(" MPI: DISABLED")
732 if env['uselapack']:
733 print(" LAPACK: YES (flavour: %s)"%env['lapack'])
734 else:
735 print(" LAPACK: DISABLED")
736 d_list=[]
737 e_list=[]
738 for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit','vsl_random':
739 if env[i]: e_list.append(i)
740 else: d_list.append(i)
741 for i in e_list:
742 print("%16s: YES"%i)
743 for i in d_list:
744 print("%16s: DISABLED"%i)
745 if env['cppunit']:
746 print(" CppUnit: FOUND")
747 else:
748 print(" CppUnit: NOT FOUND")
749 if env['gmsh']=='m':
750 print(" gmsh: FOUND, MPI-ENABLED")
751 elif env['gmsh']=='s':
752 print(" gmsh: FOUND")
753 else:
754 print(" gmsh: NOT FOUND")
755 if env['numpy_h']:
756 print(" numpy headers: FOUND")
757 else:
758 print(" numpy headers: NOT FOUND")
759 print(" vsl_random: %s"%env['vsl_random'])
760
761 if ((fatalwarning != '') and (env['werror'])):
762 print(" Treating warnings as errors")
763 else:
764 print(" NOT treating warnings as errors")
765 print("")
766
767 ####################### Configure the subdirectories #########################
768
769 from grouptest import *
770
771 TestGroups=[]
772
773 # keep an environment without warnings-as-errors
774 dodgy_env=env.Clone()
775
776 # now add warnings-as-errors flags. This needs to be done after configuration
777 # because the scons test files have warnings in them
778 if ((fatalwarning != '') and (env['werror'])):
779 env.Append(CCFLAGS = fatalwarning)
780
781 Export(
782 ['env',
783 'dodgy_env',
784 'IS_WINDOWS',
785 'TestGroups'
786 ]
787 )
788
789 print "William"
790
791
792 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
793 env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
794 env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
795 env.SConscript(dirs = ['escript/src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
796 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
797 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
798 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
799 env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
800 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
801 print "Terry"
802 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
803 print "X1"
804 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
805 print "X2"
806 env.SConscript(dirs = ['pyvisi/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pyvisi', duplicate=0)
807 print "X3"
808 env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
809 env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
810 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
811
812 print "Bob"
813
814 ######################## Populate the buildvars file #########################
815
816 # remove obsolete file
817 if not env['usempi']:
818 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
819 Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
820
821 # Try to extract the boost version from version.hpp
822 boosthpp=open(os.path.join(boost_inc_path, 'boost', 'version.hpp'))
823 boostversion='unknown'
824 try:
825 for line in boosthpp:
826 ver=re.match(r'#define BOOST_VERSION (\d+)',line)
827 if ver:
828 boostversion=ver.group(1)
829 except StopIteration:
830 pass
831 boosthpp.close()
832
833 print "Tim"
834
835 buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
836 buildvars.write("svn_revision="+str(global_revision)+"\n")
837 buildvars.write("prefix="+prefix+"\n")
838 buildvars.write("cc="+env['CC']+"\n")
839 buildvars.write("cxx="+env['CXX']+"\n")
840 if env['pythoncmd']=='python':
841 buildvars.write("python="+sys.executable+"\n")
842 buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
843 else:
844 buildvars.write("python="+env['pythoncmd']+"\n")
845 p=Popen([env['pythoncmd'], '-c', 'from __future__ import print_function;import sys;print(str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]))'], stdout=PIPE)
846 verstring=p.stdout.readline().strip()
847 p.wait()
848 buildvars.write("python_version="+verstring+"\n")
849 buildvars.write("boost_inc_path="+boost_inc_path+"\n")
850 buildvars.write("boost_lib_path="+boost_lib_path+"\n")
851 buildvars.write("boost_version="+boostversion+"\n")
852 buildvars.write("debug=%d\n"%int(env['debug']))
853 buildvars.write("openmp=%d\n"%int(env['openmp']))
854 buildvars.write("mpi=%s\n"%env['mpi'])
855 buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
856 buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
857 buildvars.write("lapack=%s\n"%env['lapack'])
858 buildvars.write("pyvisi=%d\n"%env['pyvisi'])
859 buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
860 for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
861 buildvars.write("%s=%d\n"%(i, int(env[i])))
862 if env[i]:
863 buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))
864 buildvars.write("%s_lib_path=%s\n"%(i, eval(i+'_lib_path')))
865 buildvars.close()
866
867 print "Bozo"
868
869 ################### Targets to build and install libraries ###################
870
871 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
872 env.Alias('target_init', [target_init])
873 # delete buildvars upon cleanup
874 env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
875
876 # The headers have to be installed prior to build in order to satisfy
877 # #include <paso/Common.h>
878 env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
879 env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
880
881 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
882 env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
883
884 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
885 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escript_py'])
886
887 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
888 env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
889
890 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
891 env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
892
893 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
894 env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
895
896 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
897 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
898
899 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
900 env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
901
902 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
903 env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
904
905 # Now gather all the above into some easy targets: build_all and install_all
906 build_all_list = []
907 build_all_list += ['build_esysUtils']
908 build_all_list += ['build_paso']
909 build_all_list += ['build_escript']
910 build_all_list += ['build_pasowrap']
911 build_all_list += ['build_dudley']
912 build_all_list += ['build_finley']
913 build_all_list += ['build_ripley']
914 build_all_list += ['build_weipa']
915 if not IS_WINDOWS: build_all_list += ['build_escriptreader']
916 if env['usempi']: build_all_list += ['build_pythonMPI']
917 build_all_list += ['build_escriptconvert']
918 env.Alias('build_all', build_all_list)
919
920 install_all_list = []
921 install_all_list += ['target_init']
922 install_all_list += ['install_esysUtils']
923 install_all_list += ['install_paso']
924 install_all_list += ['install_escript']
925 install_all_list += ['install_pasowrap']
926 install_all_list += ['install_dudley']
927 install_all_list += ['install_finley']
928 install_all_list += ['install_ripley']
929 install_all_list += ['install_weipa']
930 if not IS_WINDOWS: install_all_list += ['install_escriptreader']
931 #install_all_list += ['install_pyvisi_py']
932 install_all_list += ['install_modellib_py']
933 install_all_list += ['install_pycad_py']
934 if env['usempi']: install_all_list += ['install_pythonMPI']
935 install_all_list += ['install_escriptconvert']
936 env.Alias('install_all', install_all_list)
937
938 # Default target is install
939 env.Default('install_all')
940
941 ################## Targets to build and run the test suite ###################
942
943 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')
944 if not env['cppunit']:
945 env.Alias('run_tests', test_msg)
946 env.Alias('run_tests', ['install_all'])
947 env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
948 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
949 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
950
951 ##################### Targets to build the documentation #####################
952
953 env.Alias('api_epydoc','install_all')
954 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf'])
955 env.Alias('release_prep', ['docs', 'install_all'])
956
957 if not IS_WINDOWS:
958 try:
959 utest=open('utest.sh','w')
960 utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix))
961 for tests in TestGroups:
962 utest.write(tests.makeString())
963 utest.close()
964 Execute(Chmod('utest.sh', 0o755))
965 print("Generated utest.sh.")
966 except IOError:
967 print("Error attempting to write unittests file.")
968 Exit(1)
969
970 # delete utest.sh upon cleanup
971 env.Clean('target_init', 'utest.sh')
972
973 # Make sure that the escript wrapper is in place
974 if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
975 print("Copying escript wrapper.")
976 Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
977

  ViewVC Help
Powered by ViewVC 1.1.26