/[escript]/branches/diaplayground/SConstruct
ViewVC logotype

Diff of /branches/diaplayground/SConstruct

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

revision 2276 by jfenwick, Tue Feb 17 06:21:31 2009 UTC revision 2884 by jfenwick, Thu Jan 28 05:00:59 2010 UTC
# Line 1  Line 1 
1    
2  ########################################################  ########################################################
3  #  #
4  # Copyright (c) 2003-2008 by University of Queensland  # Copyright (c) 2003-2010 by University of Queensland
5  # Earth Systems Science Computational Center (ESSCC)  # Earth Systems Science Computational Center (ESSCC)
6  # http://www.uq.edu.au/esscc  # http://www.uq.edu.au/esscc
7  #  #
# Line 15  Line 15 
15  EnsureSConsVersion(0,96,91)  EnsureSConsVersion(0,96,91)
16  EnsurePythonVersion(2,3)  EnsurePythonVersion(2,3)
17    
18  import sys, os, re, socket, platform  import sys, os, re, socket, platform, stat
19    # For copy()
20    import shutil
21    
22  # Add our extensions  # Add our extensions
23  if os.path.isdir('scons'): sys.path.append('scons')  if os.path.isdir('scons'): sys.path.append('scons')
# Line 33  IS_WINDOWS_PLATFORM = (os.name== "nt") Line 35  IS_WINDOWS_PLATFORM = (os.name== "nt")
35    
36  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
37    
38  # Read configuration options from file scons/<hostname>_options.py  #Holds names of variables from the calling environment which need to be passed
39  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])  #to tools
40  tmp = os.path.join("scons",hostname+"_options.py")  env_export=[]
41  options_file = ARGUMENTS.get('options_file', tmp)  
42    #Determine where to read options from use:
43    #1. command line
44    #2. scons/<hostname>_options.py
45    #3. name as part of a cluster
46    options_file=ARGUMENTS.get('options_file', None)
47    effective_hostname=socket.gethostname().split('.')[0]
48    if not options_file:
49      mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
50      options_file = os.path.join("scons",mangledhostname+"_options.py")
51      #If there is no options file with that name see if there is a substitute
52      if not os.path.isfile(options_file):
53        effective_hostname = scons_extensions.effectiveName(effective_hostname)
54        mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
55        options_file = os.path.join("scons",mangledhostname+"_options.py")
56    
57  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
58      print "Options file not found (expected '%s')" % options_file
59    options_file = False    options_file = False
   print "Options file not found (expected '%s')" % tmp  
