/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 3338 by jfenwick, Fri Nov 5 03:50:51 2010 UTC revision 4167 by jfenwick, Fri Jan 25 05:21:30 2013 UTC
# Line 1  Line 1 
1  ########################################################  ##############################################################################
2  #  #
3  # Copyright (c) 2003-2010 by University of Queensland  # Copyright (c) 2003-2013 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 since 2012 by School of Earth Sciences
12    #
13    ##############################################################################
14    
15  EnsureSConsVersion(0,98,1)  EnsureSConsVersion(0,98,1)
16  EnsurePythonVersion(2,5)  EnsurePythonVersion(2,5)
# Line 16  EnsurePythonVersion(2,5) Line 18  EnsurePythonVersion(2,5)
18  import sys, os, platform, re  import sys, os, platform, re
19  from distutils import sysconfig  from distutils import sysconfig
20  from site_init import *  from site_init import *
21    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.
25  REQUIRED_OPTS_VERSION=200  REQUIRED_OPTS_VERSION=201
26    
27  # MS Windows support, many thanks to PH  # MS Windows support, many thanks to PH
28  IS_WINDOWS = (os.name == 'nt')  IS_WINDOWS = (os.name == 'nt')
# Line 47  if not os.path.isfile(options_file): Line 50  if not os.path.isfile(options_file):
50  ############################### Build options ################################  ############################### Build options ################################
51    
52  default_prefix='/usr'  default_prefix='/usr'
53  mpi_flavours=('none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')  mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
54  lapack_flavours=('none', 'clapack', 'mkl')  lapack_flavours=('none', 'clapack', 'mkl')
55    
56  vars = Variables(options_file, ARGUMENTS)  vars = Variables(options_file, ARGUMENTS)
57  vars.AddVariables(  vars.AddVariables(
58    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
59    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
60      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
63    ('cc', 'Path to C compiler', 'default'),    ('cc', 'Path to C compiler', 'default'),
# Line 72  vars.AddVariables( Line 76  vars.AddVariables(
76  # Mandatory libraries  # Mandatory libraries
77    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
78    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
79    # Mandatory for tests
80      ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
81      ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
82  # Optional libraries and options  # Optional libraries and options
83    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),
84    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
# Line 92  vars.AddVariables( Line 99  vars.AddVariables(
99    BoolVariable('umfpack', 'Enable UMFPACK', False),    BoolVariable('umfpack', 'Enable UMFPACK', False),
100    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
101    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
102      BoolVariable('boomeramg', 'Enable BoomerAMG', False),
103      ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
104      ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
105    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
106    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
107    ('lapack_libs', 'LAPACK libraries to link with', []),    ('lapack_libs', 'LAPACK libraries to link with', []),
# Line 101  vars.AddVariables( Line 111  vars.AddVariables(
111    BoolVariable('visit', 'Enable the VisIt simulation interface', False),    BoolVariable('visit', 'Enable the VisIt simulation interface', False),
112    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
113    ('visit_libs', 'VisIt libraries to link with', ['simV2']),    ('visit_libs', 'VisIt libraries to link with', ['simV2']),
114    BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', False),    BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
115  # Advanced settings  # Advanced settings
116    #dudley_assemble_flags = -funroll-loops      to actually do something    #dudley_assemble_flags = -funroll-loops      to actually do something
117    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),    ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
# Line 114  vars.AddVariables( Line 124  vars.AddVariables(
124    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')),
125    # finer control over library building, intel aggressive global optimisation    # finer control over library building, intel aggressive global optimisation
126    # works with dynamic libraries on windows.    # works with dynamic libraries on windows.
127    ('share_esysutils', 'Build a dynamic esysUtils library', False),    ('build_shared', 'Build dynamic libraries only', False),
   ('share_paso', 'Build a dynamic paso library', False),  
