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

Diff of /branches/diaplayground/SConstruct

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

trunk/SConstruct revision 3259 by jfenwick, Mon Oct 11 01:48:14 2010 UTC branches/diaplayground/SConstruct revision 5064 by caltinay, Fri Jun 20 05:24:53 2014 UTC
# Line 1  Line 1 
1  ########################################################  ##############################################################################
2  #  #
3  # Copyright (c) 2003-2010 by University of Queensland  # Copyright (c) 2003-2014 by University of Queensland
4  # Earth Systems Science Computational Center (ESSCC)  # http://www.uq.edu.au
 # http://www.uq.edu.au/esscc  
5  #  #
6  # Primary Business: Queensland, Australia  # Primary Business: Queensland, Australia
7  # Licensed under the Open Software License version 3.0  # Licensed under the Open Software License version 3.0
8  # http://www.opensource.org/licenses/osl-3.0.php  # http://www.opensource.org/licenses/osl-3.0.php
9  #  #
10  ########################################################  # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11    # Development 2012-2013 by School of Earth Sciences
12    # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13    #
14    ##############################################################################
15    
16  EnsureSConsVersion(0,98,1)  EnsureSConsVersion(0,98,1)
17  EnsurePythonVersion(2,5)  EnsurePythonVersion(2,5)
18    
19  import sys, os, platform, re  import atexit, sys, os, platform, re
20  from distutils import sysconfig  from distutils import sysconfig
21    from dependencies import *
22  from site_init import *  from site_init import *
23    
24  # Version number to check for in options file. Increment when new features are  # Version number to check for in options file. Increment when new features are
25  # added or existing options changed.  # added or existing options changed.
26  REQUIRED_OPTS_VERSION=200  REQUIRED_OPTS_VERSION=202
27    
28  # MS Windows support, many thanks to PH  # MS Windows support, many thanks to PH
29  IS_WINDOWS = (os.name == 'nt')  IS_WINDOWS = (os.name == 'nt')
30    
31    IS_OSX = (os.uname()[0] == 'Darwin')
32    
33  ########################## Determine options file ############################  ########################## Determine options file ############################
34  # 1. command line  # 1. command line
35  # 2. scons/<hostname>_options.py  # 2. scons/<hostname>_options.py
# Line 40  if not options_file: Line 46  if not options_file:
46  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
47      print("\nWARNING:\nOptions file %s" % options_file)      print("\nWARNING:\nOptions file %s" % options_file)
48      print("not found! Default options will be used which is most likely suboptimal.")      print("not found! Default options will be used which is most likely suboptimal.")
49      print("It is recommended that you copy one of the TEMPLATE files in the scons/")      print("We recommend that you copy the most relavent options file in the scons/os/")
50      print("subdirectory and customize it to your needs.\n")      print("subdirectory and customize it to your needs.\n")
51      options_file = None      options_file = None
52    
53  ############################### Build options ################################  ############################### Build options ################################
54    
55  default_prefix='/usr'  default_prefix='/usr'
56  mpi_flavours=('none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')  mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57  lapack_flavours=('none', 'clapack', 'mkl')  lapack_flavours=('none', 'clapack', 'mkl')
58    
59  vars = Variables(options_file, ARGUMENTS)  vars = Variables(options_file, ARGUMENTS)
60  vars.AddVariables(  vars.AddVariables(
61    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
62    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
63      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 71  vars.AddVariables( Line 78  vars.AddVariables(
78    ('omp_ldflags', 'OpenMP linker flags', 'default'),    ('omp_ldflags', 'OpenMP linker flags', 'default'),
79  # Mandatory libraries  # Mandatory libraries
80    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82    # Mandatory for tests
83      ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84      ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85  # Optional libraries and options  # Optional libraries and options
86    EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),    EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
# Line 92  vars.AddVariables( Line 102  vars.AddVariables(
102    BoolVariable('umfpack', 'Enable UMFPACK', False),    BoolVariable('umfpack', 'Enable UMFPACK', False),
103    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
104    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
105      BoolVariable('boomeramg', 'Enable BoomerAMG', False),
106      ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
107      ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
108    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
109    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
110    ('lapack_libs', 'LAPACK libraries to link with', []),    ('lapack_libs', 'LAPACK libraries to link with', []),
# Line 101  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']),
117    BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', 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 114  vars.AddVariables( Line 129  vars.AddVariables(
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')),
130    # finer control over library building, intel aggressive global optimisation    # finer control over library building, intel aggressive global optimisation
131    # works with dynamic libraries on windows.    # works with dynamic libraries on windows.
132    ('share_esysutils', 'Build a dynamic esysUtils library', False),    ('build_shared', 'Build dynamic libraries only', False),
   ('share_paso', 'Build a dynamic paso library', False),  
133    ('sys_libs', 'Extra libraries to link with', []),    ('sys_libs', 'Extra libraries to link with', []),
134    ('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)'),
135      ('SVN_VERSION', 'Do not use from options file', -2),
136      ('pythoncmd', 'which python to compile with','python'),
137      ('usepython3', 'Is this a python3 build? (experimental)', False),
138      ('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 125  vars.AddVariables( Line 148  vars.AddVariables(
148  # Intel's compiler uses regular expressions improperly and emits a warning  # Intel's compiler uses regular expressions improperly and emits a warning
149  # about failing to find the compilers. This warning can be safely ignored.  # about failing to find the compilers. This warning can be safely ignored.
150    
151  env = Environment(tools = ['default'], options = vars)  # PATH is needed so the compiler, linker and tools are found if they are not
152    # in default locations.
153    env = Environment(tools = ['default'], options = vars,
154                      ENV = {'PATH': os.environ['PATH']})
155    
156    # set the vars for clang
157    def mkclang(env):
158        env['CXX']='clang++'
159    
160  if env['tools_names'] != 'default':  if env['tools_names'] != 'default':
161      env = Environment(tools = ['default'] + env['tools_names'], options = vars)      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,
166                          ENV = {'PATH' : os.environ['PATH']})
167    
168  if options_file:  if options_file:
169      opts_valid=False      opts_valid=False
# Line 146  if options_file: Line 182  if options_file:
182  Help(vars.GenerateHelpText(env))  Help(vars.GenerateHelpText(env))
183    
184  # Check for superfluous options  # Check for superfluous options
185  for k in vars.UnknownVariables():  if len(vars.UnknownVariables())>0:
186      print("WARNING: Ignoring unknown option '%s'" % k)      for k in vars.UnknownVariables():
187            print("Unknown option '%s'" % k)
188        Exit(1)
189    
190    if env['cuda']:
191        env.Tool('nvcc')
192    
193    # create dictionary which will be populated with info for buildvars file
194    env['buildvars']={}
195    # create list which will be populated with warnings if there are any
196    env['warnings']=[]
197    
198  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
199    
200    env['BUILD_DIR']=Dir(env['build_dir']).abspath
201  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
202    env['buildvars']['prefix']=prefix
203  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
204  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
205  env['libinstall'] = os.path.join(prefix, 'lib')  env['libinstall'] = os.path.join(prefix, 'lib')
# Line 168  env.Append(LIBPATH = [env['libinstall']] Line 216  env.Append(LIBPATH = [env['libinstall']]
216    
217  ################# Fill in compiler options if not set above ##################  ################# Fill in compiler options if not set above ##################
218    
 if env['cc'] != 'default': env['CC']=env['cc']  
219  if env['cxx'] != 'default': env['CXX']=env['cxx']  if env['cxx'] != 'default': env['CXX']=env['cxx']
220    
221    if env['nvcc'] != 'default':
222        env['NVCC'] = env['nvcc']
223    else:
224        env['NVCC'] = 'nvcc'
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++
227  # runtimes (icc does not)  # runtimes (icc does not)
228  if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':  if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
# Line 186  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 -lguide -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"      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
260      omp_flags    = "-fopenmp"      omp_flags    = "-fopenmp"
261      omp_ldflags  = "-fopenmp"      omp_ldflags  = "-fopenmp"
262      fatalwarning = "-Werror"      fatalwarning = "-Werror"
# Line 219  elif cc_name == 'icl': Line 275  elif cc_name == 'icl':
275      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
276      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
277    
278    env['sysheaderopt']=sysheaderopt
279    
280  # set defaults if not otherwise specified  # set defaults if not otherwise specified
281  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
282  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
283  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
284  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
285  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'])  
286  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
287  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
288    
289    if env['nvccflags'] != 'default':
290        env['NVCCFLAGS'] = env['nvccflags']
291        env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
292    
293    if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
294    
295    if env['usepython3']:
296        env.Append(CPPDEFINES=['ESPYTHON3'])
297    
298  # set up the autolazy values  # set up the autolazy values
299  if env['forcelazy'] == 'on':  if env['forcelazy'] == 'on':
300      env.Append(CPPDEFINES=['FAUTOLAZYON'])      env.Append(CPPDEFINES=['FAUTOLAZYON'])
# Line 247  if env['iknowwhatimdoing']: Line 313  if env['iknowwhatimdoing']:
313    
314  # Disable OpenMP if no flags provided  # Disable OpenMP if no flags provided
315  if env['openmp'] and env['omp_flags'] == '':  if env['openmp'] and env['omp_flags'] == '':
316     print("OpenMP requested but no flags provided - disabling OpenMP!")     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
317     env['openmp'] = False     env['openmp'] = False
318    
319  if env['openmp']:  if env['openmp']:
# Line 257  else: Line 323  else:
323      env['omp_flags']=''      env['omp_flags']=''
324      env['omp_ldflags']=''      env['omp_ldflags']=''
325    
326    env['buildvars']['openmp']=int(env['openmp'])
327    
328  # add debug/non-debug compiler flags  # add debug/non-debug compiler flags
329    env['buildvars']['debug']=int(env['debug'])
330  if env['debug']:  if env['debug']:
331      env.Append(CCFLAGS = env['cc_debug'])      env.Append(CCFLAGS = env['cc_debug'])
332  else:  else:
# Line 269  env.Append(CCFLAGS = env['cc_flags']) Line 338  env.Append(CCFLAGS = env['cc_flags'])
338  # add system libraries  # add system libraries
339  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
340    
341  # Get the global Subversion revision number for the getVersion() method  # determine svn revision
342  try:  global_revision=ARGUMENTS.get('SVN_VERSION', None)
343    if global_revision:
344        global_revision = re.sub(':.*', '', global_revision)
345        global_revision = re.sub('[^0-9]', '', global_revision)
346        if global_revision == '': global_revision='-2'
347    else:
348      # Get the global Subversion revision number for the getVersion() method
349      try:
350      global_revision = os.popen('svnversion -n .').read()      global_revision = os.popen('svnversion -n .').read()
351      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
352      global_revision = re.sub('[^0-9]', '', global_revision)      global_revision = re.sub('[^0-9]', '', global_revision)
353      if global_revision == '': global_revision='-2'      if global_revision == '': global_revision='-2'
354  except:    except:
355      global_revision = '-1'      global_revision = '-1'
356    env['svn_revision']=global_revision
357    env['buildvars']['svn_revision']=global_revision
358  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
359    
360  if IS_WINDOWS:  if IS_WINDOWS:
361      if not env['share_esysutils']:      if not env['build_shared']:
362          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
     if not env['share_paso']:  
363          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
364    
365    # VSL random numbers
366    env['buildvars']['vsl_random']=int(env['vsl_random'])
367    if env['vsl_random']:
368        env.Append(CPPDEFINES = ['MKLRANDOM'])
369    
370    env['IS_WINDOWS']=IS_WINDOWS
371    
372  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
373    
374  # Windows doesn't use LD_LIBRARY_PATH but PATH instead  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
# Line 294  if IS_WINDOWS: Line 378  if IS_WINDOWS:
378  else:  else:
379      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
380    
381  # the following env variables are exported for the unit tests, PATH is needed  env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
382  # so the compiler/linker is found if they are not in default locations.  
383    # the following env variables are exported for the unit tests
384    
385  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
386      try:      try:
# Line 304  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N Line 389  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N
389          env['ENV'][key] = 1          env['ENV'][key] = 1
390    
391  env_export=env['env_export']  env_export=env['env_export']
392  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME'])  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
393    
394  for key in set(env_export):  for key in set(env_export):
395      try:      try:
# Line 317  try: Line 402  try:
402  except KeyError:  except KeyError:
403      pass      pass
404    
405    if IS_OSX:
406      try:
407        env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
408      except KeyError:
409        pass
410    
411    
412  # these shouldn't be needed  # these shouldn't be needed
413  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
414  #    try:  #    try:
# Line 331  except KeyError: Line 423  except KeyError:
423    
424  ######################## Add some custom builders ############################  ######################## Add some custom builders ############################
425    
426  py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  if env['pythoncmd']=='python':
427        py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
428    else:
429        py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
430  env.Append(BUILDERS = {'PyCompile' : py_builder});  env.Append(BUILDERS = {'PyCompile' : py_builder});
431    
432  runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
# Line 345  env.Append(BUILDERS = {'EpsToPDF' : epst Line 440  env.Append(BUILDERS = {'EpsToPDF' : epst
440    
441  ############################ Dependency checks ###############################  ############################ Dependency checks ###############################
442    
443  # Create a Configure() environment to check for compilers and python  ######## Compiler
444  conf = Configure(env.Clone())  env=checkCompiler(env)
   
 ######## Test that the compilers work  
   
 if 'CheckCC' in dir(conf): # exists since scons 1.1.0  
     if not conf.CheckCC():  
         print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))  
         Exit(1)  
     if not conf.CheckCXX():  
         print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))  
         Exit(1)  
 else:  
     if not conf.CheckFunc('printf', language='c'):  
         print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))  
         Exit(1)  
     if not conf.CheckFunc('printf', language='c++'):  
         print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))  
         Exit(1)  
   
 if conf.CheckFunc('gethostname'):  
     conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])  
