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

Diff of /branches/inv2jf/SConstruct

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

revision 3896 by caltinay, Fri May 11 01:31:29 2012 UTC revision 5436 by caltinay, Tue Jan 27 05:16:42 2015 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 *
 import subprocess  
 from subprocess import PIPE, Popen  
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 42  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    
# Line 59  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 82  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      ('cuda_prefix', 'Prefix/Paths to NVidia CUDA 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 110  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      ('launcher', 'Launcher command (e.g. mpirun)', 'default'),
119      ('prelaunch', 'Command to execute before launcher (e.g. mpdboot)', 'default'),
120      ('postlaunch', 'Command to execute after launcher (e.g. mpdexit)', 'default'),
121    #dudley_assemble_flags = -funroll-loops      to actually do something    #dudley_assemble_flags = -funroll-loops      to actually do something
122    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
123    # To enable passing function pointers through python    # To enable passing function pointers through python
124    BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),    BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
125    # An option for specifying the compiler tools (see windows branch)    # An option for specifying the compiler tools
126    ('tools_names', 'Compiler tools to use', ['default']),    ('tools_names', 'Compiler tools to use', ['default']),
127    ('env_export', 'Environment variables to be passed to tools',[]),    ('env_export', 'Environment variables to be passed to tools',[]),
128    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')),
129    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.  
130    ('build_shared', 'Build dynamic libraries only', False),    ('build_shared', 'Build dynamic libraries only', False),
131    ('sys_libs', 'Extra libraries to link with', []),    ('sys_libs', 'Extra libraries to link with', []),
132    ('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)'),
# Line 131  vars.AddVariables( Line 134  vars.AddVariables(
134    ('pythoncmd', 'which python to compile with','python'),    ('pythoncmd', 'which python to compile with','python'),
135    ('usepython3', 'Is this a python3 build? (experimental)', False),    ('usepython3', 'Is this a python3 build? (experimental)', False),
136    ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),    ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
137      ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
138      ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
139      BoolVariable('longindices', 'use long indices (for very large matrices)', False),
140      BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
141      BoolVariable('compressed_files','Enables reading from compressed binary files', True),
142      ('compression_libs', 'Compression libraries to link with', ['boost_iostreams']),
143      BoolVariable('papi', 'Enable PAPI', False),
144      ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
145      ('papi_libs', 'PAPI libraries to link with', ['papi']),
146      BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False)
147  )  )
148    
149  ##################### Create environment and help text #######################  ##################### Create environment and help text #######################
# Line 142  vars.AddVariables( Line 155  vars.AddVariables(
155  # in default locations.  # in default locations.
156  env = Environment(tools = ['default'], options = vars,  env = Environment(tools = ['default'], options = vars,
157                    ENV = {'PATH': os.environ['PATH']})                    ENV = {'PATH': os.environ['PATH']})
158  if env['tools_names'] != 'default':  
159    # set the vars for clang
160    def mkclang(env):
161        env['CXX']='clang++'
162    
163    if env['tools_names'] != ['default']:
164        zz=env['tools_names']
165        if 'clang' in zz:
166            zz.remove('clang')
167            zz.insert(0, mkclang)
168      env = Environment(tools = ['default'] + env['tools_names'], options = vars,      env = Environment(tools = ['default'] + env['tools_names'], options = vars,
169                        ENV = {'PATH' : os.environ['PATH']})                        ENV = {'PATH' : os.environ['PATH']})
170    
# Line 168  if len(vars.UnknownVariables())>0: Line 190  if len(vars.UnknownVariables())>0:
190          print("Unknown option '%s'" % k)          print("Unknown option '%s'" % k)
191      Exit(1)      Exit(1)
192    
193    if env['cuda']:
194        if env['nvcc'] != 'default':
195            env['NVCC'] = env['nvcc']
196        env.Tool('nvcc')
197    
198    if 'dudley' in env['domains']:
199        env['domains'].append('finley')
200    
201    # create dictionary which will be populated with info for buildvars file
202    env['buildvars']={}
203    # create list which will be populated with warnings if there are any
204    env['warnings']=[]
205    
206  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
207    
208  env['BUILD_DIR']=env['build_dir']  env['BUILD_DIR']=Dir(env['build_dir']).abspath
209  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
210    env['buildvars']['prefix']=prefix
211  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
212  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
213  env['libinstall'] = os.path.join(prefix, 'lib')  env['libinstall'] = os.path.join(prefix, 'lib')
# Line 188  env.Append(LIBPATH = [env['libinstall']] Line 224  env.Append(LIBPATH = [env['libinstall']]
224    
225  ################# Fill in compiler options if not set above ##################  ################# Fill in compiler options if not set above ##################
226    
 if env['cc'] != 'default': env['CC']=env['cc']  
