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

Diff of /branches/refine/SConstruct

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

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

Legend:
Removed from v.1756  
changed lines
  Added in v.3680

  ViewVC Help
Powered by ViewVC 1.1.26