/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1708 by ksteube, Thu Aug 14 22:42:24 2008 UTC revision 2358 by gross, Wed Apr 1 22:25:24 2009 UTC
# Line 1  Line 1 
1  #         Copyright 2006 by ACcESS MNRF  
2    ########################################################
3    #
4    # Copyright (c) 2003-2008 by University of Queensland
5    # Earth Systems Science Computational Center (ESSCC)
6    # http://www.uq.edu.au/esscc
7    #
8    # Primary Business: Queensland, Australia
9    # Licensed under the Open Software License version 3.0
10    # http://www.opensource.org/licenses/osl-3.0.php
11  #  #
12  #              http://www.access.edu.au  ########################################################
13  #       Primary Business: Queensland, Australia  
 #  Licensed under the Open Software License version 3.0  
 #     http://www.opensource.org/licenses/osl-3.0.php  
14    
15  EnsureSConsVersion(0,96,91)  EnsureSConsVersion(0,96,91)
16  EnsurePythonVersion(2,3)  EnsurePythonVersion(2,3)
17    
18  import sys, os, re, socket  import sys, os, re, socket, platform, stat
19    
20  # Add our extensions  # Add our extensions
21  if os.path.isdir('scons'): sys.path.append('scons')  if os.path.isdir('scons'): sys.path.append('scons')
# Line 30  prefix = ARGUMENTS.get('prefix', Dir('#. Line 37  prefix = ARGUMENTS.get('prefix', Dir('#.
37  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])
38  tmp = os.path.join("scons",hostname+"_options.py")  tmp = os.path.join("scons",hostname+"_options.py")
39  options_file = ARGUMENTS.get('options_file', tmp)  options_file = ARGUMENTS.get('options_file', tmp)
40  if not os.path.isfile(options_file): options_file = False  if not os.path.isfile(options_file):
41  else: print "Options file is", options_file    options_file = False
42      print "Options file not found (expected '%s')" % tmp
43    else:
44      print "Options file is", options_file
45    
46  # Load options file and command-line arguments  # Load options file and command-line arguments
47  opts = Options(options_file, ARGUMENTS)  opts = Options(options_file, ARGUMENTS)
# Line 42  opts.AddOptions( Line 52  opts.AddOptions(
52  # Where to install esys stuff  # Where to install esys stuff
53    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
54    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),
55      ('bininstall', 'where the esys binaries will be installed',            os.path.join(prefix,'bin')),
56    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),
57    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),
58  # Compilation options  # Compilation options
# Line 49  opts.AddOptions( Line 60  opts.AddOptions(
60    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolOption('usedebug', 'Do you want a debug build?', 'no'),
61    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),
62    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),
63      ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
64    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below
65    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
66    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),
# Line 57  opts.AddOptions( Line 69  opts.AddOptions(
69    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
70    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
71    ('cc_extra', 'Extra C/C++ flags', ''),    ('cc_extra', 'Extra C/C++ flags', ''),
72      ('ld_extra', 'Extra linker flags', ''),
73    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
74    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
75    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'),
76    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'yes'),    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
77      BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),
78      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
79  # Python  # Python
80    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
81    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 83  opts.AddOptions( Line 98  opts.AddOptions(
98    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
99    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
100    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),
101      ('mpi_flavour','Type of MPI execution environment','none'),
102  # ParMETIS  # ParMETIS
103    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
104    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
# Line 105  opts.AddOptions( Line 121  opts.AddOptions(
121    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
122    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
123    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
124    # Silo
125      BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),
126      ('silo_path', 'Path to Silo includes', '/usr/include'),
127      ('silo_lib_path', 'Path to Silo libs', usr_lib),
128      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
129  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
130    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
131    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 112  opts.AddOptions( Line 133  opts.AddOptions(
133  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
134    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
135    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
136    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
137    # An option for specifying the compiler tools set (see windows branch).
138      ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
139    # finer control over library building, intel aggressive global optimisation
140    # works with dynamic libraries on windows.
141      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
142      ('share_paso', 'control static or dynamic paso lib', False)
143  )  )
144    
145  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
# Line 121  opts.AddOptions( Line 148  opts.AddOptions(
148  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
149    
150  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
151        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
152          env = Environment(tools = ['default'] + env['tools_names'],
153                            options = opts)
154  else:  else:
155     if socket.gethostname().split('.')[0] == 'service0':     if socket.gethostname().split('.')[0] == 'service0':
156        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 142  if env['useMPI']: env['usempi'] = 1 Line 171  if env['useMPI']: env['usempi'] = 1
171  # Default compiler options (override allowed in hostname_options.py, but should not be necessary)  # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
172  # For both C and C++ you get: cc_flags and either the optim flags or debug flags  # For both C and C++ you get: cc_flags and either the optim flags or debug flags
173    
174    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
175    
176  if env["CC"] == "icc":  if env["CC"] == "icc":
177    # Intel compilers    # Intel compilers
178    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
179    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
180    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
181    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
182    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
183    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
184    pedantic      = ""    pedantic      = ""
185      fatalwarning      = ""        # Switch to turn warnings into errors
186      sysheaderopt      = ""
187  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
188    # GNU C on any system    # GNU C on any system
189    cc_flags      = "-fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER"    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
190    #the long long warning occurs on the Mac
191    cc_optim      = "-O3"    cc_optim      = "-O3"
192    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
193    omp_optim     = ""    omp_optim     = "-fopenmp"
194    omp_debug     = ""    omp_debug     = "-fopenmp"
195    omp_libs      = []    omp_libs      = ['gomp']
196    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
197      fatalwarning      = "-Werror"
198      sysheaderopt      = "-isystem "
199  elif env["CC"] == "cl":  elif env["CC"] == "cl":
200    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
201    cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"    cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
# Line 169  elif env["CC"] == "cl": Line 205  elif env["CC"] == "cl":
205    omp_debug     = ""    omp_debug     = ""
206    omp_libs      = []    omp_libs      = []
207    pedantic      = ""    pedantic      = ""
208      fatalwarning      = ""
209      sysheaderopt      = ""
210    elif env["CC"] == "icl":
211      # intel C on Windows, see windows_intelc_options.py for a start
212      pedantic      = ""
213      fatalwarning      = ""
214      sysheaderopt      = ""
215    
216    
217  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
218  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 178  if env["omp_optim"]    == "-DEFAULT_4": env Line 222  if env["omp_optim"]    == "-DEFAULT_4": env
222  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
223  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
224    
225    #set up the autolazy values
226    if env['forcelazy']    != "leave_alone":
227      if env['forcelazy'] == 'on':
228        env.Append(CPPDEFINES='FAUTOLAZYON')
229      else:
230         if env['forcelazy'] == 'off':
231        env.Append(CPPDEFINES='FAUTOLAZYOFF')
232    
233  # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty  # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
234  if not env["useopenmp"]:  if not env["useopenmp"]:
235    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 222  except KeyError: pass Line 274  except KeyError: pass
274  env.PrependENVPath('PYTHONPATH', prefix)  env.PrependENVPath('PYTHONPATH', prefix)
275  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
276    
277    env['ENV']['ESCRIPT_ROOT'] = prefix
278    
279  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
280    
281  # Make a copy of an environment  # Make a copy of an environment
# Line 234  def clone_env(env): Line 288  def clone_env(env):
288  env.Append(CPPPATH      = [Dir('include')])  env.Append(CPPPATH      = [Dir('include')])
289    
290  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
291  env.Append(LIBPATH      = [Dir('lib')])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
   
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
292    
293  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
294    if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
295    
296  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
297    
298  # MS Windows  # MS Windows
299  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
300    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
301    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
302      if not env['share_esysUtils'] :
303        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
304      if not env['share_paso'] :
305        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
306    
307    if env['usenetcdf']:    if env['usenetcdf']:
308      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
309    
310  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
311    
# Line 276  conf = Configure(clone_env(env)) Line 334  conf = Configure(clone_env(env))
334    
335  # Test that the compiler is working  # Test that the compiler is working
336  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
337    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
338    sys.exit(1)     sys.exit(1)
339    
340  if not conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
341    env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
342    
343  ############ python libraries (required) #######################  ############ python libraries (required) #######################
344    
345  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
346    if not sysheaderopt =="":
347      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
348    else:
349      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
350    
351  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
352  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
353    
354    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs
355    conf.env.PrependENVPath('PYTHONPATH', prefix)
356    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
357    
358  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
359    print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])    print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])
360    sys.exit(1)    sys.exit(1)
361  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
362    print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])    print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
363    sys.exit(1)    sys.exit(1)
364    
365  ############ boost (required) ##################################  ############ boost (required) ##################################
366    
367  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
368    # This is required because we can't -isystem /usr/system because it breaks std includes
369      if os.path.normpath(env['boost_path']) =="/usr/include":
370        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
371      else:
372        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
373    else:
374      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
375    
376  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
377  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
378    
379    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs
380    #ensure that our path entries remain at the front
381    conf.env.PrependENVPath('PYTHONPATH', prefix)
382    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
383    
384  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
385    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
386    sys.exit(1)    sys.exit(1)
387    
388  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
389    print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])    print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])
390    sys.exit(1)    sys.exit(1)
# Line 332  if env['usenetcdf']: Line 413  if env['usenetcdf']:
413    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
414    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
415    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
416      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs
417      #ensure that our path entries remain at the front
418      conf.env.PrependENVPath('PYTHONPATH', prefix)
419      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
420    
421  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
422  if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0
# Line 352  if env['usepapi']: Line 437  if env['usepapi']:
437    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
438    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
439    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
440      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs
441      #ensure that our path entries remain at the front
442      conf.env.PrependENVPath('PYTHONPATH', prefix)
443      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
444    
445  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
446  if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0
# Line 372  if env['usemkl']: Line 461  if env['usemkl']:
461    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
462    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
463    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
464      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs
465      #ensure that our path entries remain at the front
466      conf.env.PrependENVPath('PYTHONPATH', prefix)
467      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
468    
469  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
470  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
471    
472  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
473  if env['usemkl']:  if env['usemkl']:
# Line 399  if env['useumfpack']: Line 492  if env['useumfpack']:
492    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
493    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
494    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
495      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs
496      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs
497      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs
498      #ensure that our path entries remain at the front
499      conf.env.PrependENVPath('PYTHONPATH', prefix)
500      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
501    
 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  
