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

Diff of /branches/diaplayground/SConstruct

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

revision 4107 by jfenwick, Thu Dec 13 05:54:03 2012 UTC revision 4520 by caltinay, Thu Aug 22 06:42:57 2013 UTC
# Line 1  Line 1 
1  ##############################################################################  ##############################################################################
2  #  #
3  # Copyright (c) 2003-2012 by University of Queensland  # Copyright (c) 2003-2013 by University of Queensland
4  # http://www.uq.edu.au  # http://www.uq.edu.au
5  #  #
6  # Primary Business: Queensland, Australia  # Primary Business: Queensland, Australia
# Line 15  Line 15 
15  EnsureSConsVersion(0,98,1)  EnsureSConsVersion(0,98,1)
16  EnsurePythonVersion(2,5)  EnsurePythonVersion(2,5)
17    
18  import sys, os, platform, re  import atexit, sys, os, platform, re
19  from distutils import sysconfig  from distutils import sysconfig
20    from dependencies import *
21  from site_init import *  from site_init import *
 from subprocess import PIPE, Popen  
22    
23  # 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
24  # added or existing options changed.  # added or existing options changed.
# Line 43  if not options_file: Line 43  if not options_file:
43  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
44      print("\nWARNING:\nOptions file %s" % options_file)      print("\nWARNING:\nOptions file %s" % options_file)
45      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.")
46      print("It is recommended that you copy one of the TEMPLATE files in the scons/")      print("We recommend that you copy one of the TEMPLATE files in the scons/")
47      print("subdirectory and customize it to your needs.\n")      print("subdirectory and customize it to your needs.\n")
48      options_file = None      options_file = None
49    
# Line 60  vars.AddVariables( Line 60  vars.AddVariables(
60    PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),    PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
61    BoolVariable('verbose', 'Output full compile/link lines', False),    BoolVariable('verbose', 'Output full compile/link lines', False),
62  # Compiler/Linker options  # Compiler/Linker options
   ('cc', 'Path to C compiler', 'default'),  
63    ('cxx', 'Path to C++ compiler', 'default'),    ('cxx', 'Path to C++ compiler', 'default'),
64    ('cc_flags', 'Base C/C++ compiler flags', 'default'),    ('cc_flags', 'Base C++ compiler flags', 'default'),
65    ('cc_optim', 'Additional C/C++ flags for a non-debug build', 'default'),    ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
66    ('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', ''),  
67    ('cxx_extra', 'Extra C++ compiler flags', ''),    ('cxx_extra', 'Extra C++ compiler flags', ''),
68    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
69    BoolVariable('werror','Treat compiler warnings as errors', True),    BoolVariable('werror','Treat compiler warnings as errors', True),
# Line 145  vars.AddVariables( Line 143  vars.AddVariables(
143  # in default locations.  # in default locations.
144  env = Environment(tools = ['default'], options = vars,  env = Environment(tools = ['default'], options = vars,
145                    ENV = {'PATH': os.environ['PATH']})                    ENV = {'PATH': os.environ['PATH']})
                     
146    
147  #set the vars for clang  # set the vars for clang
148  def mkclang(env):  def mkclang(env):
149    env['CC']='clang'      env['CXX']='clang++'
150    env['CXX']='clang++'  
                     
                     
151  if env['tools_names'] != 'default':  if env['tools_names'] != 'default':
152      zz=env['tools_names']      zz=env['tools_names']
153      if 'clang' in zz:      if 'clang' in zz:
# Line 183  if len(vars.UnknownVariables())>0: Line 178  if len(vars.UnknownVariables())>0:
178          print("Unknown option '%s'" % k)          print("Unknown option '%s'" % k)
179      Exit(1)      Exit(1)
180    
181    # create dictionary which will be populated with info for buildvars file
182    env['buildvars']={}
183    # create list which will be populated with warnings if there are any
184    env['warnings']=[]
185    
186  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
187    
188  env['BUILD_DIR']=Dir(env['build_dir']).abspath  env['BUILD_DIR']=Dir(env['build_dir']).abspath
189  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
190    env['buildvars']['prefix']=prefix
191  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
192  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
193  env['libinstall'] = os.path.join(prefix, 'lib')  env['libinstall'] = os.path.join(prefix, 'lib')
# Line 203  env.Append(LIBPATH = [env['libinstall']] Line 204  env.Append(LIBPATH = [env['libinstall']]
204    
205  ################# Fill in compiler options if not set above ##################  ################# Fill in compiler options if not set above ##################
206    
 if env['cc'] != 'default': env['CC']=env['cc']  