60  else:  else:
61    print "Options file is", options_file    print "Options file is", options_file
62    
63  # Load options file and command-line arguments  #Does our scons support the newer Variables class or do we need to use Options?
64  opts = Options(options_file, ARGUMENTS)  
65    try:
66       dummyvar=Variables
67       opts = Variables(options_file, ARGUMENTS)
68       adder = opts.AddVariables
69    except:
70       opts = Options(options_file, ARGUMENTS)
71       adder = opts.AddOptions
72       BoolVariable = BoolOption
73    
74  ############ Load build options ################################  ############ Load build options ################################
75    
76  opts.AddOptions(  adder(
77    #opts.AddOptions(
78  # Where to install esys stuff  # Where to install esys stuff
79    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
80    ('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')),
# Line 56  opts.AddOptions( Line 82  opts.AddOptions(
82    ('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')),
83    ('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')),
84  # Compilation options  # Compilation options
85    BoolOption('dodebug', 'For backwards compatibility', 'no'),    BoolVariable('dodebug', 'For backwards compatibility', 'no'),
86    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolVariable('usedebug', 'Do you want a debug build?', 'no'),
87    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolVariable('usevtk', 'Do you want to use VTK?', 'yes'),
88    ('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),
89      ('cc', 'path to C compiler', 'DEFAULT'),
90      ('cxx', 'path to C++ compiler', 'DEFAULT'),
91    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
92    # 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
93    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
# Line 72  opts.AddOptions( Line 100  opts.AddOptions(
100    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
101    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
102    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
103    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
104    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
105    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
106    ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),    ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
107      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
108  # Python  # Python
109    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
110    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 86  opts.AddOptions( Line 115  opts.AddOptions(
115    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
116    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
117  # NetCDF  # NetCDF
118    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
119    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
120    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
121    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
122  # MPI  # MPI
123    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
124    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
125    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
126    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
127    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
128    ('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),
129    ('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!)', []),
130      ('mpi_flavour','Type of MPI execution environment','none'),
131  # ParMETIS  # ParMETIS
132    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
133    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
134    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
135    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
136  # PAPI  # PAPI
137    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
138    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
139    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
140    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
141    BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),    BoolVariable('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
142  # MKL  # MKL
143    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
144    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
145    ('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'),
146    ('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']),
147  # UMFPACK  # UMFPACK
148    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
149    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
150    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
151    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
152    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
153  # Silo  # Silo
154    BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),    BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
155    ('silo_path', 'Path to Silo includes', '/usr/include'),    ('silo_path', 'Path to Silo includes', '/usr/include'),
156    ('silo_lib_path', 'Path to Silo libs', usr_lib),    ('silo_lib_path', 'Path to Silo libs', usr_lib),
157    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
# Line 133  opts.AddOptions( Line 163  opts.AddOptions(
163    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
164    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
165    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
166    #Lapack options
167      BoolVariable('uselapack','switch on/off use of Lapack','no'),
168      ('lapack_path', 'Path to Lapack includes','/usr/include'),
169      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
170      ('lapack_libs', 'Lapack libraries to link with', []),
171      ('lapack_type', '{clapack,mkl}','clapack'),
172  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
173    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
174  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
175  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
176    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
177    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
178      ('env_export','Environment variables to be passed to children',[]),
179    #To enable passing function pointers through python
180      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
181  )  )
182    
183    
184    
185  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
186    
187  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 151  if IS_WINDOWS_PLATFORM: Line 192  if IS_WINDOWS_PLATFORM:
192        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
193                          options = opts)                          options = opts)
194  else:  else:
195     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
196        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
197     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
198        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 159  else: Line 200  else:
200           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
201     else:     else:
202        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
203    
204    # Override compiler choice if provided
205    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
206    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
207    
208  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
209    
210    ############ Make sure target directories exist ################
211    
212    if not os.path.isdir(env['bininstall']):
213        os.makedirs(env['bininstall'])
214    if not os.path.isdir(env['libinstall']):
215        os.makedirs(env['libinstall'])
216    if not os.path.isdir(env['pyinstall']):
217        os.makedirs(env['pyinstall'])
218    
219    ########## Copy required environment vars ######################
220    
221    for i in env['env_export']:
222       env.Append(ENV = {i:os.environ[i]})
223    
224  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
225    
226  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 172  if env['useMPI']: env['usempi'] = 1 Line 232  if env['useMPI']: env['usempi'] = 1
232    
233  sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.  sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
234    
235    cc_flags = ""
236    cc_optim = ""
237    cc_debug = ""
238    omp_optim = ""
239    omp_debug = ""
240    omp_libs = []
241    
242  if env["CC"] == "icc":  if env["CC"] == "icc":
243    # Intel compilers    # Intel compilers
244    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
245    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
246    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
# Line 183  if env["CC"] == "icc": Line 250  if env["CC"] == "icc":
250    pedantic      = ""    pedantic      = ""
251    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
252    sysheaderopt      = ""    sysheaderopt      = ""
253  elif env["CC"] == "gcc":  elif env["CC"][:3] == "gcc":
254    # GNU C on any system    # GNU C on any system
255    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"    cc_flags      = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
256  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
257    cc_optim      = "-O3"    cc_optim      = "-O3"
258    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
259    omp_optim     = ""    omp_optim     = "-fopenmp"
260    omp_debug     = ""    omp_debug     = "-fopenmp"
261    omp_libs      = []    omp_libs      = []
262    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
263    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
# Line 224  if env["omp_libs"] == "-DEFAULT_6": env[ Line 291  if env["omp_libs"] == "-DEFAULT_6": env[
291  #set up the autolazy values  #set up the autolazy values
292  if env['forcelazy']    != "leave_alone":  if env['forcelazy']    != "leave_alone":
293    if env['forcelazy'] == 'on':    if env['forcelazy'] == 'on':
294      env.Append(CPPDEFINES='FAUTOLAZYON')      env.Append(CPPDEFINES=['FAUTOLAZYON'])
295    else:    else:
296       if env['forcelazy'] == 'off':       if env['forcelazy'] == 'off':
297      env.Append(CPPDEFINES='FAUTOLAZYOFF')      env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
298    
299    #set up the colective resolve values
300    if env['forcecollres']    != "leave_alone":
301      print env['forcecollres']
302      if env['forcecollres'] == 'on':
303        env.Append(CPPDEFINES=['FRESCOLLECTON'])
304      else:
305         if env['forcecollres'] == 'off':
306        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
307    
308    
309    if env['iknowwhatimdoing']:
310        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
311    
312  # 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
313  if not env["useopenmp"]:  if not env["useopenmp"]:
# Line 237  if not env["useopenmp"]: Line 317  if not env["useopenmp"]:
317    
318  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
319    
320    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
321    if IS_WINDOWS_PLATFORM:
322        LD_LIBRARY_PATH_KEY='PATH'
323        env['ENV']['LD_LIBRARY_PATH']=''
324    else:
325        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
326  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
327    
328  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
329  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
330    
331    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
332    except KeyError: pass
333    
334    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
335    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
336    
337    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
338    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
339    
340    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
341    except KeyError: pass
342    
343  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
344  except KeyError: pass  except KeyError: pass
345    
# Line 254  except KeyError: pass Line 352  except KeyError: pass
352  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
353  except KeyError: pass  except KeyError: pass
354    
355  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
356  except KeyError: pass  except KeyError: pass
357    
358  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 270  try: env['ENV']['HOME'] = os.environ['HO Line 368  try: env['ENV']['HOME'] = os.environ['HO
368  except KeyError: pass  except KeyError: pass
369    
370  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
371    
372    
373    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
374    env.PrependENVPath('PYTHONPATH', prefix)
375  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
376    
377  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 296  if env['usepedantic']: env.Append(CCFLAG Line 395  if env['usepedantic']: env.Append(CCFLAG
395    
396  # MS Windows  # MS Windows
397  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
398    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
399    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
400    if not env['share_esysUtils'] :    if not env['share_esysUtils'] :
401      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
402    if not env['share_paso'] :    if not env['share_paso'] :
403      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
404    
405    if env['usenetcdf']:    if env['usenetcdf']:
406      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
407    
408  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
409    
# Line 318  except: Line 417  except:
417  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
418  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
419    
420  ############ numarray (required) ###############################  ############ numpy (required) ###############################
421    
422  try:  try:
423    from numarray import identity    from numpy import identity
424  except ImportError:  except ImportError:
425    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
426    sys.exit(1)    sys.exit(1)
427    
428  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 333  conf = Configure(clone_env(env)) Line 432  conf = Configure(clone_env(env))
432    
433  # Test that the compiler is working  # Test that the compiler is working
434  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
435    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
436    sys.exit(1)     sys.exit(1)
437    
438  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
439    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
# Line 350  else: Line 449  else:
449  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
450  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
451    
452  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
453    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
454    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
455    
456  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
457    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'])
458    sys.exit(1)    sys.exit(1)
459  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
460    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'])
461    sys.exit(1)    sys.exit(1)
462    
463  ############ boost (required) ##################################  ############ boost (required) ##################################
464    
465  if not sysheaderopt =="":  if not sysheaderopt =="":
466    conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path']+'boost')  # This is required because we can't -isystem /usr/system because it breaks std includes
467      if os.path.normpath(env['boost_path']) =="/usr/include":
468        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
469      else:
470        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
471  else:  else:
472    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
473    
474  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
475  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
476    
477  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['boost_lib_path']) # The wrapper script needs to find these libs
478    #ensure that our path entries remain at the front
479    conf.env.PrependENVPath('PYTHONPATH', prefix)
480    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
481    
482  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
483    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'])
484    sys.exit(1)    sys.exit(1)
485    
486  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
487    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'])
488    sys.exit(1)    sys.exit(1)
# Line 402  if env['usenetcdf']: Line 511  if env['usenetcdf']:
511    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
512    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
513    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
514    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['netCDF_lib_path'])  # The wrapper script needs to find these libs
515      #ensure that our path entries remain at the front
516      conf.env.PrependENVPath('PYTHONPATH', prefix)
517      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
518    
519  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
520  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 423  if env['usepapi']: Line 535  if env['usepapi']:
535    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
536    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
537    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
538    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['papi_lib_path'])    # The wrapper script needs to find these libs
539      #ensure that our path entries remain at the front
540      conf.env.PrependENVPath('PYTHONPATH', prefix)
541      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
542    
543  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
544  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 444  if env['usemkl']: Line 559  if env['usemkl']:
559    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
560    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
561    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
562    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mkl_lib_path']) # The wrapper script needs to find these libs
563      #ensure that our path entries remain at the front
564      conf.env.PrependENVPath('PYTHONPATH', prefix)
565      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
566    
567  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
568  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
569    
570    
571  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
572  if env['usemkl']:  if env['usemkl']:
# Line 472  if env['useumfpack']: Line 591  if env['useumfpack']:
591    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
592    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
593    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
594    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['umf_lib_path']) # The wrapper script needs to find these libs
595    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['amd_lib_path']) # The wrapper script needs to find these libs
596    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['blas_lib_path'])    # The wrapper script needs to find these libs
597      #ensure that our path entries remain at the front
598      conf.env.PrependENVPath('PYTHONPATH', prefix)
599      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
600    
601  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
602  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
603  if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?  # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
604    
605  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
606  if env['useumfpack']:  if env['useumfpack']:
# Line 500  if env['usesilo']: Line 622  if env['usesilo']:
622    
623  # Add the path to Silo to environment env if it was found.  # Add the path to Silo to environment env if it was found.
624  # Note that we do not add the libs since they are only needed for the  # Note that we do not add the libs since they are only needed for the
625  # escriptreader library and tools.  # escriptexport library and tools.
626  if env['usesilo']:  if env['usesilo']:
627    env.AppendUnique(CPPPATH = [env['silo_path']])    env.AppendUnique(CPPPATH = [env['silo_path']])
628    env.AppendUnique(LIBPATH = [env['silo_lib_path']])    env.AppendUnique(LIBPATH = [env['silo_lib_path']])
629    env.Append(CPPDEFINES = ['HAVE_SILO'])    env.Append(CPPDEFINES = ['USE_SILO'])
630    
631    ########### Lapack (optional) ##################################
632    
633    if env['uselapack']:
634        env.AppendUnique(CPPDEFINES='USE_LAPACK')
635        env.AppendUnique(CPPPATH = [env['lapack_path']])
636        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
637    
638        env.Append(LIBPATH = '/usr/lib/atlas')
639        env.Append(LIBS = [env['lapack_libs']])
640        if env['lapack_type']=='mkl':
641           if not env['usemkl']:
642            env['uselapack']=0
643            print "mkl_lapack requires mkl"
644           else:
645            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
646          
647    
648  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
649    
# Line 520  else: Line 659  else:
659  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
660  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
661    
   
