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

Diff of /branches/4.0fordebian/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 5148 by caltinay, Mon Sep 15 01:25:23 2014 UTC
# Line 1  Line 1 
1  ########################################################  ##############################################################################
2  #  #
3  # Copyright (c) 2003-2010 by University of Queensland  # Copyright (c) 2003-2014 by University of Queensland
4  # Earth Systems Science Computational Center (ESSCC)  # http://www.uq.edu.au
 # http://www.uq.edu.au/esscc  
5  #  #
6  # Primary Business: Queensland, Australia  # Primary Business: Queensland, Australia
7  # Licensed under the Open Software License version 3.0  # Licensed under the Open Software License version 3.0
8  # http://www.opensource.org/licenses/osl-3.0.php  # http://www.opensource.org/licenses/osl-3.0.php
9  #  #
10  ########################################################  # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11    # Development 2012-2013 by School of Earth Sciences
12    # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13    #
14    ##############################################################################
15    
16  EnsureSConsVersion(0,98,1)  EnsureSConsVersion(0,98,1)
17  EnsurePythonVersion(2,5)  EnsurePythonVersion(2,5)
18    
19  import sys, os, platform, re  import atexit, sys, os, platform, re
20  from distutils import sysconfig  from distutils import sysconfig
21    from dependencies import *
22  from site_init import *  from site_init import *
 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 110  vars.AddVariables( Line 114  vars.AddVariables(
114    BoolVariable('visit', 'Enable the VisIt simulation interface', False),    BoolVariable('visit', 'Enable the VisIt simulation interface', False),
115    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
116    ('visit_libs', 'VisIt libraries to link with', ['simV2']),    ('visit_libs', 'VisIt libraries to link with', ['simV2']),
   BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', False),  
117    BoolVariable('vsl_random', 'Use VSL from intel for random data', False),    BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
118      BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
119      ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
120  # Advanced settings  # Advanced settings
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', ''),
# Line 131  vars.AddVariables( Line 136  vars.AddVariables(
136    ('pythoncmd', 'which python to compile with','python'),    ('pythoncmd', 'which python to compile with','python'),
137    ('usepython3', 'Is this a python3 build? (experimental)', False),    ('usepython3', 'Is this a python3 build? (experimental)', False),
138    ('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.)', ''),
139      ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
140      ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
141      BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
142      BoolVariable('compressed_files','Enables reading from compressed binary files', True),
143      ('compression_libs', 'Compression libraries to link with', ['boost_iostreams'])
144  )  )
145    
146  ##################### Create environment and help text #######################  ##################### Create environment and help text #######################
# Line 142  vars.AddVariables( Line 152  vars.AddVariables(
152  # in default locations.  # in default locations.
153  env = Environment(tools = ['default'], options = vars,  env = Environment(tools = ['default'], options = vars,
154                    ENV = {'PATH': os.environ['PATH']})                    ENV = {'PATH': os.environ['PATH']})
155  if env['tools_names'] != 'default':  
156    # set the vars for clang
157    def mkclang(env):
158        env['CXX']='clang++'
159    
160    if env['tools_names'] != ['default']:
161        zz=env['tools_names']
162        if 'clang' in zz:
163            zz.remove('clang')
164            zz.insert(0, mkclang)
165      env = Environment(tools = ['default'] + env['tools_names'], options = vars,      env = Environment(tools = ['default'] + env['tools_names'], options = vars,
166                        ENV = {'PATH' : os.environ['PATH']})                        ENV = {'PATH' : os.environ['PATH']})
167    
# Line 168  if len(vars.UnknownVariables())>0: Line 187  if len(vars.UnknownVariables())>0:
187          print("Unknown option '%s'" % k)          print("Unknown option '%s'" % k)
188      Exit(1)      Exit(1)
189    
190    if env['cuda']:
191        if env['nvcc'] != 'default':
192            env['NVCC'] = env['nvcc']
193        env.Tool('nvcc')
194    
195    # create dictionary which will be populated with info for buildvars file
196    env['buildvars']={}
197    # create list which will be populated with warnings if there are any
198    env['warnings']=[]
199    
200  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
201    
202  env['BUILD_DIR']=env['build_dir']  env['BUILD_DIR']=Dir(env['build_dir']).abspath
203  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
204    env['buildvars']['prefix']=prefix
205  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
206  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
207  env['libinstall'] = os.path.join(prefix, 'lib')  env['libinstall'] = os.path.join(prefix, 'lib')
# Line 188  env.Append(LIBPATH = [env['libinstall']] Line 218  env.Append(LIBPATH = [env['libinstall']]
218    
219  ################# Fill in compiler options if not set above ##################  ################# Fill in compiler options if not set above ##################
220    
 if env['cc'] != 'default': env['CC']=env['cc']  
