/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 3271 by caltinay, Thu Oct 14 02:16:00 2010 UTC revision 3967 by jfenwick, Mon Sep 17 04:02:58 2012 UTC
# Line 1  Line 1 
1  ########################################################  ########################################################
2  #  #
3  # Copyright (c) 2003-2010 by University of Queensland  # Copyright (c) 2003-2012 by University of Queensland
4  # Earth Systems Science Computational Center (ESSCC)  # Earth Systems Science Computational Center (ESSCC)
5  # http://www.uq.edu.au/esscc  # http://www.uq.edu.au/esscc
6  #  #
# Line 16  EnsurePythonVersion(2,5) Line 16  EnsurePythonVersion(2,5)
16  import sys, os, platform, re  import sys, os, platform, re
17  from distutils import sysconfig  from distutils import sysconfig
18  from site_init import *  from site_init import *
19    import subprocess
20    from subprocess import PIPE, Popen
21    
22  # 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
23  # added or existing options changed.  # added or existing options changed.
24  REQUIRED_OPTS_VERSION=200  REQUIRED_OPTS_VERSION=201
25    
26  # MS Windows support, many thanks to PH  # MS Windows support, many thanks to PH
27  IS_WINDOWS = (os.name == 'nt')  IS_WINDOWS = (os.name == 'nt')
# Line 47  if not os.path.isfile(options_file): Line 49  if not os.path.isfile(options_file):
49  ############################### Build options ################################  ############################### Build options ################################
50    
51  default_prefix='/usr'  default_prefix='/usr'
52  mpi_flavours=('none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')  mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
53  lapack_flavours=('none', 'clapack', 'mkl')  lapack_flavours=('none', 'clapack', 'mkl')
54    
55  vars = Variables(options_file, ARGUMENTS)  vars = Variables(options_file, ARGUMENTS)
56  vars.AddVariables(  vars.AddVariables(
57    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
58    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
59      PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
60    BoolVariable('verbose', 'Output full compile/link lines', False),    BoolVariable('verbose', 'Output full compile/link lines', False),
61  # Compiler/Linker options  # Compiler/Linker options
62    ('cc', 'Path to C compiler', 'default'),    ('cc', 'Path to C compiler', 'default'),
# Line 71  vars.AddVariables( Line 74  vars.AddVariables(
74    ('omp_ldflags', 'OpenMP linker flags', 'default'),    ('omp_ldflags', 'OpenMP linker flags', 'default'),
75  # Mandatory libraries  # Mandatory libraries
76    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
77    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
78    # Mandatory for tests
79      ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
80      ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
81  # Optional libraries and options  # Optional libraries and options
82    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),
83    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
# Line 92  vars.AddVariables( Line 98  vars.AddVariables(
98    BoolVariable('umfpack', 'Enable UMFPACK', False),    BoolVariable('umfpack', 'Enable UMFPACK', False),
99    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
100    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
101      BoolVariable('boomeramg', 'Enable BoomerAMG', False),
102      ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
103      ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
104    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
105    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
106    ('lapack_libs', 'LAPACK libraries to link with', []),    ('lapack_libs', 'LAPACK libraries to link with', []),
# Line 101  vars.AddVariables( Line 110  vars.AddVariables(
110    BoolVariable('visit', 'Enable the VisIt simulation interface', False),    BoolVariable('visit', 'Enable the VisIt simulation interface', False),
111    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
112    ('visit_libs', 'VisIt libraries to link with', ['simV2']),    ('visit_libs', 'VisIt libraries to link with', ['simV2']),
113    BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', False),    BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
114  # Advanced settings  # Advanced settings
115    #dudley_assemble_flags = -funroll-loops      to actually do something    #dudley_assemble_flags = -funroll-loops      to actually do something
116    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
# Line 114  vars.AddVariables( Line 123  vars.AddVariables(
123    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')),
124    # finer control over library building, intel aggressive global optimisation    # finer control over library building, intel aggressive global optimisation
125    # works with dynamic libraries on windows.    # works with dynamic libraries on windows.
126    ('share_esysutils', 'Build a dynamic esysUtils library', False),    ('build_shared', 'Build dynamic libraries only', False),
   ('share_paso', 'Build a dynamic paso library', False),  
127    ('sys_libs', 'Extra libraries to link with', []),    ('sys_libs', 'Extra libraries to link with', []),
128    ('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)'),
129      ('SVN_VERSION', 'Do not use from options file', -2),
130      ('pythoncmd', 'which python to compile with','python'),
131      ('usepython3', 'Is this a python3 build? (experimental)', False),
132      ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
133      ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
134      ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
135      BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
136  )  )
137    
138  ##################### Create environment and help text #######################  ##################### Create environment and help text #######################
# Line 125  vars.AddVariables( Line 140  vars.AddVariables(
140  # Intel's compiler uses regular expressions improperly and emits a warning  # Intel's compiler uses regular expressions improperly and emits a warning
141  # about failing to find the compilers. This warning can be safely ignored.  # about failing to find the compilers. This warning can be safely ignored.
142    
143  env = Environment(tools = ['default'], options = vars)  # PATH is needed so the compiler, linker and tools are found if they are not
144    # in default locations.
145    env = Environment(tools = ['default'], options = vars,
146                      ENV = {'PATH': os.environ['PATH']})
147                      
148    
149    #set the vars for clang
150    def mkclang(env):
151      env['CC']='clang'
152      env['CXX']='clang++'
153                      
154                      
155  if env['tools_names'] != 'default':  if env['tools_names'] != 'default':
156      env = Environment(tools = ['default'] + env['tools_names'], options = vars)      zz=env['tools_names']
157        if 'clang' in zz:
158            zz.remove('clang')
159            zz.insert(0, mkclang)
160        env = Environment(tools = ['default'] + env['tools_names'], options = vars,
161                          ENV = {'PATH' : os.environ['PATH']})
162    
163  if options_file:  if options_file:
164      opts_valid=False      opts_valid=False
# Line 153  if len(vars.UnknownVariables())>0: Line 184  if len(vars.UnknownVariables())>0:
184    
185  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
186    
187    env['BUILD_DIR']=env['build_dir']
188  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
189  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
190  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
# Line 196  if cc_name == 'icc': Line 228  if cc_name == 'icc':
228      cc_optim    = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"      cc_optim    = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"
229      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
230      omp_flags   = "-openmp -openmp_report0"      omp_flags   = "-openmp -openmp_report0"
231      omp_ldflags = "-openmp -openmp_report0 -lguide -lpthread"      omp_ldflags = "-openmp -openmp_report0 -lpthread"
232      fatalwarning = "-Werror"      fatalwarning = "-Werror"
233  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'gcc':
234      # GNU C on any system      # GNU C on any system
# Line 231  if env['cc_extra']  != '': env.Append(CF Line 263  if env['cc_extra']  != '': env.Append(CF
263  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
264  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
265    
266    if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
267    
268    if env['usepython3']:
269        env.Append(CPPDEFINES=['ESPYTHON3'])
270    
271  # set up the autolazy values  # set up the autolazy values
272  if env['forcelazy'] == 'on':  if env['forcelazy'] == 'on':
273      env.Append(CPPDEFINES=['FAUTOLAZYON'])      env.Append(CPPDEFINES=['FAUTOLAZYON'])
# Line 271  env.Append(CCFLAGS = env['cc_flags']) Line 308  env.Append(CCFLAGS = env['cc_flags'])
308  # add system libraries  # add system libraries
309  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
310    
311  # Get the global Subversion revision number for the getVersion() method  
312  try:  global_revision=ARGUMENTS.get('SVN_VERSION', None)
313    if global_revision:
314        global_revision = re.sub(':.*', '', global_revision)
315        global_revision = re.sub('[^0-9]', '', global_revision)
316        if global_revision == '': global_revision='-2'
317    else:
318      # Get the global Subversion revision number for the getVersion() method
319      try:
320      global_revision = os.popen('svnversion -n .').read()      global_revision = os.popen('svnversion -n .').read()
321      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
322      global_revision = re.sub('[^0-9]', '', global_revision)      global_revision = re.sub('[^0-9]', '', global_revision)
323      if global_revision == '': global_revision='-2'      if global_revision == '': global_revision='-2'
324  except:    except:
325      global_revision = '-1'      global_revision = '-1'
326  env['svn_revision']=global_revision  env['svn_revision']=global_revision
327  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
328    
329  if IS_WINDOWS:  if IS_WINDOWS:
330      if not env['share_esysutils']:      if not env['build_shared']:
331          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
     if not env['share_paso']:  
