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

Diff of /branches/py3_attempt2/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/SConstruct revision 425 by gross, Tue Jan 10 04:10:39 2006 UTC branches/py3_attempt2/SConstruct revision 3880 by jfenwick, Wed Mar 21 10:21:26 2012 UTC
# Line 1  Line 1 
1  # top-level Scons configuration file for all esys13 modules  ########################################################
2  #  #
3  # set appropriate defaults for configuration variables  # Copyright (c) 2003-2010 by University of Queensland
4  esysroot=str(Dir('.').abspath)  # Earth Systems Science Computational Center (ESSCC)
5  execfile(str(File(esysroot+"/scons/esys_options.py")))  # 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  # call appropriate SConscripts  ########################################################
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  target_scripts = ['tools/CppUnitTest/SConstruct',      # delete utest.sh upon cleanup
971                    'tools/mmio/SConstruct',      env.Clean('target_init', 'utest.sh')
                   'esysUtils/SConstruct',  
                   'escript/SConstruct',  
                   'bruce/SConstruct',  
                   'paso/SConstruct',  
                   'finley/SConstruct',  
                   'modellib/SConstruct']  
972    
973  #                  'doc/SConstruct']      # 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    
 SConscript(target_scripts, duplicate=0)  

Legend:
Removed from v.425  
changed lines
  Added in v.3880

  ViewVC Help
Powered by ViewVC 1.1.26