221  if env['cxx'] != 'default': env['CXX']=env['cxx']  if env['cxx'] != 'default': env['CXX']=env['cxx']
222    
223  # version >=9 of intel C++ compiler requires use of icpc to link in C++  # version >=9 of intel C++ compiler requires use of icpc to link in C++
# Line 206  fatalwarning = '' # switch to turn warni Line 235  fatalwarning = '' # switch to turn warni
235  sysheaderopt = '' # how to indicate that a header is a system header  sysheaderopt = '' # how to indicate that a header is a system header
236    
237  # env['CC'] might be a full path  # env['CC'] might be a full path
238  cc_name=os.path.basename(env['CC'])  cc_name=os.path.basename(env['CXX'])
239    
240  if cc_name == 'icc':  if cc_name == 'icpc':
241      # Intel compiler      # Intel compiler
242      cc_flags    = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
243      cc_optim    = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"      # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
244        cc_flags    = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
245        cc_optim    = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
246      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247      omp_flags   = "-openmp -openmp_report0"      omp_flags   = "-openmp"
248      omp_ldflags = "-openmp -openmp_report0 -lpthread"      omp_ldflags = "-openmp -openmp_report=1"
249      fatalwarning = "-Werror"      fatalwarning = "-Werror"
250  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'g++':
251      # GNU C on any system      # GNU C on any system
252      cc_flags     = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"      # note that -ffast-math is not used because it breaks isnan(),
253        # see mantis #691
254        cc_flags     = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
255      cc_optim     = "-O3"      cc_optim     = "-O3"
256      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
257      omp_flags    = "-fopenmp"      omp_flags    = "-fopenmp"
258      omp_ldflags  = "-fopenmp"      omp_ldflags  = "-fopenmp"
259      fatalwarning = "-Werror"      fatalwarning = "-Werror"
# Line 239  elif cc_name == 'icl': Line 272  elif cc_name == 'icl':
272      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
273      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
274    
275    env['sysheaderopt']=sysheaderopt
276    
277  # set defaults if not otherwise specified  # set defaults if not otherwise specified
278  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
279  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
280  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
281  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
282  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'])  
283  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
284  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
285    
286    if env['nvccflags'] != 'default':
287        env['NVCCFLAGS'] = env['nvccflags']
288        env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
289    
290    if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
291    
292  if env['usepython3']:  if env['usepython3']:
293      env.Append(CPPDEFINES=['ESPYTHON3'])      env.Append(CPPDEFINES=['ESPYTHON3'])
294    
# Line 270  if env['iknowwhatimdoing']: Line 310  if env['iknowwhatimdoing']:
310    
311  # Disable OpenMP if no flags provided  # Disable OpenMP if no flags provided
312  if env['openmp'] and env['omp_flags'] == '':  if env['openmp'] and env['omp_flags'] == '':
313     print("OpenMP requested but no flags provided - disabling OpenMP!")     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
314     env['openmp'] = False     env['openmp'] = False
315    
316  if env['openmp']:  if env['openmp']:
# Line 280  else: Line 320  else:
320      env['omp_flags']=''      env['omp_flags']=''
321      env['omp_ldflags']=''      env['omp_ldflags']=''
322    
323    env['buildvars']['openmp']=int(env['openmp'])
324    
325  # add debug/non-debug compiler flags  # add debug/non-debug compiler flags
326    env['buildvars']['debug']=int(env['debug'])
327  if env['debug']:  if env['debug']:
328      env.Append(CCFLAGS = env['cc_debug'])      env.Append(CCFLAGS = env['cc_debug'])
329  else:  else:
# Line 292  env.Append(CCFLAGS = env['cc_flags']) Line 335  env.Append(CCFLAGS = env['cc_flags'])
335  # add system libraries  # add system libraries
336  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
337    
338    # determine svn revision
339  global_revision=ARGUMENTS.get('SVN_VERSION', None)  global_revision=ARGUMENTS.get('SVN_VERSION', None)
340  if global_revision:  if global_revision:
341      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
# Line 308  else: Line 351  else:
351    except:    except:
352      global_revision = '-1'      global_revision = '-1'
353  env['svn_revision']=global_revision  env['svn_revision']=global_revision
354    env['buildvars']['svn_revision']=global_revision
355  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
356    
357  if IS_WINDOWS:  if IS_WINDOWS:
# Line 315  if IS_WINDOWS: Line 359  if IS_WINDOWS:
359          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
360          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
361    
362    # VSL random numbers
363    env['buildvars']['vsl_random']=int(env['vsl_random'])
364    if env['vsl_random']:
365        env.Append(CPPDEFINES = ['MKLRANDOM'])
366    
367    env['IS_WINDOWS']=IS_WINDOWS
368    
369  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
370    
371  # Windows doesn't use LD_LIBRARY_PATH but PATH instead  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
# Line 324  if IS_WINDOWS: Line 375  if IS_WINDOWS:
375  else:  else:
376      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
377    
378    env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
379    
380  # the following env variables are exported for the unit tests  # the following env variables are exported for the unit tests
381    
382  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
383      try:      try:
384          env['ENV'][key] = os.environ[key]          env['ENV'][key] = os.environ[key]
385      except KeyError:      except KeyError:
386          env['ENV'][key] = 1          env['ENV'][key] = '1'
387    
388  env_export=env['env_export']  env_export=env['env_export']
389  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','TMPDIR','TEMP','TMP'])  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
390    
391  for key in set(env_export):  for key in set(env_export):
392      try:      try:
# Line 346  try: Line 399  try:
399  except KeyError:  except KeyError:
400      pass      pass
401    
402    if IS_OSX:
403      try:
404        env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
405      except KeyError:
406        pass
407    
408    
409  # these shouldn't be needed  # these shouldn't be needed
410  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
411  #    try:  #    try:
# Line 372  env.Append(BUILDERS = {'RunUnitTest' : r Line 432  env.Append(BUILDERS = {'RunUnitTest' : r
432  runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
433  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
434    
435    runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
436    env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
437    
438  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
439  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
440    
441  ############################ Dependency checks ###############################  ############################ Dependency checks ###############################
442    
443  # Create a Configure() environment to check for compilers and python  ######## Compiler
444  conf = Configure(env.Clone())  env=checkCompiler(env)
   
 ######## Test that the compilers work  
   
 if 'CheckCC' in dir(conf): # exists since scons 1.1.0  
     if not conf.CheckCC():  
         print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))  
         Exit(1)  
     if not conf.CheckCXX():  
         print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))  
         Exit(1)  
 else:  
     if not conf.CheckFunc('printf', language='c'):  
         print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))  
         Exit(1)  
     if not conf.CheckFunc('printf', language='c++'):  
         print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))  
         Exit(1)  
   
 if conf.CheckFunc('gethostname'):  
     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])  
