/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1705 by ksteube, Thu Aug 14 05:56:40 2008 UTC revision 2300 by gross, Wed Mar 11 08:17:57 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  #              http://www.access.edu.au  # Primary Business: Queensland, Australia
9  #       Primary Business: Queensland, Australia  # Licensed under the Open Software License version 3.0
10  #  Licensed under the Open Software License version 3.0  # http://www.opensource.org/licenses/osl-3.0.php
11  #     http://www.opensource.org/licenses/osl-3.0.php  #
12    ########################################################
13    
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      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 41  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 48  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 56  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 99  opts.AddOptions( Line 115  opts.AddOptions(
115    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
116    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
117  # UMFPACK  # UMFPACK
118    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'yes'),    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
119    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
120    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
121    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
122    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
123    # Silo
124      BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),
125      ('silo_path', 'Path to Silo includes', '/usr/include'),
126      ('silo_lib_path', 'Path to Silo libs', usr_lib),
127      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
128  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
129    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
130    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 111  opts.AddOptions( Line 132  opts.AddOptions(
132  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
133    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
134    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
135    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
136    # An option for specifying the compiler tools set (see windows branch).
137      ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
138    # finer control over library building, intel aggressive global optimisation
139    # works with dynamic libraries on windows.
140      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
141      ('share_paso', 'control static or dynamic paso lib', False)
142  )  )
143    
144  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
# Line 120  opts.AddOptions( Line 147  opts.AddOptions(
147  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
148    
149  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
150        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
151          env = Environment(tools = ['default'] + env['tools_names'],
152                            options = opts)
153  else:  else:
154     if socket.gethostname().split('.')[0] == 'service0':     if socket.gethostname().split('.')[0] == 'service0':
155        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 141  if env['useMPI']: env['usempi'] = 1 Line 170  if env['useMPI']: env['usempi'] = 1
170  # 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)
171  # 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
172    
173    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
174    
175  if env["CC"] == "icc":  if env["CC"] == "icc":
176    # Intel compilers    # Intel compilers
177    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
178    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
179    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
180    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
181    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
182    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
183    pedantic      = ""    pedantic      = ""
184      fatalwarning      = ""        # Switch to turn warnings into errors
185      sysheaderopt      = ""
186  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
187    # GNU C on any system    # GNU C on any system
188    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"
189    #the long long warning occurs on the Mac
190    cc_optim      = "-O3"    cc_optim      = "-O3"
191    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
192    omp_optim     = ""    omp_optim     = "-fopenmp"
193    omp_debug     = ""    omp_debug     = "-fopenmp"
194    omp_libs      = []    omp_libs      = ['gomp']
195    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
196      fatalwarning      = "-Werror"
197      sysheaderopt      = "-isystem "
198  elif env["CC"] == "cl":  elif env["CC"] == "cl":
199    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
200    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 168  elif env["CC"] == "cl": Line 204  elif env["CC"] == "cl":
204    omp_debug     = ""    omp_debug     = ""
205    omp_libs      = []    omp_libs      = []
206    pedantic      = ""    pedantic      = ""
207      fatalwarning      = ""
208      sysheaderopt      = ""
209    elif env["CC"] == "icl":
210      # intel C on Windows, see windows_intelc_options.py for a start
211      pedantic      = ""
212      fatalwarning      = ""
213      sysheaderopt      = ""
214    
215    
216  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
217  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 177  if env["omp_optim"]    == "-DEFAULT_4": env Line 221  if env["omp_optim"]    == "-DEFAULT_4": env
221  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
222  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
223    
224    #set up the autolazy values
225    if env['forcelazy']    != "leave_alone":
226      if env['forcelazy'] == 'on':
227        env.Append(CPPDEFINES='FAUTOLAZYON')
228      else:
229         if env['forcelazy'] == 'off':
230        env.Append(CPPDEFINES='FAUTOLAZYOFF')
231    
232  # 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
233  if not env["useopenmp"]:  if not env["useopenmp"]:
234    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 221  except KeyError: pass Line 273  except KeyError: pass
273  env.PrependENVPath('PYTHONPATH', prefix)  env.PrependENVPath('PYTHONPATH', prefix)
274  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
275    
276    env['ENV']['ESCRIPT_ROOT'] = prefix
277    
278  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
279    
280  # Make a copy of an environment  # Make a copy of an environment
# Line 233  def clone_env(env): Line 287  def clone_env(env):
287  env.Append(CPPPATH      = [Dir('include')])  env.Append(CPPPATH      = [Dir('include')])
288    
289  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
290  env.Append(LIBPATH      = [Dir('lib')])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
   
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
291    
292  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
293    if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
294    
295  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
296    
# Line 245  if env['usepedantic']: env.Append(CCFLAG Line 298  if env['usepedantic']: env.Append(CCFLAG
298  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
299    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.PrependENVPath('PATH',    [env['boost_lib_path']])
300    env.PrependENVPath('PATH',    [env['libinstall']])    env.PrependENVPath('PATH',    [env['libinstall']])
301      if not env['share_esysUtils'] :
302        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
303      if not env['share_paso'] :
304        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
305    
306    if env['usenetcdf']:    if env['usenetcdf']:
307      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])
308    
# Line 275  conf = Configure(clone_env(env)) Line 333  conf = Configure(clone_env(env))
333    
334  # Test that the compiler is working  # Test that the compiler is working
335  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
336    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
337    sys.exit(1)     sys.exit(1)
338    
339  if not conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
340    env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
341    
342  ############ python libraries (required) #######################  ############ python libraries (required) #######################
343    
344  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
345    if not sysheaderopt =="":
346      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
347    else:
348      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
349    
350  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
351  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
352    
353    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs
354    conf.env.PrependENVPath('PYTHONPATH', prefix)
355    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
356    
357  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
358    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'])
359    sys.exit(1)    sys.exit(1)
360  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
361    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'])
362    sys.exit(1)    sys.exit(1)
363    
364  ############ boost (required) ##################################  ############ boost (required) ##################################
365    
366  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
367    # This is required because we can't -isystem /usr/system because it breaks std includes
368      if os.path.normpath(env['boost_path']) =="/usr/include":
369        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
370      else:
371        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
372    else:
373      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
374    
375  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
376  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
377    
378    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs
379    #ensure that our path entries remain at the front
380    conf.env.PrependENVPath('PYTHONPATH', prefix)
381    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
382    
383  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
384    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'])
385    sys.exit(1)    sys.exit(1)
386    
387  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
388    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'])
389    sys.exit(1)    sys.exit(1)
# Line 331  if env['usenetcdf']: Line 412  if env['usenetcdf']:
412    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
413    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
414    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
415      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs
416      #ensure that our path entries remain at the front
417      conf.env.PrependENVPath('PYTHONPATH', prefix)
418      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
419    
420  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
421  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 351  if env['usepapi']: Line 436  if env['usepapi']:
436    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
437    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
438    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
439      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs
440      #ensure that our path entries remain at the front
441      conf.env.PrependENVPath('PYTHONPATH', prefix)
442      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
443    
444  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
445  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 371  if env['usemkl']: Line 460  if env['usemkl']:
460    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
461    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
462    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
463      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs
464      #ensure that our path entries remain at the front
465      conf.env.PrependENVPath('PYTHONPATH', prefix)
466      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
467    
468  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
469  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0
# Line 398  if env['useumfpack']: Line 491  if env['useumfpack']:
491    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
492    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
493    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
494      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs
495      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs
496      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs
497      #ensure that our path entries remain at the front
498      conf.env.PrependENVPath('PYTHONPATH', prefix)
499      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
500    
 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  