207  if env['cxx'] != 'default': env['CXX']=env['cxx']  if env['cxx'] != 'default': env['CXX']=env['cxx']
208    
209  # 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 221  fatalwarning = '' # switch to turn warni Line 221  fatalwarning = '' # switch to turn warni
221  sysheaderopt = '' # how to indicate that a header is a system header  sysheaderopt = '' # how to indicate that a header is a system header
222    
223  # env['CC'] might be a full path  # env['CC'] might be a full path
224  cc_name=os.path.basename(env['CC'])  cc_name=os.path.basename(env['CXX'])
225    
226  if cc_name == 'icc':  if cc_name == 'icpc':
227      # Intel compiler      # Intel compiler
228      # #1875: offsetof applied to non-POD types is nonstandard (in boost)      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
229      cc_flags    = "-std=c99 -fPIC -w2 -wd1875 -Wno-unknown-pragmas -DBLOCKTIMER -DCORE_ID1"      cc_flags    = "-std=c99 -fPIC -w2 -wd1875 -Wno-unknown-pragmas -DBLOCKTIMER -DCORE_ID1"
# Line 232  if cc_name == 'icc': Line 232  if cc_name == 'icc':
232      omp_flags   = "-openmp"      omp_flags   = "-openmp"
233      omp_ldflags = "-openmp -openmp_report=1"      omp_ldflags = "-openmp -openmp_report=1"
234      fatalwarning = "-Werror"      fatalwarning = "-Werror"
235  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'g++':
236      # GNU C on any system      # GNU C on any system
237      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(),
238        # see mantis #691
239        cc_flags     = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
240      cc_optim     = "-O3"      cc_optim     = "-O3"
241      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
242      omp_flags    = "-fopenmp"      omp_flags    = "-fopenmp"
# Line 255  elif cc_name == 'icl': Line 257  elif cc_name == 'icl':
257      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
258      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
259    
260    env['sysheaderopt']=sysheaderopt
261    
262  # set defaults if not otherwise specified  # set defaults if not otherwise specified
263  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
264  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
265  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
266  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
267  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'])  
268  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
269  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
270    
# Line 288  if env['iknowwhatimdoing']: Line 291  if env['iknowwhatimdoing']:
291    
292  # Disable OpenMP if no flags provided  # Disable OpenMP if no flags provided
293  if env['openmp'] and env['omp_flags'] == '':  if env['openmp'] and env['omp_flags'] == '':
294     print("OpenMP requested but no flags provided - disabling OpenMP!")     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
295     env['openmp'] = False     env['openmp'] = False
296    
297  if env['openmp']:  if env['openmp']:
# Line 298  else: Line 301  else:
301      env['omp_flags']=''      env['omp_flags']=''
302      env['omp_ldflags']=''      env['omp_ldflags']=''
303    
304    env['buildvars']['openmp']=int(env['openmp'])
305    
306  # add debug/non-debug compiler flags  # add debug/non-debug compiler flags
307    env['buildvars']['debug']=int(env['debug'])
308  if env['debug']:  if env['debug']:
309      env.Append(CCFLAGS = env['cc_debug'])      env.Append(CCFLAGS = env['cc_debug'])
310  else:  else:
# Line 310  env.Append(CCFLAGS = env['cc_flags']) Line 316  env.Append(CCFLAGS = env['cc_flags'])
316  # add system libraries  # add system libraries
317  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
318    
319    # determine svn revision
320  global_revision=ARGUMENTS.get('SVN_VERSION', None)  global_revision=ARGUMENTS.get('SVN_VERSION', None)
321  if global_revision:  if global_revision:
322      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
# Line 326  else: Line 332  else:
332    except:    except:
333      global_revision = '-1'      global_revision = '-1'
334  env['svn_revision']=global_revision  env['svn_revision']=global_revision
335    env['buildvars']['svn_revision']=global_revision
336  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
337    
338  if IS_WINDOWS:  if IS_WINDOWS:
# Line 333  if IS_WINDOWS: Line 340  if IS_WINDOWS:
340          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
341          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
342    
343    # VSL random numbers
344    env['buildvars']['vsl_random']=int(env['vsl_random'])
345    if env['vsl_random']:
346        env.Append(CPPDEFINES = ['MKLRANDOM'])
347    
348    env['IS_WINDOWS']=IS_WINDOWS
349    
350  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
351    
352  # Windows doesn't use LD_LIBRARY_PATH but PATH instead  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
# Line 342  if IS_WINDOWS: Line 356  if IS_WINDOWS:
356  else:  else:
357      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
358    
359    env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
360    
361  # the following env variables are exported for the unit tests  # the following env variables are exported for the unit tests
362    
363  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
# Line 395  env.Append(BUILDERS = {'EpsToPDF' : epst Line 411  env.Append(BUILDERS = {'EpsToPDF' : epst
411    
412  ############################ Dependency checks ###############################  ############################ Dependency checks ###############################
413    
414  # Create a Configure() environment to check for compilers and python  ######## Compiler
415  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'])  
416    
417  ######## Python headers & library (required)  ######## Python headers & library (required)
418    env=checkPython(env)
419    
420  #First we check to see if the config file has specified  ######## boost & boost-python (required)
421  ##Where to find the filae. Ideally, this should be automatic  env=checkBoost(env)
 #But we need to deal with the case where python is not in its INSTALL  
 #Directory  
 # Use the python scons is running  
 if env['pythoncmd']=='python':  
     python_inc_path=sysconfig.get_python_inc()  
     if IS_WINDOWS:  
         python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')  
     elif env['PLATFORM']=='darwin':  
         python_lib_path=sysconfig.get_config_var('LIBPL')  
     else:  
         python_lib_path=sysconfig.get_config_var('LIBDIR')  
   
     #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux  
     if IS_WINDOWS:  
         python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]  
     else:  
         python_libs=['python'+sysconfig.get_python_version()]  
   
 #if we want to use a python other than the one scons is running  
 else:  
     initstring='from __future__ import print_function;from distutils import sysconfig;'  
     if env['pythonlibname']!='':  
         python_libs=env['pythonlibname']  
     else:   # work it out by calling python      
         if IS_WINDOWS:  
             cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'  
         else:  
             cmd='print("python"+sysconfig.get_python_version())'  
         p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)  
         python_libs=p.stdout.readline()  
         if env['usepython3']:       # This is to convert unicode str into py2 string  
             python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought  
         p.wait()  
         python_libs=python_libs.strip()  
   
     
     # Now we know whether we are using python3 or not  
     p=Popen([env['pythoncmd'], '-c',  initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)  
     python_inc_path=p.stdout.readline()  
     if env['usepython3']:  
          python_inc_path=python_inc_path.encode()  
     p.wait()    
     python_inc_path=python_inc_path.strip()  
     if IS_WINDOWS:  
         cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"  
     elif env['PLATFORM']=='darwin':  
         cmd="sysconfig.get_config_var(\"LIBPL\")"  
     else:  
         cmd="sysconfig.get_config_var(\"LIBDIR\")"  
   
     p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)  
     python_lib_path=p.stdout.readline()  
     if env['usepython3']:  
         python_lib_path=python_lib_path.decode()  
     p.wait()  
     python_lib_path=python_lib_path.strip()  
   
 #Check for an override from the config file.  
 #Ideally, this should be automatic  
 #But we need to deal with the case where python is not in its INSTALL  
 #Directory  
 if env['pythonlibpath']!='':  
     python_lib_path=env['pythonlibpath']  
   
 if env['pythonincpath']!='':  
     python_inc_path=env['pythonincpath']  