662  ############ Add some custom builders ##########################  ############ Add some custom builders ##########################
663    
664  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
# Line 532  env.Append(BUILDERS = {'RunUnitTest' : r Line 670  env.Append(BUILDERS = {'RunUnitTest' : r
670  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
671  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
672    
673    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
674    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
675    
676  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
677    if not env['usempi']: env['mpi_flavour']='none'
678    
679  # 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)
680  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 541  env_mpi = clone_env(env) Line 683  env_mpi = clone_env(env)
683  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
684    
685  if env_mpi['usempi']:  if env_mpi['usempi']:
686      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
687      if not env_mpi['mpi_flavour'] in VALID_MPIs:
688          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
689    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
690    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
691    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
692    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mpi_lib_path']) # The wrapper script needs to find these libs
693      #ensure that our path entries remain at the front
694      conf.env.PrependENVPath('PYTHONPATH', prefix)
695      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
696    
697  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
698  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
699    
700  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
701  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 569  if env_mpi['useparmetis']: Line 717  if env_mpi['useparmetis']:
717    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
718    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
719    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
720    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_lib_path'])    # The wrapper script needs to find these libs
721      #ensure that our path entries remain at the front
722      conf.env.PrependENVPath('PYTHONPATH', prefix)
723      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
724    
725  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
726  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 583  else: Line 734  else:
734    
735  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
736    
 ############ Now we switch on Warnings as errors ###############  
   
 #this needs to be done after configuration because the scons test files have warnings in them  
   
 if ((fatalwarning != "") and (env['usewarnings'])):  
   env.Append(CCFLAGS        = fatalwarning)  
   env_mpi.Append(CCFLAGS        = fatalwarning)  
   