445    
446  ######## Python headers & library (required)  ######## Python headers & library (required)
447    env=checkPython(env)
448    
449  # Use the python scons is running  ######## boost & boost-python (required)
450  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()]  
   
 #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()  
   
 if sysheaderopt == '':  
     conf.env.AppendUnique(CPPPATH = [python_inc_path])  
 else:  
     conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])  
451    
452  conf.env.AppendUnique(LIBPATH = [python_lib_path])  ######## NVCC version (optional)
453  conf.env.AppendUnique(LIBS = python_libs)  if env['cuda']:
454  # The wrapper script needs to find the libs      env=checkCudaVersion(env)
 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  
455    
456  # Commit changes to environment  ######## numpy (required) and numpy headers (optional)
457  env = conf.Finish()  env=checkNumpy(env)
   
 ######## 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)  
458    
459  ######## CppUnit (required for tests)  ######## CppUnit (required for tests)
460    env=checkCppUnit(env)
461    
462  try:  ######## optional python modules (sympy, pyproj)
463      cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')  env=checkOptionalModules(env)
     env.AppendUnique(CPPPATH = [cppunit_inc_path])  
     env.AppendUnique(LIBPATH = [cppunit_lib_path])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)  
     env['cppunit']=True  
 except:  
     env['cppunit']=False  
   
 ######## VTK (optional)  
   
 if env['pyvisi']:  
     try:  
         import vtk  
         env['pyvisi'] = True  
     except ImportError:  
         print("Cannot import vtk, disabling pyvisi.")  
         env['pyvisi'] = False  
   
 ######## netCDF (optional)  
   
 netcdf_inc_path=''  
 netcdf_lib_path=''  
 if env['netcdf']:  
     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')  
     env.AppendUnique(CPPPATH = [netcdf_inc_path])  
     env.AppendUnique(LIBPATH = [netcdf_lib_path])  
     env.AppendUnique(LIBS = env['netcdf_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)  
     env.Append(CPPDEFINES = ['USE_NETCDF'])  
   
 ######## PAPI (optional)  
   
 papi_inc_path=''  
 papi_lib_path=''  
 if env['papi']:  
     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [papi_inc_path])  
     env.AppendUnique(LIBPATH = [papi_lib_path])  
     env.AppendUnique(LIBS = env['papi_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)  
     env.Append(CPPDEFINES = ['BLOCKPAPI'])  
   
 ######## MKL (optional)  
   
 mkl_inc_path=''  
 mkl_lib_path=''  
 if env['mkl']:  
     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [mkl_inc_path])  
     env.AppendUnique(LIBPATH = [mkl_lib_path])  
     env.AppendUnique(LIBS = env['mkl_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)  
     env.Append(CPPDEFINES = ['MKL'])  
   
 ######## UMFPACK (optional)  
   
 umfpack_inc_path=''  
 umfpack_lib_path=''  
 if env['umfpack']:  
     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [umfpack_inc_path])  
     env.AppendUnique(LIBPATH = [umfpack_lib_path])  
     env.AppendUnique(LIBS = env['umfpack_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)  
     env.Append(CPPDEFINES = ['UMFPACK'])  
   
 ######## LAPACK (optional)  
   
 if env['lapack']=='mkl' and not env['mkl']:  
     print("mkl_lapack requires MKL!")  
     Exit(1)  
   
 env['uselapack'] = env['lapack']!='none'  
 lapack_inc_path=''  
 lapack_lib_path=''  
 if env['uselapack']:  
     header='clapack.h'  
     if env['lapack']=='mkl':  
         env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])  
         header='mkl_lapack.h'  
     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [lapack_inc_path])  
     env.AppendUnique(LIBPATH = [lapack_lib_path])  
     env.AppendUnique(LIBS = env['lapack_libs'])  
     env.Append(CPPDEFINES = ['USE_LAPACK'])  
   
 ######## Silo (optional)  
   
 silo_inc_path=''  
 silo_lib_path=''  
 if env['silo']:  
     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [silo_inc_path])  
     env.AppendUnique(LIBPATH = [silo_lib_path])  
     # Note that we do not add the libs since they are only needed for the  
     # weipa library and tools.  
     #env.AppendUnique(LIBS = [env['silo_libs']])  
   
 ######## VSL random numbers (optional)  
 if env['vsl_random']:  
     env.Append(CPPDEFINES = ['MKLRANDOM'])  
   
 ######## VisIt (optional)  
464    
465  visit_inc_path=''  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
466  visit_lib_path=''  env=checkOptionalLibraries(env)
 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  
467    
468  ######## PDFLaTeX (for documentation)  ######## PDFLaTeX (for documentation)
469  if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):  env=checkPDFLatex(env)
     env['pdflatex']=True  
 else:  
     env['pdflatex']=False  
   
 ######################## Summarize our environment ###########################  