501  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
502    if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
503    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
504    
505  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
506  if env['useumfpack']:  if env['useumfpack']:
# Line 409  if env['useumfpack']: Line 509  if env['useumfpack']:
509  else:  else:
510    conf.Finish()    conf.Finish()
511    
512    ############ Silo (optional) ###################################
513    
514    if env['usesilo']:
515      conf = Configure(clone_env(env))
516      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
517      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
518      conf.env.AppendUnique(LIBS = [env['silo_libs']])
519      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
520      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
521      conf.Finish()
522    
523    # Add the path to Silo to environment env if it was found.
524    # Note that we do not add the libs since they are only needed for the
525    # escriptreader library and tools.
526    if env['usesilo']:
527      env.AppendUnique(CPPPATH = [env['silo_path']])
528      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
529      env.Append(CPPDEFINES = ['HAVE_SILO'])
530    
531  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
532    
533  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 423  else: Line 542  else:
542  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
543  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
544    
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 435  if env_mpi['usempi']: Line 566  if env_mpi['usempi']:
566    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
567    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
568    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
569      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs
570      #ensure that our path entries remain at the front
571      conf.env.PrependENVPath('PYTHONPATH', prefix)
572      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
573    
574  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
575  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
# Line 459  if env_mpi['useparmetis']: Line 594  if env_mpi['useparmetis']:
594    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
595    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
596    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
597      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs
598      #ensure that our path entries remain at the front
599      conf.env.PrependENVPath('PYTHONPATH', prefix)
600      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
601    
602  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
603  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 472  else: Line 611  else:
611    
612  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
613    
614    ############ Now we switch on Warnings as errors ###############
615    
616    #this needs to be done after configuration because the scons test files have warnings in them
617    
618    if ((fatalwarning != "") and (env['usewarnings'])):
619      env.Append(CCFLAGS        = fatalwarning)
620      env_mpi.Append(CCFLAGS        = fatalwarning)
621    
622  ############ Summarize our environment #########################  ############ Summarize our environment #########################
623    
624  print ""  print ""
# Line 487  if env['usemkl']: print "  Using MKL" Line 634  if env['usemkl']: print "  Using MKL"
634  else: print "   Not using MKL"  else: print "   Not using MKL"
635  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
636  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
637    if env['usesilo']: print "  Using Silo"
638    else: print "   Not using Silo"
639  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
640  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
641  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI"
# Line 498  else: print "  Not using PAPI" Line 647  else: print "  Not using PAPI"
647  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
648  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
649  print " Installing in", prefix  print " Installing in", prefix
650    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
651    else: print "   Not treating warnings as errors"
652  print ""  print ""
653    
654  ############ Add some custom builders ##########################  ############ Delete option-dependent files #####################
655    
656  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))
657  env.Append(BUILDERS = {'PyCompile' : py_builder});  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))
658    Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))
659    Execute(Delete(env['libinstall'] + "pyversion"))
660    if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))
661    
 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
