/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 3463 by caltinay, Mon Feb 7 02:09:57 2011 UTC revision 5250 by caltinay, Mon Nov 10 04:05:11 2014 UTC
# Line 1  Line 1 
1  ########################################################  ##############################################################################
2  #  #
3  # Copyright (c) 2003-2010 by University of Queensland  # Copyright (c) 2003-2014 by University of Queensland
4  # Earth Systems Science Computational Center (ESSCC)  # http://www.uq.edu.au
 # http://www.uq.edu.au/esscc  
5  #  #
6  # Primary Business: Queensland, Australia  # Primary Business: Queensland, Australia
7  # Licensed under the Open Software License version 3.0  # Licensed under the Open Software License version 3.0
8  # http://www.opensource.org/licenses/osl-3.0.php  # http://www.opensource.org/licenses/osl-3.0.php
9  #  #
10  ########################################################  # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11    # Development 2012-2013 by School of Earth Sciences
12    # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13    #
14    ##############################################################################
15    
16  EnsureSConsVersion(0,98,1)  EnsureSConsVersion(0,98,1)
17  EnsurePythonVersion(2,5)  EnsurePythonVersion(2,5)
18    
19  import sys, os, platform, re  import atexit, sys, os, platform, re
20  from distutils import sysconfig  from distutils import sysconfig
21    from dependencies import *
22  from site_init import *  from site_init import *
23    
24  # Version number to check for in options file. Increment when new features are  # Version number to check for in options file. Increment when new features are
25  # added or existing options changed.  # added or existing options changed.
26  REQUIRED_OPTS_VERSION=200  REQUIRED_OPTS_VERSION=202
27    
28  # MS Windows support, many thanks to PH  # MS Windows support, many thanks to PH
29  IS_WINDOWS = (os.name == 'nt')  IS_WINDOWS = (os.name == 'nt')
30    
31    IS_OSX = (os.uname()[0] == 'Darwin')
32    
33  ########################## Determine options file ############################  ########################## Determine options file ############################
34  # 1. command line  # 1. command line
35  # 2. scons/<hostname>_options.py  # 2. scons/<hostname>_options.py
# Line 40  if not options_file: Line 46  if not options_file:
46  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
47      print("\nWARNING:\nOptions file %s" % options_file)      print("\nWARNING:\nOptions file %s" % options_file)
48      print("not found! Default options will be used which is most likely suboptimal.")      print("not found! Default options will be used which is most likely suboptimal.")
49      print("It is recommended that you copy one of the TEMPLATE files in the scons/")      print("We recommend that you copy the most relavent options file in the scons/os/")
50      print("subdirectory and customize it to your needs.\n")      print("subdirectory and customize it to your needs.\n")
51      options_file = None      options_file = None
52    
53  ############################### Build options ################################  ############################### Build options ################################
54    
55  default_prefix='/usr'  default_prefix='/usr'
56  mpi_flavours=('none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')  mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57  lapack_flavours=('none', 'clapack', 'mkl')  lapack_flavours=('none', 'clapack', 'mkl')
58    
59  vars = Variables(options_file, ARGUMENTS)  vars = Variables(options_file, ARGUMENTS)
# Line 57  vars.AddVariables( Line 63  vars.AddVariables(
63    PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),    PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
64    BoolVariable('verbose', 'Output full compile/link lines', False),    BoolVariable('verbose', 'Output full compile/link lines', False),
65  # Compiler/Linker options  # Compiler/Linker options
   ('cc', 'Path to C compiler', 'default'),  
66    ('cxx', 'Path to C++ compiler', 'default'),    ('cxx', 'Path to C++ compiler', 'default'),
67    ('cc_flags', 'Base C/C++ compiler flags', 'default'),    ('cc_flags', 'Base C++ compiler flags', 'default'),
68    ('cc_optim', 'Additional C/C++ flags for a non-debug build', 'default'),    ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
69    ('cc_debug', 'Additional C/C++ flags for a debug build', 'default'),    ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
   ('cc_extra', 'Extra C compiler flags', ''),  
70    ('cxx_extra', 'Extra C++ compiler flags', ''),    ('cxx_extra', 'Extra C++ compiler flags', ''),
71    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
72      ('nvcc', 'Path to CUDA compiler', 'default'),
73      ('nvccflags', 'Base CUDA compiler flags', 'default'),
74    BoolVariable('werror','Treat compiler warnings as errors', True),    BoolVariable('werror','Treat compiler warnings as errors', True),
75    BoolVariable('debug', 'Compile with debug flags', False),    BoolVariable('debug', 'Compile with debug flags', False),
76    BoolVariable('openmp', 'Compile parallel version using OpenMP', False),    BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
# Line 73  vars.AddVariables( Line 79  vars.AddVariables(
79  # Mandatory libraries  # Mandatory libraries
80    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82    # Mandatory for tests
83      ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84      ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85  # Optional libraries and options  # Optional libraries and options
86    EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),    EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
88    ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),    ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
89      BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
90      ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
91    BoolVariable('netcdf', 'Enable netCDF file support', False),    BoolVariable('netcdf', 'Enable netCDF file support', False),
92    ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),    ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
93    ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),    ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
94    BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),    BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
95    ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),    ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
96    ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
   BoolVariable('papi', 'Enable PAPI', False),  
   ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),  
   ('papi_libs', 'PAPI libraries to link with', ['papi']),  
   BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),  
