/[escript]/branches/4.0fordebian/SConstruct
ViewVC logotype

Diff of /branches/4.0fordebian/SConstruct

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

trunk/SConstruct revision 3947 by caltinay, Wed Aug 22 23:19:10 2012 UTC release/4.0/SConstruct revision 5389 by sshaw, Tue Dec 16 06:23:30 2014 UTC
# Line 1  Line 1 
1  ########################################################  ##############################################################################
2  #  #
3  # Copyright (c) 2003-2012 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      ('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 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('vsl_random', 'Use VSL from intel for random data', False),    ListVariable('domains', 'Which domains to build', 'all',\
116                   ['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 132  vars.AddVariables( Line 136  vars.AddVariables(
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)',''),    ('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',''),    ('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 143  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 169  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    # create dictionary which will be populated with info for buildvars file
199    env['buildvars']={}
200    # create list which will be populated with warnings if there are any
201    env['warnings']=[]
202    
203  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
204    
205  env['BUILD_DIR']=env['build_dir']  env['BUILD_DIR']=Dir(env['build_dir']).abspath
206  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
207    env['buildvars']['prefix']=prefix
208  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
209  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
210  env['libinstall'] = os.path.join(prefix, 'lib')  env['libinstall'] = os.path.join(prefix, 'lib')
# Line 189  env.Append(LIBPATH = [env['libinstall']] Line 221  env.Append(LIBPATH = [env['libinstall']]
221    
222  ################# Fill in compiler options if not set above ##################  ################# Fill in compiler options if not set above ##################
223    
 if env['cc'] != 'default': env['CC']=env['cc']  