128    ('sys_libs', 'Extra libraries to link with', []),    ('sys_libs', 'Extra libraries to link with', []),
129    ('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)'),
130      ('SVN_VERSION', 'Do not use from options file', -2),
131      ('pythoncmd', 'which python to compile with','python'),
132      ('usepython3', 'Is this a python3 build? (experimental)', False),
133      ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
134      ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
135      ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
136      BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
137  )  )
138    
139  ##################### Create environment and help text #######################  ##################### Create environment and help text #######################
# Line 129  vars.AddVariables( Line 145  vars.AddVariables(
145  # in default locations.  # in default locations.
146  env = Environment(tools = ['default'], options = vars,  env = Environment(tools = ['default'], options = vars,
147                    ENV = {'PATH': os.environ['PATH']})                    ENV = {'PATH': os.environ['PATH']})
148                      
149    
150    #set the vars for clang
151    def mkclang(env):
152      env['CC']='clang'
153      env['CXX']='clang++'
154                      
155                      
156  if env['tools_names'] != 'default':  if env['tools_names'] != 'default':
157        zz=env['tools_names']
158        if 'clang' in zz:
159            zz.remove('clang')
160            zz.insert(0, mkclang)
161      env = Environment(tools = ['default'] + env['tools_names'], options = vars,      env = Environment(tools = ['default'] + env['tools_names'], options = vars,
162                        ENV = {'PATH' : os.environ['PATH']})                        ENV = {'PATH' : os.environ['PATH']})
163    
# Line 157  if len(vars.UnknownVariables())>0: Line 185  if len(vars.UnknownVariables())>0:
185    
186  #################### Make sure install directories exist #####################  #################### Make sure install directories exist #####################
187    
188    env['BUILD_DIR']=Dir(env['build_dir']).abspath
189  prefix=Dir(env['prefix']).abspath  prefix=Dir(env['prefix']).abspath
190  env['incinstall'] = os.path.join(prefix, 'include')  env['incinstall'] = os.path.join(prefix, 'include')
191  env['bininstall'] = os.path.join(prefix, 'bin')  env['bininstall'] = os.path.join(prefix, 'bin')
# Line 196  cc_name=os.path.basename(env['CC']) Line 225  cc_name=os.path.basename(env['CC'])
225    
226  if cc_name == 'icc':  if cc_name == 'icc':
227      # Intel compiler      # Intel compiler
228      cc_flags    = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
229      cc_optim    = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"      cc_flags    = "-std=c99 -fPIC -w2 -wd1875 -Wno-unknown-pragmas -DBLOCKTIMER -DCORE_ID1"
230        cc_optim    = "-O3 -ftz -fno-alias -ipo -xHost"
231      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
232      omp_flags   = "-openmp -openmp_report0"      omp_flags   = "-openmp"
233      omp_ldflags = "-openmp -openmp_report0 -lguide -lpthread"      omp_ldflags = "-openmp -openmp_report=1"
234      fatalwarning = "-Werror"      fatalwarning = "-Werror"
235  elif cc_name[:3] == 'gcc':  elif cc_name[:3] == 'gcc':
236      # GNU C on any system      # GNU C on any system
# Line 235  if env['cc_extra']  != '': env.Append(CF Line 265  if env['cc_extra']  != '': env.Append(CF
265  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
266  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
267    
268    if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
269    
270    if env['usepython3']:
271        env.Append(CPPDEFINES=['ESPYTHON3'])
272    
273  # set up the autolazy values  # set up the autolazy values
274  if env['forcelazy'] == 'on':  if env['forcelazy'] == 'on':
275      env.Append(CPPDEFINES=['FAUTOLAZYON'])      env.Append(CPPDEFINES=['FAUTOLAZYON'])
# Line 275  env.Append(CCFLAGS = env['cc_flags']) Line 310  env.Append(CCFLAGS = env['cc_flags'])
310  # add system libraries  # add system libraries
311  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
312    
313  # Get the global Subversion revision number for the getVersion() method  
314  try:  global_revision=ARGUMENTS.get('SVN_VERSION', None)
315    if global_revision:
316        global_revision = re.sub(':.*', '', global_revision)
317        global_revision = re.sub('[^0-9]', '', global_revision)
318        if global_revision == '': global_revision='-2'
319    else:
320      # Get the global Subversion revision number for the getVersion() method
321      try:
322      global_revision = os.popen('svnversion -n .').read()      global_revision = os.popen('svnversion -n .').read()
323      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
324      global_revision = re.sub('[^0-9]', '', global_revision)      global_revision = re.sub('[^0-9]', '', global_revision)
325      if global_revision == '': global_revision='-2'      if global_revision == '': global_revision='-2'
326  except:    except:
327      global_revision = '-1'      global_revision = '-1'
328  env['svn_revision']=global_revision  env['svn_revision']=global_revision
329  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
330    
331  if IS_WINDOWS:  if IS_WINDOWS:
332      if not env['share_esysutils']:      if not env['build_shared']:
333          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
     if not env['share_paso']:  
