/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2132 by jfenwick, Fri Dec 5 00:18:06 2008 UTC revision 2881 by jfenwick, Thu Jan 28 02:03:15 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  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    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
90    # 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
# Line 72  opts.AddOptions( Line 98  opts.AddOptions(
98    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
99    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
100    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
101    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
102    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
103    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
104      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
105      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
106  # Python  # Python
107    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
108    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 85  opts.AddOptions( Line 113  opts.AddOptions(
113    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
114    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
115  # NetCDF  # NetCDF
116    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
117    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
118    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
119    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
120  # MPI  # MPI
121    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
122    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
123    ('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'),
124    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
125    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
126    ('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),
127    ('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!)', []),
128      ('mpi_flavour','Type of MPI execution environment','none'),
129  # ParMETIS  # ParMETIS
130    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
131    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
132    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
133    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
134  # PAPI  # PAPI
135    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
136    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
137    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
138    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
139    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),
140  # MKL  # MKL
141    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
142    ('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'),
143    ('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'),
144    ('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']),
145  # UMFPACK  # UMFPACK
146    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
147    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
148    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
149    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
150    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
151    # Silo
152      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
153      ('silo_path', 'Path to Silo includes', '/usr/include'),
154      ('silo_lib_path', 'Path to Silo libs', usr_lib),
155      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
156  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
157    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
158    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 127  opts.AddOptions( Line 161  opts.AddOptions(
161    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
162    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
163    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
164    #Lapack options
165      BoolVariable('uselapack','switch on/off use of Lapack','no'),
166      ('lapack_path', 'Path to Lapack includes','/usr/include'),
167      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
168      ('lapack_libs', 'Lapack libraries to link with', []),
169      ('lapack_type', '{clapack,mkl}','clapack'),
170  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
171    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
172  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
173  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
174    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
175    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
176      ('env_export','Environment variables to be passed to children',[]),
177    #To enable passing function pointers through python
178      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
179  )  )
180    
181    
182    
183  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
184    
185  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 145  if IS_WINDOWS_PLATFORM: Line 190  if IS_WINDOWS_PLATFORM:
190        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
191                          options = opts)                          options = opts)
192  else:  else:
193     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
194        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
195     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
196        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 155  else: Line 200  else:
200        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
201  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
202    
203    
204    ############ Make sure target directories exist ################
205    
206    if not os.path.isdir(env['bininstall']):
207        os.makedirs(env['bininstall'])
208    if not os.path.isdir(env['libinstall']):
209        os.makedirs(env['libinstall'])
210    if not os.path.isdir(env['pyinstall']):
211        os.makedirs(env['pyinstall'])
212    
213    ########## Copy required environment vars ######################
214    
215    for i in env['env_export']:
216       env.Append(ENV = {i:os.environ[i]})
217    
218  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
219    
220  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 180  if env["CC"] == "icc": Line 240  if env["CC"] == "icc":
240  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
241    # GNU C on any system    # GNU C on any system
242    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 -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
 #The strict aliasing error occurs for some versions of boost  
