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

Diff of /branches/dirac/SConstruct

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

revision 2356 by gross, Wed Apr 1 04:46:22 2009 UTC revision 3039 by caltinay, Tue Jun 15 07:21:56 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 16  EnsureSConsVersion(0,96,91) Line 16  EnsureSConsVersion(0,96,91)
16  EnsurePythonVersion(2,3)  EnsurePythonVersion(2,3)
17    
18  import sys, os, re, socket, platform, stat  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/C++ compiler flags to use', '-DEFAULT_1'),
94    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cc_optim', 'C/C++ optimization flags to use', '-DEFAULT_2'),
95    ('cc_debug', 'C compiler debug flags to use', '-DEFAULT_3'),    ('cc_debug', 'C/C++ debug flags to use', '-DEFAULT_3'),
96    ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),    ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),
97    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
98    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
99    ('cc_extra', 'Extra C/C++ flags', ''),    ('cc_extra', 'Extra C compiler flags', ''),
100      ('cxx_extra', 'Extra C++ compiler flags', ''),
101    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
102    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
103    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
104    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
105    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
106    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
107    ('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'),
108      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
109  # Python  # Python
110    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
111    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 86  opts.AddOptions( Line 116  opts.AddOptions(
116    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
117    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
118  # NetCDF  # NetCDF
119    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
120    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
121    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
122    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
123  # MPI  # MPI
124    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
125    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
126    ('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'),
127    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
128    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
129    ('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),
130    ('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!)', []),
131    ('mpi_flavour','Type of MPI execution environment','none'),    ('mpi_flavour','Type of MPI execution environment','none'),
132  # ParMETIS  # ParMETIS
133    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
134    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
135    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
136    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
137  # PAPI  # PAPI
138    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
139    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
140    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
141    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
142    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),
143  # MKL  # MKL
144    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
145    ('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'),
146    ('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'),
147    ('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']),
148  # UMFPACK  # UMFPACK
149    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
150    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
151    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
152    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
153    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
154  # Silo  # Silo
155    BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),    BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
156    ('silo_path', 'Path to Silo includes', '/usr/include'),    ('silo_path', 'Path to Silo includes', '/usr/include'),
157    ('silo_lib_path', 'Path to Silo libs', usr_lib),    ('silo_lib_path', 'Path to Silo libs', usr_lib),
158    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
# Line 134  opts.AddOptions( Line 164  opts.AddOptions(
164    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
165    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
166    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
167    #Lapack options
168      BoolVariable('uselapack','switch on/off use of Lapack','no'),
169      ('lapack_path', 'Path to Lapack includes','/usr/include'),
170      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
171      ('lapack_libs', 'Lapack libraries to link with', []),
172      ('lapack_type', '{clapack,mkl}','clapack'),
173  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
174    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
175  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
176  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
177    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
178    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
179      ('env_export','Environment variables to be passed to children',[]),
180    #To enable passing function pointers through python
181      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
182  )  )
183    
184    
185    
186  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
187    
188  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 152  if IS_WINDOWS_PLATFORM: Line 193  if IS_WINDOWS_PLATFORM:
193        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
194                          options = opts)                          options = opts)
195  else:  else:
196     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'savanna':
197        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
198     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
199        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 160  else: Line 201  else:
201           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)
202     else:     else:
203        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
204    
205    # Override compiler choice if provided
206    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
207    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
208    
209  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
210    
211    ############ Make sure target directories exist ################
212    
213    if not os.path.isdir(env['bininstall']):
214        os.makedirs(env['bininstall'])
215    if not os.path.isdir(env['libinstall']):
216        os.makedirs(env['libinstall'])
217    if not os.path.isdir(env['pyinstall']):
218        os.makedirs(env['pyinstall'])
219    
220    ########## Copy required environment vars ######################
221    
222    for i in env['env_export']:
223       env.Append(ENV = {i:os.environ[i]})
224    
225  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
226    
227  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 173  if env['useMPI']: env['usempi'] = 1 Line 233  if env['useMPI']: env['usempi'] = 1
233    
234  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.
235    
236    cc_flags = ""
237    cc_optim = ""
238    cc_debug = ""
239    omp_optim = ""
240    omp_debug = ""
241    omp_libs = []
242    
243  if env["CC"] == "icc":  if env["CC"] == "icc":
244    # Intel compilers    # Intel compilers
245    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
246    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
247    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
248    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
# Line 184  if env["CC"] == "icc": Line 251  if env["CC"] == "icc":
251    pedantic      = ""    pedantic      = ""
252    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
253    sysheaderopt      = ""    sysheaderopt      = ""
254  elif env["CC"] == "gcc":  elif env["CC"][:3] == "gcc":
255    # GNU C on any system    # GNU C on any system
256    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"
257  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
258    cc_optim      = "-O3"    cc_optim      = "-O3"
259    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
260    omp_optim     = "-fopenmp"    omp_optim     = "-fopenmp"
261    omp_debug     = "-fopenmp"    omp_debug     = "-fopenmp"
262    omp_libs      = ['gomp']    omp_libs      = []
263    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
264    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
265    sysheaderopt      = "-isystem "    sysheaderopt      = "-isystem "
# Line 225  if env["omp_libs"] == "-DEFAULT_6": env[ Line 292  if env["omp_libs"] == "-DEFAULT_6": env[
292  #set up the autolazy values  #set up the autolazy values
293  if env['forcelazy']    != "leave_alone":  if env['forcelazy']    != "leave_alone":
294    if env['forcelazy'] == 'on':    if env['forcelazy'] == 'on':
295      env.Append(CPPDEFINES='FAUTOLAZYON')      env.Append(CPPDEFINES=['FAUTOLAZYON'])
296    else:    else:
297       if env['forcelazy'] == 'off':       if env['forcelazy'] == 'off':
298      env.Append(CPPDEFINES='FAUTOLAZYOFF')      env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
299    
300    #set up the colective resolve values
301    if env['forcecollres']    != "leave_alone":
302      print env['forcecollres']
303      if env['forcecollres'] == 'on':
304        env.Append(CPPDEFINES=['FRESCOLLECTON'])
305      else:
306         if env['forcecollres'] == 'off':
307        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
308    
309    
310    if env['iknowwhatimdoing']:
311        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
312    
313  # 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
314  if not env["useopenmp"]:  if not env["useopenmp"]:
# Line 238  if not env["useopenmp"]: Line 318  if not env["useopenmp"]:
318    
319  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
320    
321    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
322    if IS_WINDOWS_PLATFORM:
323        LD_LIBRARY_PATH_KEY='PATH'
324        env['ENV']['LD_LIBRARY_PATH']=''
325    else:
326        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
327  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
328    
329  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
330  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
331    
332    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
333    except KeyError: pass
334    
335    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
336    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
337    
338    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
339    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
340    
341    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
342    except KeyError: pass
343    
344  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
345  except KeyError: pass  except KeyError: pass
346    
# Line 255  except KeyError: pass Line 353  except KeyError: pass
353  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
354  except KeyError: pass  except KeyError: pass
355    
356  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
357  except KeyError: pass  except KeyError: pass
358    
359  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 271  try: env['ENV']['HOME'] = os.environ['HO Line 369  try: env['ENV']['HOME'] = os.environ['HO
369  except KeyError: pass  except KeyError: pass
370    
371  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
372    
373    
374    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
375    env.PrependENVPath('PYTHONPATH', prefix)
376  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
377    
378  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 290  env.Append(CPPPATH     = [Dir('include')]) Line 389  env.Append(CPPPATH     = [Dir('include')])
389  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
390  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
391    
392  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
393    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
394  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
395    
396  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
# Line 319  except: Line 419  except:
419  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
420  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
421    
422  ############ numarray (required) ###############################  ############ numpy (required) ###############################
423    
424  try:  try:
425    from numarray import identity    from numpy import identity
426  except ImportError:  except ImportError:
427    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
428    sys.exit(1)    sys.exit(1)
429    
430  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 351  else: Line 451  else:
451  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
452  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
453    
 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  
454  conf.env.PrependENVPath('PYTHONPATH', prefix)  conf.env.PrependENVPath('PYTHONPATH', prefix)
455  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
456    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
457    
458  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
459    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'])
# Line 376  else: Line 476  else:
476  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
477  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
478    
479  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
480  #ensure that our path entries remain at the front  #ensure that our path entries remain at the front
481  conf.env.PrependENVPath('PYTHONPATH', prefix)  conf.env.PrependENVPath('PYTHONPATH', prefix)
482  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
483    
 if not conf.CheckCXXHeader('boost/python.hpp'):  
   print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])  
   sys.exit(1)  