445    
446  ######## Python headers & library (required)  ######## Python headers & library (required)
447    env=checkPython(env)
448    
449  python_inc_path=sysconfig.get_python_inc()  ######## boost & boost-python (required)
450  if IS_WINDOWS:  env=checkBoost(env)
     python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')  
 else:  
     python_lib_path=sysconfig.get_config_var('LIBDIR')  
 #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux  
 if IS_WINDOWS:  
     python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]  
 else:  
     python_libs=['python'+sysconfig.get_python_version()]  
   
 if sysheaderopt == '':  
     conf.env.AppendUnique(CPPPATH = [python_inc_path])  
 else:  
     conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])  
   
 conf.env.AppendUnique(LIBPATH = [python_lib_path])  
 conf.env.AppendUnique(LIBS = python_libs)  
 # The wrapper script needs to find the libs  
 conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)  
   
 if not conf.CheckCHeader('Python.h'):  
     print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))  
     Exit(1)  
 if not conf.CheckFunc('Py_Exit'):  
     print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))  
     Exit(1)  
   
 # Commit changes to environment  
 env = conf.Finish()  
   
 ######## boost (required)  
   
 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')  
 if sysheaderopt == '':  
     env.AppendUnique(CPPPATH = [boost_inc_path])  
 else:  
     # This is required because we can't -isystem /usr/include since it breaks  
     # std includes  
     if os.path.normpath(boost_inc_path) == '/usr/include':  
         conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])  
     else:  
         env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])  
   
 env.AppendUnique(LIBPATH = [boost_lib_path])  
 env.AppendUnique(LIBS = env['boost_libs'])  
 env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)  
   
 ######## numpy (required)  
   
 try:  
     from numpy import identity  
 except ImportError:  
     print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)  
     Exit(1)  
   
 ######## VTK (optional)  