227  if env['cxx'] != 'default': env['CXX']=env['cxx']  if env['cxx'] != 'default': env['CXX']=env['cxx']
228    
229  # 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 206  fatalwarning = '' # switch to turn warni Line 241  fatalwarning = '' # switch to turn warni
241  sysheaderopt = '' # how to indicate that a header is a system header  sysheaderopt = '' # how to indicate that a header is a system header
242    
243  # env['CC'] might be a full path  # env['CC'] might be a full path
244  cc_name=os.path.basename(env['CC'])  cc_name=os.path.basename(env['CXX'])
245    
246  if cc_name == 'icc':  if cc_name == 'icpc':
247      # Intel compiler      # Intel compiler
248      cc_flags    = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
249      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
250        cc_flags    = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
251        cc_optim    = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
252      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
253      omp_flags   = "-openmp -openmp_report0"      omp_flags   = "-openmp"
254      omp_ldflags = "-openmp -openmp_report0 -lpthread"      omp_ldflags = "-openmp -openmp_report=1"
255      fatalwarning = "-Werror"      fatalwarning = "-Werror"
256  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'g++':
257      # GNU C on any system      # GNU C++ on any system
258      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(),
259        # see mantis #691
260        cc_flags     = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
261      cc_optim     = "-O3"      cc_optim     = "-O3"
262      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
263        cc_debug     = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
264      omp_flags    = "-fopenmp"      omp_flags    = "-fopenmp"
265      omp_ldflags  = "-fopenmp"      omp_ldflags  = "-fopenmp"
266      fatalwarning = "-Werror"      fatalwarning = "-Werror"
# Line 239  elif cc_name == 'icl': Line 279  elif cc_name == 'icl':
279      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
280      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
281    
282    env['sysheaderopt']=sysheaderopt
283    
284  # set defaults if not otherwise specified  # set defaults if not otherwise specified
285  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
286  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
287  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
288  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
289  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'])  
290  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
291  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
292    
293    if env['nvccflags'] != 'default':
294        env['NVCCFLAGS'] = env['nvccflags']
295        env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
296    
297    if env['BADPYTHONMACROS']:
298        env.Append(CPPDEFINES = ['BADPYTHONMACROS'])
299    
300    if env['longindices']:
301        env.Append(CPPDEFINES = ['ESYS_INDEXTYPE_LONG'])
302    
303  if env['usepython3']:  if env['usepython3']:
304      env.Append(CPPDEFINES=['ESPYTHON3'])      env.Append(CPPDEFINES=['ESPYTHON3'])
305    
# Line 270  if env['iknowwhatimdoing']: Line 321  if env['iknowwhatimdoing']:
321    
322  # Disable OpenMP if no flags provided  # Disable OpenMP if no flags provided
323  if env['openmp'] and env['omp_flags'] == '':  if env['openmp'] and env['omp_flags'] == '':
324     print("OpenMP requested but no flags provided - disabling OpenMP!")     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
325     env['openmp'] = False     env['openmp'] = False
326    
327  if env['openmp']:  if env['openmp']:
# Line 280  else: Line 331  else:
331      env['omp_flags']=''      env['omp_flags']=''
332      env['omp_ldflags']=''      env['omp_ldflags']=''
333    
334    env['buildvars']['openmp']=int(env['openmp'])
335    
336  # add debug/non-debug compiler flags  # add debug/non-debug compiler flags
337    env['buildvars']['debug']=int(env['debug'])
338  if env['debug']:  if env['debug']:
339      env.Append(CCFLAGS = env['cc_debug'])      env.Append(CCFLAGS = env['cc_debug'])
340  else:  else:
# Line 292  env.Append(CCFLAGS = env['cc_flags']) Line 346  env.Append(CCFLAGS = env['cc_flags'])
346  # add system libraries  # add system libraries
347  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
348    
349    # set defaults for launchers if not otherwise specified
350    if env['prelaunch'] == 'default':
351        if env['mpi'] == 'INTELMPI' and env['openmp']:
352            env['prelaunch'] = "export I_MPI_PIN_DOMAIN=omp"
353        elif env['mpi'] == 'OPENMPI':
354            # transform comma-separated list to '-x a -x b -x c ...'
355            env['prelaunch'] = "EE=$(echo -x %e|sed -e 's/,/ -x /g')"
356        elif env['mpi'] == 'MPT':
357            env['prelaunch'] = "export MPI_NUM_MEMORY_REGIONS=0"
358        elif env['mpi'] == 'MPICH2':
359            env['prelaunch'] = "mpdboot -n %n -r ssh -f %f"
360        else:
361            env['prelaunch'] = ""
362    
363    if env['launcher'] == 'default':
364        if env['mpi'] == 'INTELMPI':
365            env['launcher'] = "mpirun -hostfile %f -n %N -ppn %p %b"
366        elif env['mpi'] == 'OPENMPI':
367            env['launcher'] = "mpirun --gmca mpi_warn_on_fork 0 ${EE} --host %h -bynode -bind-to-core --cpus-per-rank %t -np %N %b"
368        elif env['mpi'] == 'MPT':
369            env['launcher'] = "mpirun %h -np %p %b"
370        elif env['mpi'] == 'MPICH':
371            env['launcher'] = "mpirun -machinefile %f -np %N %b"
372        elif env['mpi'] == 'MPICH2':
373            env['launcher'] = "mpiexec -genvlist %e -np %N %b"
374        else:
375            env['launcher'] = "%b"
376    
377    if env['postlaunch'] == 'default':
378        if env['mpi'] == 'MPICH2':
379            env['postlaunch'] = "mpdallexit"
380        else:
381            env['postlaunch'] = ""
382    
383    # determine svn revision
384  global_revision=ARGUMENTS.get('SVN_VERSION', None)  global_revision=ARGUMENTS.get('SVN_VERSION', None)
385  if global_revision:  if global_revision:
386      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
# Line 308  else: Line 396  else:
396    except:    except:
397      global_revision = '-1'      global_revision = '-1'
398  env['svn_revision']=global_revision  env['svn_revision']=global_revision
399    env['buildvars']['svn_revision']=global_revision
400  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
401    
402  if IS_WINDOWS:  if IS_WINDOWS:
# Line 315  if IS_WINDOWS: Line 404  if IS_WINDOWS:
404          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
405          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
406    
407    env['IS_WINDOWS']=IS_WINDOWS
408    env['IS_OSX']=IS_OSX
409    
410  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
411    
412  # Windows doesn't use LD_LIBRARY_PATH but PATH instead  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
# Line 324  if IS_WINDOWS: Line 416  if IS_WINDOWS:
416  else:  else:
417      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
418    
419    env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
420    
421  # the following env variables are exported for the unit tests  # the following env variables are exported for the unit tests
422    
423  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
424      try:      try:
425          env['ENV'][key] = os.environ[key]          env['ENV'][key] = os.environ[key]
426      except KeyError:      except KeyError:
427          env['ENV'][key] = 1          env['ENV'][key] = '1'
428    
429  env_export=env['env_export']  env_export=env['env_export']
430  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'])
431    
432  for key in set(env_export):  for key in set(env_export):
433      try:      try:
# Line 341  for key in set(env_export): Line 435  for key in set(env_export):
435      except KeyError:      except KeyError:
436          pass          pass
437    
438    for key in os.environ.keys():
439        if key.startswith("SLURM_"):
440            env['ENV'][key] = os.environ[key]
441    
442  try:  try:
443      env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])      env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
444  except KeyError:  except KeyError:
445      pass      pass
446    
447    if IS_OSX:
448      try:
449        env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
450      except KeyError:
451        pass
452    
453    
454  # these shouldn't be needed  # these shouldn't be needed
455  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
456  #    try:  #    try:
# Line 372  env.Append(BUILDERS = {'RunUnitTest' : r Line 477  env.Append(BUILDERS = {'RunUnitTest' : r
477  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)
478  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
479    
480    runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
481    env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
482    
483  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
484  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
485    
486  ############################ Dependency checks ###############################  ############################ Dependency checks ###############################
487    
488  # Create a Configure() environment to check for compilers and python  ######## Compiler
489  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'])  
490    
491  ######## Python headers & library (required)  ######## Python headers & library (required)
492    env=checkPython(env)
493    
494  # Use the python scons is running  ######## boost & boost-python (required)
495  if env['pythoncmd']=='python':  env=checkBoost(env)
     python_inc_path=sysconfig.get_python_inc()  
     if IS_WINDOWS:  
         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()]  