502  if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
503    if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
504    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
505    
506  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
507  if env['useumfpack']:  if env['useumfpack']:
# Line 410  if env['useumfpack']: Line 510  if env['useumfpack']:
510  else:  else:
511    conf.Finish()    conf.Finish()
512    
513    ############ Silo (optional) ###################################
514    
515    if env['usesilo']:
516      conf = Configure(clone_env(env))
517      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
518      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
519      conf.env.AppendUnique(LIBS = [env['silo_libs']])
520      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
521      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
522      conf.Finish()
523    
524    # Add the path to Silo to environment env if it was found.
525    # Note that we do not add the libs since they are only needed for the
526    # escriptreader library and tools.
527    if env['usesilo']:
528      env.AppendUnique(CPPPATH = [env['silo_path']])
529      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
530      env.Append(CPPDEFINES = ['HAVE_SILO'])
531    
532  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
533    
534  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 424  else: Line 543  else:
543  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
544  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
545    
546    ############ Add some custom builders ##########################
547    
548    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
549    env.Append(BUILDERS = {'PyCompile' : py_builder});
550    
551    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
552    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
553    
554    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
555    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
556    
557  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
558    
559  # Create a modified environment for MPI programs (identical to env if usempi=no)  # Create a modified environment for MPI programs (identical to env if usempi=no)
# Line 433  env_mpi = clone_env(env) Line 563  env_mpi = clone_env(env)
563  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
564    
565  if env_mpi['usempi']:  if env_mpi['usempi']:
566      VALID_MPIs=[ "MPT", "OPENMPI", "MPICH", "OPENMPI", "INTELMPI" ]
567      if not env_mpi['mpi_flavour'] in VALID_MPIs:
568          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
569    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
570    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
571    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
572      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs
573      #ensure that our path entries remain at the front
574      conf.env.PrependENVPath('PYTHONPATH', prefix)
575      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
576    
577  if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0  if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0
578  if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0  # if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
579    
580  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
581  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 460  if env_mpi['useparmetis']: Line 597  if env_mpi['useparmetis']:
597    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
598    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
599    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
600      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs
601      #ensure that our path entries remain at the front
602      conf.env.PrependENVPath('PYTHONPATH', prefix)
603      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
604    
605  if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0  if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0
606  if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0  if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0
# Line 473  else: Line 614  else:
614    
615  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
616    
617    ############ Now we switch on Warnings as errors ###############
618    
619    #this needs to be done after configuration because the scons test files have warnings in them
620    
621    if ((fatalwarning != "") and (env['usewarnings'])):
622      env.Append(CCFLAGS        = fatalwarning)
623      env_mpi.Append(CCFLAGS        = fatalwarning)
624    
625  ############ Summarize our environment #########################  ############ Summarize our environment #########################
626    
627  print ""  print ""
# Line 488  if env['usemkl']: print "  Using MKL" Line 637  if env['usemkl']: print "  Using MKL"
637  else: print "   Not using MKL"  else: print "   Not using MKL"
638  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
639  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
640    if env['usesilo']: print "  Using Silo"
641    else: print "   Not using Silo"
642  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
643  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
644  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
645  else: print "   Not using MPI"  else: print "   Not using MPI"
646  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
647  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 499  else: print "  Not using PAPI" Line 650  else: print "  Not using PAPI"
650  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
651  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
652  print " Installing in", prefix  print " Installing in", prefix
653    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
654    else: print "   Not treating warnings as errors"
655  print ""  print ""
656    
657  ############ Add some custom builders ##########################  ############ Delete option-dependent files #####################
   
 py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  
 env.Append(BUILDERS = {'PyCompile' : py_builder});  
   
 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
   
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
   
 ############ Build the desired subdirectories ##################  