224  if env['cxx'] != 'default': env['CXX']=env['cxx']  if env['cxx'] != 'default': env['CXX']=env['cxx']
225    
226  # 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 207  fatalwarning = '' # switch to turn warni Line 238  fatalwarning = '' # switch to turn warni
238  sysheaderopt = '' # how to indicate that a header is a system header  sysheaderopt = '' # how to indicate that a header is a system header
239    
240  # env['CC'] might be a full path  # env['CC'] might be a full path
241  cc_name=os.path.basename(env['CC'])  cc_name=os.path.basename(env['CXX'])
242    
243  if cc_name == 'icc':  if cc_name == 'icpc':
244      # Intel compiler      # Intel compiler
245      cc_flags    = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
246      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
247        cc_flags    = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
248        cc_optim    = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
249      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
250      omp_flags   = "-openmp -openmp_report0"      omp_flags   = "-openmp"
251      omp_ldflags = "-openmp -openmp_report0 -lpthread"      omp_ldflags = "-openmp -openmp_report=1"
252      fatalwarning = "-Werror"      fatalwarning = "-Werror"
253  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'g++':
254      # GNU C on any system      # GNU C++ on any system
255      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(),
256        # see mantis #691
257        cc_flags     = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
258      cc_optim     = "-O3"      cc_optim     = "-O3"
259      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
260        cc_debug     = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
261      omp_flags    = "-fopenmp"      omp_flags    = "-fopenmp"
262      omp_ldflags  = "-fopenmp"      omp_ldflags  = "-fopenmp"
263      fatalwarning = "-Werror"      fatalwarning = "-Werror"
# Line 240  elif cc_name == 'icl': Line 276  elif cc_name == 'icl':
276      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
277      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
278    
279    env['sysheaderopt']=sysheaderopt
280    
281  # set defaults if not otherwise specified  # set defaults if not otherwise specified
282  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
283  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
284  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
285  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
286  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'])  
287  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
288  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
289    
290    if env['nvccflags'] != 'default':
291        env['NVCCFLAGS'] = env['nvccflags']
292        env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
293    
294    if env['BADPYTHONMACROS']:
295        env.Append(CPPDEFINES = ['BADPYTHONMACROS'])
296    
297    if env['longindices']:
298        env.Append(CPPDEFINES = ['ESYS_INDEXTYPE_LONG'])
299    
300  if env['usepython3']:  if env['usepython3']:
301      env.Append(CPPDEFINES=['ESPYTHON3'])      env.Append(CPPDEFINES=['ESPYTHON3'])
302    
# Line 271  if env['iknowwhatimdoing']: Line 318  if env['iknowwhatimdoing']:
318    
319  # Disable OpenMP if no flags provided  # Disable OpenMP if no flags provided
320  if env['openmp'] and env['omp_flags'] == '':  if env['openmp'] and env['omp_flags'] == '':
321     print("OpenMP requested but no flags provided - disabling OpenMP!")     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
322     env['openmp'] = False     env['openmp'] = False
323    
324  if env['openmp']:  if env['openmp']:
# Line 281  else: Line 328  else:
328      env['omp_flags']=''      env['omp_flags']=''
329      env['omp_ldflags']=''      env['omp_ldflags']=''
330    
331    env['buildvars']['openmp']=int(env['openmp'])
332    
333  # add debug/non-debug compiler flags  # add debug/non-debug compiler flags
334    env['buildvars']['debug']=int(env['debug'])
335  if env['debug']:  if env['debug']:
336      env.Append(CCFLAGS = env['cc_debug'])      env.Append(CCFLAGS = env['cc_debug'])
337  else:  else:
# Line 293  env.Append(CCFLAGS = env['cc_flags']) Line 343  env.Append(CCFLAGS = env['cc_flags'])
343  # add system libraries  # add system libraries
344  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
345    
346    # set defaults for launchers if not otherwise specified
347    if env['prelaunch'] == 'default':
348        if env['mpi'] == 'INTELMPI' and env['openmp']:
349            env['prelaunch'] = "export I_MPI_PIN_DOMAIN=omp"
350        elif env['mpi'] == 'OPENMPI':
351            # transform comma-separated list to '-x a -x b -x c ...'
352            env['prelaunch'] = "EE=$(echo %e|sed -e 's/,/ -x /g')"
353        elif env['mpi'] == 'MPT':
354            env['prelaunch'] = "export MPI_NUM_MEMORY_REGIONS=0"
355        elif env['mpi'] == 'MPICH2':
356            env['prelaunch'] = "mpdboot -n %n -r ssh -f %f"
357        else:
358            env['prelaunch'] = ""
359    
360    if env['launcher'] == 'default':
361        if env['mpi'] == 'INTELMPI':
362            env['launcher'] = "mpirun -hostfile %f -n %N -ppn %p %b"
363        elif env['mpi'] == 'OPENMPI':
364            env['launcher'] = "mpirun --gmca mpi_warn_on_fork 0 -x ${EE} --host %h -bynode -bind-to-core --cpus-per-rank %t -np %N %b"
365        elif env['mpi'] == 'MPT':
366            env['launcher'] = "mpirun %h -np %p %b"
367        elif env['mpi'] == 'MPICH':
368            env['launcher'] = "mpirun -machinefile %f -np %N %b"
369        elif env['mpi'] == 'MPICH2':
370            env['launcher'] = "mpiexec -genvlist %e -np %N %b"
371        else:
372            env['launcher'] = "%b"
373    
374    if env['postlaunch'] == 'default':
375        if env['mpi'] == 'MPICH2':
376            env['postlaunch'] = "mpdallexit"
377        else:
378            env['postlaunch'] = ""
379    
380    # determine svn revision
381  global_revision=ARGUMENTS.get('SVN_VERSION', None)  global_revision=ARGUMENTS.get('SVN_VERSION', None)
382  if global_revision:  if global_revision:
383      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
# Line 309  else: Line 393  else:
393    except:    except:
394      global_revision = '-1'      global_revision = '-1'
395  env['svn_revision']=global_revision  env['svn_revision']=global_revision
396    env['buildvars']['svn_revision']=global_revision
397  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
398    
399  if IS_WINDOWS:  if IS_WINDOWS:
# Line 316  if IS_WINDOWS: Line 401  if IS_WINDOWS:
401          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
402          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
403    
404    env['IS_WINDOWS']=IS_WINDOWS
405    env['IS_OSX']=IS_OSX
406    
407  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
408    
409  # Windows doesn't use LD_LIBRARY_PATH but PATH instead  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
# Line 325  if IS_WINDOWS: Line 413  if IS_WINDOWS:
413  else:  else:
414      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
415    
416    env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
417    
418  # the following env variables are exported for the unit tests  # the following env variables are exported for the unit tests
419    
420  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
421      try:      try:
422          env['ENV'][key] = os.environ[key]          env['ENV'][key] = os.environ[key]
423      except KeyError:      except KeyError:
424          env['ENV'][key] = 1          env['ENV'][key] = '1'
425    
426  env_export=env['env_export']  env_export=env['env_export']
427  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'])
428    
429  for key in set(env_export):  for key in set(env_export):
430      try:      try:
# Line 347  try: Line 437  try:
437  except KeyError:  except KeyError:
438      pass      pass
439    
440    if IS_OSX:
441      try:
442        env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
443      except KeyError:
444        pass
445    
446    
447  # these shouldn't be needed  # these shouldn't be needed
448  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
449  #    try:  #    try:
# Line 373  env.Append(BUILDERS = {'RunUnitTest' : r Line 470  env.Append(BUILDERS = {'RunUnitTest' : r
470  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)
471  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
472    
473    runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
474    env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
475    
476  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
477  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
478    
479  ############################ Dependency checks ###############################  ############################ Dependency checks ###############################
480    
481  # Create a Configure() environment to check for compilers and python  ######## Compiler
482  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'])  
483    
484  ######## Python headers & library (required)  ######## Python headers & library (required)
485    env=checkPython(env)
486    
487  #First we check to see if the config file has specified  ######## boost & boost-python (required)
488  ##Where to find the filae. Ideally, this should be automatic  env=checkBoost(env)
 #But we need to deal with the case where python is not in its INSTALL  
 #Directory  
 # Use the python scons is running  
 if env['pythoncmd']=='python':  
     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()]  
   
 #if we want to use a python other than the one scons is running  
 else:  
     initstring='from __future__ import print_function;from distutils import sysconfig;'  
     if env['pythonlibname']!='':  
         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()  
   
 #Check for an override from the config file.  
 #Ideally, this should be automatic  
 #But we need to deal with the case where python is not in its INSTALL  
 #Directory  
 if env['pythonlibpath']!='':  
     python_lib_path=env['pythonlibpath']  
   
 if env['pythonincpath']!='':  
     python_inc_path=env['pythonincpath']  