470    
471  # keep some of our install paths first in the list for the unit tests  # keep some of our install paths first in the list for the unit tests
472  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
# Line 709  env.PrependENVPath('PYTHONPATH', prefix) Line 474  env.PrependENVPath('PYTHONPATH', prefix)
474  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
475    
476  if not env['verbose']:  if not env['verbose']:
     env['CCCOMSTR'] = "Compiling $TARGET"  
477      env['CXXCOMSTR'] = "Compiling $TARGET"      env['CXXCOMSTR'] = "Compiling $TARGET"
     env['SHCCCOMSTR'] = "Compiling $TARGET"  
478      env['SHCXXCOMSTR'] = "Compiling $TARGET"      env['SHCXXCOMSTR'] = "Compiling $TARGET"
479      env['ARCOMSTR'] = "Linking $TARGET"      env['ARCOMSTR'] = "Linking $TARGET"
480      env['LINKCOMSTR'] = "Linking $TARGET"      env['LINKCOMSTR'] = "Linking $TARGET"
# Line 722  if not env['verbose']: Line 485  if not env['verbose']:
485      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
486      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
487    
 print("")  
 print("*** Config Summary (see config.log and lib/buildvars for details) ***")  
 print("Escript/Finley revision %s"%global_revision)  
 print("  Install prefix:  %s"%env['prefix'])  
 print("          Python:  %s"%sysconfig.PREFIX)  
 print("           boost:  %s"%env['boost_prefix'])  
 print("           numpy:  YES")  
 if env['usempi']:  
     print("             MPI:  YES (flavour: %s)"%env['mpi'])  
 else:  
     print("             MPI:  DISABLED")  
 if env['uselapack']:  
     print("          LAPACK:  YES (flavour: %s)"%env['lapack'])  
 else:  
     print("          LAPACK:  DISABLED")  
 d_list=[]  
 e_list=[]  
 for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit','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("")  
   