658    
659  Export(["env", "env_mpi", "clone_env"])  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
660    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
661    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
662    Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
663    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
664    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
665    
666    
667    ############ Build the subdirectories ##########################
668    
669    from grouptest import *
670    
671    TestGroups=[]
672    
673    Export(
674      ["env",
675       "env_mpi",
676       "clone_env",
677       "IS_WINDOWS_PLATFORM",
678       "TestGroups"
679       ]
680      )
681    
682  env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
683    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
684  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
685  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
686  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
# Line 526  env.SConscript(dirs = ['doc'], build_dir Line 690  env.SConscript(dirs = ['doc'], build_dir
690  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
691  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
692  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
693    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
694    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
695    
696    
697  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
698    
699  remember_list = []  remember_list = []
700    
701  if env['usedebug']:  if env['usedebug']:
702    remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Delete('$TARGET'))  
703    
704  if env['usempi']:  if env['usempi']:
705    remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Delete('$TARGET'))  
706    
707  if env['omp_optim'] != '':  if env['useopenmp']:
708    remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Delete('$TARGET'))  
709    
710  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
711    
712    
713    ############### Record python interpreter version ##############
714    
715    if not IS_WINDOWS_PLATFORM:
716      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
717      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
718    
719    ############## Populate the buildvars file #####################
720    
721    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
722    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
723    
724    # Find the boost version by extracting it from version.hpp
725    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
726    boostversion='unknown'
727    try:
728        for line in boosthpp:
729            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
730            if ver:
731                boostversion=ver.group(1)
732    except StopIteration:
733        pass
734    buildvars.write("boost="+boostversion+"\n")
735    buildvars.write("svn_revision="+str(global_revision)+"\n")
736    out="usedebug="
737    if env['usedebug']:
738        out+="y"
739    else:
740        out+="n"
741    out+="\nusempi="
742    if env['usempi']:
743        out+="y"
744    else:
745        out+="n"
746    out+="\nuseopenmp="
747    if env['useopenmp']:
748        out+="y"
749    else:
750        out+="n"
751    buildvars.write(out+"\n")
752    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
753    
754    buildvars.close()
755    
756    
757  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
758    
759  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 572  build_all_list += ['build_esysUtils'] Line 778  build_all_list += ['build_esysUtils']
778  build_all_list += ['build_paso']  build_all_list += ['build_paso']
779  build_all_list += ['build_escript']  build_all_list += ['build_escript']
780  build_all_list += ['build_finley']  build_all_list += ['build_finley']
781  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
782    if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
783    if env['usesilo']:  build_all_list += ['target_escript2silo']
784  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
785    
786  install_all_list = []  install_all_list = []
# Line 584  install_all_list += ['install_finley'] Line 792  install_all_list += ['install_finley']
792  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
793  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
794  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
795  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
796    if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
797    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
798  install_all_list += ['remember_options']  install_all_list += ['remember_options']
799  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
800    
# Line 597  env.Alias('build_cppunittest', ['target_ Line 807  env.Alias('build_cppunittest', ['target_
807  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
808  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
809  env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])  env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])
810    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
811    
812  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
813    
814  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
815    
816    if not IS_WINDOWS_PLATFORM:
817       try:
818        utest=open("utest.sh","w")
819        build_platform=os.name      #Sometimes Mac python says it is posix
820        if (build_platform=='posix') and platform.system()=="Darwin":
821            build_platform='darwin'
822        utest.write(GroupTest.makeHeader(build_platform))
823        for tests in TestGroups:
824            utest.write(tests.makeString())
825        utest.close()
826        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
827        print "utest.sh written"
828       except IOError:
829        print "Error attempting to write unittests file."
830        sys.exit(1)
831    

Legend:
Removed from v.1708  
changed lines
  Added in v.2358

  ViewVC Help
Powered by ViewVC 1.1.26