334          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
335    
336  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
# Line 310  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N Line 351  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N
351          env['ENV'][key] = 1          env['ENV'][key] = 1
352    
353  env_export=env['env_export']  env_export=env['env_export']
354  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'])
355    
356  for key in set(env_export):  for key in set(env_export):
357      try:      try:
# Line 337  except KeyError: Line 378  except KeyError:
378    
379  ######################## Add some custom builders ############################  ######################## Add some custom builders ############################
380    
381  py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  if env['pythoncmd']=='python':
382        py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
383    else:
384        py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
385  env.Append(BUILDERS = {'PyCompile' : py_builder});  env.Append(BUILDERS = {'PyCompile' : py_builder});
386    
387  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 376  if conf.CheckFunc('gethostname'): Line 420  if conf.CheckFunc('gethostname'):
420    
421  ######## Python headers & library (required)  ######## Python headers & library (required)
422    
423  python_inc_path=sysconfig.get_python_inc()  #First we check to see if the config file has specified
424  if IS_WINDOWS:  ##Where to find the filae. Ideally, this should be automatic
425      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
426  else:  #Directory
427      python_lib_path=sysconfig.get_config_var('LIBDIR')  # Use the python scons is running
428  #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux  if env['pythoncmd']=='python':
429  if IS_WINDOWS:      python_inc_path=sysconfig.get_python_inc()
430      python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]      if IS_WINDOWS:
431            python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
432        elif env['PLATFORM']=='darwin':
433            python_lib_path=sysconfig.get_config_var('LIBPL')
434        else:
435            python_lib_path=sysconfig.get_config_var('LIBDIR')
436    
437        #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
438        if IS_WINDOWS:
439            python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
440        else:
441            python_libs=['python'+sysconfig.get_python_version()]
442    
443    #if we want to use a python other than the one scons is running
444  else:  else:
445      python_libs=['python'+sysconfig.get_python_version()]      initstring='from __future__ import print_function;from distutils import sysconfig;'
446        if env['pythonlibname']!='':
447            python_libs=env['pythonlibname']
448        else:   # work it out by calling python    
449            if IS_WINDOWS:
450                cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
451            else:
452                cmd='print("python"+sysconfig.get_python_version())'
453            p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
454            python_libs=p.stdout.readline()
455            if env['usepython3']:       # This is to convert unicode str into py2 string
456                python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought
457            p.wait()
458            python_libs=python_libs.strip()
459    
460      
461        # Now we know whether we are using python3 or not
462        p=Popen([env['pythoncmd'], '-c',  initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
463        python_inc_path=p.stdout.readline()
464        if env['usepython3']:
465             python_inc_path=python_inc_path.encode()
466        p.wait()  
467        python_inc_path=python_inc_path.strip()
468        if IS_WINDOWS:
469            cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
470        elif env['PLATFORM']=='darwin':
471            cmd="sysconfig.get_config_var(\"LIBPL\")"
472        else:
473            cmd="sysconfig.get_config_var(\"LIBDIR\")"
474    
475        p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
476        python_lib_path=p.stdout.readline()
477        if env['usepython3']:
478            python_lib_path=python_lib_path.decode()
479        p.wait()
480        python_lib_path=python_lib_path.strip()
481    
482    #Check for an override from the config file.
483    #Ideally, this should be automatic
484    #But we need to deal with the case where python is not in its INSTALL
485    #Directory
486    if env['pythonlibpath']!='':
487        python_lib_path=env['pythonlibpath']
488    
489    if env['pythonincpath']!='':
490        python_inc_path=env['pythonincpath']
491    
492    
493  if sysheaderopt == '':  if sysheaderopt == '':
494      conf.env.AppendUnique(CPPPATH = [python_inc_path])      conf.env.AppendUnique(CPPPATH = [python_inc_path])
# Line 404  if not conf.CheckFunc('Py_Exit'): Line 507  if not conf.CheckFunc('Py_Exit'):
507      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))
508      Exit(1)      Exit(1)
509    
510    ## reuse conf to check for numpy header (optional)
511    if env['usepython3']:
512        # FIXME: This is until we can work out how to make the checks in python 3
513        conf.env['numpy_h']=False
514    else:
515        if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
516            conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
517            conf.env['numpy_h']=True
518        else:
519            conf.env['numpy_h']=False
520    
521  # Commit changes to environment  # Commit changes to environment
522  env = conf.Finish()  env = conf.Finish()
523    
# Line 426  env.PrependENVPath(LD_LIBRARY_PATH_KEY, Line 540  env.PrependENVPath(LD_LIBRARY_PATH_KEY,
540    
541  ######## numpy (required)  ######## numpy (required)
542    
543  try:  if not detectModule(env, 'numpy'):
544      from numpy import identity      print("Cannot import numpy. If it is installed try setting your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
 except ImportError:  
     print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)  