488  ####################### Configure the subdirectories #########################  ####################### Configure the subdirectories #########################
489    
490  from grouptest import *  # remove obsolete files
491    if not env['usempi']:
492        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
493        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
494    
495    from grouptest import *
496  TestGroups=[]  TestGroups=[]
497    
498  # keep an environment without warnings-as-errors  # keep an environment without warnings-as-errors
# Line 793  Export( Line 514  Export(
514  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)
515  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)
516  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)
517  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)
518    
519    env.SConscript(dirs = ['cusplibrary'])
520    
521    #This will pull in the escriptcore/py_src and escriptcore/test
522    env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
523    #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
524  env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
525  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
526  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
527  env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)  env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
528  env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)  env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
529    env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
530    env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
531  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)  
532  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)
533  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)
534    env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
535  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)
536    
537    
538  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
539    
540  # 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()  
   
   
 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()  
541    
542  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
543    
# Line 875  env.Alias('build_paso', ['install_paso_h Line 555  env.Alias('build_paso', ['install_paso_h
555  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
556    
557  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'])
558  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'])
559    
560  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'])
561  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'])
# Line 886  env.Alias('install_dudley', ['build_dudl Line 566  env.Alias('install_dudley', ['build_dudl
566  env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])  env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
567  env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])  env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
568    
569  env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])  env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
570  env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])  env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
571    
572    env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
573    env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
574    
575  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'])
576  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'])
577    
# Line 904  build_all_list += ['build_pasowrap'] Line 587  build_all_list += ['build_pasowrap']
587  build_all_list += ['build_dudley']  build_all_list += ['build_dudley']
588  build_all_list += ['build_finley']  build_all_list += ['build_finley']
589  build_all_list += ['build_ripley']  build_all_list += ['build_ripley']
590    build_all_list += ['build_speckley']
591  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
592  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS: build_all_list += ['build_escriptreader']
593  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
# Line 919  install_all_list += ['install_pasowrap'] Line 603  install_all_list += ['install_pasowrap']
603  install_all_list += ['install_dudley']  install_all_list += ['install_dudley']
604  install_all_list += ['install_finley']  install_all_list += ['install_finley']
605  install_all_list += ['install_ripley']  install_all_list += ['install_ripley']
606    install_all_list += ['install_speckley']
607  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
608  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS: install_all_list += ['install_escriptreader']
609  #install_all_list += ['install_pyvisi_py']  install_all_list += ['install_downunder_py']
610  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
611  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
612  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
# Line 933  env.Default('install_all') Line 618  env.Default('install_all')
618    
619  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
620    
 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')  