496    
497  #if we want to use a python other than the one scons is running  ######## NVCC version (optional)
498  else:  if env['cuda']:
499      initstring='from __future__ import print_function;from distutils import sysconfig;'      env=checkCudaVersion(env)
500      if env['pythonlibname']!='':      env=checkCUDA(env)
         python_libs=env['pythonlibname']  
     else:   # work it out by calling python      
         if IS_WINDOWS:  
             cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'  
         else:  
             cmd='print("python"+sysconfig.get_python_version())'  
         p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)  
         python_libs=p.stdout.readline()  
         if env['usepython3']:       # This is to convert unicode str into py2 string  
             python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought  
         p.wait()  
         python_libs=python_libs.strip()  
   
     
     # Now we know whether we are using python3 or not  
     p=Popen([env['pythoncmd'], '-c',  initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)  
     python_inc_path=p.stdout.readline()  
     if env['usepython3']:  
          python_inc_path=python_inc_path.encode()  
     p.wait()    
     python_inc_path=python_inc_path.strip()  
     if IS_WINDOWS:  
         cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"  
     elif env['PLATFORM']=='darwin':  
         cmd="sysconfig.get_config_var(\"LIBPL\")"  
     else:  
         cmd="sysconfig.get_config_var(\"LIBDIR\")"  
   
     p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)  
     python_lib_path=p.stdout.readline()  
     if env['usepython3']:  
         python_lib_path=python_lib_path.decode()  
     p.wait()  
     python_lib_path=python_lib_path.strip()  
   
 if sysheaderopt == '':  
     conf.env.AppendUnique(CPPPATH = [python_inc_path])  
 else:  
     conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])  