484    
485  if not conf.CheckFunc('PyObject_SetAttr'):  #Yep we still cant figure this one out. - working on it.
486    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'])  if not IS_WINDOWS_PLATFORM:
487    sys.exit(1)    if not conf.CheckCXXHeader('boost/python.hpp'):
488        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
489        sys.exit(1)
490    
491      if not conf.CheckFunc('PyObject_SetAttr'):
492        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'])
493        sys.exit(1)
494    
495    
496  # Commit changes to environment  # Commit changes to environment
497  env = conf.Finish()  env = conf.Finish()
# Line 413  if env['usenetcdf']: Line 517  if env['usenetcdf']:
517    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
518    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
519    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
520    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
521    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
522    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
523    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
524    
525  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
526  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 437  if env['usepapi']: Line 541  if env['usepapi']:
541    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
542    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
543    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
544    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
545    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
546    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
547    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
548    
549  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
550  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 461  if env['usemkl']: Line 565  if env['usemkl']:
565    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
566    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
567    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
568    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
569    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
570    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
571    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
572    
573  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
574  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
575    
576    
577  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
578  if env['usemkl']:  if env['usemkl']:
# Line 492  if env['useumfpack']: Line 597  if env['useumfpack']:
597    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
598    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
599    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
600    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
601    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
602    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
603    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
604    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
605    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
606    
 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0  