621  if not env['cppunit']:  if not env['cppunit']:
622        test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
623      env.Alias('run_tests', test_msg)      env.Alias('run_tests', test_msg)
624        env.Alias('build_tests', '')
625  env.Alias('run_tests', ['install_all'])  env.Alias('run_tests', ['install_all'])
626  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
627  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 629  env.Alias('build_PasoTests','$BUILD_DIR/
629    
630  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
631    
632  env.Alias('api_epydoc','install_all')  env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
633  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'])
634    env.Alias('docs', ['basedocs', 'sphinxdoc'])
635  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
636    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
637    
638    # The test scripts are always generated, this target allows us to
639    # generate the testscripts without doing a full build
640    env.Alias('testscripts',[])
641    
642  if not IS_WINDOWS:  if not IS_WINDOWS:
643      try:      generateTestScripts(env, TestGroups)
644          utest=open('utest.sh','w')  
645          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix))  
646          for tests in TestGroups:  
647              utest.write(tests.makeString())  ######################## Summarize our environment ###########################
648          utest.close()  def print_summary():
649          Execute(Chmod('utest.sh', 0o755))      print("")
650          print("Generated utest.sh.")      print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
651      except IOError:      print("Escript/Finley revision %s"%global_revision)
652          print("Error attempting to write unittests file.")      print("  Install prefix:  %s"%env['prefix'])
653          Exit(1)      print("          Python:  %s"%sysconfig.PREFIX)
654        print("           boost:  %s"%env['boost_prefix'])
655        if env['numpy_h']:
656            print("           numpy:  YES (with headers)")
657        else:
658            print("           numpy:  YES (without headers)")
659        if env['usempi']:
660            print("             MPI:  YES (flavour: %s)"%env['mpi'])
661        else:
662            print("             MPI:  DISABLED")
663        if env['uselapack']:
664            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
665        else:
666            print("          LAPACK:  DISABLED")
667        if env['cuda']:
668            print("            CUDA:  YES (nvcc: %s)"%env['nvcc_version'])
669        else:
670            print("            CUDA:  DISABLED")
671        d_list=[]
672        e_list=[]
673        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
674            if env[i]: e_list.append(i)
675            else: d_list.append(i)
676        for i in e_list:
677            print("%16s:  YES"%i)
678        for i in d_list:
679            print("%16s:  DISABLED"%i)
680        if env['cppunit']:
681            print("         CppUnit:  FOUND")
682        else:
683            print("         CppUnit:  NOT FOUND")
684        if env['gmsh']=='m':
685            print("            gmsh:  FOUND, MPI-ENABLED")
686        elif env['gmsh']=='s':
687            print("            gmsh:  FOUND")
688        else:
689            print("            gmsh:  NOT FOUND")
690        print(    "            gzip:  " + ("YES" if env['compressed_files'] else "NO"))
691    
692      # delete utest.sh upon cleanup      if ((fatalwarning != '') and (env['werror'])):
693      env.Clean('target_init', 'utest.sh')          print("  Treating warnings as errors")
694        else:
695            print("  NOT treating warnings as errors")
696        print("")
697        for w in env['warnings']:
698            print("WARNING: %s"%w)
699        if len(GetBuildFailures()):
700            print("\nERROR: build stopped due to errors\n")
701        else:
702            print("\nSUCCESS: build complete\n")
703    
704      # 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'))  
705    

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

  ViewVC Help
Powered by ViewVC 1.1.26