489    
490    ######## NVCC version (optional)
491    if env['cuda']:
492        env=checkCudaVersion(env)
493    
494  if sysheaderopt == '':  ######## numpy (required) and numpy headers (optional)
495      conf.env.AppendUnique(CPPPATH = [python_inc_path])  env=checkNumpy(env)
 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)  
   
 ## 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)  
496    
497  ######## CppUnit (required for tests)  ######## CppUnit (required for tests)
498    env=checkCppUnit(env)
499    
500  try:  ######## optional python modules (sympy, pyproj)
501      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  
   
 ######## 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)  
502    
503  if env['lapack']=='mkl' and not env['mkl']:  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
504      print("mkl_lapack requires MKL!")  env=checkOptionalLibraries(env)
     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)  
   
 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'])  
505    
506  ######## gmsh (optional, for tests)  #use gmsh info to set some defines
507    if env['gmsh'] == 's':
508  try:      env.Append(CPPDEFINES=['GMSH'])
509      import subprocess  elif env['gmsh'] == 'm':
510      p=subprocess.Popen(['gmsh', '-info'], stderr=subprocess.PIPE)      env.Append(CPPDEFINES=['GMSH','GMSH_MPI'])
     _,e=p.communicate()  
     if e.split().count("MPI"):  
         env['gmsh']='m'  
     else:  
         env['gmsh']='s'  
 except OSError:  
     env['gmsh']=False  
511    
512  ######## PDFLaTeX (for documentation)  ######## PDFLaTeX (for documentation)
513  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 ###########################  
514    
515  # 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
516  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
# Line 715  env.PrependENVPath('PYTHONPATH', prefix) Line 518  env.PrependENVPath('PYTHONPATH', prefix)
518  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
519    
520  if not env['verbose']:  if not env['verbose']:
     env['CCCOMSTR'] = "Compiling $TARGET"  
521      env['CXXCOMSTR'] = "Compiling $TARGET"      env['CXXCOMSTR'] = "Compiling $TARGET"
     env['SHCCCOMSTR'] = "Compiling $TARGET"  