607  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
608    if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
609  # 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?
610    
611  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
# Line 523  if env['usesilo']: Line 628  if env['usesilo']:
628    
629  # Add the path to Silo to environment env if it was found.  # Add the path to Silo to environment env if it was found.
630  # 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
631  # escriptreader library and tools.  # weipa library and tools.
632  if env['usesilo']:  if env['usesilo']:
633    env.AppendUnique(CPPPATH = [env['silo_path']])    env.AppendUnique(CPPPATH = [env['silo_path']])
634    env.AppendUnique(LIBPATH = [env['silo_lib_path']])    env.AppendUnique(LIBPATH = [env['silo_lib_path']])
635    env.Append(CPPDEFINES = ['HAVE_SILO'])  
636    ########### Lapack (optional) ##################################
637    
638    if env['uselapack']:
639        env.AppendUnique(CPPDEFINES='USE_LAPACK')
640        env.AppendUnique(CPPPATH = [env['lapack_path']])
641        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
642    
643        env.Append(LIBPATH = '/usr/lib/atlas')
644        env.Append(LIBS = [env['lapack_libs']])
645        if env['lapack_type']=='mkl':
646           if not env['usemkl']:
647            env['uselapack']=0
648            print "mkl_lapack requires mkl"
649           else:
650            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
651          
652    
653  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
654    
# Line 554  env.Append(BUILDERS = {'RunUnitTest' : r Line 675  env.Append(BUILDERS = {'RunUnitTest' : r
675  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)
676  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
677    
678    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
679    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
680    
681  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
682    if not env['usempi']: env['mpi_flavour']='none'
683    
684  # 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)
685  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 563  env_mpi = clone_env(env) Line 688  env_mpi = clone_env(env)
688  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
689    
690  if env_mpi['usempi']:  if env_mpi['usempi']:
691    VALID_MPIs=[ "MPT", "OPENMPI", "MPICH", "OPENMPI", "INTELMPI" ]    VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
692    if not env_mpi['mpi_flavour'] in VALID_MPIs:    if not env_mpi['mpi_flavour'] in VALID_MPIs:
693        raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."( env_mpi['mpi_flavour'],VALID_MPIs)        raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
694    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
695    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
696    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
697    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
698    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
699    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
700    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
701    
702  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
703  # if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0  # if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0
# Line 581  if env_mpi['usempi'] and not conf.CheckC Line 706  if env_mpi['usempi'] and not conf.CheckC
706  if env_mpi['usempi']:  if env_mpi['usempi']:
707    env_mpi = conf.Finish()    env_mpi = conf.Finish()
708    env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])    env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
709      # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
710      # On the other hand MPT and OpenMPI don't define the latter so we have to
711      # do that here
712      if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
713        env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
714  else:  else:
715    conf.Finish()    conf.Finish()
716    
# Line 597  if env_mpi['useparmetis']: Line 727  if env_mpi['useparmetis']:
727    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
728    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
729    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
730    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
731    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
732    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
733    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
734    
735  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
736  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 614  else: Line 744  else:
744    
745  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
746    
 ############ 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)  
   