422    
423    ######## numpy (required) and numpy headers (optional)
424  if sysheaderopt == '':  env=checkNumpy(env)
     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)  
   
 ## reuse conf to check for numpy header (optional)  
 if env['usepython3']:  
     # FIXME: This is until we can work out how to make the checks in python 3  
     conf.env['numpy_h']=False  
 else:  
     if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):  
         conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])  
         conf.env['numpy_h']=True  
     else:  
         conf.env['numpy_h']=False  
   
 # Commit changes to environment  
 env = conf.Finish()  
   
 ######## boost (required)  
   
 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')  
 if sysheaderopt == '':  
     env.AppendUnique(CPPPATH = [boost_inc_path])  
 else:  
     # This is required because we can't -isystem /usr/include since it breaks  
     # std includes  
     if os.path.normpath(boost_inc_path) == '/usr/include':  
         conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])  
     else:  
         env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])  
   
 env.AppendUnique(LIBPATH = [boost_lib_path])  
 env.AppendUnique(LIBS = env['boost_libs'])  
 env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)  
   
 ######## numpy (required)  
   
 if not detectModule(env, 'numpy'):  
     print("Cannot import numpy. If it is installed try setting your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)  
     Exit(1)  
425    
426  ######## CppUnit (required for tests)  ######## CppUnit (required for tests)
427    env=checkCppUnit(env)
428    
429  try:  ######## optional python modules (sympy, pyproj)
430      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  
431    
432  ######## sympy (optional)  ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
433    env=checkOptionalLibraries(env)
 if detectModule(env, 'sympy'):  
     env['sympy'] = True  
 else:  
     print("Cannot import sympy. Symbolic toolbox and nonlinear PDEs will not be available.")  
     env['sympy'] = False  
   
 ######## netCDF (optional)  
   
 netcdf_inc_path=''  
 netcdf_lib_path=''  
 if env['netcdf']:  
     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')  
     env.AppendUnique(CPPPATH = [netcdf_inc_path])  
     env.AppendUnique(LIBPATH = [netcdf_lib_path])  
     env.AppendUnique(LIBS = env['netcdf_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)  
     env.Append(CPPDEFINES = ['USE_NETCDF'])  
   
 ######## PAPI (optional)  
   
 papi_inc_path=''  
 papi_lib_path=''  
 if env['papi']:  
     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [papi_inc_path])  
     env.AppendUnique(LIBPATH = [papi_lib_path])  
     env.AppendUnique(LIBS = env['papi_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)  
     env.Append(CPPDEFINES = ['BLOCKPAPI'])  
   
 ######## MKL (optional)  
   
 mkl_inc_path=''  
 mkl_lib_path=''  
 if env['mkl']:  
     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [mkl_inc_path])  
     env.AppendUnique(LIBPATH = [mkl_lib_path])  
     env.AppendUnique(LIBS = env['mkl_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)  
     env.Append(CPPDEFINES = ['MKL'])  
   
 ######## UMFPACK (optional)  
   
 umfpack_inc_path=''  
 umfpack_lib_path=''  
 if env['umfpack']:  
     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [umfpack_inc_path])  
     env.AppendUnique(LIBPATH = [umfpack_lib_path])  
     env.AppendUnique(LIBS = env['umfpack_libs'])  
     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)  
     env.Append(CPPDEFINES = ['UMFPACK'])  
   
 ######## LAPACK (optional)  
   
 if env['lapack']=='mkl' and not env['mkl']:  
     print("mkl_lapack requires MKL!")  
     Exit(1)  
   
 env['uselapack'] = env['lapack']!='none'  
 lapack_inc_path=''  
 lapack_lib_path=''  
 if env['uselapack']:  
     header='clapack.h'  
     if env['lapack']=='mkl':  
         env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])  
         header='mkl_lapack.h'  
     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [lapack_inc_path])  
     env.AppendUnique(LIBPATH = [lapack_lib_path])  
     env.AppendUnique(LIBS = env['lapack_libs'])  
     env.Append(CPPDEFINES = ['USE_LAPACK'])  
   
 ######## Silo (optional)  
   
 silo_inc_path=''  
 silo_lib_path=''  
 if env['silo']:  
     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [silo_inc_path])  
     env.AppendUnique(LIBPATH = [silo_lib_path])  
     # Note that we do not add the libs since they are only needed for the  
     # weipa library and tools.  
     #env.AppendUnique(LIBS = [env['silo_libs']])  
   
 ######## VSL random numbers (optional)  
 if env['vsl_random']:  
     env.Append(CPPDEFINES = ['MKLRANDOM'])  
   
 ######## VisIt (optional)  
   
 visit_inc_path=''  
 visit_lib_path=''  
 if env['visit']:  
     visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')  
     env.AppendUnique(CPPPATH = [visit_inc_path])  
     env.AppendUnique(LIBPATH = [visit_lib_path])  
   
 ######## MPI (optional)  
   
 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:  
     p=Popen(['gmsh', '-info'], stderr=PIPE)  
     _,e=p.communicate()  
     if e.split().count("MPI"):  
         env['gmsh']='m'  
     else:  
         env['gmsh']='s'  
 except OSError:  
     env['gmsh']=False  