97    BoolVariable('mkl', 'Enable the Math Kernel Library', False),    BoolVariable('mkl', 'Enable the Math Kernel Library', False),
98    ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),    ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
99    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
100    BoolVariable('umfpack', 'Enable UMFPACK', False),    BoolVariable('umfpack', 'Enable UMFPACK', False),
101    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
102    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
103      BoolVariable('boomeramg', 'Enable BoomerAMG', False),
104      ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
105      ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
106    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
107    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
108    ('lapack_libs', 'LAPACK libraries to link with', []),    ('lapack_libs', 'LAPACK libraries to link with', []),
# Line 102  vars.AddVariables( Line 112  vars.AddVariables(
112    BoolVariable('visit', 'Enable the VisIt simulation interface', False),    BoolVariable('visit', 'Enable the VisIt simulation interface', False),
113    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
114    ('visit_libs', 'VisIt libraries to link with', ['simV2']),    ('visit_libs', 'VisIt libraries to link with', ['simV2']),
115    BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', False),    ListVariable('domains', 'Which domains to build', 'all',\
116                   ['dudley','finley','ripley','speckley']),
117  # Advanced settings  # Advanced settings
118    #dudley_assemble_flags = -funroll-loops      to actually do something    #dudley_assemble_flags = -funroll-loops      to actually do something
119    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
# Line 113  vars.AddVariables( Line 124  vars.AddVariables(
124    ('env_export', 'Environment variables to be passed to tools',[]),    ('env_export', 'Environment variables to be passed to tools',[]),
125    EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),    EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
126    EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),    EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
127    # finer control over library building, intel aggressive global optimisation    ('build_shared', 'Build dynamic libraries only', False),
   # works with dynamic libraries on windows.  
   ('share_esysutils', 'Build a dynamic esysUtils library', False),  
   ('share_paso', 'Build a dynamic paso library', False),  
128    ('sys_libs', 'Extra libraries to link with', []),    ('sys_libs', 'Extra libraries to link with', []),
129    ('escript_opts_version', 'Version of options file (do not specify on command line)'),    ('escript_opts_version', 'Version of options file (do not specify on command line)'),
130      ('SVN_VERSION', 'Do not use from options file', -2),
131      ('pythoncmd', 'which python to compile with','python'),
132      ('usepython3', 'Is this a python3 build? (experimental)', False),
133      ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
134      ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
135      ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
136      BoolVariable('longindices', 'use long indices (for very large matrices)', False),
137      BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
138      BoolVariable('compressed_files','Enables reading from compressed binary files', True),
139      ('compression_libs', 'Compression libraries to link with', ['boost_iostreams']),
140      BoolVariable('papi', 'Enable PAPI', False),
141      ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
142      ('papi_libs', 'PAPI libraries to link with', ['papi']),
143      BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False)
144  )  )
145    
146  ##################### Create environment and help text #######################  ##################### Create environment and help text #######################
# Line 130  vars.AddVariables( Line 152  vars.AddVariables(
152  # in default locations.  # in default locations.
153  env = Environment(tools = ['default'], options = vars,  env = Environment(tools = ['default'], options = vars,
154                    ENV = {'PATH': os.environ['PATH']})                    ENV = {'PATH': os.environ['PATH']})
155  if env['tools_names'] != 'default':  
156    # set the vars for clang
157    def mkclang(env):
158        env['CXX']='clang++'
159    
160    if env['tools_names'] != ['default']:
161        zz=env['tools_names']
162        if 'clang' in zz:
163            zz.remove('clang')
164            zz.insert(0, mkclang)
165      env = Environment(tools = ['default'] + env['tools_names'], options = vars,      env = Environment(tools = ['default'] + env['tools_names'], options = vars,
166                        ENV = {'PATH' : os.environ['PATH']})                        ENV = {'PATH' : os.environ['PATH']})
167    
# Line 156  if len(vars.UnknownVariables())>0: Line 187  if len(vars.UnknownVariables())>0:
187          print("Unknown option '%s'" % k)          print("Unknown option '%s'" % k)
188      Exit(1)      Exit(1)
189    
190    if env['cuda']:
191        if env['nvcc'] != 'default':
192            env['NVCC'] = env['nvcc']
193        env.Tool('nvcc')
194    
195    # create dictionary which will be populated with info for buildvars file
196    env['buildvars']={}
197    # create list which will be populated with warnings if there are any
198    env['warnings']=[]
199    
200  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
201    
202  env['BUILD_DIR']=env['build_dir']  env['BUILD_DIR']=Dir(env['build_dir']).abspath
203  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
204    env['buildvars']['prefix']=prefix
205  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
206  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
207  env['libinstall'] = os.path.join(prefix, 'lib')  env['libinstall'] = os.path.join(prefix, 'lib')
# Line 176  env.Append(LIBPATH = [env['libinstall']] Line 218  env.Append(LIBPATH = [env['libinstall']]
218    
219  ################# Fill in compiler options if not set above ##################  ################# Fill in compiler options if not set above ##################
220    
 if env['cc'] != 'default': env['CC']=env['cc']  