747  ############ Summarize our environment #########################  ############ Summarize our environment #########################
748    
749  print ""  print ""
750  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
751  print " Using python libraries"  print " Using python libraries"
752  print " Using numarray"  print " Using numpy"
753  print " Using boost"  print " Using boost"
754  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
755  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 647  if env['useparmetis']: print " Using Par Line 769  if env['useparmetis']: print " Using Par
769  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
770  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
771  else: print "   Not using PAPI"  else: print "   Not using PAPI"
772    if env['uselapack']: print "    Using Lapack"
773    else: print "   Not using Lapack"
774  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
775  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
776  print " Installing in", prefix  print " Installing in", prefix
# Line 666  if not env['usempi']: Execute(Delete(os. Line 790  if not env['usempi']: Execute(Delete(os.
790    
791  ############ Build the subdirectories ##########################  ############ Build the subdirectories ##########################
792    
793    if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
794    
795    
796  from grouptest import *  from grouptest import *
797    
798  TestGroups=[]  TestGroups=[]
799    
800    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
801    
802    ############ Now we switch on Warnings as errors ###############
803    
804    #this needs to be done after configuration because the scons test files have warnings in them
805    
806    if ((fatalwarning != "") and (env['usewarnings'])):
807      env.Append(CCFLAGS        = fatalwarning)
808      env_mpi.Append(CCFLAGS        = fatalwarning)
809    
810    
811  Export(  Export(
812    ["env",    ["env",
813     "env_mpi",     "env_mpi",
814     "clone_env",     "clone_env",
815       "dodgy_env",
816     "IS_WINDOWS_PLATFORM",     "IS_WINDOWS_PLATFORM",
817     "TestGroups"     "TestGroups"
818     ]     ]
819    )    )
820    
821  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)
822  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)
823  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
824    env.SConscript(dirs = ['weipa/src'], build_dir='build/$PLATFORM/weipa', duplicate=0)
825  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
826  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
827  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 713  env.Alias('remember_options', remember_l Line 853  env.Alias('remember_options', remember_l
853  ############### Record python interpreter version ##############  ############### Record python interpreter version ##############
854    
855  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
856    
857    versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])    versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
858      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
859    os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))    os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
860    
861  ############## Populate the buildvars file #####################  ############## Populate the buildvars file #####################
# Line 750  else: Line 892  else:
892      out+="n"      out+="n"
893  buildvars.write(out+"\n")  buildvars.write(out+"\n")
894  buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')  buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
895    out="lapack="
896    if env['uselapack']:
897       out+="y"
898    else:
899       out+="n"
900    out+="\nsilo="
901    if env['usesilo']:
902       out+="y"
903    else:
904       out+="n"
905    buildvars.write(out+"\n")
906  buildvars.close()  buildvars.close()
907    
908    
# Line 766  env.Alias('install_esysUtils', ['build_e Line 918  env.Alias('install_esysUtils', ['build_e
918  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
919  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
920    
921    env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
922    env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
923    
924    env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
925    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
926    
927  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'])
928  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'])
929    
# Line 776  env.Alias('install_finley', ['build_finl Line 934  env.Alias('install_finley', ['build_finl
934  build_all_list = []  build_all_list = []
935  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
936  build_all_list += ['build_paso']  build_all_list += ['build_paso']
937    build_all_list += ['build_weipa']
938  build_all_list += ['build_escript']  build_all_list += ['build_escript']
939  build_all_list += ['build_finley']  build_all_list += ['build_finley']
940  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
941  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
942  if env['usesilo']:  build_all_list += ['target_escript2silo']  build_all_list += ['target_escriptconvert']
943  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
944    
945  install_all_list = []  install_all_list = []
946  install_all_list += ['target_init']  install_all_list += ['target_init']
947  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
948  install_all_list += ['install_paso']  install_all_list += ['install_paso']
949    install_all_list += ['install_weipa']
950  install_all_list += ['install_escript']  install_all_list += ['install_escript']
951  install_all_list += ['install_finley']  install_all_list += ['install_finley']
952  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
953  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
954  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
955  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
956  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
957  if env['usesilo']:  install_all_list += ['target_install_escript2silo']  if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
958  install_all_list += ['remember_options']  install_all_list += ['remember_options']
959  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
960    
# Line 809  env.Alias('run_tests', ['install_all', ' Line 969  env.Alias('run_tests', ['install_all', '
969  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'])
970  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
971    
972    
973  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
974    
975  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])  env.Alias('api_epydoc','install_all')
976    
977    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
978    
979    build_platform=os.name
980    
981  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
982     try:     try:
983      utest=open("utest.sh","w")      utest=open("utest.sh","w")
984      build_platform=os.name      #Sometimes Mac python says it is posix      #Sometimes Mac python says it is posix
985      if (build_platform=='posix') and platform.system()=="Darwin":      if (build_platform=='posix') and platform.system()=="Darwin":
986          build_platform='darwin'          build_platform='darwin'
987      utest.write(GroupTest.makeHeader(build_platform))      utest.write(GroupTest.makeHeader(build_platform))
# Line 829  if not IS_WINDOWS_PLATFORM: Line 994  if not IS_WINDOWS_PLATFORM:
994      print "Error attempting to write unittests file."      print "Error attempting to write unittests file."
995      sys.exit(1)      sys.exit(1)
996    
997       #Make sure that the escript wrapper is in place
998       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
999           print "Copying escript wrapper"
1000           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1001    
1002    ############ Targets to build PasoTests suite ################
1003    
1004    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1005    
1006    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.2356  
changed lines
  Added in v.3039

  ViewVC Help
Powered by ViewVC 1.1.26