522      env['SHCXXCOMSTR'] = "Compiling $TARGET"      env['SHCXXCOMSTR'] = "Compiling $TARGET"
523      env['ARCOMSTR'] = "Linking $TARGET"      env['ARCOMSTR'] = "Linking $TARGET"
524      env['LINKCOMSTR'] = "Linking $TARGET"      env['LINKCOMSTR'] = "Linking $TARGET"
# Line 728  if not env['verbose']: Line 529  if not env['verbose']:
529      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
530      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
531    
 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("")  
   
532  ####################### Configure the subdirectories #########################  ####################### Configure the subdirectories #########################
533    
534  from grouptest import *  # remove obsolete files
535    if not env['usempi']:
536        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
537        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
538    
539    from grouptest import *
540  TestGroups=[]  TestGroups=[]
541    
542  # keep an environment without warnings-as-errors  # keep an environment without warnings-as-errors
# Line 796  Export( Line 555  Export(
555    ]    ]
556  )  )
557    
558    #do not auto build
559  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)
560  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)
561  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)
562  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)
563    
564    env.SConscript(dirs = ['cusplibrary'])
565    
566    #This will pull in the escriptcore/py_src and escriptcore/test
567    env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
568  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)
569  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)
570  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)  if 'dudley' in env['domains']:
571  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)
572  env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)  if 'finley' in env['domains']:
573        env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
574    if 'ripley' in env['domains']:
575        env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
576    if 'speckley' in env['domains']:
577        env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
578  env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)  env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
579  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)
580  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)
# Line 815  env.SConscript(dirs = ['paso/profiling'] Line 585  env.SConscript(dirs = ['paso/profiling']
585    
586  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
587    
588  # 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()  
   
589    
590  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  write_launcher(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")  
 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("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()  
591    
592  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
593    
# Line 880  env.Alias('build_paso', ['install_paso_h Line 605  env.Alias('build_paso', ['install_paso_h
605  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
606    
607  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'])
608  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'])
609    
610  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'])
611  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'])
612    
613  env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])  if 'dudley' in env['domains']:
614  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'])
615        env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
616  env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])  
617  env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])  if 'finley' in env['domains']:
618        env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
619  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'])
620  env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])  
621    if 'ripley' in env['domains']:
622        env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
623        env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
624    
625    if 'speckley' in env['domains']:
626        env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
627        env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
628    
629  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'])
630  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 906  build_all_list += ['build_esysUtils'] Line 638  build_all_list += ['build_esysUtils']
638  build_all_list += ['build_paso']  build_all_list += ['build_paso']
639  build_all_list += ['build_escript']  build_all_list += ['build_escript']
640  build_all_list += ['build_pasowrap']  build_all_list += ['build_pasowrap']
641  build_all_list += ['build_dudley']  if 'dudley' in env['domains']: build_all_list += ['build_dudley']
642  build_all_list += ['build_finley']  if 'finley' in env['domains']: build_all_list += ['build_finley']
643  build_all_list += ['build_ripley']  if 'ripley' in env['domains']: build_all_list += ['build_ripley']
644    if 'speckley' in env['domains']: build_all_list += ['build_speckley']
645  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
646  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS and 'finley' in env['domains']:
647        build_all_list += ['build_escriptreader']
648  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
 build_all_list += ['build_escriptconvert']  
649  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
650    
651  install_all_list = []  install_all_list = []
# Line 921  install_all_list += ['install_esysUtils' Line 654  install_all_list += ['install_esysUtils'
654  install_all_list += ['install_paso']  install_all_list += ['install_paso']
655  install_all_list += ['install_escript']  install_all_list += ['install_escript']
656  install_all_list += ['install_pasowrap']  install_all_list += ['install_pasowrap']
657  install_all_list += ['install_dudley']  if 'dudley' in env['domains']: install_all_list += ['install_dudley']
658  install_all_list += ['install_finley']  if 'finley' in env['domains']: install_all_list += ['install_finley']
659  install_all_list += ['install_ripley']  if 'ripley' in env['domains']: install_all_list += ['install_ripley']
660    if 'speckley' in env['domains']: install_all_list += ['install_speckley']
661  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
662  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS and 'finley' in env['domains']:
663        install_all_list += ['install_escriptreader']
664  install_all_list += ['install_downunder_py']  install_all_list += ['install_downunder_py']
665  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
666  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
667  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
 install_all_list += ['install_escriptconvert']  