451    
452  if env['pyvisi']:  ######## numpy (required) and numpy headers (optional)
453      try:  env=checkNumpy(env)
         import vtk  
         env['pyvisi'] = True  
     except ImportError:  
         print("Cannot import vtk, disabling pyvisi.")  
         env['pyvisi'] = False  
   
 ######## netCDF (optional)  
   
 netcdf_inc_path=''  
 netcdf_lib_path=''  
 if env['netcdf']:  
     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')  
     env.AppendUnique(CPPPATH = [netcdf_inc_path])  
     env.AppendUnique(LIBPATH = [netcdf_lib_path])  
     env.AppendUnique(LIBS = env['netcdf_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)  
     env.Append(CPPDEFINES = ['USE_NETCDF'])  
   
 ######## PAPI (optional)  
   
 papi_inc_path=''  
 papi_lib_path=''  
 if env['papi']:  
     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [papi_inc_path])  
     env.AppendUnique(LIBPATH = [papi_lib_path])  
     env.AppendUnique(LIBS = env['papi_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)  
     env.Append(CPPDEFINES = ['BLOCKPAPI'])  
   
 ######## MKL (optional)  
   
 mkl_inc_path=''  
 mkl_lib_path=''  
 if env['mkl']:  
     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [mkl_inc_path])  
     env.AppendUnique(LIBPATH = [mkl_lib_path])  
     env.AppendUnique(LIBS = env['mkl_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)  
     env.Append(CPPDEFINES = ['MKL'])  
   
 ######## UMFPACK (optional)  
   
 umfpack_inc_path=''  
 umfpack_lib_path=''  
 if env['umfpack']:  
     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [umfpack_inc_path])  
     env.AppendUnique(LIBPATH = [umfpack_lib_path])  
     env.AppendUnique(LIBS = env['umfpack_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)  
     env.Append(CPPDEFINES = ['UMFPACK'])  
454    
455  ######## LAPACK (optional)  ######## CppUnit (required for tests)
456    env=checkCppUnit(env)
457    
458  if env['lapack']=='mkl' and not env['mkl']:  ######## optional python modules (sympy, pyproj)
459      print("mkl_lapack requires MKL!")  env=checkOptionalModules(env)
     Exit(1)  
460    
461  env['uselapack'] = env['lapack']!='none'  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
462  lapack_inc_path=''  env=checkOptionalLibraries(env)
 lapack_lib_path=''  
 if env['uselapack']:  
     header='clapack.h'  
     if env['lapack']=='mkl':  
         env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])  
         header='mkl_lapack.h'  
     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [lapack_inc_path])  
     env.AppendUnique(LIBPATH = [lapack_lib_path])  
     env.AppendUnique(LIBS = env['lapack_libs'])  
     env.Append(CPPDEFINES = ['USE_LAPACK'])  
   
 ######## Silo (optional)  
   
 silo_inc_path=''  
 silo_lib_path=''  
 if env['silo']:  
     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [silo_inc_path])  
     env.AppendUnique(LIBPATH = [silo_lib_path])  
     # Note that we do not add the libs since they are only needed for the  
     # weipa library and tools.  
     #env.AppendUnique(LIBS = [env['silo_libs']])  
   
 ######## VisIt (optional)  
   
 visit_inc_path=''  
 visit_lib_path=''  
 if env['visit']:  
     visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [visit_inc_path])  
     env.AppendUnique(LIBPATH = [visit_lib_path])  
   
 ######## MPI (optional)  
   
 env['usempi'] = env['mpi']!='none'  
 mpi_inc_path=''  
 mpi_lib_path=''  
 if env['usempi']:  
     mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [mpi_inc_path])  
     env.AppendUnique(LIBPATH = [mpi_lib_path])  
     env.AppendUnique(LIBS = env['mpi_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)  
     env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])  
     # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!  
     # On the other hand MPT and OpenMPI don't define the latter so we have to  
     # do that here  
     if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:  
         env.Append(CPPDEFINES = ['MPI_INCLUDED'])  
   
 ######## ParMETIS (optional)  
   
 if not env['usempi']: env['parmetis'] = False  
   
 parmetis_inc_path=''  
 parmetis_lib_path=''  
 if env['parmetis']:  
     parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [parmetis_inc_path])  
     env.AppendUnique(LIBPATH = [parmetis_lib_path])  
     env.AppendUnique(LIBS = env['parmetis_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)  
     env.Append(CPPDEFINES = ['USE_PARMETIS'])  
463    
464  ######################## Summarize our environment ###########################  ######## PDFLaTeX (for documentation)
465    env=checkPDFLatex(env)
466    
467  # 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
468  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
# Line 565  env.PrependENVPath('PYTHONPATH', prefix) Line 470  env.PrependENVPath('PYTHONPATH', prefix)
470  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
471    
472  if not env['verbose']:  if not env['verbose']:
     env['CCCOMSTR'] = "Compiling $TARGET"  
473      env['CXXCOMSTR'] = "Compiling $TARGET"      env['CXXCOMSTR'] = "Compiling $TARGET"
     env['SHCCCOMSTR'] = "Compiling $TARGET"  
474      env['SHCXXCOMSTR'] = "Compiling $TARGET"      env['SHCXXCOMSTR'] = "Compiling $TARGET"
475      env['ARCOMSTR'] = "Linking $TARGET"      env['ARCOMSTR'] = "Linking $TARGET"
476      env['LINKCOMSTR'] = "Linking $TARGET"      env['LINKCOMSTR'] = "Linking $TARGET"
477      env['SHLINKCOMSTR'] = "Linking $TARGET"      env['SHLINKCOMSTR'] = "Linking $TARGET"
478        env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
479        env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
480        env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
481        env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
482      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
483    
 print("")  
 print("*** Config Summary (see config.log and lib/buildvars for details) ***")  
 print("Escript/Finley revision %s"%global_revision)  
 print("  Install prefix:  %s"%env['prefix'])  
 print("          Python:  %s"%sysconfig.PREFIX)  
 print("           boost:  %s"%env['boost_prefix'])  
 print("           numpy:  YES")  
 if env['usempi']:  
     print("             MPI:  YES (flavour: %s)"%env['mpi'])  
 else:  
     print("             MPI:  DISABLED")  
 if env['uselapack']:  
     print("          LAPACK:  YES (flavour: %s)"%env['lapack'])  
 else:  
     print("          LAPACK:  DISABLED")  
 d_list=[]  
 e_list=[]  
 for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','silo','visit','pyvisi':  
     if env[i]: e_list.append(i)  
     else: d_list.append(i)  
 for i in e_list:  
     print("%16s:  YES"%i)  
 for i in d_list:  
     print("%16s:  DISABLED"%i)  
 if ((fatalwarning != '') and (env['werror'])):  
     print("  Treating warnings as errors")  
 else:  
     print("  NOT treating warnings as errors")  
 print("")  
   
484  ####################### Configure the subdirectories #########################  ####################### Configure the subdirectories #########################
485    
486  from grouptest import *  # remove obsolete files
487    if not env['usempi']:
488        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
489        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
490    
491    from grouptest import *
492  TestGroups=[]  TestGroups=[]
493    
494  # keep an environment without warnings-as-errors  # keep an environment without warnings-as-errors
# Line 626  Export( Line 507  Export(
507    ]    ]
508  )  )
509    
510  env.SConscript(dirs = ['tools/CppUnitTest/src'], variant_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
511  env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)  env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
512  env.SConscript(dirs = ['paso/src'], variant_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
513  env.SConscript(dirs = ['weipa/src'], variant_dir='build/$PLATFORM/weipa', duplicate=0)  env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
514  env.SConscript(dirs = ['escript/src'], variant_dir='build/$PLATFORM/escript', duplicate=0)  
515  env.SConscript(dirs = ['esysUtils/src'], variant_dir='build/$PLATFORM/esysUtils', duplicate=0)  #This will pull in the escriptcore/py_src and escriptcore/test
516  env.SConscript(dirs = ['dudley/src'], variant_dir='build/$PLATFORM/dudley', duplicate=0)  env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
517  env.SConscript(dirs = ['finley/src'], variant_dir='build/$PLATFORM/finley', duplicate=0)  #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
518  env.SConscript(dirs = ['modellib/py_src'], variant_dir='build/$PLATFORM/modellib', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
519  env.SConscript(dirs = ['doc'], variant_dir='build/$PLATFORM/doc', duplicate=0)  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
520  env.SConscript(dirs = ['pyvisi/py_src'], variant_dir='build/$PLATFORM/pyvisi', duplicate=0)  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
521  env.SConscript(dirs = ['pycad/py_src'], variant_dir='build/$PLATFORM/pycad', duplicate=0)  env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
522  env.SConscript(dirs = ['pythonMPI/src'], variant_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
523  env.SConscript(dirs = ['paso/profiling'], variant_dir='build/$PLATFORM/paso/profiling', duplicate=0)  env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
524    env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
525  ######################## Populate the buildvars file #########################  env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
526    env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
527    env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
528    env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
529    
 # remove obsolete file  
 if not env['usempi']:  
     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))  
     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))  