221  if env['cxx'] != 'default': env['CXX']=env['cxx']  if env['cxx'] != 'default': env['CXX']=env['cxx']
222    
223  # version >=9 of intel C++ compiler requires use of icpc to link in C++  # version >=9 of intel C++ compiler requires use of icpc to link in C++
# Line 194  fatalwarning = '' # switch to turn warni Line 235  fatalwarning = '' # switch to turn warni
235  sysheaderopt = '' # how to indicate that a header is a system header  sysheaderopt = '' # how to indicate that a header is a system header
236    
237  # env['CC'] might be a full path  # env['CC'] might be a full path
238  cc_name=os.path.basename(env['CC'])  cc_name=os.path.basename(env['CXX'])
239    
240  if cc_name == 'icc':  if cc_name == 'icpc':
241      # Intel compiler      # Intel compiler
242      cc_flags    = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
243      cc_optim    = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"      # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
244        cc_flags    = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
245        cc_optim    = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
246      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247      omp_flags   = "-openmp -openmp_report0"      omp_flags   = "-openmp"
248      omp_ldflags = "-openmp -openmp_report0 -lguide -lpthread"      omp_ldflags = "-openmp -openmp_report=1"
249      fatalwarning = "-Werror"      fatalwarning = "-Werror"
250  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'g++':
251      # GNU C on any system      # GNU C++ on any system
252      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"      # note that -ffast-math is not used because it breaks isnan(),
253        # see mantis #691
254        cc_flags     = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
255      cc_optim     = "-O3"      cc_optim     = "-O3"
256      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
257        cc_debug     = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
258      omp_flags    = "-fopenmp"      omp_flags    = "-fopenmp"
259      omp_ldflags  = "-fopenmp"      omp_ldflags  = "-fopenmp"
260      fatalwarning = "-Werror"      fatalwarning = "-Werror"
# Line 227  elif cc_name == 'icl': Line 273  elif cc_name == 'icl':
273      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
274      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
275    
276    env['sysheaderopt']=sysheaderopt
277    
278  # set defaults if not otherwise specified  # set defaults if not otherwise specified
279  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
280  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
281  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
282  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
283  if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags  if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
 if env['cc_extra']  != '': env.Append(CFLAGS = env['cc_extra'])  