332          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
333    
334  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
# Line 297  if IS_WINDOWS: Line 340  if IS_WINDOWS:
340  else:  else:
341      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
342    
343  # the following env variables are exported for the unit tests, PATH is needed  # the following env variables are exported for the unit tests
 # so the compiler/linker is found if they are not in default locations.  
344    
345  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
346      try:      try:
# Line 307  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N Line 349  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N
349          env['ENV'][key] = 1          env['ENV'][key] = 1
350    
351  env_export=env['env_export']  env_export=env['env_export']
352  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME'])  env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','TMPDIR','TEMP','TMP'])
353    
354  for key in set(env_export):  for key in set(env_export):
355      try:      try:
# Line 334  except KeyError: Line 376  except KeyError:
376    
377  ######################## Add some custom builders ############################  ######################## Add some custom builders ############################
378    
379  py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  if env['pythoncmd']=='python':
380        py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
381    else:
382        py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
383  env.Append(BUILDERS = {'PyCompile' : py_builder});  env.Append(BUILDERS = {'PyCompile' : py_builder});
384    
385  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 373  if conf.CheckFunc('gethostname'): Line 418  if conf.CheckFunc('gethostname'):
418    
419  ######## Python headers & library (required)  ######## Python headers & library (required)
420    
421  python_inc_path=sysconfig.get_python_inc()  #First we check to see if the config file has specified
422  if IS_WINDOWS:  ##Where to find the filae. Ideally, this should be automatic
423      python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')  #But we need to deal with the case where python is not in its INSTALL
424  else:  #Directory
425      python_lib_path=sysconfig.get_config_var('LIBDIR')  # Use the python scons is running
426  #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux  if env['pythoncmd']=='python':
427  if IS_WINDOWS:      python_inc_path=sysconfig.get_python_inc()
428      python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]      if IS_WINDOWS:
429            python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
430        elif env['PLATFORM']=='darwin':
431            python_lib_path=sysconfig.get_config_var('LIBPL')
432        else:
433            python_lib_path=sysconfig.get_config_var('LIBDIR')
434    
435        #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
436        if IS_WINDOWS:
437            python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
438        else:
439            python_libs=['python'+sysconfig.get_python_version()]
440    
441    #if we want to use a python other than the one scons is running
442  else:  else:
443      python_libs=['python'+sysconfig.get_python_version()]      initstring='from __future__ import print_function;from distutils import sysconfig;'
444        if env['pythonlibname']!='':
445            python_libs=env['pythonlibname']
446        else:   # work it out by calling python    
447            if IS_WINDOWS:
448                cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
449            else:
450                cmd='print("python"+sysconfig.get_python_version())'
451            p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
452            python_libs=p.stdout.readline()
453            if env['usepython3']:       # This is to convert unicode str into py2 string
454                python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought
455            p.wait()
456            python_libs=python_libs.strip()
457    
458      
459        # Now we know whether we are using python3 or not
460        p=Popen([env['pythoncmd'], '-c',  initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
461        python_inc_path=p.stdout.readline()
462        if env['usepython3']:
463             python_inc_path=python_inc_path.encode()
464        p.wait()  
465        python_inc_path=python_inc_path.strip()
466        if IS_WINDOWS:
467            cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
468        elif env['PLATFORM']=='darwin':
469            cmd="sysconfig.get_config_var(\"LIBPL\")"
470        else:
471            cmd="sysconfig.get_config_var(\"LIBDIR\")"
472    
473        p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
474        python_lib_path=p.stdout.readline()
475        if env['usepython3']:
476            python_lib_path=python_lib_path.decode()
477        p.wait()
478        python_lib_path=python_lib_path.strip()
479    
480    #Check for an override from the config file.
481    #Ideally, this should be automatic
482    #But we need to deal with the case where python is not in its INSTALL
483    #Directory
484    if env['pythonlibpath']!='':
485        python_lib_path=env['pythonlibpath']
486    
487    if env['pythonincpath']!='':
488        python_inc_path=env['pythonincpath']
489    
490    
491  if sysheaderopt == '':  if sysheaderopt == '':
492      conf.env.AppendUnique(CPPPATH = [python_inc_path])      conf.env.AppendUnique(CPPPATH = [python_inc_path])
# Line 401  if not conf.CheckFunc('Py_Exit'): Line 505  if not conf.CheckFunc('Py_Exit'):
505      print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))      print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))
506      Exit(1)      Exit(1)
507    
508    ## reuse conf to check for numpy header (optional)
509    if env['usepython3']:
510        # FIXME: This is until we can work out how to make the checks in python 3
511        conf.env['numpy_h']=False
512    else:
513        if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
514            conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
515            conf.env['numpy_h']=True
516        else:
517            conf.env['numpy_h']=False
518    
519  # Commit changes to environment  # Commit changes to environment
520  env = conf.Finish()  env = conf.Finish()
521    
# Line 423  env.PrependENVPath(LD_LIBRARY_PATH_KEY, Line 538  env.PrependENVPath(LD_LIBRARY_PATH_KEY,
538    
539  ######## numpy (required)  ######## numpy (required)
540    
541  try:  if env['pythoncmd']=='python':
     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)  
   
 if env['pyvisi']:  