501    
502  conf.env.AppendUnique(LIBPATH = [python_lib_path])  ######## numpy (required) and numpy headers (optional)
503  conf.env.AppendUnique(LIBS = python_libs)  env=checkNumpy(env)
 # 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)  
   
 ## reuse conf to check for numpy header (optional)  
 if env['usepython3']:  
     # FIXME: This is until we can work out how to make the checks in python 3  
     conf.env['numpy_h']=False  
 else:  
     if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):  
         conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])  
         conf.env['numpy_h']=True  
     else:  
         conf.env['numpy_h']=False  
   
 # 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)  
   
 ######## numpy (required)  
   
 if env['pythoncmd']=='python':  
     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)  
 else:  
     p=subprocess.call([env['pythoncmd'],'-c','import numpy'])  
     if p!=0:  
       print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)  
       Exit(1)  
504    
505  ######## CppUnit (required for tests)  ######## CppUnit (required for tests)
506    env=checkCppUnit(env)
507    
508  try:  ######## optional python modules (sympy, pyproj)
509      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)  
510    
511  if env['pyvisi']:  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
512      try:  env=checkOptionalLibraries(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)  
   
 if env['lapack']=='mkl' and not env['mkl']:  
     print("mkl_lapack requires MKL!")  
     Exit(1)  
513    
514  env['uselapack'] = env['lapack']!='none'  #use gmsh info to set some defines
515  lapack_inc_path=''  if env['gmsh'] == 's':
516  lapack_lib_path=''      env.Append(CPPDEFINES=['GMSH'])
517  if env['uselapack']:  elif env['gmsh'] == 'm':
518      header='clapack.h'      env.Append(CPPDEFINES=['GMSH','GMSH_MPI'])
     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)  
   
 if env['mpi']=='no':  
     env['mpi']='none'  
   
 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'])  
   
 ######## gmsh (optional, for tests)  
   
 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  
519    
520  ######## PDFLaTeX (for documentation)  ######## PDFLaTeX (for documentation)
521  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 ###########################  
522    
523  # 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
524  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
# Line 709  env.PrependENVPath('PYTHONPATH', prefix) Line 526  env.PrependENVPath('PYTHONPATH', prefix)
526  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
527    
528  if not env['verbose']:  if not env['verbose']:
     env['CCCOMSTR'] = "Compiling $TARGET"  
529      env['CXXCOMSTR'] = "Compiling $TARGET"      env['CXXCOMSTR'] = "Compiling $TARGET"
     env['SHCCCOMSTR'] = "Compiling $TARGET"  
