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

Diff of /branches/inv2jf/SConstruct

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

revision 3604 by caltinay, Mon Sep 19 04:47:53 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=201  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 80  vars.AddVariables( Line 86  vars.AddVariables(
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']),
# Line 108  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    BoolVariable('vsl_random', 'Use VSL from intel for random data', False),                 ['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 120  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')),
   # finer control over library building, intel aggressive global optimisation  
   # works with dynamic libraries on windows.  
127    ('build_shared', 'Build dynamic libraries only', False),    ('build_shared', 'Build dynamic libraries only', 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 136  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 162  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 182  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 200  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 233  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 261  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 271  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 283  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:
# Line 299  if IS_WINDOWS: Line 364  if IS_WINDOWS:
364          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
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 308  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','TMPDIR','TEMP','TMP'])  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 330  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 344  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 353  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()  
451    
452  ######## boost (required)  ######## NVCC version (optional)
453    if env['cuda']:
454        env=checkCudaVersion(env)
455    
456  boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')  ######## numpy (required) and numpy headers (optional)
457  if sysheaderopt == '':  env=checkNumpy(env)
     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)  
   
 ######## numpy (required)  
   
 try:  
     from numpy import identity  
 except ImportError:  
     print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)  
     Exit(1)  
458    
459  ######## CppUnit (required for tests)  ######## CppUnit (required for tests)
460    env=checkCppUnit(env)
461    
462  try:  ######## optional python modules (sympy, pyproj)
463      cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')  env=checkOptionalModules(env)
     env.AppendUnique(CPPPATH = [cppunit_inc_path])  
     env.AppendUnique(LIBPATH = [cppunit_lib_path])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)  
     env['cppunit']=True  
 except:  
     env['cppunit']=False  
   
 ######## VTK (optional)  
   
 if env['pyvisi']:  
     try:  
         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)  
   
 if env['lapack']=='mkl' and not env['mkl']:  
     print("mkl_lapack requires MKL!")  
     Exit(1)  
   
 env['uselapack'] = env['lapack']!='none'  
 lapack_inc_path=''  
 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']])  
   
 ######## VSL random numbers (optional)  
 if env['vsl_random']:  
     env.Append(CPPDEFINES = ['MKLRANDOM'])  
   
 ######## 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'])  
   
 ######## BOOMERAMG (optional)  
   
 if env['mpi'] == 'none': env['boomeramg'] = False  
   
 boomeramg_inc_path=''  
 boomeramg_lib_path=''  
 if env['boomeramg']:  
     boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [boomeramg_inc_path])  
     env.AppendUnique(LIBPATH = [boomeramg_lib_path])  
     env.AppendUnique(LIBS = env['boomeramg_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)  
     env.Append(CPPDEFINES = ['BOOMERAMG'])  
   
 ######## 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'])  
464    
465  ######## gmsh (optional, for tests)  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
466    env=checkOptionalLibraries(env)
 try:  
     import subprocess  
     p=subprocess.Popen(['gmsh', '-info'], stderr=subprocess.PIPE)  
     _,e=p.communicate()  
     if e.split().count("MPI"):  
         env['gmsh']='m'  
     else:  
         env['gmsh']='s'  
 except OSError:  
     env['gmsh']=False  
467    
468  ######## PDFLaTeX (for documentation)  ######## PDFLaTeX (for documentation)
469  if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):  env=checkPDFLatex(env)
     env['pdflatex']=True  
 else:  
     env['pdflatex']=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 628  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 641  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','boomeramg','silo','visit':  
     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['cppunit']:  
     print("         CppUnit:  FOUND")  
 else:  
     print("         CppUnit:  NOT FOUND")  
 if env['gmsh']=='m':  
     print("            gmsh:  FOUND, MPI-ENABLED")  
 elif env['gmsh']=='s':  
     print("            gmsh:  FOUND")  
 else:  
     print("            gmsh:  NOT FOUND")  
 print("      vsl_random:  %s"%env['vsl_random'])  
       
 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 705  Export( Line 511  Export(
511    ]    ]
512  )  )
513    
514    #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 #########################  
541    
542  # remove obsolete file  ######################## Populate the buildvars file #########################
 if not env['usempi']:  
     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))  
     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))  
   
 # Try to extract the boost version from version.hpp  
 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'])  
 buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))  
 for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','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    
# Line 779  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 798  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 811  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 827  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    
 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')  
629  if not env['cppunit']:  if not env['cppunit']:
630        test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
631      env.Alias('run_tests', test_msg)      env.Alias('run_tests', test_msg)
632        env.Alias('build_tests', '')
633  env.Alias('run_tests', ['install_all'])  env.Alias('run_tests', ['install_all'])
634  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])  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'])
# Line 837  env.Alias('build_PasoTests','$BUILD_DIR/ Line 637  env.Alias('build_PasoTests','$BUILD_DIR/
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)
         utest=open('utest.sh','w')  
         utest.write(GroupTest.makeHeader(env['PLATFORM']))  
         for tests in TestGroups:  
             utest.write(tests.makeString())  
         utest.close()  
         Execute(Chmod('utest.sh', 0755))  
         print("Generated utest.sh.")  
     except IOError:  
         print("Error attempting to write unittests file.")  
         Exit(1)  
652    
     # delete utest.sh upon cleanup  
     env.Clean('target_init', 'utest.sh')  
653    
654      # Make sure that the escript wrapper is in place  ######################## Summarize our environment ###########################
655      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):  def print_summary():
656          print("Copying escript wrapper.")      print("")
657          Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))      print("*** Config Summary (see config.log and <prefix>/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        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    atexit.register(print_summary)
712    

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

  ViewVC Help
Powered by ViewVC 1.1.26