434    
435  ######## PDFLaTeX (for documentation)  ######## PDFLaTeX (for documentation)
436  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 ###########################  
437    
438  # 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
439  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
# Line 731  env.PrependENVPath('PYTHONPATH', prefix) Line 441  env.PrependENVPath('PYTHONPATH', prefix)
441  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
442    
443  if not env['verbose']:  if not env['verbose']:
     env['CCCOMSTR'] = "Compiling $TARGET"  
444      env['CXXCOMSTR'] = "Compiling $TARGET"      env['CXXCOMSTR'] = "Compiling $TARGET"
     env['SHCCCOMSTR'] = "Compiling $TARGET"  
445      env['SHCXXCOMSTR'] = "Compiling $TARGET"      env['SHCXXCOMSTR'] = "Compiling $TARGET"
446      env['ARCOMSTR'] = "Linking $TARGET"      env['ARCOMSTR'] = "Linking $TARGET"
447      env['LINKCOMSTR'] = "Linking $TARGET"      env['LINKCOMSTR'] = "Linking $TARGET"
# Line 744  if not env['verbose']: Line 452  if not env['verbose']:
452      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"      env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
453      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)      #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
454    
 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','boomeramg','mkl','netcdf','papi','parmetis','silo','sympy','umfpack','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("")  
   