530      env['SHCXXCOMSTR'] = "Compiling $TARGET"      env['SHCXXCOMSTR'] = "Compiling $TARGET"
531      env['ARCOMSTR'] = "Linking $TARGET"      env['ARCOMSTR'] = "Linking $TARGET"
532      env['LINKCOMSTR'] = "Linking $TARGET"      env['LINKCOMSTR'] = "Linking $TARGET"
# Line 722  if not env['verbose']: Line 537  if not env['verbose']:
537      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
538      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
539    
 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','vsl_random':  
     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")  
 if env['numpy_h']:  
     print("   numpy headers:  FOUND")  
 else:  
     print("   numpy headers:  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("")  
   
540  ####################### Configure the subdirectories #########################  ####################### Configure the subdirectories #########################
541    
542  from grouptest import *  # remove obsolete files
543    if not env['usempi']:
544        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
545        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
546    
547    from grouptest import *
548  TestGroups=[]  TestGroups=[]
549    
550  # keep an environment without warnings-as-errors  # keep an environment without warnings-as-errors
# Line 790  Export( Line 563  Export(
563    ]    ]
564  )  )
565    
566    #do not auto build
567  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)
568  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)
569  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)
570  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)
571    
572    env.SConscript(dirs = ['cusplibrary'])
573    
574    #This will pull in the escriptcore/py_src and escriptcore/test
575    env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
576  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)
577  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
578  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)  if 'dudley' in env['domains']:
579  env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)      env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
580  env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)  if 'finley' in env['domains']:
581        env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
582    if 'ripley' in env['domains']:
583        env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
584    if 'speckley' in env['domains']:
585        env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
586    env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
587  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)  
588  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)
589  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)
590    env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
591  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)
592    
593    
594  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
595    
596  # remove obsolete file  write_buildvars(env)
 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()  
597    
598    write_launcher(env)
 buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  
 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")  
 if env['pythoncmd']=='python':  
     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")  
 else:  
     buildvars.write("python="+env['pythoncmd']+"\n")  
     p=Popen([env['pythoncmd'], '-c', 'from __future__ import print_function;import sys;print(str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]))'], stdout=PIPE)  
     verstring=p.stdout.readline().strip()  
     p.wait()  
     buildvars.write("python_version="+verstring+"\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()  
599    
600  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
601    
# Line 875  env.Alias('build_paso', ['install_paso_h Line 613  env.Alias('build_paso', ['install_paso_h
613  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
614    
615  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'])
616  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'])
617    
618  env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])  env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
619  env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])  env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
620    
621  env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])  if 'dudley' in env['domains']:
622  env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])      env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
623        env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
624  env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])  
625  env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])  if 'finley' in env['domains']:
626        env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
627  env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])      env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
628  env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])  
629    if 'ripley' in env['domains']:
630        env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
631        env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
632    
633    if 'speckley' in env['domains']:
634        env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
635        env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
636    
637  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'])
638  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 901  build_all_list += ['build_esysUtils'] Line 646  build_all_list += ['build_esysUtils']
646  build_all_list += ['build_paso']  build_all_list += ['build_paso']
647  build_all_list += ['build_escript']  build_all_list += ['build_escript']
648  build_all_list += ['build_pasowrap']  build_all_list += ['build_pasowrap']
649  build_all_list += ['build_dudley']  if 'dudley' in env['domains']: build_all_list += ['build_dudley']
650  build_all_list += ['build_finley']  if 'finley' in env['domains']: build_all_list += ['build_finley']
651  build_all_list += ['build_ripley']  if 'ripley' in env['domains']: build_all_list += ['build_ripley']
652    if 'speckley' in env['domains']: build_all_list += ['build_speckley']
653  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
654  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS and 'finley' in env['domains']:
655        build_all_list += ['build_escriptreader']
656  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
 build_all_list += ['build_escriptconvert']  
657  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
658    
659  install_all_list = []  install_all_list = []
# Line 916  install_all_list += ['install_esysUtils' Line 662  install_all_list += ['install_esysUtils'
662  install_all_list += ['install_paso']  install_all_list += ['install_paso']
663  install_all_list += ['install_escript']  install_all_list += ['install_escript']
664  install_all_list += ['install_pasowrap']  install_all_list += ['install_pasowrap']
665  install_all_list += ['install_dudley']  if 'dudley' in env['domains']: install_all_list += ['install_dudley']
666  install_all_list += ['install_finley']  if 'finley' in env['domains']: install_all_list += ['install_finley']
667  install_all_list += ['install_ripley']  if 'ripley' in env['domains']: install_all_list += ['install_ripley']
668    if 'speckley' in env['domains']: install_all_list += ['install_speckley']
669  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
670  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS and 'finley' in env['domains']:
671  #install_all_list += ['install_pyvisi_py']      install_all_list += ['install_escriptreader']
672    install_all_list += ['install_downunder_py']
673  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
674  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
675  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
 install_all_list += ['install_escriptconvert']  
