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

Legend:
Removed from v.2276  
changed lines
  Added in v.3668

  ViewVC Help
Powered by ViewVC 1.1.26