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

Diff of /branches/amg_from_3530/SConstruct

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.26