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

Diff of /branches/amg_from_3530/SConstruct

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

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

Legend:
Removed from v.2474  
changed lines
  Added in v.3506

  ViewVC Help
Powered by ViewVC 1.1.26