530    
531  # Try to extract the boost version from version.hpp  ######################## Populate the buildvars file #########################
 boosthpp=open(os.path.join(boost_inc_path, 'boost', 'version.hpp'))  
 boostversion='unknown'  
 try:  
     for line in boosthpp:  
         ver=re.match(r'#define BOOST_VERSION (\d+)',line)  
         if ver:  
             boostversion=ver.group(1)  
 except StopIteration:  
     pass  
 boosthpp.close()  
532    
533  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  write_buildvars(env)
 buildvars.write("svn_revision="+str(global_revision)+"\n")  
 buildvars.write("prefix="+prefix+"\n")  
 buildvars.write("cc="+env['CC']+"\n")  
 buildvars.write("cxx="+env['CXX']+"\n")  
 buildvars.write("python="+sys.executable+"\n")  
 buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")  
 buildvars.write("boost_inc_path="+boost_inc_path+"\n")  
 buildvars.write("boost_lib_path="+boost_lib_path+"\n")  
 buildvars.write("boost_version="+boostversion+"\n")  
 buildvars.write("debug=%d\n"%int(env['debug']))  
 buildvars.write("openmp=%d\n"%int(env['openmp']))  
 buildvars.write("mpi=%s\n"%env['mpi'])  
 buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)  
 buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)  
 buildvars.write("lapack=%s\n"%env['lapack'])  
 buildvars.write("pyvisi=%d\n"%env['pyvisi'])  
 for i in 'netcdf','parmetis','papi','mkl','umfpack','silo','visit':  
     buildvars.write("%s=%d\n"%(i, int(env[i])))  
     if env[i]:  
         buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))  
         buildvars.write("%s_lib_path=%s\n"%(i, eval(i+'_lib_path')))  
 buildvars.close()  