668  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
669    
670  # Default target is install  # Default target is install
# Line 939  env.Default('install_all') Line 673  env.Default('install_all')
673  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
674    
675  if not env['cppunit']:  if not env['cppunit']:
676      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
677      env.Alias('run_tests', test_msg)      env.Alias('run_tests', test_msg)
678        env.Alias('build_tests', '')
679  env.Alias('run_tests', ['install_all'])  env.Alias('run_tests', ['install_all'])
680  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
681  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
# Line 948  env.Alias('build_PasoTests','$BUILD_DIR/ Line 683  env.Alias('build_PasoTests','$BUILD_DIR/
683    
684  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
685    
686  env.Alias('api_epydoc','install_all')  env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
687  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'])
688    env.Alias('docs', ['basedocs', 'sphinxdoc'])
689  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
690    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
691    
692    # The test scripts are always generated, this target allows us to
693    # generate the testscripts without doing a full build
694    env.Alias('testscripts',[])
695    
696  if not IS_WINDOWS:  if not IS_WINDOWS:
697      try:      generateTestScripts(env, TestGroups)
         utest=open('utest.sh','w')  
         utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix))  
         for tests in TestGroups:  
             utest.write(tests.makeString())  
         utest.close()  
         Execute(Chmod('utest.sh', 0o755))  
         print("Generated utest.sh.")  
     except IOError:  
         print("Error attempting to write unittests file.")  
         Exit(1)  
698    
     # delete utest.sh upon cleanup  
     env.Clean('target_init', 'utest.sh')  
699    
700      # Make sure that the escript wrapper is in place  ######################## Summarize our environment ###########################
701      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):  def print_summary():
702          print("Copying escript wrapper.")      print("")
703          Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))      print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
704        print("Escript/Finley revision %s"%global_revision)
705        print("  Install prefix:  %s"%env['prefix'])
706        print("          Python:  %s"%sysconfig.PREFIX)
707        print("           boost:  %s"%env['boost_prefix'])
708        if env['numpy_h']:
709            print("           numpy:  YES (with headers)")
710        else:
711            print("           numpy:  YES (without headers)")
712        if env['usempi']:
713            print("             MPI:  YES (flavour: %s)"%env['mpi'])
714        else:
715            print("             MPI:  NO")
716        if env['uselapack']:
717            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
718        else:
719            print("          LAPACK:  NO")
720        if env['cuda']:
721            print("            CUDA:  YES (nvcc: %s)"%env['nvcc_version'])
722        else:
723            print("            CUDA:  NO")
724        d_list=[]
725        e_list=[]
726        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit':
727            if env[i]: e_list.append(i)
728            else: d_list.append(i)
729        for i in e_list:
730            print("%16s:  YES"%i)
731        for i in d_list:
732            print("%16s:  NO"%i)
733        if env['cppunit']:
734            print("         CppUnit:  YES")
735        else:
736            print("         CppUnit:  NO")
737        if env['gmsh']=='m':
738            print("            gmsh:  YES, MPI-ENABLED")
739        elif env['gmsh']=='s':
740            print("            gmsh:  YES")
741        else:
742            print("            gmsh:  NO")
743        print(    "            gzip:  " + ("YES" if env['compressed_files'] else "NO"))
744    
745        if ((fatalwarning != '') and (env['werror'])):
746            print("  Treating warnings as errors")
747        else:
748            print("  NOT treating warnings as errors")
749        print("")
750        for w in env['warnings']:
751            print("WARNING: %s"%w)
752        if len(GetBuildFailures()):
753            print("\nERROR: build stopped due to errors\n")
754        else:
755            print("\nSUCCESS: build complete\n")
756    
757    atexit.register(print_summary)
758    

Legend:
Removed from v.3947  
changed lines
  Added in v.5389

  ViewVC Help
Powered by ViewVC 1.1.26