284  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
285  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
286    
287    if env['nvccflags'] != 'default':
288        env['NVCCFLAGS'] = env['nvccflags']
289        env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
290    
291    if env['BADPYTHONMACROS']:
292        env.Append(CPPDEFINES = ['BADPYTHONMACROS'])
293    
294    if env['longindices']:
295        env.Append(CPPDEFINES = ['ESYS_INDEXTYPE_LONG'])
296    
297    if env['usepython3']:
298        env.Append(CPPDEFINES=['ESPYTHON3'])
299    
300  # set up the autolazy values  # set up the autolazy values
301  if env['forcelazy'] == 'on':  if env['forcelazy'] == 'on':
302      env.Append(CPPDEFINES=['FAUTOLAZYON'])      env.Append(CPPDEFINES=['FAUTOLAZYON'])
# Line 255  if env['iknowwhatimdoing']: Line 315  if env['iknowwhatimdoing']:
315    
316  # Disable OpenMP if no flags provided  # Disable OpenMP if no flags provided
317  if env['openmp'] and env['omp_flags'] == '':  if env['openmp'] and env['omp_flags'] == '':
318     print("OpenMP requested but no flags provided - disabling OpenMP!")     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
319     env['openmp'] = False     env['openmp'] = False
320    
321  if env['openmp']:  if env['openmp']:
# Line 265  else: Line 325  else:
325      env['omp_flags']=''      env['omp_flags']=''
326      env['omp_ldflags']=''      env['omp_ldflags']=''
327    
328    env['buildvars']['openmp']=int(env['openmp'])
329    
330  # add debug/non-debug compiler flags  # add debug/non-debug compiler flags
331    env['buildvars']['debug']=int(env['debug'])
332  if env['debug']:  if env['debug']:
333      env.Append(CCFLAGS = env['cc_debug'])      env.Append(CCFLAGS = env['cc_debug'])
334  else:  else:
# Line 277  env.Append(CCFLAGS = env['cc_flags']) Line 340  env.Append(CCFLAGS = env['cc_flags'])
340  # add system libraries  # add system libraries
341  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
342    
343  # Get the global Subversion revision number for the getVersion() method  # determine svn revision
344  try:  global_revision=ARGUMENTS.get('SVN_VERSION', None)
345    if global_revision:
346        global_revision = re.sub(':.*', '', global_revision)
347        global_revision = re.sub('[^0-9]', '', global_revision)
348        if global_revision == '': global_revision='-2'
349    else:
350      # Get the global Subversion revision number for the getVersion() method
351      try:
352      global_revision = os.popen('svnversion -n .').read()      global_revision = os.popen('svnversion -n .').read()
353      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
354      global_revision = re.sub('[^0-9]', '', global_revision)      global_revision = re.sub('[^0-9]', '', global_revision)
355      if global_revision == '': global_revision='-2'      if global_revision == '': global_revision='-2'
356  except:    except:
357      global_revision = '-1'      global_revision = '-1'
358  env['svn_revision']=global_revision  env['svn_revision']=global_revision
359    env['buildvars']['svn_revision']=global_revision
360  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
361    
362  if IS_WINDOWS:  if IS_WINDOWS:
363      if not env['share_esysutils']:      if not env['build_shared']:
364          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
     if not env['share_paso']:  
365          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
366    
367    env['IS_WINDOWS']=IS_WINDOWS
368    
369  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
370    
371  # Windows doesn't use LD_LIBRARY_PATH but PATH instead  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
# Line 303  if IS_WINDOWS: Line 375  if IS_WINDOWS:
375  else:  else:
376      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
377    
378    env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
379    
380  # the following env variables are exported for the unit tests  # the following env variables are exported for the unit tests
381    
382  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
383      try:      try:
384          env['ENV'][key] = os.environ[key]          env['ENV'][key] = os.environ[key]
385      except KeyError:      except KeyError:
386          env['ENV'][key] = 1          env['ENV'][key] = '1'
387    
388  env_export=env['env_export']  env_export=env['env_export']
389  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME'])  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
390    
391  for key in set(env_export):  for key in set(env_export):
392      try:      try:
# Line 325  try: Line 399  try:
399  except KeyError:  except KeyError:
400      pass      pass
401    
402    if IS_OSX:
403      try:
404        env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
405      except KeyError:
406        pass
407    
408    
409  # these shouldn't be needed  # these shouldn't be needed
410  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
411  #    try:  #    try:
# Line 339  except KeyError: Line 420  except KeyError:
420    
421  ######################## Add some custom builders ############################  ######################## Add some custom builders ############################
422    
423  py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  if env['pythoncmd']=='python':
424        py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
425    else:
426        py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
427  env.Append(BUILDERS = {'PyCompile' : py_builder});  env.Append(BUILDERS = {'PyCompile' : py_builder});
428    
429  runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
# Line 348  env.Append(BUILDERS = {'RunUnitTest' : r Line 432  env.Append(BUILDERS = {'RunUnitTest' : r
432  runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
433  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
434    
435    runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
436    env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
437    
438  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
439  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
440    
441  ############################ Dependency checks ###############################  ############################ Dependency checks ###############################
442    
443  # Create a Configure() environment to check for compilers and python  ######## Compiler
444  conf = Configure(env.Clone())  env=checkCompiler(env)
   
 ######## Test that the compilers work  
   
 if 'CheckCC' in dir(conf): # exists since scons 1.1.0  
     if not conf.CheckCC():  
         print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))  
         Exit(1)  
     if not conf.CheckCXX():  
         print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))  
         Exit(1)  
 else:  
     if not conf.CheckFunc('printf', language='c'):  
         print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))  
         Exit(1)  
     if not conf.CheckFunc('printf', language='c++'):  
         print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))  
         Exit(1)  
   
 if conf.CheckFunc('gethostname'):  
     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])  