737  ############ Summarize our environment #########################  ############ Summarize our environment #########################
738    
739  print ""  print ""
740  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
741  print " Using python libraries"  print " Using python libraries"
742  print " Using numarray"  print " Using numpy"
743  print " Using boost"  print " Using boost"
744  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
745  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 610  if env['usesilo']: print " Using Silo" Line 753  if env['usesilo']: print " Using Silo"
753  else: print "   Not using Silo"  else: print "   Not using Silo"
754  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
755  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
756  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
757  else: print "   Not using MPI"  else: print "   Not using MPI"
758  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
759  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
760  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
761  else: print "   Not using PAPI"  else: print "   Not using PAPI"
762    if env['uselapack']: print "    Using Lapack"
763    else: print "   Not using Lapack"
764  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
765  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
766  print " Installing in", prefix  print " Installing in", prefix
# Line 625  print "" Line 770  print ""
770    
771  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
772    
773  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
774  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
775  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
776  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
777    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
778    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
779    
780    
781  ############ Build the subdirectories ##########################  ############ Build the subdirectories ##########################
782    
783    if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
784    
785    
786  from grouptest import *  from grouptest import *
787    
788  TestGroups=[]  TestGroups=[]
789    
790    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
791    
792    ############ Now we switch on Warnings as errors ###############
793    
794    #this needs to be done after configuration because the scons test files have warnings in them
795    
796    if ((fatalwarning != "") and (env['usewarnings'])):
797      env.Append(CCFLAGS        = fatalwarning)
798      env_mpi.Append(CCFLAGS        = fatalwarning)
799    
800    
801  Export(  Export(
802    ["env",    ["env",
803     "env_mpi",     "env_mpi",
804     "clone_env",     "clone_env",
805       "dodgy_env",
806     "IS_WINDOWS_PLATFORM",     "IS_WINDOWS_PLATFORM",
807     "TestGroups"     "TestGroups"
808     ]     ]
809    )    )
810    
811  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)
812  env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)  env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
813  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
814    env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
815  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
816  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
817  env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)  env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)
# Line 666  env.SConscript(dirs = ['paso/profiling'] Line 829  env.SConscript(dirs = ['paso/profiling']
829  remember_list = []  remember_list = []
830    
831  if env['usedebug']:  if env['usedebug']:
832    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'))
833    
834  if env['usempi']:  if env['usempi']:
835    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'))
836    
837  if env['omp_optim'] != '':  if env['useopenmp']:
838    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'))
839    
840  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
841    
842    
843    ############### Record python interpreter version ##############
844    
845    if not IS_WINDOWS_PLATFORM:
846    
847      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
848      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
849      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
850    
851    ############## Populate the buildvars file #####################
852    
853    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
854    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
855    
856    # Find the boost version by extracting it from version.hpp
857    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
858    boostversion='unknown'
859    try:
860        for line in boosthpp:
861            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
862            if ver:
863                boostversion=ver.group(1)
864    except StopIteration:
865        pass
866    buildvars.write("boost="+boostversion+"\n")
867    buildvars.write("svn_revision="+str(global_revision)+"\n")
868    out="usedebug="
869    if env['usedebug']:
870        out+="y"
871    else:
872        out+="n"
873    out+="\nusempi="
874    if env['usempi']:
875        out+="y"
876    else:
877        out+="n"
878    out+="\nuseopenmp="
879    if env['useopenmp']:
880        out+="y"
881    else:
882        out+="n"
883    buildvars.write(out+"\n")
884    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
885    out="lapack="
886    if env['uselapack']:
887       out+="y"
888    else:
889       out+="n"
890    out+="\nsilo="
891    if env['usesilo']:
892       out+="y"
893    else:
894       out+="n"
895    buildvars.write(out+"\n")
896    buildvars.close()
897    
898    
899  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
900    
901  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 688  env.Alias('install_esysUtils', ['build_e Line 908  env.Alias('install_esysUtils', ['build_e
908  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
909  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
910    
911    env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
912    env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
913    
914  env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])  env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
915  env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])  env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
916    
# Line 698  env.Alias('install_finley', ['build_finl Line 921  env.Alias('install_finley', ['build_finl
921  build_all_list = []  build_all_list = []
922  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
923  build_all_list += ['build_paso']  build_all_list += ['build_paso']
924    build_all_list += ['build_dataexporter']
925  build_all_list += ['build_escript']  build_all_list += ['build_escript']
926  build_all_list += ['build_finley']  build_all_list += ['build_finley']
927  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
928  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
929  if env['usesilo']:  build_all_list += ['target_escript2silo']  if env['usesilo']:  build_all_list += ['target_escriptconvert']
930  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
931    
932  install_all_list = []  install_all_list = []
933  install_all_list += ['target_init']  install_all_list += ['target_init']
934  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
935  install_all_list += ['install_paso']  install_all_list += ['install_paso']
936    install_all_list += ['install_dataexporter']
937  install_all_list += ['install_escript']  install_all_list += ['install_escript']
938  install_all_list += ['install_finley']  install_all_list += ['install_finley']
939  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
940  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
941  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
942  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
943  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
944  if env['usesilo']:  install_all_list += ['target_install_escript2silo']  if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
945  install_all_list += ['remember_options']  install_all_list += ['remember_options']
946  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
947    
# Line 729  env.Alias('build_cppunittest', ['target_ Line 954  env.Alias('build_cppunittest', ['target_
954  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
955  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
956  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'])
957    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
958    
959    
960  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
961    
962  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
963    
964    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
965    
966    build_platform=os.name
967    
968  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
969     try:     try:
970      utest=open("utest.sh","w")      utest=open("utest.sh","w")
971      build_platform=os.name      #Sometimes Mac python says it is posix      #Sometimes Mac python says it is posix
972      if (build_platform=='posix') and platform.system()=="Darwin":      if (build_platform=='posix') and platform.system()=="Darwin":
973          build_platform='darwin'          build_platform='darwin'
974      utest.write(GroupTest.makeHeader(build_platform))      utest.write(GroupTest.makeHeader(build_platform))
975      for tests in TestGroups:      for tests in TestGroups:
976          utest.write(tests.makeString())          utest.write(tests.makeString())
977      utest.close()      utest.close()
978        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
979      print "utest.sh written"      print "utest.sh written"
980     except IOError:     except IOError:
981      print "Error attempting to write unittests file."      print "Error attempting to write unittests file."
982      sys.exit(1)      sys.exit(1)
983    
984       #Make sure that the escript wrapper is in place
985       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
986           print "Copying escript wrapper"
987           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
988    
989    ############ Targets to build PasoTests suite ################
990    
991    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')

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

  ViewVC Help
Powered by ViewVC 1.1.26