455  ####################### Configure the subdirectories #########################  ####################### Configure the subdirectories #########################
456    
457  from grouptest import *  # remove obsolete files
458    if not env['usempi']:
459        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
460        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
461    
462    from grouptest import *
463  TestGroups=[]  TestGroups=[]
464    
465  # keep an environment without warnings-as-errors  # keep an environment without warnings-as-errors
# Line 815  Export( Line 481  Export(
481  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)
482  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)
483  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)
484  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)
485    
486    #This will pull in the escriptcore/py_src and escriptcore/test
487    env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
488    #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
489  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)
490  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)
491  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)
# Line 831  env.SConscript(dirs = ['paso/profiling'] Line 501  env.SConscript(dirs = ['paso/profiling']
501    
502  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
503    
504  # 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("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()  
505    
506  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
507    
# Line 896  env.Alias('build_paso', ['install_paso_h Line 519  env.Alias('build_paso', ['install_paso_h
519  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
520    
521  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'])
522  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'])
523    
524  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'])
525  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 955  env.Default('install_all') Line 578  env.Default('install_all')
578  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
579    
580  if not env['cppunit']:  if not env['cppunit']:
581      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
582      env.Alias('run_tests', test_msg)      env.Alias('run_tests', test_msg)
583        env.Alias('build_tests', '')
584  env.Alias('run_tests', ['install_all'])  env.Alias('run_tests', ['install_all'])
585  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])  env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
586  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
# Line 964  env.Alias('build_PasoTests','$BUILD_DIR/ Line 588  env.Alias('build_PasoTests','$BUILD_DIR/
588    
589  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
590    
591  env.Alias('api_epydoc','install_all')  env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
592  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'sphinxdoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])  env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
593    env.Alias('docs', ['basedocs', 'sphinxdoc'])
594  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
595    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
596    
597  # The test scripts are always generated, this target allows us to  # The test scripts are always generated, this target allows us to
598  # generate the testscripts without doing a full build  # generate the testscripts without doing a full build
599  env.Alias('testscripts',[])  env.Alias('testscripts',[])
600    
601  if not IS_WINDOWS:  if not IS_WINDOWS:
602      try:      generateTestScripts(env, TestGroups)
603          utest=open('utest.sh','w')  
604          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, False))  
605          for tests in TestGroups:  
606              utest.write(tests.makeString())  ######################## Summarize our environment ###########################
607          utest.close()  def print_summary():
608          Execute(Chmod('utest.sh', 0o755))      print("")
609          print("Generated utest.sh.")      print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
610          # This version contains only python tests - I want this to be usable      print("Escript/Finley revision %s"%global_revision)
611          # From a binary only install if you have the test files      print("  Install prefix:  %s"%env['prefix'])
612          utest=open('itest.sh','w')      print("          Python:  %s"%sysconfig.PREFIX)
613          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, True))      print("           boost:  %s"%env['boost_prefix'])
614          for tests in TestGroups:      if env['numpy_h']:
615            if tests.exec_cmd=='$PYTHONRUNNER ':          print("           numpy:  YES (with headers)")
616              utest.write(tests.makeString())      else:
617          utest.close()          print("           numpy:  YES (without headers)")
618          Execute(Chmod('itest.sh', 0o755))      if env['usempi']:
619          print("Generated itest.sh.")                  print("             MPI:  YES (flavour: %s)"%env['mpi'])
620      except IOError:      else:
621          print("Error attempting to write unittests file.")          print("             MPI:  DISABLED")
622          Exit(1)      if env['uselapack']:
623            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
624        else:
625            print("          LAPACK:  DISABLED")
626        d_list=[]
627        e_list=[]
628        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
629            if env[i]: e_list.append(i)
630            else: d_list.append(i)
631        for i in e_list:
632            print("%16s:  YES"%i)
633        for i in d_list:
634            print("%16s:  DISABLED"%i)
635        if env['cppunit']:
636            print("         CppUnit:  FOUND")
637        else:
638            print("         CppUnit:  NOT FOUND")
639        if env['gmsh']=='m':
640            print("            gmsh:  FOUND, MPI-ENABLED")
641        elif env['gmsh']=='s':
642            print("            gmsh:  FOUND")
643        else:
644            print("            gmsh:  NOT FOUND")
645    
646        if ((fatalwarning != '') and (env['werror'])):
647            print("  Treating warnings as errors")
648        else:
649            print("  NOT treating warnings as errors")
650        print("")
651        for w in env['warnings']:
652            print("WARNING: %s"%w)
653    
654      # delete utest.sh upon cleanup  atexit.register(print_summary)
     env.Clean('target_init', 'utest.sh')  
     env.Clean('target_init', 'itest.sh')  
   
     # Make sure that the escript wrapper is in place  
     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'))  
655    

Legend:
Removed from v.4107  
changed lines
  Added in v.4520

  ViewVC Help
Powered by ViewVC 1.1.26