445    
446  ######## Python headers & library (required)  ######## Python headers & library (required)
447    env=checkPython(env)
448    
449  python_inc_path=sysconfig.get_python_inc()  ######## boost & boost-python (required)
450  if IS_WINDOWS:  env=checkBoost(env)
     python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')  
 elif env['PLATFORM']=='darwin':  
     python_lib_path=sysconfig.get_config_var('LIBPL')  
 else:  
     python_lib_path=sysconfig.get_config_var('LIBDIR')  
 #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux  
 if IS_WINDOWS:  
     python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]  
 else:  
     python_libs=['python'+sysconfig.get_python_version()]  
   
 if sysheaderopt == '':  
     conf.env.AppendUnique(CPPPATH = [python_inc_path])  
 else:  
     conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])  
   
 conf.env.AppendUnique(LIBPATH = [python_lib_path])  
 conf.env.AppendUnique(LIBS = python_libs)  
 # The wrapper script needs to find the libs  
 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)  
   
 if not conf.CheckCHeader('Python.h'):  
     print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))  
     Exit(1)  
 if not conf.CheckFunc('Py_Exit'):  
     print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))  
     Exit(1)  
   
 # Commit changes to environment  
 env = conf.Finish()  
   
 ######## boost (required)  
   
 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')  
 if sysheaderopt == '':  
     env.AppendUnique(CPPPATH = [boost_inc_path])  
 else:  
     # This is required because we can't -isystem /usr/include since it breaks  
     # std includes  
     if os.path.normpath(boost_inc_path) == '/usr/include':  
         conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])  
     else:  
         env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])  
   
 env.AppendUnique(LIBPATH = [boost_lib_path])  
 env.AppendUnique(LIBS = env['boost_libs'])  
 env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)  
451    
452  ######## numpy (required)  ######## NVCC version (optional)
453    if env['cuda']:
454        env=checkCudaVersion(env)
455    
456  try:  ######## numpy (required) and numpy headers (optional)
457      from numpy import identity  env=checkNumpy(env)
 except ImportError:  
     print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)  
     Exit(1)  
