/[escript]/trunk/SConstruct
ViewVC logotype

Contents of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3967 - (show annotations)
Mon Sep 17 04:02:58 2012 UTC (7 years, 2 months ago) by jfenwick
File size: 40423 byte(s)
Changes to SConstruct to allow building with clang

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

  ViewVC Help
Powered by ViewVC 1.1.26