542      try:      try:
543          import vtk        from numpy import identity
         env['pyvisi'] = True  
544      except ImportError:      except ImportError:
545          print("Cannot import vtk, disabling pyvisi.")        print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
546          env['pyvisi'] = False        Exit(1)
547    else:
548        p=subprocess.call([env['pythoncmd'],'-c','import numpy'])
549        if p!=0:
550          print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
551          Exit(1)
552    
553    ######## CppUnit (required for tests)
554    
555    try:
556        cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
557        env.AppendUnique(CPPPATH = [cppunit_inc_path])
558        env.AppendUnique(LIBPATH = [cppunit_lib_path])
559        env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
560        env['cppunit']=True
561    except:
562        env['cppunit']=False
563    
564  ######## netCDF (optional)  ######## netCDF (optional)
565    
# Line 519  if env['silo']: Line 641  if env['silo']:
641      # weipa library and tools.      # weipa library and tools.
642      #env.AppendUnique(LIBS = [env['silo_libs']])      #env.AppendUnique(LIBS = [env['silo_libs']])
643    
644    ######## VSL random numbers (optional)
645    if env['vsl_random']:
646        env.Append(CPPDEFINES = ['MKLRANDOM'])
647    
648  ######## VisIt (optional)  ######## VisIt (optional)
649    
650  visit_inc_path=''  visit_inc_path=''
# Line 530  if env['visit']: Line 656  if env['visit']:
656    
657  ######## MPI (optional)  ######## MPI (optional)
658    
659    if env['mpi']=='no':
660        env['mpi']='none'
661    
662  env['usempi'] = env['mpi']!='none'  env['usempi'] = env['mpi']!='none'
663  mpi_inc_path=''  mpi_inc_path=''
664  mpi_lib_path=''  mpi_lib_path=''
# Line 546  if env['usempi']: Line 675  if env['usempi']:
675      if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:      if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
676          env.Append(CPPDEFINES = ['MPI_INCLUDED'])          env.Append(CPPDEFINES = ['MPI_INCLUDED'])
677    
678    ######## BOOMERAMG (optional)
679    
680    if env['mpi'] == 'none': env['boomeramg'] = False
681    
682    boomeramg_inc_path=''
683    boomeramg_lib_path=''
684    if env['boomeramg']:
685        boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
686        env.AppendUnique(CPPPATH = [boomeramg_inc_path])
687        env.AppendUnique(LIBPATH = [boomeramg_lib_path])
688        env.AppendUnique(LIBS = env['boomeramg_libs'])
689        env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
690        env.Append(CPPDEFINES = ['BOOMERAMG'])
691    
692  ######## ParMETIS (optional)  ######## ParMETIS (optional)
693    
694  if not env['usempi']: env['parmetis'] = False  if not env['usempi']: env['parmetis'] = False
# Line 560  if env['parmetis']: Line 703  if env['parmetis']:
703      env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)      env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
704      env.Append(CPPDEFINES = ['USE_PARMETIS'])      env.Append(CPPDEFINES = ['USE_PARMETIS'])
705    
706    ######## gmsh (optional, for tests)
707    
708    try:
709        import subprocess
710        p=subprocess.Popen(['gmsh', '-info'], stderr=subprocess.PIPE)
711        _,e=p.communicate()
712        if e.split().count("MPI"):
713            env['gmsh']='m'
714        else:
715            env['gmsh']='s'
716    except OSError:
717        env['gmsh']=False
718    
719    ######## PDFLaTeX (for documentation)
720    if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
721        env['pdflatex']=True
722    else:
723        env['pdflatex']=False
724    
725  ######################## Summarize our environment ###########################  ######################## Summarize our environment ###########################
726    
727  # 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
# Line 598  else: Line 760  else:
760      print("          LAPACK:  DISABLED")      print("          LAPACK:  DISABLED")
761  d_list=[]  d_list=[]
762  e_list=[]  e_list=[]
763  for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','silo','visit','pyvisi':  for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit','vsl_random':
764      if env[i]: e_list.append(i)      if env[i]: e_list.append(i)
765      else: d_list.append(i)      else: d_list.append(i)
766  for i in e_list:  for i in e_list:
767      print("%16s:  YES"%i)      print("%16s:  YES"%i)
768  for i in d_list:  for i in d_list:
769      print("%16s:  DISABLED"%i)      print("%16s:  DISABLED"%i)
770    if env['cppunit']:
771        print("         CppUnit:  FOUND")
772    else:
773        print("         CppUnit:  NOT FOUND")
774    if env['gmsh']=='m':
775        print("            gmsh:  FOUND, MPI-ENABLED")
776    elif env['gmsh']=='s':
777        print("            gmsh:  FOUND")
778    else:
779        print("            gmsh:  NOT FOUND")
780    if env['numpy_h']:
781        print("   numpy headers:  FOUND")
782    else:
783        print("   numpy headers:  NOT FOUND")
784    print("   vsl_random:  %s"%env['vsl_random'])
785        
786  if ((fatalwarning != '') and (env['werror'])):  if ((fatalwarning != '') and (env['werror'])):
787      print("  Treating warnings as errors")      print("  Treating warnings as errors")
788  else:  else:
# Line 633  Export( Line 811  Export(
811    ]    ]
812  )  )
813    
814  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)
815  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)
816  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)
817  env.SConscript(dirs = ['weipa/src'], variant_dir='build/$PLATFORM/weipa', duplicate=0)  env.SConscript(dirs = ['escript/src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
818  env.SConscript(dirs = ['escript/src'], variant_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
819  env.SConscript(dirs = ['esysUtils/src'], variant_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
820  env.SConscript(dirs = ['dudley/src'], variant_dir='build/$PLATFORM/dudley', duplicate=0)  env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
821  env.SConscript(dirs = ['finley/src'], variant_dir='build/$PLATFORM/finley', duplicate=0)  env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
822  env.SConscript(dirs = ['modellib/py_src'], variant_dir='build/$PLATFORM/modellib', duplicate=0)  env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
823  env.SConscript(dirs = ['doc'], variant_dir='build/$PLATFORM/doc', duplicate=0)  env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
824  env.SConscript(dirs = ['pyvisi/py_src'], variant_dir='build/$PLATFORM/pyvisi', duplicate=0)  env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
825  env.SConscript(dirs = ['pycad/py_src'], variant_dir='build/$PLATFORM/pycad', duplicate=0)  env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
826  env.SConscript(dirs = ['pythonMPI/src'], variant_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
827  env.SConscript(dirs = ['paso/profiling'], variant_dir='build/$PLATFORM/paso/profiling', duplicate=0)  env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
828    env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
829    
830    
831  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
832    
# Line 667  except StopIteration: Line 847  except StopIteration:
847      pass      pass
848  boosthpp.close()  boosthpp.close()
849    
850    
851  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
852  buildvars.write("svn_revision="+str(global_revision)+"\n")  buildvars.write("svn_revision="+str(global_revision)+"\n")
853  buildvars.write("prefix="+prefix+"\n")  buildvars.write("prefix="+prefix+"\n")
854  buildvars.write("cc="+env['CC']+"\n")  buildvars.write("cc="+env['CC']+"\n")
855  buildvars.write("cxx="+env['CXX']+"\n")  buildvars.write("cxx="+env['CXX']+"\n")
856  buildvars.write("python="+sys.executable+"\n")  if env['pythoncmd']=='python':
857  buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")      buildvars.write("python="+sys.executable+"\n")
858        buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
859    else:
860        buildvars.write("python="+env['pythoncmd']+"\n")
861        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)
862        verstring=p.stdout.readline().strip()
863        p.wait()
864        buildvars.write("python_version="+verstring+"\n")
865  buildvars.write("boost_inc_path="+boost_inc_path+"\n")  buildvars.write("boost_inc_path="+boost_inc_path+"\n")
866  buildvars.write("boost_lib_path="+boost_lib_path+"\n")  buildvars.write("boost_lib_path="+boost_lib_path+"\n")
867  buildvars.write("boost_version="+boostversion+"\n")  buildvars.write("boost_version="+boostversion+"\n")
# Line 683  buildvars.write("mpi=%s\n"%env['mpi']) Line 871  buildvars.write("mpi=%s\n"%env['mpi'])
871  buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)  buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
872  buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)  buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
873  buildvars.write("lapack=%s\n"%env['lapack'])  buildvars.write("lapack=%s\n"%env['lapack'])
874  buildvars.write("pyvisi=%d\n"%env['pyvisi'])  buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
875  for i in 'netcdf','parmetis','papi','mkl','umfpack','silo','visit':  for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
876      buildvars.write("%s=%d\n"%(i, int(env[i])))      buildvars.write("%s=%d\n"%(i, int(env[i])))
877      if env[i]:      if env[i]:
878          buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))          buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))
# Line 693  buildvars.close() Line 881  buildvars.close()
881    
882  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
883    
884  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'))
885  env.Alias('target_init', [target_init])  env.Alias('target_init', [target_init])
886    # delete buildvars upon cleanup
887    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
888    
889  # 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
890  # #include <paso/Common.h>  # #include <paso/Common.h>
# Line 707  env.Alias('install_paso', ['build_paso', Line 897  env.Alias('install_paso', ['build_paso',
897  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'])
898  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_escript_py'])
899    
900    env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
901    env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
902    
903  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'])
904  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'])
905    
906  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'])
907  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'])
908    
909    env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
910    env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
911    
912  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'])
913  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'])
914    
# Line 724  build_all_list = [] Line 920  build_all_list = []
920  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
921  build_all_list += ['build_paso']  build_all_list += ['build_paso']
922  build_all_list += ['build_escript']  build_all_list += ['build_escript']
923    build_all_list += ['build_pasowrap']
924  build_all_list += ['build_dudley']  build_all_list += ['build_dudley']
925  build_all_list += ['build_finley']  build_all_list += ['build_finley']
926    build_all_list += ['build_ripley']
927  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
928  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS: build_all_list += ['build_escriptreader']
929  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
# Line 737  install_all_list += ['target_init'] Line 935  install_all_list += ['target_init']
935  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
936  install_all_list += ['install_paso']  install_all_list += ['install_paso']
937  install_all_list += ['install_escript']  install_all_list += ['install_escript']
938    install_all_list += ['install_pasowrap']
939  install_all_list += ['install_dudley']  install_all_list += ['install_dudley']
940  install_all_list += ['install_finley']  install_all_list += ['install_finley']
941    install_all_list += ['install_ripley']
942  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
943  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS: install_all_list += ['install_escriptreader']
944  install_all_list += ['install_pyvisi_py']  install_all_list += ['install_downunder_py']
945  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
946  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
947  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
# Line 753  env.Default('install_all') Line 953  env.Default('install_all')
953    
954  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
955    
956  env.Alias('build_cppunittest', ['install_cppunittest_headers', 'build_cppunittest_lib'])  if not env['cppunit']:
957  env.Alias('install_cppunittest', ['build_cppunittest', 'install_cppunittest_lib'])      test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')
958  env.Alias('run_tests', ['install_all', 'install_cppunittest_lib'])      env.Alias('run_tests', test_msg)
959  env.Alias('all_tests', ['install_all', 'install_cppunittest_lib', 'run_tests', 'py_tests'])  env.Alias('run_tests', ['install_all'])
960    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
961  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
962  env.Alias('build_PasoTests','build/$PLATFORM/paso/profiling/PasoTests')  env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
963    
964  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
965    
966  env.Alias('api_epydoc','install_all')  env.Alias('api_epydoc','install_all')
967  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf'])
968  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
969    
970  if not IS_WINDOWS:  if not IS_WINDOWS:
971      try:      try:
972          utest=open('utest.sh','w')          utest=open('utest.sh','w')
973          utest.write(GroupTest.makeHeader(env['PLATFORM']))          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix))
974          for tests in TestGroups:          for tests in TestGroups:
975              utest.write(tests.makeString())              utest.write(tests.makeString())
976          utest.close()          utest.close()
977          Execute(Chmod('utest.sh', 0755))          Execute(Chmod('utest.sh', 0o755))
978          print("Generated utest.sh.")          print("Generated utest.sh.")
979      except IOError:      except IOError:
980          print("Error attempting to write unittests file.")          print("Error attempting to write unittests file.")
981          Exit(1)          Exit(1)
982    
983        # delete utest.sh upon cleanup
984        env.Clean('target_init', 'utest.sh')
985    
986      # Make sure that the escript wrapper is in place      # Make sure that the escript wrapper is in place
987      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
988          print("Copying escript wrapper.")          print("Copying escript wrapper.")
989          Execute(Copy(os.path.join(env['bininstall'],'escript'), 'bin/run-escript'))          Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
990    

Legend:
Removed from v.3271  
changed lines
  Added in v.3967

  ViewVC Help
Powered by ViewVC 1.1.26