/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1753 by ksteube, Sun Sep 7 22:01:23 2008 UTC revision 2276 by jfenwick, Tue Feb 17 06:21:31 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
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', 'yes'),
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 105  opts.AddOptions( Line 120  opts.AddOptions(
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 112  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 121  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 142  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     = ""
193    omp_debug     = ""    omp_debug     = ""
194    omp_libs      = []    omp_libs      = []
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 169  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 178  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 186  if not env["useopenmp"]: Line 237  if not env["useopenmp"]:
237    
238  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
239    
 Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  
 Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  
 Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  
 if not env['useMPI']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  
   
240  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
241    
242  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
# Line 227  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 241  env.Append(CPPPATH     = [Dir('include')]) Line 289  env.Append(CPPPATH     = [Dir('include')])
289  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
290  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
291    
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
   
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 251  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 284  if not conf.CheckFunc('printf'): Line 336  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    
355  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
356    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'])
357    sys.exit(1)    sys.exit(1)
# Line 302  if not conf.CheckFunc('Py_Main'): Line 361  if not conf.CheckFunc('Py_Main'):
361    
362  ############ boost (required) ##################################  ############ boost (required) ##################################
363    
364  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
365      conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path']+'boost')
366    else:
367      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
368    
369  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
370  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
371    
372    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs
373    
374  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
375    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'])
376    sys.exit(1)    sys.exit(1)
# Line 337  if env['usenetcdf']: Line 402  if env['usenetcdf']:
402    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
403    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
404    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
405      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs
406    
407  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
408  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 357  if env['usepapi']: Line 423  if env['usepapi']:
423    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
424    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
425    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
426      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs
427    
428  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
429  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 377  if env['usemkl']: Line 444  if env['usemkl']:
444    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
445    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
446    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
447      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs
448    
449  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
450  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0
# Line 404  if env['useumfpack']: Line 472  if env['useumfpack']:
472    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
473    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
474    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
475      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs
476      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs
477      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs
478    
479  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
480  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
481    if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
482    
483  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
484  if env['useumfpack']:  if env['useumfpack']:
# Line 415  if env['useumfpack']: Line 487  if env['useumfpack']:
487  else:  else:
488    conf.Finish()    conf.Finish()
489    
490    ############ Silo (optional) ###################################
491    
492    if env['usesilo']:
493      conf = Configure(clone_env(env))
494      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
495      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
496      conf.env.AppendUnique(LIBS = [env['silo_libs']])
497      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
498      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
499      conf.Finish()
500    
501    # Add the path to Silo to environment env if it was found.
502    # Note that we do not add the libs since they are only needed for the
503    # escriptreader library and tools.
504    if env['usesilo']:
505      env.AppendUnique(CPPPATH = [env['silo_path']])
506      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
507      env.Append(CPPDEFINES = ['HAVE_SILO'])
508    
509  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
510    
511  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 429  else: Line 520  else:
520  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
521  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
522    
523    
524    ############ Add some custom builders ##########################
525    
526    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
527    env.Append(BUILDERS = {'PyCompile' : py_builder});
528    
529    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
530    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
531    
532    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
533    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
534    
535  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
536    
537  # 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 441  if env_mpi['usempi']: Line 544  if env_mpi['usempi']:
544    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
545    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
546    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
547      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs
548    
549  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
550  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 465  if env_mpi['useparmetis']: Line 569  if env_mpi['useparmetis']:
569    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
570    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
571    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
572      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs
573    
574  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
575  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 478  else: Line 583  else:
583    
584  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
585    
586    ############ Now we switch on Warnings as errors ###############
587    
588    #this needs to be done after configuration because the scons test files have warnings in them
589    
590    if ((fatalwarning != "") and (env['usewarnings'])):
591      env.Append(CCFLAGS        = fatalwarning)
592      env_mpi.Append(CCFLAGS        = fatalwarning)
593    
594  ############ Summarize our environment #########################  ############ Summarize our environment #########################
595    
596  print ""  print ""
# Line 493  if env['usemkl']: print "  Using MKL" Line 606  if env['usemkl']: print "  Using MKL"
606  else: print "   Not using MKL"  else: print "   Not using MKL"
607  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
608  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
609    if env['usesilo']: print "  Using Silo"
610    else: print "   Not using Silo"
611  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
612  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
613  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI"
# Line 504  else: print "  Not using PAPI" Line 619  else: print "  Not using PAPI"
619  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
620  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
621  print " Installing in", prefix  print " Installing in", prefix
622    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
623    else: print "   Not treating warnings as errors"
624  print ""  print ""
625    
626  ############ Add some custom builders ##########################  ############ Delete option-dependent files #####################
627    
628  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))
629  env.Append(BUILDERS = {'PyCompile' : py_builder});  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))
630    Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))
631    if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))
632    
 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
633    
634  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  ############ Build the subdirectories ##########################
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
635    
636  ############ Build the desired subdirectories ##################  from grouptest import *
637    
638  Export(["env", "env_mpi", "clone_env"])  TestGroups=[]
639    
640    Export(
641      ["env",
642       "env_mpi",
643       "clone_env",
644       "IS_WINDOWS_PLATFORM",
645       "TestGroups"
646       ]
647      )
648    
649  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)
650    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
651  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
652  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
653  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 531  env.SConscript(dirs = ['doc'], build_dir Line 657  env.SConscript(dirs = ['doc'], build_dir
657  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)
658  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)
659  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
660    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
661    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
662    
663    
664  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
665    
# Line 571  build_all_list += ['build_esysUtils'] Line 700  build_all_list += ['build_esysUtils']
700  build_all_list += ['build_paso']  build_all_list += ['build_paso']
701  build_all_list += ['build_escript']  build_all_list += ['build_escript']
702  build_all_list += ['build_finley']  build_all_list += ['build_finley']
703  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
704    if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']
705    if env['usesilo']:  build_all_list += ['target_escript2silo']
706  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
707    
708  install_all_list = []  install_all_list = []
# Line 583  install_all_list += ['install_finley'] Line 714  install_all_list += ['install_finley']
714  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
715  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
716  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
717  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
718    if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']
719    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
720  install_all_list += ['remember_options']  install_all_list += ['remember_options']
721  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
722    
# Line 601  env.Alias('all_tests', ['install_all', ' Line 734  env.Alias('all_tests', ['install_all', '
734    
735  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'])
736    
737    if not IS_WINDOWS_PLATFORM:
738       try:
739        utest=open("utest.sh","w")
740        build_platform=os.name      #Sometimes Mac python says it is posix
741        if (build_platform=='posix') and platform.system()=="Darwin":
742            build_platform='darwin'
743        utest.write(GroupTest.makeHeader(build_platform))
744        for tests in TestGroups:
745            utest.write(tests.makeString())
746        utest.close()
747        print "utest.sh written"
748       except IOError:
749        print "Error attempting to write unittests file."
750        sys.exit(1)
751    

Legend:
Removed from v.1753  
changed lines
  Added in v.2276

  ViewVC Help
Powered by ViewVC 1.1.26