458    
459  ######## VTK (optional)  ######## CppUnit (required for tests)
460    env=checkCppUnit(env)
461    
462  if env['pyvisi']:  ######## optional python modules (sympy, pyproj)
463      try:  env=checkOptionalModules(env)
         import vtk  
         env['pyvisi'] = True  
     except ImportError:  
         print("Cannot import vtk, disabling pyvisi.")  
         env['pyvisi'] = False  
   
 ######## netCDF (optional)  
   
 netcdf_inc_path=''  
 netcdf_lib_path=''  
 if env['netcdf']:  
     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')  
     env.AppendUnique(CPPPATH = [netcdf_inc_path])  
     env.AppendUnique(LIBPATH = [netcdf_lib_path])  
     env.AppendUnique(LIBS = env['netcdf_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)  
     env.Append(CPPDEFINES = ['USE_NETCDF'])  
   
 ######## PAPI (optional)  
   
 papi_inc_path=''  
 papi_lib_path=''  
 if env['papi']:  
     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [papi_inc_path])  
     env.AppendUnique(LIBPATH = [papi_lib_path])  
     env.AppendUnique(LIBS = env['papi_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)  
     env.Append(CPPDEFINES = ['BLOCKPAPI'])  
   
 ######## MKL (optional)  
   
 mkl_inc_path=''  
 mkl_lib_path=''  
 if env['mkl']:  
     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [mkl_inc_path])  
     env.AppendUnique(LIBPATH = [mkl_lib_path])  
     env.AppendUnique(LIBS = env['mkl_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)  
     env.Append(CPPDEFINES = ['MKL'])  
   
 ######## UMFPACK (optional)  
   
 umfpack_inc_path=''  
 umfpack_lib_path=''  
 if env['umfpack']:  
     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [umfpack_inc_path])  
     env.AppendUnique(LIBPATH = [umfpack_lib_path])  
     env.AppendUnique(LIBS = env['umfpack_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)  
     env.Append(CPPDEFINES = ['UMFPACK'])  
   
 ######## LAPACK (optional)  
464    
465  if env['lapack']=='mkl' and not env['mkl']:  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
466      print("mkl_lapack requires MKL!")  env=checkOptionalLibraries(env)
     Exit(1)  
467    
468  env['uselapack'] = env['lapack']!='none'  ######## PDFLaTeX (for documentation)
469  lapack_inc_path=''  env=checkPDFLatex(env)
 lapack_lib_path=''  
 if env['uselapack']:  
     header='clapack.h'  
     if env['lapack']=='mkl':  
         env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])  
         header='mkl_lapack.h'  
     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [lapack_inc_path])  
     env.AppendUnique(LIBPATH = [lapack_lib_path])  
     env.AppendUnique(LIBS = env['lapack_libs'])  
     env.Append(CPPDEFINES = ['USE_LAPACK'])  
   
 ######## Silo (optional)  
   
 silo_inc_path=''  
 silo_lib_path=''  
 if env['silo']:  
     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [silo_inc_path])  
     env.AppendUnique(LIBPATH = [silo_lib_path])  
     # Note that we do not add the libs since they are only needed for the  
     # weipa library and tools.  
     #env.AppendUnique(LIBS = [env['silo_libs']])  
   
 ######## VisIt (optional)  
   
 visit_inc_path=''  
 visit_lib_path=''  
 if env['visit']:  
     visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [visit_inc_path])  
     env.AppendUnique(LIBPATH = [visit_lib_path])  
   
 ######## MPI (optional)  
   
 env['usempi'] = env['mpi']!='none'  
 mpi_inc_path=''  
 mpi_lib_path=''  
 if env['usempi']:  
     mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [mpi_inc_path])  
     env.AppendUnique(LIBPATH = [mpi_lib_path])  
     env.AppendUnique(LIBS = env['mpi_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)  
     env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])  
     # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!  
     # On the other hand MPT and OpenMPI don't define the latter so we have to  
     # do that here  
     if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:  
         env.Append(CPPDEFINES = ['MPI_INCLUDED'])  
   
 ######## ParMETIS (optional)  
   
 if not env['usempi']: env['parmetis'] = False  
   
 parmetis_inc_path=''  
 parmetis_lib_path=''  
 if env['parmetis']:  
     parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [parmetis_inc_path])  
     env.AppendUnique(LIBPATH = [parmetis_lib_path])  
     env.AppendUnique(LIBS = env['parmetis_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)  
     env.Append(CPPDEFINES = ['USE_PARMETIS'])  
   
 ######## gmsh (optional, for tests)  
   
 try:  
     import subprocess  
     p=subprocess.Popen(['gmsh', '-version'], stderr=subprocess.PIPE)  
     p.poll()  
     env['gmsh']=True  
 except OSError:  
     env['gmsh']=False  
   
 ######################## Summarize our environment ###########################  
470    
471  # keep some of our install paths first in the list for the unit tests  # keep some of our install paths first in the list for the unit tests
472  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
# Line 585  env.PrependENVPath('PYTHONPATH', prefix) Line 474  env.PrependENVPath('PYTHONPATH', prefix)
474  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
475    
476  if not env['verbose']:  if not env['verbose']:
     env['CCCOMSTR'] = "Compiling $TARGET"  
477      env['CXXCOMSTR'] = "Compiling $TARGET"      env['CXXCOMSTR'] = "Compiling $TARGET"
     env['SHCCCOMSTR'] = "Compiling $TARGET"  
478      env['SHCXXCOMSTR'] = "Compiling $TARGET"      env['SHCXXCOMSTR'] = "Compiling $TARGET"
479      env['ARCOMSTR'] = "Linking $TARGET"      env['ARCOMSTR'] = "Linking $TARGET"
480      env['LINKCOMSTR'] = "Linking $TARGET"      env['LINKCOMSTR'] = "Linking $TARGET"
# Line 598  if not env['verbose']: Line 485  if not env['verbose']:
485      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
486      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
487    
 print("")  
 print("*** Config Summary (see config.log and lib/buildvars for details) ***")  
 print("Escript/Finley revision %s"%global_revision)  
 print("  Install prefix:  %s"%env['prefix'])  
 print("          Python:  %s"%sysconfig.PREFIX)  
 print("           boost:  %s"%env['boost_prefix'])  
 print("           numpy:  YES")  
 if env['usempi']:  
     print("             MPI:  YES (flavour: %s)"%env['mpi'])  
 else:  
     print("             MPI:  DISABLED")  
 if env['uselapack']:  
     print("          LAPACK:  YES (flavour: %s)"%env['lapack'])  
 else:  
     print("          LAPACK:  DISABLED")  
 d_list=[]  
 e_list=[]  
 for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','silo','visit','pyvisi':  
     if env[i]: e_list.append(i)  
     else: d_list.append(i)  
 for i in e_list:  
     print("%16s:  YES"%i)  
 for i in d_list:  
     print("%16s:  DISABLED"%i)  
 if env['gmsh']:  
     print("            gmsh:  FOUND")  
 else:  
     print("            gmsh:  NOT FOUND")  
 if ((fatalwarning != '') and (env['werror'])):  
     print("  Treating warnings as errors")  
 else:  
     print("  NOT treating warnings as errors")  
 print("")  
   
488  ####################### Configure the subdirectories #########################  ####################### Configure the subdirectories #########################
489    
490  from grouptest import *  # remove obsolete files
491    if not env['usempi']:
492        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
493        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
494    
495    from grouptest import *
496  TestGroups=[]  TestGroups=[]
497    
498  # keep an environment without warnings-as-errors  # keep an environment without warnings-as-errors
# Line 654  Export( Line 511  Export(
511    ]    ]
512  )  )
513    
514  env.SConscript(dirs = ['tools/CppUnitTest/src'], variant_dir='$BUILD_DIR/$PLATFORM/tools/CppUnitTest', duplicate=0)  #do not auto build
515  env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)  env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
516  env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
517  env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)  env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
518  env.SConscript(dirs = ['escript/src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
519    
520    env.SConscript(dirs = ['cusplibrary'])
521    
522    #This will pull in the escriptcore/py_src and escriptcore/test
523    env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
524  env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
525  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
526  env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)  if 'dudley' in env['domains']:
527        env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
528    if 'finley' in env['domains']:
529        env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
530    if 'ripley' in env['domains']:
531        env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
532    if 'speckley' in env['domains']:
533        env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
534    env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
535  env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)  env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)  
 env.SConscript(dirs = ['pyvisi/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pyvisi', duplicate=0)  
536  env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)  env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
537  env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
538    env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
539  env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)  env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
540    
 ######################## Populate the buildvars file #########################  
   
 # remove obsolete file  
 if not env['usempi']:  
     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))  
     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))  