662    
663  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  ############ Build the subdirectories ##########################
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
664    
665  ############ Build the desired subdirectories ##################  from grouptest import *
666    
667  Export(["env", "env_mpi", "clone_env"])  TestGroups=[]
668    
669    Export(
670      ["env",
671       "env_mpi",
672       "clone_env",
673       "IS_WINDOWS_PLATFORM",
674       "TestGroups"
675       ]
676      )
677    
678  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)
679    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
680  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
681  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
682  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 525  env.SConscript(dirs = ['doc'], build_dir Line 686  env.SConscript(dirs = ['doc'], build_dir
686  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)
687  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)
688  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
689    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
690    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
691    
692    
693  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
694    
# Line 532  remember_list = [] Line 696  remember_list = []
696    
697  if env['usedebug']:  if env['usedebug']:
698    remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))    remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Delete('$TARGET'))  
699    
700  if env['usempi']:  if env['usempi']:
701    remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))    remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Delete('$TARGET'))  
702    
703  if env['omp_optim'] != '':  if env['omp_optim'] != '':
704    remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))    remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Delete('$TARGET'))  
705    
706  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
707    
708    
709    ############### Record python interpreter version ##############
710    
711    if not IS_WINDOWS_PLATFORM:
712      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
713      os.system("echo "+versionstring+" > "+env['libinstall']+"/pyversion")
714    
715  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
716    
717  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 571  build_all_list += ['build_esysUtils'] Line 736  build_all_list += ['build_esysUtils']
736  build_all_list += ['build_paso']  build_all_list += ['build_paso']
737  build_all_list += ['build_escript']  build_all_list += ['build_escript']
738  build_all_list += ['build_finley']  build_all_list += ['build_finley']
739  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
740    if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
741    if env['usesilo']:  build_all_list += ['target_escript2silo']
742  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
743    
744  install_all_list = []  install_all_list = []
# Line 583  install_all_list += ['install_finley'] Line 750  install_all_list += ['install_finley']
750  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
751  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
752  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
753  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
754    if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
755    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
756  install_all_list += ['remember_options']  install_all_list += ['remember_options']
757  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
758    
# Line 596  env.Alias('build_cppunittest', ['target_ Line 765  env.Alias('build_cppunittest', ['target_
765  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
766  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
767  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'])
768    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
769    
770  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
771    
772  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'])
773    
774    if not IS_WINDOWS_PLATFORM:
775       try:
776        utest=open("utest.sh","w")
777        build_platform=os.name      #Sometimes Mac python says it is posix
778        if (build_platform=='posix') and platform.system()=="Darwin":
779            build_platform='darwin'
780        utest.write(GroupTest.makeHeader(build_platform))
781        for tests in TestGroups:
782            utest.write(tests.makeString())
783        utest.close()
784        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
785        print "utest.sh written"
786       except IOError:
787        print "Error attempting to write unittests file."
788        sys.exit(1)
789    

Legend:
Removed from v.1705  
changed lines
  Added in v.2300

  ViewVC Help
Powered by ViewVC 1.1.26