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

Diff of /branches/refine/SConstruct

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.26