/[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 4173 by caltinay, Wed Jan 30 03:05:01 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 71  vars.AddVariables( Line 75  vars.AddVariables(
75    ('omp_ldflags', 'OpenMP linker flags', 'default'),    ('omp_ldflags', 'OpenMP linker flags', 'default'),
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']),    ('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 125  vars.AddVariables( Line 141  vars.AddVariables(
141  # Intel's compiler uses regular expressions improperly and emits a warning  # Intel's compiler uses regular expressions improperly and emits a warning
142  # about failing to find the compilers. This warning can be safely ignored.  # about failing to find the compilers. This warning can be safely ignored.
143    
144  env = Environment(tools = ['default'], options = vars)  # PATH is needed so the compiler, linker and tools are found if they are not
145    # in default locations.
146    env = Environment(tools = ['default'], options = vars,
147                      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      env = Environment(tools = ['default'] + env['tools_names'], options = vars)      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,
162                          ENV = {'PATH' : os.environ['PATH']})
163    
164  if options_file:  if options_file:
165      opts_valid=False      opts_valid=False
# Line 153  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 192  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
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 231  if env['cc_extra']  != '': env.Append(CF Line 267  if env['cc_extra']  != '': env.Append(CF
267  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])  if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
268  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
269    
270    if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
271    
272    if env['usepython3']:
273        env.Append(CPPDEFINES=['ESPYTHON3'])
274    
275  # set up the autolazy values  # set up the autolazy values
276  if env['forcelazy'] == 'on':  if env['forcelazy'] == 'on':
277      env.Append(CPPDEFINES=['FAUTOLAZYON'])      env.Append(CPPDEFINES=['FAUTOLAZYON'])
# Line 271  env.Append(CCFLAGS = env['cc_flags']) Line 312  env.Append(CCFLAGS = env['cc_flags'])
312  # add system libraries  # add system libraries
313  env.AppendUnique(LIBS = env['sys_libs'])  env.AppendUnique(LIBS = env['sys_libs'])
314    
315  # Get the global Subversion revision number for the getVersion() method  
316  try:  global_revision=ARGUMENTS.get('SVN_VERSION', None)
317    if global_revision:
318        global_revision = re.sub(':.*', '', global_revision)
319        global_revision = re.sub('[^0-9]', '', global_revision)
320        if global_revision == '': global_revision='-2'
321    else:
322      # Get the global Subversion revision number for the getVersion() method
323      try:
324      global_revision = os.popen('svnversion -n .').read()      global_revision = os.popen('svnversion -n .').read()
325      global_revision = re.sub(':.*', '', global_revision)      global_revision = re.sub(':.*', '', global_revision)
326      global_revision = re.sub('[^0-9]', '', global_revision)      global_revision = re.sub('[^0-9]', '', global_revision)
327      if global_revision == '': global_revision='-2'      if global_revision == '': global_revision='-2'
328  except:    except:
329      global_revision = '-1'      global_revision = '-1'
330  env['svn_revision']=global_revision  env['svn_revision']=global_revision
331  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
332    
333  if IS_WINDOWS:  if IS_WINDOWS:
334      if not env['share_esysutils']:      if not env['build_shared']:
335          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
     if not env['share_paso']:  
336          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
337    
338  ###################### Copy required environment vars ########################  ###################### Copy required environment vars ########################
# Line 297  if IS_WINDOWS: Line 344  if IS_WINDOWS:
344  else:  else:
345      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
346    
347  # 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.  
348    
349  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
350      try:      try:
# Line 307  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N Line 353  for key in 'OMP_NUM_THREADS', 'ESCRIPT_N
353          env['ENV'][key] = 1          env['ENV'][key] = 1
354    
355  env_export=env['env_export']  env_export=env['env_export']
356  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'])
357    
358  for key in set(env_export):  for key in set(env_export):
359      try:      try:
# Line 334  except KeyError: Line 380  except KeyError:
380    
381  ######################## Add some custom builders ############################  ######################## Add some custom builders ############################
382    
383  py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  if env['pythoncmd']=='python':
384        py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
385    else:
386        py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
387  env.Append(BUILDERS = {'PyCompile' : py_builder});  env.Append(BUILDERS = {'PyCompile' : py_builder});
388    
389  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 422  if conf.CheckFunc('gethostname'):
422    
423  ######## Python headers & library (required)  ######## Python headers & library (required)
424    
425  python_inc_path=sysconfig.get_python_inc()  #First we check to see if the config file has specified
426  if IS_WINDOWS:  ##Where to find the filae. Ideally, this should be automatic
427      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
428  else:  #Directory
429      python_lib_path=sysconfig.get_config_var('LIBDIR')  # Use the python scons is running
430  #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux  if env['pythoncmd']=='python':
431  if IS_WINDOWS:      python_inc_path=sysconfig.get_python_inc()
432      python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]      if IS_WINDOWS:
433            python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
434        elif env['PLATFORM']=='darwin':
435            python_lib_path=sysconfig.get_config_var('LIBPL')
436        else:
437            python_lib_path=sysconfig.get_config_var('LIBDIR')
438    
439        #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
440        if IS_WINDOWS:
441            python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
442        else:
443            python_libs=['python'+sysconfig.get_python_version()]
444    
445    #if we want to use a python other than the one scons is running
446  else:  else:
447      python_libs=['python'+sysconfig.get_python_version()]      initstring='from __future__ import print_function;from distutils import sysconfig;'
448        if env['pythonlibname']!='':
449            python_libs=env['pythonlibname']
450        else:   # work it out by calling python    
451            if IS_WINDOWS:
452                cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
453            else:
454                cmd='print("python"+sysconfig.get_python_version())'
455            p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
456            python_libs=p.stdout.readline()
457            if env['usepython3']:       # This is to convert unicode str into py2 string
458                python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought
459            p.wait()
460            python_libs=python_libs.strip()
461    
462      
463        # Now we know whether we are using python3 or not
464        p=Popen([env['pythoncmd'], '-c',  initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
465        python_inc_path=p.stdout.readline()
466        if env['usepython3']:
467             python_inc_path=python_inc_path.encode()
468        p.wait()  
469        python_inc_path=python_inc_path.strip()
470        if IS_WINDOWS:
471            cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
472        elif env['PLATFORM']=='darwin':
473            cmd="sysconfig.get_config_var(\"LIBPL\")"
474        else:
475            cmd="sysconfig.get_config_var(\"LIBDIR\")"
476    
477        p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
478        python_lib_path=p.stdout.readline()
479        if env['usepython3']:
480            python_lib_path=python_lib_path.decode()
481        p.wait()
482        python_lib_path=python_lib_path.strip()
483    
484    #Check for an override from the config file.
485    #Ideally, this should be automatic
486    #But we need to deal with the case where python is not in its INSTALL
487    #Directory
488    if env['pythonlibpath']!='':
489        python_lib_path=env['pythonlibpath']
490    
491    if env['pythonincpath']!='':
492        python_inc_path=env['pythonincpath']
493    
494    
495  if sysheaderopt == '':  if sysheaderopt == '':
496      conf.env.AppendUnique(CPPPATH = [python_inc_path])      conf.env.AppendUnique(CPPPATH = [python_inc_path])
# Line 401  if not conf.CheckFunc('Py_Exit'): Line 509  if not conf.CheckFunc('Py_Exit'):
509      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))
510      Exit(1)      Exit(1)
511    
512    ## reuse conf to check for numpy header (optional)
513    if env['usepython3']:
514        # FIXME: This is until we can work out how to make the checks in python 3
515        conf.env['numpy_h']=False
516    else:
517        if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
518            conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
519            conf.env['numpy_h']=True
520        else:
521            conf.env['numpy_h']=False
522    
523  # Commit changes to environment  # Commit changes to environment
524  env = conf.Finish()  env = conf.Finish()
525    
# Line 423  env.PrependENVPath(LD_LIBRARY_PATH_KEY, Line 542  env.PrependENVPath(LD_LIBRARY_PATH_KEY,
542    
543  ######## numpy (required)  ######## numpy (required)
544    
545  try:  if not detectModule(env, 'numpy'):
546      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)  
547      Exit(1)      Exit(1)
548    
549  ######## VTK (optional)  ######## CppUnit (required for tests)
550    
551  if env['pyvisi']:  try:
552      try:      cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
553          import vtk      env.AppendUnique(CPPPATH = [cppunit_inc_path])
554          env['pyvisi'] = True      env.AppendUnique(LIBPATH = [cppunit_lib_path])
555      except ImportError:      env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
556          print("Cannot import vtk, disabling pyvisi.")      env['cppunit']=True
557          env['pyvisi'] = False  except:
558        env['cppunit']=False
559    
560    ######## sympy (optional)
561    
562    if detectModule(env, 'sympy'):
563        env['sympy'] = True
564    else:
565        print("Cannot import sympy. Symbolic toolbox and nonlinear PDEs will not be available.")
566        env['sympy'] = False
567    
568  ######## netCDF (optional)  ######## netCDF (optional)
569    
# Line 519  if env['silo']: Line 645  if env['silo']:
645      # weipa library and tools.      # weipa library and tools.
646      #env.AppendUnique(LIBS = [env['silo_libs']])      #env.AppendUnique(LIBS = [env['silo_libs']])
647    
648    ######## VSL random numbers (optional)
649    if env['vsl_random']:
650        env.Append(CPPDEFINES = ['MKLRANDOM'])
651    
652  ######## VisIt (optional)  ######## VisIt (optional)
653    
654  visit_inc_path=''  visit_inc_path=''
# Line 530  if env['visit']: Line 660  if env['visit']:
660    
661  ######## MPI (optional)  ######## MPI (optional)
662    
663    if env['mpi']=='no':
664        env['mpi']='none'
665    
666  env['usempi'] = env['mpi']!='none'  env['usempi'] = env['mpi']!='none'
667  mpi_inc_path=''  mpi_inc_path=''
668  mpi_lib_path=''  mpi_lib_path=''
# Line 546  if env['usempi']: Line 679  if env['usempi']:
679      if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:      if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
680          env.Append(CPPDEFINES = ['MPI_INCLUDED'])          env.Append(CPPDEFINES = ['MPI_INCLUDED'])
681    
682    ######## BOOMERAMG (optional)
683    
684    if env['mpi'] == 'none': env['boomeramg'] = False
685    
686    boomeramg_inc_path=''
687    boomeramg_lib_path=''
688    if env['boomeramg']:
689        boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
690        env.AppendUnique(CPPPATH = [boomeramg_inc_path])
691        env.AppendUnique(LIBPATH = [boomeramg_lib_path])
692        env.AppendUnique(LIBS = env['boomeramg_libs'])
693        env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
694        env.Append(CPPDEFINES = ['BOOMERAMG'])
695    
696  ######## ParMETIS (optional)  ######## ParMETIS (optional)
697    
698  if not env['usempi']: env['parmetis'] = False  if not env['usempi']: env['parmetis'] = False
# Line 560  if env['parmetis']: Line 707  if env['parmetis']:
707      env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)      env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
708      env.Append(CPPDEFINES = ['USE_PARMETIS'])      env.Append(CPPDEFINES = ['USE_PARMETIS'])
709    
710    ######## gmsh (optional, for tests)
711    
712    try:
713        p=Popen(['gmsh', '-info'], stderr=PIPE)
714        _,e=p.communicate()
715        if e.split().count("MPI"):
716            env['gmsh']='m'
717        else:
718            env['gmsh']='s'
719    except OSError:
720        env['gmsh']=False
721    
722    ######## PDFLaTeX (for documentation)
723    if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
724        env['pdflatex']=True
725    else:
726        env['pdflatex']=False
727    
728  ######################## Summarize our environment ###########################  ######################## Summarize our environment ###########################
729    
730  # 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 763  else:
763      print("          LAPACK:  DISABLED")      print("          LAPACK:  DISABLED")
764  d_list=[]  d_list=[]
765  e_list=[]  e_list=[]
766  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':
767      if env[i]: e_list.append(i)      if env[i]: e_list.append(i)
768      else: d_list.append(i)      else: d_list.append(i)
769  for i in e_list:  for i in e_list:
770      print("%16s:  YES"%i)      print("%16s:  YES"%i)
771  for i in d_list:  for i in d_list:
772      print("%16s:  DISABLED"%i)      print("%16s:  DISABLED"%i)
773    if env['cppunit']:
774        print("         CppUnit:  FOUND")
775    else:
776        print("         CppUnit:  NOT FOUND")
777    if env['gmsh']=='m':
778        print("            gmsh:  FOUND, MPI-ENABLED")
779    elif env['gmsh']=='s':
780        print("            gmsh:  FOUND")
781    else:
782        print("            gmsh:  NOT FOUND")
783    if env['numpy_h']:
784        print("   numpy headers:  FOUND")
785    else:
786        print("   numpy headers:  NOT FOUND")
787    print("   vsl_random:  %s"%env['vsl_random'])
788        
789  if ((fatalwarning != '') and (env['werror'])):  if ((fatalwarning != '') and (env['werror'])):
790      print("  Treating warnings as errors")      print("  Treating warnings as errors")
791  else:  else:
# Line 633  Export( Line 814  Export(
814    ]    ]
815  )  )
816    
817  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)
818  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)
819  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)
820  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)
821  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)
822  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)
823  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)
824  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)
825  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)
826  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)
827  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)
828  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)
829  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)
830  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)
831    env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
832    
833    
834  ######################## Populate the buildvars file #########################  ######################## Populate the buildvars file #########################
835    
# Line 667  except StopIteration: Line 850  except StopIteration:
850      pass      pass
851  boosthpp.close()  boosthpp.close()
852    
853    
854  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')  buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
855  buildvars.write("svn_revision="+str(global_revision)+"\n")  buildvars.write("svn_revision="+str(global_revision)+"\n")
856  buildvars.write("prefix="+prefix+"\n")  buildvars.write("prefix="+prefix+"\n")
857  buildvars.write("cc="+env['CC']+"\n")  buildvars.write("cc="+env['CC']+"\n")
858  buildvars.write("cxx="+env['CXX']+"\n")  buildvars.write("cxx="+env['CXX']+"\n")
859  buildvars.write("python="+sys.executable+"\n")  if env['pythoncmd']=='python':
860  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")
861        buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
862    else:
863        buildvars.write("python="+env['pythoncmd']+"\n")
864        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)
865        verstring=p.stdout.readline().strip()
866        p.wait()
867        buildvars.write("python_version="+verstring+"\n")
868  buildvars.write("boost_inc_path="+boost_inc_path+"\n")  buildvars.write("boost_inc_path="+boost_inc_path+"\n")
869  buildvars.write("boost_lib_path="+boost_lib_path+"\n")  buildvars.write("boost_lib_path="+boost_lib_path+"\n")
870  buildvars.write("boost_version="+boostversion+"\n")  buildvars.write("boost_version="+boostversion+"\n")
# Line 683  buildvars.write("mpi=%s\n"%env['mpi']) Line 874  buildvars.write("mpi=%s\n"%env['mpi'])
874  buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)  buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
875  buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)  buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
876  buildvars.write("lapack=%s\n"%env['lapack'])  buildvars.write("lapack=%s\n"%env['lapack'])
877  buildvars.write("pyvisi=%d\n"%env['pyvisi'])  buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
878  for i in 'netcdf','parmetis','papi','mkl','umfpack','silo','visit':  for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
879      buildvars.write("%s=%d\n"%(i, int(env[i])))      buildvars.write("%s=%d\n"%(i, int(env[i])))
880      if env[i]:      if env[i]:
881          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 884  buildvars.close()
884    
885  ################### Targets to build and install libraries ###################  ################### Targets to build and install libraries ###################
886    
887  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'))
888  env.Alias('target_init', [target_init])  env.Alias('target_init', [target_init])
889    # delete buildvars upon cleanup
890    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
891    
892  # 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
893  # #include <paso/Common.h>  # #include <paso/Common.h>
# Line 707  env.Alias('install_paso', ['build_paso', Line 900  env.Alias('install_paso', ['build_paso',
900  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'])
901  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'])
902    
903    env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
904    env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
905    
906  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'])
907  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'])
908    
909  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'])
910  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'])
911    
912    env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
913    env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
914    
915  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'])
916  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'])
917    
# Line 724  build_all_list = [] Line 923  build_all_list = []
923  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
924  build_all_list += ['build_paso']  build_all_list += ['build_paso']
925  build_all_list += ['build_escript']  build_all_list += ['build_escript']
926    build_all_list += ['build_pasowrap']
927  build_all_list += ['build_dudley']  build_all_list += ['build_dudley']
928  build_all_list += ['build_finley']  build_all_list += ['build_finley']
929    build_all_list += ['build_ripley']
930  build_all_list += ['build_weipa']  build_all_list += ['build_weipa']
931  if not IS_WINDOWS: build_all_list += ['build_escriptreader']  if not IS_WINDOWS: build_all_list += ['build_escriptreader']
932  if env['usempi']:   build_all_list += ['build_pythonMPI']  if env['usempi']:   build_all_list += ['build_pythonMPI']
# Line 737  install_all_list += ['target_init'] Line 938  install_all_list += ['target_init']
938  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
939  install_all_list += ['install_paso']  install_all_list += ['install_paso']
940  install_all_list += ['install_escript']  install_all_list += ['install_escript']
941    install_all_list += ['install_pasowrap']
942  install_all_list += ['install_dudley']  install_all_list += ['install_dudley']
943  install_all_list += ['install_finley']  install_all_list += ['install_finley']
944    install_all_list += ['install_ripley']
945  install_all_list += ['install_weipa']  install_all_list += ['install_weipa']
946  if not IS_WINDOWS: install_all_list += ['install_escriptreader']  if not IS_WINDOWS: install_all_list += ['install_escriptreader']
947  install_all_list += ['install_pyvisi_py']  install_all_list += ['install_downunder_py']
948  install_all_list += ['install_modellib_py']  install_all_list += ['install_modellib_py']
949  install_all_list += ['install_pycad_py']  install_all_list += ['install_pycad_py']
950  if env['usempi']:   install_all_list += ['install_pythonMPI']  if env['usempi']:   install_all_list += ['install_pythonMPI']
# Line 753  env.Default('install_all') Line 956  env.Default('install_all')
956    
957  ################## Targets to build and run the test suite ###################  ################## Targets to build and run the test suite ###################
958    
959  env.Alias('build_cppunittest', ['install_cppunittest_headers', 'build_cppunittest_lib'])  if not env['cppunit']:
960  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')
961  env.Alias('run_tests', ['install_all', 'install_cppunittest_lib'])      env.Alias('run_tests', test_msg)
962  env.Alias('all_tests', ['install_all', 'install_cppunittest_lib', 'run_tests', 'py_tests'])  env.Alias('run_tests', ['install_all'])
963    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
964  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
965  env.Alias('build_PasoTests','build/$PLATFORM/paso/profiling/PasoTests')  env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
966    
967  ##################### Targets to build the documentation #####################  ##################### Targets to build the documentation #####################
968    
969  env.Alias('api_epydoc','install_all')  env.Alias('basedocs', ['examples_tarfile', 'examples_zipfile', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
970  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])  env.Alias('docs', ['basedocs', 'sphinxdoc'])
971  env.Alias('release_prep', ['docs', 'install_all'])  env.Alias('release_prep', ['docs', 'install_all'])
972    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
973    
974    
975    # The test scripts are always generated, this target allows us to
976    # generate the testscripts without doing a full build
977    env.Alias('testscripts',[])
978    
979  if not IS_WINDOWS:  if not IS_WINDOWS:
980      try:      try:
981          utest=open('utest.sh','w')          utest=open('utest.sh','w')
982          utest.write(GroupTest.makeHeader(env['PLATFORM']))          utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, False))
983          for tests in TestGroups:          for tests in TestGroups:
984              utest.write(tests.makeString())              utest.write(tests.makeString())
985          utest.close()          utest.close()
986          Execute(Chmod('utest.sh', 0755))          Execute(Chmod('utest.sh', 0o755))
987          print("Generated utest.sh.")          print("Generated utest.sh.")
988            # This version contains only python tests - I want this to be usable
989            # From a binary only install if you have the test files
990            utest=open('itest.sh','w')
991            utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, True))
992            for tests in TestGroups:
993              if tests.exec_cmd=='$PYTHONRUNNER ':
994                utest.write(tests.makeString())
995            utest.close()
996            Execute(Chmod('itest.sh', 0o755))
997            print("Generated itest.sh.")        
998      except IOError:      except IOError:
999          print("Error attempting to write unittests file.")          print("Error attempting to write unittests file.")
1000          Exit(1)          Exit(1)
1001    
1002        # delete utest.sh upon cleanup
1003        env.Clean('target_init', 'utest.sh')
1004        env.Clean('target_init', 'itest.sh')
1005    
1006      # Make sure that the escript wrapper is in place      # Make sure that the escript wrapper is in place
1007      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):      if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
1008          print("Copying escript wrapper.")          print("Copying escript wrapper.")
1009          Execute(Copy(os.path.join(env['bininstall'],'escript'), 'bin/run-escript'))          Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
1010    

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

  ViewVC Help
Powered by ViewVC 1.1.26