243  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
244    cc_optim      = "-O3"    cc_optim      = "-O3"
245    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
246    omp_optim     = ""    omp_optim     = "-fopenmp"
247    omp_debug     = ""    omp_debug     = "-fopenmp"
248    omp_libs      = []    omp_libs      = []
249    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
250    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
# Line 216  if env["omp_optim"]    == "-DEFAULT_4": env Line 275  if env["omp_optim"]    == "-DEFAULT_4": env
275  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
276  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
277    
278    #set up the autolazy values
279    if env['forcelazy']    != "leave_alone":
280      if env['forcelazy'] == 'on':
281        env.Append(CPPDEFINES=['FAUTOLAZYON'])
282      else:
283         if env['forcelazy'] == 'off':
284        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
285    
286    #set up the colective resolve values
287    if env['forcecollres']    != "leave_alone":
288      print env['forcecollres']
289      if env['forcecollres'] == 'on':
290        env.Append(CPPDEFINES=['FRESCOLLECTON'])
291      else:
292         if env['forcecollres'] == 'off':
293        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
294    
295    
296    if env['iknowwhatimdoing']:
297        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
298    
299  # 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
300  if not env["useopenmp"]:  if not env["useopenmp"]:
301    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 224  if not env["useopenmp"]: Line 304  if not env["useopenmp"]:
304    
305  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
306    
307    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
308    if IS_WINDOWS_PLATFORM:
309        LD_LIBRARY_PATH_KEY='PATH'
310        env['ENV']['LD_LIBRARY_PATH']=''
311    else:
312        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
313  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
314    
315  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
316  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
317    
318    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
319    except KeyError: pass
320    
321    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
322    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
323    
324    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
325    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
326    
327    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
328    except KeyError: pass
329    
330  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
331  except KeyError: pass  except KeyError: pass
332    
# Line 241  except KeyError: pass Line 339  except KeyError: pass
339  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
340  except KeyError: pass  except KeyError: pass
341    
342  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
343  except KeyError: pass  except KeyError: pass
344    
345  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 257  try: env['ENV']['HOME'] = os.environ['HO Line 355  try: env['ENV']['HOME'] = os.environ['HO
355  except KeyError: pass  except KeyError: pass
356    
357  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
358    
359    
360    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
361    env.PrependENVPath('PYTHONPATH', prefix)
362  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
363    
364  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 283  if env['usepedantic']: env.Append(CCFLAG Line 382  if env['usepedantic']: env.Append(CCFLAG
382    
383  # MS Windows  # MS Windows
384  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
385    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
386    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
387    if not env['share_esysUtils'] :    if not env['share_esysUtils'] :
388      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
389    if not env['share_paso'] :    if not env['share_paso'] :
390      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
391    
392    if env['usenetcdf']:    if env['usenetcdf']:
393      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
394    
395  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
396    
# Line 305  except: Line 404  except:
404  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
405  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
406    
407  ############ numarray (required) ###############################  ############ numpy (required) ###############################
408    
409  try:  try:
410    from numarray import identity    from numpy import identity
411  except ImportError:  except ImportError:
412    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
413    sys.exit(1)    sys.exit(1)
414    
415  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 320  conf = Configure(clone_env(env)) Line 419  conf = Configure(clone_env(env))
419    
420  # Test that the compiler is working  # Test that the compiler is working
421  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
422    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
423    sys.exit(1)     sys.exit(1)
424    
425  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
426    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
# Line 337  else: Line 436  else:
436  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
437  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
438    
439  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
440    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
441    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
442    
443  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
444    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'])
445    sys.exit(1)    sys.exit(1)
446  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
447    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'])
448    sys.exit(1)    sys.exit(1)
449    
450  ############ boost (required) ##################################  ############ boost (required) ##################################
451    
452  if not sysheaderopt =="":  if not sysheaderopt =="":
453    conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path']+'boost')  # This is required because we can't -isystem /usr/system because it breaks std includes
454      if os.path.normpath(env['boost_path']) =="/usr/include":
455        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
456      else:
457        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
458  else:  else:
459    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
460    
461  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
462  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
463    
464  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
465    #ensure that our path entries remain at the front
466    conf.env.PrependENVPath('PYTHONPATH', prefix)
467    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
468    
469  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
470    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'])
471    sys.exit(1)    sys.exit(1)
472    
473  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
474    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'])
475    sys.exit(1)    sys.exit(1)
# Line 389  if env['usenetcdf']: Line 498  if env['usenetcdf']:
498    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
499    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
500    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
501    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
502      #ensure that our path entries remain at the front
503      conf.env.PrependENVPath('PYTHONPATH', prefix)
504      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
505    
506  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
507  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 410  if env['usepapi']: Line 522  if env['usepapi']:
522    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
523    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
524    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
525    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
526      #ensure that our path entries remain at the front
527      conf.env.PrependENVPath('PYTHONPATH', prefix)
528      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
529    
530  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
531  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 431  if env['usemkl']: Line 546  if env['usemkl']:
546    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
547    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
548    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
549    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
550      #ensure that our path entries remain at the front
551      conf.env.PrependENVPath('PYTHONPATH', prefix)
552      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
553    
554  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
555  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
556    
557    
558  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
559  if env['usemkl']:  if env['usemkl']:
# Line 459  if env['useumfpack']: Line 578  if env['useumfpack']:
578    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
579    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
580    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
581    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
582    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
583    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
584      #ensure that our path entries remain at the front
585      conf.env.PrependENVPath('PYTHONPATH', prefix)
586      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
587    
588  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
589  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
590  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?
591    
592  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
593  if env['useumfpack']:  if env['useumfpack']:
# Line 474  if env['useumfpack']: Line 596  if env['useumfpack']:
596  else:  else:
597    conf.Finish()    conf.Finish()
598    
599    ############ Silo (optional) ###################################
600    
601    if env['usesilo']:
602      conf = Configure(clone_env(env))
603      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
604      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
605      conf.env.AppendUnique(LIBS = [env['silo_libs']])
606      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
607      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
608      conf.Finish()
609    
610    # Add the path to Silo to environment env if it was found.
611    # Note that we do not add the libs since they are only needed for the
612    # escriptexport library and tools.
613    if env['usesilo']:
614      env.AppendUnique(CPPPATH = [env['silo_path']])
615      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
616      env.Append(CPPDEFINES = ['USE_SILO'])
617    
618    ########### Lapack (optional) ##################################
619    
620    if env['uselapack']:
621        env.AppendUnique(CPPDEFINES='USE_LAPACK')
622        env.AppendUnique(CPPPATH = [env['lapack_path']])
623        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
624    
625        env.Append(LIBPATH = '/usr/lib/atlas')
626        env.Append(LIBS = [env['lapack_libs']])
627        if env['lapack_type']=='mkl':
628           if not env['usemkl']:
629            env['uselapack']=0
630            print "mkl_lapack requires mkl"
631           else:
632            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
633          
634    
635  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
636    
637  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 488  else: Line 646  else:
646  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
647  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
648    
649    ############ Add some custom builders ##########################
650    
651    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
652    env.Append(BUILDERS = {'PyCompile' : py_builder});
653    
654    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
655    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
656    
657    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
658    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
659    
660    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
661    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
662    
663  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
664    if not env['usempi']: env['mpi_flavour']='none'
665    
666  # 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)
667  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 497  env_mpi = clone_env(env) Line 670  env_mpi = clone_env(env)
670  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
671    
672  if env_mpi['usempi']:  if env_mpi['usempi']:
673      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
674      if not env_mpi['mpi_flavour'] in VALID_MPIs:
675          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
676    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
677    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
678    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
679    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
680      #ensure that our path entries remain at the front
681      conf.env.PrependENVPath('PYTHONPATH', prefix)
682      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
683    
684  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
685  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
686    
687  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
688  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 525  if env_mpi['useparmetis']: Line 704  if env_mpi['useparmetis']:
704    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
705    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
706    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
707    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
708      #ensure that our path entries remain at the front
709      conf.env.PrependENVPath('PYTHONPATH', prefix)
710      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
711    
712  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
713  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 539  else: Line 721  else:
721    
722  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
723    
 ############ 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)  
   
724  ############ Summarize our environment #########################  ############ Summarize our environment #########################
725    
726  print ""  print ""
727  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
728  print " Using python libraries"  print " Using python libraries"
729  print " Using numarray"  print " Using numpy"
730  print " Using boost"  print " Using boost"
731  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
732  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 562  if env['usemkl']: print "  Using MKL" Line 736  if env['usemkl']: print "  Using MKL"
736  else: print "   Not using MKL"  else: print "   Not using MKL"
737  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
738  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
739    if env['usesilo']: print "  Using Silo"
740    else: print "   Not using Silo"
741  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
742  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
743  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
744  else: print "   Not using MPI"  else: print "   Not using MPI"
745  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
746  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
747  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
748  else: print "   Not using PAPI"  else: print "   Not using PAPI"
749    if env['uselapack']: print "    Using Lapack"
750    else: print "   Not using Lapack"
751  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
752  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
753  print " Installing in", prefix  print " Installing in", prefix
# Line 579  print "" Line 757  print ""
757    
758  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
759    
760  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
761  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
762  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
763  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
764    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
765    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
766    
 ############ Add some custom builders ##########################  
767    
768  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  ############ Build the subdirectories ##########################
 env.Append(BUILDERS = {'PyCompile' : py_builder});  
769    
770  runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
771    
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
772    
773  ############ Build the subdirectories ##########################  from grouptest import *
774    
775    TestGroups=[]
776    
777    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
778    
779    ############ Now we switch on Warnings as errors ###############
780    
781    #this needs to be done after configuration because the scons test files have warnings in them
782    
783    if ((fatalwarning != "") and (env['usewarnings'])):
784      env.Append(CCFLAGS        = fatalwarning)
785      env_mpi.Append(CCFLAGS        = fatalwarning)
786    
787    
788  Export(  Export(
789    ["env",    ["env",
790     "env_mpi",     "env_mpi",
791     "clone_env",     "clone_env",
792     "IS_WINDOWS_PLATFORM"     "dodgy_env",
793       "IS_WINDOWS_PLATFORM",
794       "TestGroups"
795     ]     ]
796    )    )
797    
798  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)
799    env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
800  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
801    env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
802  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
803  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
804  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 616  env.SConscript(dirs = ['pyvisi/py_src'], Line 808  env.SConscript(dirs = ['pyvisi/py_src'],
808  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)
809  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
810  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
811    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
812    
813    
814  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
815    
816  remember_list = []  remember_list = []
817    
818  if env['usedebug']:  if env['usedebug']:
819    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'))
820    
821  if env['usempi']:  if env['usempi']:
822    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'))
823    
824  if env['omp_optim'] != '':  if env['useopenmp']:
825    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'))
826    
827  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
828    
829    
830    ############### Record python interpreter version ##############
831    
832    if not IS_WINDOWS_PLATFORM:
833    
834      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
835      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
836      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
837    
838    ############## Populate the buildvars file #####################
839    
840    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
841    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
842    
843    # Find the boost version by extracting it from version.hpp
844    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
845    boostversion='unknown'
846    try:
847        for line in boosthpp:
848            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
849            if ver:
850                boostversion=ver.group(1)
851    except StopIteration:
852        pass
853    buildvars.write("boost="+boostversion+"\n")
854    buildvars.write("svn_revision="+str(global_revision)+"\n")
855    out="usedebug="
856    if env['usedebug']:
857        out+="y"
858    else:
859        out+="n"
860    out+="\nusempi="
861    if env['usempi']:
862        out+="y"
863    else:
864        out+="n"
865    out+="\nuseopenmp="
866    if env['useopenmp']:
867        out+="y"
868    else:
869        out+="n"
870    buildvars.write(out+"\n")
871    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
872    out="lapack="
873    if env['uselapack']:
874       out+="y"
875    else:
876       out+="n"
877    out+="\nsilo="
878    if env['usesilo']:
879       out+="y"
880    else:
881       out+="n"
882    buildvars.write(out+"\n")
883    buildvars.close()
884    
885    
886  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
887    
888  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 644  env.Alias('install_esysUtils', ['build_e Line 895  env.Alias('install_esysUtils', ['build_e
895  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
896  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
897    
898    env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
899    env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
900    
901  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'])
902  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'])
903    
# Line 654  env.Alias('install_finley', ['build_finl Line 908  env.Alias('install_finley', ['build_finl
908  build_all_list = []  build_all_list = []
909  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
910  build_all_list += ['build_paso']  build_all_list += ['build_paso']
911    build_all_list += ['build_dataexporter']
912  build_all_list += ['build_escript']  build_all_list += ['build_escript']
913  build_all_list += ['build_finley']  build_all_list += ['build_finley']
914  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
915  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
916    if env['usesilo']:  build_all_list += ['target_escriptconvert']
917  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
918    
919  install_all_list = []  install_all_list = []
920  install_all_list += ['target_init']  install_all_list += ['target_init']
921  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
922  install_all_list += ['install_paso']  install_all_list += ['install_paso']
923    install_all_list += ['install_dataexporter']
924  install_all_list += ['install_escript']  install_all_list += ['install_escript']
925  install_all_list += ['install_finley']  install_all_list += ['install_finley']
926  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
927  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
928  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
929  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
930  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
931    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
932  install_all_list += ['remember_options']  install_all_list += ['remember_options']
933  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
934    
# Line 683  env.Alias('build_cppunittest', ['target_ Line 941  env.Alias('build_cppunittest', ['target_
941  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
942  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
943  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'])
944    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
945    
946    
947  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
948    
949  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
950    
951    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
952    
953    build_platform=os.name
954    
955    if not IS_WINDOWS_PLATFORM:
956       try:
957        utest=open("utest.sh","w")
958        #Sometimes Mac python says it is posix
959        if (build_platform=='posix') and platform.system()=="Darwin":
960            build_platform='darwin'
961        utest.write(GroupTest.makeHeader(build_platform))
962        for tests in TestGroups:
963            utest.write(tests.makeString())
964        utest.close()
965        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
966        print "utest.sh written"
967       except IOError:
968        print "Error attempting to write unittests file."
969        sys.exit(1)
970    
971       #Make sure that the escript wrapper is in place
972       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
973           print "Copying escript wrapper"
974           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
975    
976    ############ Targets to build PasoTests suite ################
977    
978    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')

Legend:
Removed from v.2132  
changed lines
  Added in v.2881

  ViewVC Help
Powered by ViewVC 1.1.26