534    
535  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
536    
537  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
538  env.Alias('target_init', [target_init])  env.Alias('target_init', [target_init])
539    # delete buildvars upon cleanup
540    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
541    
542    cusphdr_inst = env.Install(env['incinstall'], Dir('#cusplibrary/cusp'))
543    env.Alias('install_cusp_headers', cusphdr_inst)
544  # The headers have to be installed prior to build in order to satisfy  # The headers have to be installed prior to build in order to satisfy
545  # #include <paso/Common.h>  # #include <paso/Common.h>
546  env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])  env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
# Line 698  env.Alias('build_paso', ['install_paso_h Line 550  env.Alias('build_paso', ['install_paso_h
550  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
551    
552  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'])
553  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'])
554    
555    env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
556    env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
557    
558  env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])  env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
559  env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])  env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
# Line 706  env.Alias('install_dudley', ['build_dudl Line 561  env.Alias('install_dudley', ['build_dudl
561  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'])
562  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'])
563    
564    env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
565    env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
566    
567  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'])
568  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'])
569    
# Line 717  build_all_list = [] Line 575  build_all_list = []
575  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
576  build_all_list += ['build_paso']  build_all_list += ['build_paso']
577  build_all_list += ['build_escript']  build_all_list += ['build_escript']
578    build_all_list += ['build_pasowrap']
579  build_all_list += ['build_dudley']  build_all_list += ['build_dudley']
580  build_all_list += ['build_finley']  build_all_list += ['build_finley']
581    build_all_list += ['build_ripley']
582  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
583  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS: build_all_list += ['build_escriptreader']
584  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
# Line 730  install_all_list += ['target_init'] Line 590  install_all_list += ['target_init']
590  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
591  install_all_list += ['install_paso']  install_all_list += ['install_paso']
592  install_all_list += ['install_escript']  install_all_list += ['install_escript']
593    install_all_list += ['install_pasowrap']
594  install_all_list += ['install_dudley']  install_all_list += ['install_dudley']
595  install_all_list += ['install_finley']  install_all_list += ['install_finley']
596    install_all_list += ['install_ripley']
597  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
598  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS: install_all_list += ['install_escriptreader']
599  install_all_list += ['install_pyvisi_py']  install_all_list += ['install_downunder_py']
600  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
601  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
602  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
# Line 746  env.Default('install_all') Line 608  env.Default('install_all')
608    
609  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
610    
611  env.Alias('build_cppunittest', ['install_cppunittest_headers', 'build_cppunittest_lib'])  if not env['cppunit']:
612  env.Alias('install_cppunittest', ['build_cppunittest', 'install_cppunittest_lib'])      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
613  env.Alias('run_tests', ['install_all', 'install_cppunittest_lib'])      env.Alias('run_tests', test_msg)
614  env.Alias('all_tests', ['install_all', 'install_cppunittest_lib', 'run_tests', 'py_tests'])      env.Alias('build_tests', '')
615    env.Alias('run_tests', ['install_all'])
616    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
617  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
618  env.Alias('build_PasoTests','build/$PLATFORM/paso/profiling/PasoTests')  env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
619    
620  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
621    
622  env.Alias('api_epydoc','install_all')  env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
623  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])  env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
624    env.Alias('docs', ['basedocs', 'sphinxdoc'])
625  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
626    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
627    
628    # The test scripts are always generated, this target allows us to
629    # generate the testscripts without doing a full build
630    env.Alias('testscripts',[])
631    
632  if not IS_WINDOWS:  if not IS_WINDOWS:
633      try:      generateTestScripts(env, TestGroups)
634          utest=open('utest.sh','w')  
635          utest.write(GroupTest.makeHeader(env['PLATFORM']))  
636          for tests in TestGroups:  
637              utest.write(tests.makeString())  ######################## Summarize our environment ###########################
638          utest.close()  def print_summary():
639          Execute(Chmod('utest.sh', 0755))      print("")
640          print("Generated utest.sh.")      print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
641      except IOError:      print("Escript/Finley revision %s"%global_revision)
642          print("Error attempting to write unittests file.")      print("  Install prefix:  %s"%env['prefix'])
643          Exit(1)      print("          Python:  %s"%sysconfig.PREFIX)
644        print("           boost:  %s"%env['boost_prefix'])
645        if env['numpy_h']:
646            print("           numpy:  YES (with headers)")
647        else:
648            print("           numpy:  YES (without headers)")
649        if env['usempi']:
650            print("             MPI:  YES (flavour: %s)"%env['mpi'])
651        else:
652            print("             MPI:  DISABLED")
653        if env['uselapack']:
654            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
655        else:
656            print("          LAPACK:  DISABLED")
657        d_list=[]
658        e_list=[]
659        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
660            if env[i]: e_list.append(i)
661            else: d_list.append(i)
662        for i in e_list:
663            print("%16s:  YES"%i)
664        for i in d_list:
665            print("%16s:  DISABLED"%i)
666        if env['cppunit']:
667            print("         CppUnit:  FOUND")
668        else:
669            print("         CppUnit:  NOT FOUND")
670        if env['gmsh']=='m':
671            print("            gmsh:  FOUND, MPI-ENABLED")
672        elif env['gmsh']=='s':
673            print("            gmsh:  FOUND")
674        else:
675            print("            gmsh:  NOT FOUND")
676        print(    "            gzip:  " + ("YES" if env['compressed_files'] else "NO"))
677    
678        if ((fatalwarning != '') and (env['werror'])):
679            print("  Treating warnings as errors")
680        else:
681            print("  NOT treating warnings as errors")
682        print("")
683        for w in env['warnings']:
684            print("WARNING: %s"%w)
685        if len(GetBuildFailures()):
686            print("\nERROR: build stopped due to errors\n")
687        else:
688            print("\nSUCCESS: build complete\n")
689    
690      # 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'],'escript'), 'bin/run-escript'))  
691    

Legend:
Removed from v.3259  
changed lines
  Added in v.5064

  ViewVC Help
Powered by ViewVC 1.1.26