676  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
677    
678  # Default target is install  # Default target is install
# Line 933  env.Default('install_all') Line 680  env.Default('install_all')
680    
681  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
682    
 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')  
683  if not env['cppunit']:  if not env['cppunit']:
684        test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
685      env.Alias('run_tests', test_msg)      env.Alias('run_tests', test_msg)
686        env.Alias('build_tests', '')
687  env.Alias('run_tests', ['install_all'])  env.Alias('run_tests', ['install_all'])
688  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
689  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
# Line 943  env.Alias('build_PasoTests','$BUILD_DIR/ Line 691  env.Alias('build_PasoTests','$BUILD_DIR/
691    
692  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
693    
694  env.Alias('api_epydoc','install_all')  env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
695  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'])
696    env.Alias('docs', ['basedocs', 'sphinxdoc'])
697  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
698    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
699    
700    # The test scripts are always generated, this target allows us to
701    # generate the testscripts without doing a full build
702    env.Alias('testscripts',[])
703    
704  if not IS_WINDOWS:  if not IS_WINDOWS:
705      try:      generateTestScripts(env, TestGroups)
706          utest=open('utest.sh','w')  
707          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix))  
708          for tests in TestGroups:  ######################## Summarize our environment ###########################
709              utest.write(tests.makeString())  def print_summary():
710          utest.close()      print("")
711          Execute(Chmod('utest.sh', 0o755))      print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
712          print("Generated utest.sh.")      print("Escript/Finley revision %s"%global_revision)
713      except IOError:      print("  Install prefix:  %s"%env['prefix'])
714          print("Error attempting to write unittests file.")      print("          Python:  %s"%sysconfig.PREFIX)
715          Exit(1)      print("           boost:  %s"%env['boost_prefix'])
716        if env['numpy_h']:
717            print("           numpy:  YES (with headers)")
718        else:
719            print("           numpy:  YES (without headers)")
720        if env['usempi']:
721            print("             MPI:  YES (flavour: %s)"%env['mpi'])
722        else:
723            print("             MPI:  NO")
724        if env['uselapack']:
725            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
726        else:
727            print("          LAPACK:  NO")
728        if env['cuda']:
729            print("            CUDA:  YES (nvcc: %s)"%env['nvcc_version'])
730        else:
731            print("            CUDA:  NO")
732        d_list=[]
733        e_list=[]
734        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit':
735            if env[i]: e_list.append(i)
736            else: d_list.append(i)
737        for i in e_list:
738            print("%16s:  YES"%i)
739        for i in d_list:
740            print("%16s:  NO"%i)
741        if env['cppunit']:
742            print("         CppUnit:  YES")
743        else:
744            print("         CppUnit:  NO")
745        if env['gmshpy']:
746            gmshpy=" + python module"
747        else:
748            gmshpy=""
749        if env['gmsh']=='m':
750            print("            gmsh:  YES, MPI-ENABLED"+gmshpy)
751        elif env['gmsh']=='s':
752            print("            gmsh:  YES"+gmshpy)
753        else:
754            if env['gmshpy']:
755                print("            gmsh:  python module only")
756            else:
757                print("            gmsh:  NO")
758        print(    "            gzip:  " + ("YES" if env['compressed_files'] else "NO"))
759    
760      # delete utest.sh upon cleanup      if ((fatalwarning != '') and (env['werror'])):
761      env.Clean('target_init', 'utest.sh')          print("  Treating warnings as errors")
762        else:
763            print("  NOT treating warnings as errors")
764        print("")
765        for w in env['warnings']:
766            print("WARNING: %s"%w)
767        if len(GetBuildFailures()):
768            print("\nERROR: build stopped due to errors\n")
769        else:
770            print("\nSUCCESS: build complete\n")
771    
772      # 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'))  
773    

Legend:
Removed from v.3896  
changed lines
  Added in v.5436

  ViewVC Help
Powered by ViewVC 1.1.26