541    
542  # Try to extract the boost version from version.hpp  ######################## Populate the buildvars file #########################
 boosthpp=open(os.path.join(boost_inc_path, 'boost', 'version.hpp'))  
 boostversion='unknown'  
 try:  
     for line in boosthpp:  
         ver=re.match(r'#define BOOST_VERSION (\d+)',line)  
         if ver:  
             boostversion=ver.group(1)  
 except StopIteration:  
     pass  
 boosthpp.close()  
543    
544  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  write_buildvars(env)
 buildvars.write("svn_revision="+str(global_revision)+"\n")  
 buildvars.write("prefix="+prefix+"\n")  
 buildvars.write("cc="+env['CC']+"\n")  
 buildvars.write("cxx="+env['CXX']+"\n")  
 buildvars.write("python="+sys.executable+"\n")  
 buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")  
 buildvars.write("boost_inc_path="+boost_inc_path+"\n")  
 buildvars.write("boost_lib_path="+boost_lib_path+"\n")  
 buildvars.write("boost_version="+boostversion+"\n")  
 buildvars.write("debug=%d\n"%int(env['debug']))  
 buildvars.write("openmp=%d\n"%int(env['openmp']))  
 buildvars.write("mpi=%s\n"%env['mpi'])  
 buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)  
 buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)  
 buildvars.write("lapack=%s\n"%env['lapack'])  
 buildvars.write("pyvisi=%d\n"%env['pyvisi'])  
 for i in 'netcdf','parmetis','papi','mkl','umfpack','silo','visit':  
     buildvars.write("%s=%d\n"%(i, int(env[i])))  
     if env[i]:  
         buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))  
         buildvars.write("%s_lib_path=%s\n"%(i, eval(i+'_lib_path')))  
 buildvars.close()  
545    
546  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
547    
548  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
549  env.Alias('target_init', [target_init])  env.Alias('target_init', [target_init])
550    # delete buildvars upon cleanup
551    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
552    
553  # The headers have to be installed prior to build in order to satisfy  # The headers have to be installed prior to build in order to satisfy
554  # #include <paso/Common.h>  # #include <paso/Common.h>
# Line 726  env.Alias('build_paso', ['install_paso_h Line 559  env.Alias('build_paso', ['install_paso_h
559  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
560    
561  env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])  env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
562  env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escript_py'])  env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
563    
564  env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])  env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
565  env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])  env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
566    
567  env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])  if 'dudley' in env['domains']:
568  env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])      env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
569        env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
570    
571    if 'finley' in env['domains']:
572        env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
573        env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
574    
575    if 'ripley' in env['domains']:
576        env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
577        env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
578    
579    if 'speckley' in env['domains']:
580        env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
581        env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
582    
583  env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])  env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
584  env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])  env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
# Line 745  build_all_list = [] Line 591  build_all_list = []
591  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
592  build_all_list += ['build_paso']  build_all_list += ['build_paso']
593  build_all_list += ['build_escript']  build_all_list += ['build_escript']
594  build_all_list += ['build_dudley']  build_all_list += ['build_pasowrap']
595  build_all_list += ['build_finley']  if 'dudley' in env['domains']: build_all_list += ['build_dudley']
596    if 'finley' in env['domains']: build_all_list += ['build_finley']
597    if 'ripley' in env['domains']: build_all_list += ['build_ripley']
598    if 'speckley' in env['domains']: build_all_list += ['build_speckley']
599  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
600  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS and 'finley' in env['domains']:
601        build_all_list += ['build_escriptreader']
602  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
 build_all_list += ['build_escriptconvert']  
