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

Diff of /branches/refine/SConstruct

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.26