/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1729 by ksteube, Tue Aug 26 06:48:40 2008 UTC revision 2338 by jfenwick, Fri Mar 27 05:01:49 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 236  env.Append(CPPPATH     = [Dir('include')]) Line 290  env.Append(CPPPATH     = [Dir('include')])
290  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
291  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
292    
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
   
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
# 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    
547    ############ Add some custom builders ##########################
548    
549    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
550    env.Append(BUILDERS = {'PyCompile' : py_builder});
551    
552    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
553    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
554    
555    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
556    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
557    
558  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
559    
560  # 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 436  if env_mpi['usempi']: Line 567  if env_mpi['usempi']:
567    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
568    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
569    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
570      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs
571      #ensure that our path entries remain at the front
572      conf.env.PrependENVPath('PYTHONPATH', prefix)
573      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
574    
575  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
576  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
577    
578  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
579  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 460  if env_mpi['useparmetis']: Line 595  if env_mpi['useparmetis']:
595    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
596    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
597    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
598      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs
599      #ensure that our path entries remain at the front
600      conf.env.PrependENVPath('PYTHONPATH', prefix)
601      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
602    
603  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
604  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 612  else:
612    
613  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
614    
615    ############ Now we switch on Warnings as errors ###############
616    
617    #this needs to be done after configuration because the scons test files have warnings in them
618    
619    if ((fatalwarning != "") and (env['usewarnings'])):
620      env.Append(CCFLAGS        = fatalwarning)
621      env_mpi.Append(CCFLAGS        = fatalwarning)
622    
623  ############ Summarize our environment #########################  ############ Summarize our environment #########################
624    
625  print ""  print ""
# Line 488  if env['usemkl']: print "  Using MKL" Line 635  if env['usemkl']: print "  Using MKL"
635  else: print "   Not using MKL"  else: print "   Not using MKL"
636  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
637  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
638    if env['usesilo']: print "  Using Silo"
639    else: print "   Not using Silo"
640  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
641  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
642  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI"
# Line 499  else: print "  Not using PAPI" Line 648  else: print "  Not using PAPI"
648  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
649  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
650  print " Installing in", prefix  print " Installing in", prefix
651    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
652    else: print "   Not treating warnings as errors"
653  print ""  print ""
654    
655  ############ 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 ##################  
656    
657  Export(["env", "env_mpi", "clone_env"])  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
658    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
659    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
660    Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
661    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
662    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
663    
664    
665    ############ Build the subdirectories ##########################
666    
667    from grouptest import *
668    
669    TestGroups=[]
670    
671    Export(
672      ["env",
673       "env_mpi",
674       "clone_env",
675       "IS_WINDOWS_PLATFORM",
676       "TestGroups"
677       ]
678      )
679    
680  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)
681    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
682  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
683  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
684  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 688  env.SConscript(dirs = ['doc'], build_dir
688  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)
689  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)
690  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
691    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
692    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
693    
694    
695  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
696    
697  remember_list = []  remember_list = []
698    
699  if env['usedebug']:  if env['usedebug']:
700    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'))  
701    
702  if env['usempi']:  if env['usempi']:
703    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'))  
704    
705  if env['omp_optim'] != '':  if env['useopenmp']:
706    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'))  
707    
708  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
709    
710    
711    ############### Record python interpreter version ##############
712    
713    if not IS_WINDOWS_PLATFORM:
714      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
715      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
716    
717    ############## Populate the buildvars file #####################
718    
719    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
720    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
721    
722    # Find the boost version by extracting it from version.hpp
723    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
724    boostversion='unknown'
725    try:
726        for line in boosthpp:
727            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
728            if ver:
729                boostversion=ver.group(1)
730    except StopIteration:
731        pass
732    buildvars.write("boost="+boostversion+"\n")
733    buildvars.write("svn_revision="+str(global_revision)+"\n")
734    out="usedebug="
735    if env['usedebug']:
736        out+="y"
737    else:
738        out+="n"
739    out+="\nusempi="
740    if env['usempi']:
741        out+="y"
742    else:
743        out+="n"
744    out+="\nuseopenmp="
745    if env['useopenmp']:
746        out+="y"
747    else:
748        out+="n"
749    buildvars.write(out+"\n")
750    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
751    
752    buildvars.close()
753    
754    
755  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
756    
757  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 776  build_all_list += ['build_esysUtils']
776  build_all_list += ['build_paso']  build_all_list += ['build_paso']
777  build_all_list += ['build_escript']  build_all_list += ['build_escript']
778  build_all_list += ['build_finley']  build_all_list += ['build_finley']
779  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
780    if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
781    if env['usesilo']:  build_all_list += ['target_escript2silo']
782  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
783    
784  install_all_list = []  install_all_list = []
# Line 584  install_all_list += ['install_finley'] Line 790  install_all_list += ['install_finley']
790  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
791  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
792  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
793  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
794    if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
795    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
796  install_all_list += ['remember_options']  install_all_list += ['remember_options']
797  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
798    
# Line 597  env.Alias('build_cppunittest', ['target_ Line 805  env.Alias('build_cppunittest', ['target_
805  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
806  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
807  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'])
808    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
809    
810  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
811    
812  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'])
813    
814    if not IS_WINDOWS_PLATFORM:
815       try:
816        utest=open("utest.sh","w")
817        build_platform=os.name      #Sometimes Mac python says it is posix
818        if (build_platform=='posix') and platform.system()=="Darwin":
819            build_platform='darwin'
820        utest.write(GroupTest.makeHeader(build_platform))
821        for tests in TestGroups:
822            utest.write(tests.makeString())
823        utest.close()
824        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
825        print "utest.sh written"
826       except IOError:
827        print "Error attempting to write unittests file."
828        sys.exit(1)
829    

Legend:
Removed from v.1729  
changed lines
  Added in v.2338

  ViewVC Help
Powered by ViewVC 1.1.26