603  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
604    
605  install_all_list = []  install_all_list = []
# Line 758  install_all_list += ['target_init'] Line 607  install_all_list += ['target_init']
607  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
608  install_all_list += ['install_paso']  install_all_list += ['install_paso']
609  install_all_list += ['install_escript']  install_all_list += ['install_escript']
610  install_all_list += ['install_dudley']  install_all_list += ['install_pasowrap']
611  install_all_list += ['install_finley']  if 'dudley' in env['domains']: install_all_list += ['install_dudley']
612    if 'finley' in env['domains']: install_all_list += ['install_finley']
613    if 'ripley' in env['domains']: install_all_list += ['install_ripley']
614    if 'speckley' in env['domains']: install_all_list += ['install_speckley']
615  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
616  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS and 'finley' in env['domains']:
617  install_all_list += ['install_pyvisi_py']      install_all_list += ['install_escriptreader']
618    install_all_list += ['install_downunder_py']
619  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
620  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
621  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
 install_all_list += ['install_escriptconvert']  
622  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
623    
624  # Default target is install  # Default target is install
# Line 774  env.Default('install_all') Line 626  env.Default('install_all')
626    
627  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
628    
629  env.Alias('build_cppunittest', ['install_cppunittest_headers', 'build_cppunittest_lib'])  if not env['cppunit']:
630  env.Alias('install_cppunittest', ['build_cppunittest', 'install_cppunittest_lib'])      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
631  env.Alias('run_tests', ['install_all', 'install_cppunittest_lib'])      env.Alias('run_tests', test_msg)
632  env.Alias('all_tests', ['install_all', 'install_cppunittest_lib', 'run_tests', 'py_tests'])      env.Alias('build_tests', '')
633    env.Alias('run_tests', ['install_all'])
634    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
635  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
636  env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')  env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
637    
638  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
639    
640  env.Alias('api_epydoc','install_all')  env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
641  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf'])  env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
642    env.Alias('docs', ['basedocs', 'sphinxdoc'])
643  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
644    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
645    
646    # The test scripts are always generated, this target allows us to
647    # generate the testscripts without doing a full build
648    env.Alias('testscripts',[])
649    
650  if not IS_WINDOWS:  if not IS_WINDOWS:
651      try:      generateTestScripts(env, TestGroups)
652          utest=open('utest.sh','w')  
653          utest.write(GroupTest.makeHeader(env['PLATFORM']))  
654          for tests in TestGroups:  ######################## Summarize our environment ###########################
655              utest.write(tests.makeString())  def print_summary():
656          utest.close()      print("")
657          Execute(Chmod('utest.sh', 0755))      print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
658          print("Generated utest.sh.")      print("Escript/Finley revision %s"%global_revision)
659      except IOError:      print("  Install prefix:  %s"%env['prefix'])
660          print("Error attempting to write unittests file.")      print("          Python:  %s"%sysconfig.PREFIX)
661          Exit(1)      print("           boost:  %s"%env['boost_prefix'])
662        if env['numpy_h']:
663            print("           numpy:  YES (with headers)")
664        else:
665            print("           numpy:  YES (without headers)")
666        if env['usempi']:
667            print("             MPI:  YES (flavour: %s)"%env['mpi'])
668        else:
669            print("             MPI:  NO")
670        if env['uselapack']:
671            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
672        else:
673            print("          LAPACK:  NO")
674        if env['cuda']:
675            print("            CUDA:  YES (nvcc: %s)"%env['nvcc_version'])
676        else:
677            print("            CUDA:  NO")
678        d_list=[]
679        e_list=[]
680        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit':
681            if env[i]: e_list.append(i)
682            else: d_list.append(i)
683        for i in e_list:
684            print("%16s:  YES"%i)
685        for i in d_list:
686            print("%16s:  NO"%i)
687        if env['cppunit']:
688            print("         CppUnit:  YES")
689        else:
690            print("         CppUnit:  NO")
691        if env['gmsh']=='m':
692            print("            gmsh:  YES, MPI-ENABLED")
693        elif env['gmsh']=='s':
694            print("            gmsh:  YES")
695        else:
696            print("            gmsh:  NO")
697        print(    "            gzip:  " + ("YES" if env['compressed_files'] else "NO"))
698    
699        if ((fatalwarning != '') and (env['werror'])):
700            print("  Treating warnings as errors")
701        else:
702            print("  NOT treating warnings as errors")
703        print("")
704        for w in env['warnings']:
705            print("WARNING: %s"%w)
706        if len(GetBuildFailures()):
707            print("\nERROR: build stopped due to errors\n")
708        else:
709            print("\nSUCCESS: build complete\n")
710    
711      # Make sure that the escript wrapper is in place  atexit.register(print_summary)
     if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):  
         print("Copying escript wrapper.")  
         Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))  
712    

Legend:
Removed from v.3463  
changed lines
  Added in v.5250

  ViewVC Help
Powered by ViewVC 1.1.26