545      Exit(1)      Exit(1)
546    
547  ######## VTK (optional)  ######## CppUnit (required for tests)
548    
549  if env['pyvisi']:  try:
550      try:      cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
551          import vtk      env.AppendUnique(CPPPATH = [cppunit_inc_path])
552          env['pyvisi'] = True      env.AppendUnique(LIBPATH = [cppunit_lib_path])
553      except ImportError:      env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
554          print("Cannot import vtk, disabling pyvisi.")      env['cppunit']=True
555          env['pyvisi'] = False  except:
556        env['cppunit']=False
557    
558    ######## sympy (optional)
559    
560    if detectModule(env, 'sympy'):
561        env['sympy'] = True
562    else:
563        print("Cannot import sympy. Symbolic toolbox and nonlinear PDEs will not be available.")
564        env['sympy'] = False
565    
566  ######## netCDF (optional)  ######## netCDF (optional)
567    
# Line 522  if env['silo']: Line 643  if env['silo']:
643      # weipa library and tools.      # weipa library and tools.
644      #env.AppendUnique(LIBS = [env['silo_libs']])      #env.AppendUnique(LIBS = [env['silo_libs']])
645    
646    ######## VSL random numbers (optional)
647    if env['vsl_random']:
648        env.Append(CPPDEFINES = ['MKLRANDOM'])
649    
650  ######## VisIt (optional)  ######## VisIt (optional)
651    
652  visit_inc_path=''  visit_inc_path=''
# Line 533  if env['visit']: Line 658  if env['visit']:
658    
659  ######## MPI (optional)  ######## MPI (optional)
660    
661    if env['mpi']=='no':
662        env['mpi']='none'
663    
664  env['usempi'] = env['mpi']!='none'  env['usempi'] = env['mpi']!='none'
665  mpi_inc_path=''  mpi_inc_path=''
666  mpi_lib_path=''  mpi_lib_path=''
# Line 549  if env['usempi']: Line 677  if env['usempi']:
677      if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:      if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
678          env.Append(CPPDEFINES = ['MPI_INCLUDED'])          env.Append(CPPDEFINES = ['MPI_INCLUDED'])
679    
680    ######## BOOMERAMG (optional)
681    
682    if env['mpi'] == 'none': env['boomeramg'] = False
683    
684    boomeramg_inc_path=''
685    boomeramg_lib_path=''
686    if env['boomeramg']:
687        boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
688        env.AppendUnique(CPPPATH = [boomeramg_inc_path])
689        env.AppendUnique(LIBPATH = [boomeramg_lib_path])
690        env.AppendUnique(LIBS = env['boomeramg_libs'])
691        env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
692        env.Append(CPPDEFINES = ['BOOMERAMG'])
693    
694  ######## ParMETIS (optional)  ######## ParMETIS (optional)
695    
696  if not env['usempi']: env['parmetis'] = False  if not env['usempi']: env['parmetis'] = False
# Line 563  if env['parmetis']: Line 705  if env['parmetis']:
705      env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)      env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
706      env.Append(CPPDEFINES = ['USE_PARMETIS'])      env.Append(CPPDEFINES = ['USE_PARMETIS'])
707    
708    ######## gmsh (optional, for tests)
709    
710    try:
711        p=Popen(['gmsh', '-info'], stderr=PIPE)
712        _,e=p.communicate()
713        if e.split().count("MPI"):
714            env['gmsh']='m'
715        else:
716            env['gmsh']='s'
717    except OSError:
718        env['gmsh']=False
719    
720    ######## PDFLaTeX (for documentation)
721    if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
722        env['pdflatex']=True
723    else:
724        env['pdflatex']=False
725    
726  ######################## Summarize our environment ###########################  ######################## Summarize our environment ###########################
727    
728  # 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 601  else: Line 761  else:
761      print("          LAPACK:  DISABLED")      print("          LAPACK:  DISABLED")
762  d_list=[]  d_list=[]
763  e_list=[]  e_list=[]
764  for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','silo','visit','pyvisi':  for i in 'debug','openmp','boomeramg','mkl','netcdf','papi','parmetis','silo','sympy','umfpack','visit','vsl_random':
765      if env[i]: e_list.append(i)      if env[i]: e_list.append(i)
766      else: d_list.append(i)      else: d_list.append(i)
767  for i in e_list:  for i in e_list:
768      print("%16s:  YES"%i)      print("%16s:  YES"%i)
769  for i in d_list:  for i in d_list:
770      print("%16s:  DISABLED"%i)      print("%16s:  DISABLED"%i)
771    if env['cppunit']:
772        print("         CppUnit:  FOUND")
773    else:
774        print("         CppUnit:  NOT FOUND")
775    if env['gmsh']=='m':
776        print("            gmsh:  FOUND, MPI-ENABLED")
777    elif env['gmsh']=='s':
778        print("            gmsh:  FOUND")
779    else:
780        print("            gmsh:  NOT FOUND")
781    if env['numpy_h']:
782        print("   numpy headers:  FOUND")
783    else:
784        print("   numpy headers:  NOT FOUND")
785    print("   vsl_random:  %s"%env['vsl_random'])
786        
787  if ((fatalwarning != '') and (env['werror'])):  if ((fatalwarning != '') and (env['werror'])):
788      print("  Treating warnings as errors")      print("  Treating warnings as errors")
789  else:  else:
# Line 636  Export( Line 812  Export(
812    ]    ]
813  )  )
814    
815  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)
816  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)
817  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)
818  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)
819  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)
820  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)
821  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)
822  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)
823  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)
824  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)
825  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)
826  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)
827  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)
828  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)
829    env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
830    
831    
832  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
833    
# Line 670  except StopIteration: Line 848  except StopIteration:
848      pass      pass
849  boosthpp.close()  boosthpp.close()
850    
851    
852  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
853  buildvars.write("svn_revision="+str(global_revision)+"\n")  buildvars.write("svn_revision="+str(global_revision)+"\n")
854  buildvars.write("prefix="+prefix+"\n")  buildvars.write("prefix="+prefix+"\n")
855  buildvars.write("cc="+env['CC']+"\n")  buildvars.write("cc="+env['CC']+"\n")
856  buildvars.write("cxx="+env['CXX']+"\n")  buildvars.write("cxx="+env['CXX']+"\n")
857  buildvars.write("python="+sys.executable+"\n")  if env['pythoncmd']=='python':
858  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")
859        buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
860    else:
861        buildvars.write("python="+env['pythoncmd']+"\n")
862        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)
863        verstring=p.stdout.readline().strip()
864        p.wait()
865        buildvars.write("python_version="+verstring+"\n")
866  buildvars.write("boost_inc_path="+boost_inc_path+"\n")  buildvars.write("boost_inc_path="+boost_inc_path+"\n")
867  buildvars.write("boost_lib_path="+boost_lib_path+"\n")  buildvars.write("boost_lib_path="+boost_lib_path+"\n")
868  buildvars.write("boost_version="+boostversion+"\n")  buildvars.write("boost_version="+boostversion+"\n")
# Line 686  buildvars.write("mpi=%s\n"%env['mpi']) Line 872  buildvars.write("mpi=%s\n"%env['mpi'])
872  buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)  buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
873  buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)  buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
874  buildvars.write("lapack=%s\n"%env['lapack'])  buildvars.write("lapack=%s\n"%env['lapack'])
875  buildvars.write("pyvisi=%d\n"%env['pyvisi'])  buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
876  for i in 'netcdf','parmetis','papi','mkl','umfpack','silo','visit':  for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
877      buildvars.write("%s=%d\n"%(i, int(env[i])))      buildvars.write("%s=%d\n"%(i, int(env[i])))
878      if env[i]:      if env[i]:
879          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 696  buildvars.close() Line 882  buildvars.close()
882    
883  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
884    
885  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'))
886  env.Alias('target_init', [target_init])  env.Alias('target_init', [target_init])
887    # delete buildvars upon cleanup
888    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
889    
890  # 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
891  # #include <paso/Common.h>  # #include <paso/Common.h>
# Line 710  env.Alias('install_paso', ['build_paso', Line 898  env.Alias('install_paso', ['build_paso',
898  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'])
899  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'])
900    
901    env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
902    env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
903    
904  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'])
905  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'])
906    
907  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'])
908  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'])
909    
910    env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
911    env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
912    
913  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'])
914  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'])
915    
# Line 727  build_all_list = [] Line 921  build_all_list = []
921  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
922  build_all_list += ['build_paso']  build_all_list += ['build_paso']
923  build_all_list += ['build_escript']  build_all_list += ['build_escript']
924    build_all_list += ['build_pasowrap']
925  build_all_list += ['build_dudley']  build_all_list += ['build_dudley']
926  build_all_list += ['build_finley']  build_all_list += ['build_finley']
927    build_all_list += ['build_ripley']
928  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
929  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS: build_all_list += ['build_escriptreader']
930  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
# Line 740  install_all_list += ['target_init'] Line 936  install_all_list += ['target_init']
936  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
937  install_all_list += ['install_paso']  install_all_list += ['install_paso']
938  install_all_list += ['install_escript']  install_all_list += ['install_escript']
939    install_all_list += ['install_pasowrap']
940  install_all_list += ['install_dudley']  install_all_list += ['install_dudley']
941  install_all_list += ['install_finley']  install_all_list += ['install_finley']
942    install_all_list += ['install_ripley']
943  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
944  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS: install_all_list += ['install_escriptreader']
945  install_all_list += ['install_pyvisi_py']  install_all_list += ['install_downunder_py']
946  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
947  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
948  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
# Line 756  env.Default('install_all') Line 954  env.Default('install_all')
954    
955  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
956    
957  env.Alias('build_cppunittest', ['install_cppunittest_headers', 'build_cppunittest_lib'])  if not env['cppunit']:
958  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')
959  env.Alias('run_tests', ['install_all', 'install_cppunittest_lib'])      env.Alias('run_tests', test_msg)
960  env.Alias('all_tests', ['install_all', 'install_cppunittest_lib', 'run_tests', 'py_tests'])  env.Alias('run_tests', ['install_all'])
961    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
962  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
963  env.Alias('build_PasoTests','build/$PLATFORM/paso/profiling/PasoTests')  env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
964    
965  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
966    
967  env.Alias('api_epydoc','install_all')  env.Alias('basedocs', ['examples_tarfile', 'examples_zipfile', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
968  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'install_pdf', 'cookbook_pdf'])  env.Alias('docs', ['basedocs', 'sphinxdoc'])
969  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
970    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
971    
972    
973    # The test scripts are always generated, this target allows us to
974    # generate the testscripts without doing a full build
975    env.Alias('testscripts',[])
976    
977  if not IS_WINDOWS:  if not IS_WINDOWS:
978      try:      try:
979          utest=open('utest.sh','w')          utest=open('utest.sh','w')
980          utest.write(GroupTest.makeHeader(env['PLATFORM']))          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, False))
981          for tests in TestGroups:          for tests in TestGroups:
982              utest.write(tests.makeString())              utest.write(tests.makeString())
983          utest.close()          utest.close()
984          Execute(Chmod('utest.sh', 0755))          Execute(Chmod('utest.sh', 0o755))
985          print("Generated utest.sh.")          print("Generated utest.sh.")
986            # This version contains only python tests - I want this to be usable
987            # From a binary only install if you have the test files
988            utest=open('itest.sh','w')
989            utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, True))
990            for tests in TestGroups:
991              if tests.exec_cmd=='$PYTHONRUNNER ':
992                utest.write(tests.makeString())
993            utest.close()
994            Execute(Chmod('itest.sh', 0o755))
995            print("Generated itest.sh.")        
996      except IOError:      except IOError:
997          print("Error attempting to write unittests file.")          print("Error attempting to write unittests file.")
998          Exit(1)          Exit(1)
999    
1000        # delete utest.sh upon cleanup
1001        env.Clean('target_init', 'utest.sh')
1002        env.Clean('target_init', 'itest.sh')
1003    
1004      # Make sure that the escript wrapper is in place      # Make sure that the escript wrapper is in place
1005      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
1006          print("Copying escript wrapper.")          print("Copying escript wrapper.")

Legend:
Removed from v.3338  
changed lines
  Added in v.4167

  ViewVC Help
Powered by ViewVC 1.1.26