/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2358 by gross, Wed Apr 1 22:25:24 2009 UTC revision 3078 by jfenwick, Tue Aug 3 03:12:16 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', ['default']),
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    
187    # This is only to support old versions of scons which don't accept
188    # the variant_dir parameter (older than 0.98 I think).
189    # Once these are no longer an issue we can go back to a direct call
190    # to obj.SConscript
191    import SCons
192    vs=SCons.__version__.split('.')
193    cantusevariantdir=float(vs[0]+'.'+vs[1])<0.98
194    
195    
196    def CallSConscript(obj, **kw):
197        if cantusevariantdir:
198            if 'variant_dir' in kw:
199            kw['build_dir']=kw['variant_dir']
200            del kw['variant_dir']
201        obj.SConscript(**kw)
202    
203    
204  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
205    
206  # 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 211  if IS_WINDOWS_PLATFORM:
211        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
212                          options = opts)                          options = opts)
213  else:  else:
214     if socket.gethostname().split('.')[0] == 'service0':     if os.uname()[4]=='ia64':
       env = Environment(tools = ['default', 'intelc'], options = opts)  
    elif os.uname()[4]=='ia64':  
215        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
216        if env['CXX'] == 'icpc':        if env['CXX'] == 'icpc':
217           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)
218     else:     else:
219        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
220          if env['tools_names']!='default':
221        env=Environment(tools = ['default'] +env['tools_names'], options=opts)
222    
223    # Override compiler choice if provided
224    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
225    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
226    
227  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
228    
229    ############ Make sure target directories exist ################
230    
231    if not os.path.isdir(env['bininstall']):
232        os.makedirs(env['bininstall'])
233    if not os.path.isdir(env['libinstall']):
234        os.makedirs(env['libinstall'])
235    if not os.path.isdir(env['pyinstall']):
236        os.makedirs(env['pyinstall'])
237    
238    ########## Copy required environment vars ######################
239    
240    for i in env['env_export']:
241       env.Append(ENV = {i:os.environ[i]})
242    
243  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
244    
245  # 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 251  if env['useMPI']: env['usempi'] = 1
251    
252  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.
253    
254    cc_flags = ""
255    cc_optim = ""
256    cc_debug = ""
257    omp_optim = ""
258    omp_debug = ""
259    omp_libs = []
260    
261  if env["CC"] == "icc":  if env["CC"] == "icc":
262    # Intel compilers    # Intel compilers
263    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
264    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
265    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
266    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
# Line 184  if env["CC"] == "icc": Line 269  if env["CC"] == "icc":
269    pedantic      = ""    pedantic      = ""
270    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
271    sysheaderopt      = ""    sysheaderopt      = ""
272  elif env["CC"] == "gcc":  elif env["CC"][:3] == "gcc":
273    # GNU C on any system    # GNU C on any system
274    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"
275  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
276    cc_optim      = "-O3"    cc_optim      = "-O3"
277    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
278    omp_optim     = "-fopenmp"    omp_optim     = "-fopenmp"
279    omp_debug     = "-fopenmp"    omp_debug     = "-fopenmp"
280    omp_libs      = ['gomp']    omp_libs      = []
281    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
282    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
283    sysheaderopt      = "-isystem "    sysheaderopt      = "-isystem "
# Line 225  if env["omp_libs"] == "-DEFAULT_6": env[ Line 310  if env["omp_libs"] == "-DEFAULT_6": env[
310  #set up the autolazy values  #set up the autolazy values
311  if env['forcelazy']    != "leave_alone":  if env['forcelazy']    != "leave_alone":
312    if env['forcelazy'] == 'on':    if env['forcelazy'] == 'on':
313      env.Append(CPPDEFINES='FAUTOLAZYON')      env.Append(CPPDEFINES=['FAUTOLAZYON'])
314    else:    else:
315       if env['forcelazy'] == 'off':       if env['forcelazy'] == 'off':
316      env.Append(CPPDEFINES='FAUTOLAZYOFF')      env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
317    
318    #set up the colective resolve values
319    if env['forcecollres']    != "leave_alone":
320      print env['forcecollres']
321      if env['forcecollres'] == 'on':
322        env.Append(CPPDEFINES=['FRESCOLLECTON'])
323      else:
324         if env['forcecollres'] == 'off':
325        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
326    
327    
328    if env['iknowwhatimdoing']:
329        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
330    
331  # 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
332  if not env["useopenmp"]:  if not env["useopenmp"]:
# Line 238  if not env["useopenmp"]: Line 336  if not env["useopenmp"]:
336    
337  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
338    
339    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
340    if IS_WINDOWS_PLATFORM:
341        LD_LIBRARY_PATH_KEY='PATH'
342        env['ENV']['LD_LIBRARY_PATH']=''
343    else:
344        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
345  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
346    
347  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
348  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
349    
350    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
351    except KeyError: pass
352    
353    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
354    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
355    
356    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
357    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
358    
359    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
360    except KeyError: pass
361    
362  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
363  except KeyError: pass  except KeyError: pass
364    
# Line 255  except KeyError: pass Line 371  except KeyError: pass
371  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
372  except KeyError: pass  except KeyError: pass
373    
374  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
375  except KeyError: pass  except KeyError: pass
376    
377  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 387  try: env['ENV']['HOME'] = os.environ['HO
387  except KeyError: pass  except KeyError: pass
388    
389  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
390    
391    
392    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
393    env.PrependENVPath('PYTHONPATH', prefix)
394  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
395    
396  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 290  env.Append(CPPPATH     = [Dir('include')]) Line 407  env.Append(CPPPATH     = [Dir('include')])
407  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
408  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
409    
410  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
411    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
412  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
413    
414  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
# Line 319  except: Line 437  except:
437  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
438  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
439    
440  ############ numarray (required) ###############################  ############ numpy (required) ###############################
441    
442  try:  try:
443    from numarray import identity    from numpy import identity
444  except ImportError:  except ImportError:
445    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
446    sys.exit(1)    sys.exit(1)
447    
448  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 351  else: Line 469  else:
469  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
470  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
471    
 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  
472  conf.env.PrependENVPath('PYTHONPATH', prefix)  conf.env.PrependENVPath('PYTHONPATH', prefix)
473  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
474    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
475    
476  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
477    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 494  else:
494  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
495  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
496    
497  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
498  #ensure that our path entries remain at the front  #ensure that our path entries remain at the front
499  conf.env.PrependENVPath('PYTHONPATH', prefix)  conf.env.PrependENVPath('PYTHONPATH', prefix)
500  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
501    
 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)  
502    
503  if not conf.CheckFunc('PyObject_SetAttr'):  #Yep we still cant figure this one out. - working on it.
504    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:
505    sys.exit(1)    if not conf.CheckCXXHeader('boost/python.hpp'):
506        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
507        sys.exit(1)
508    
509      if not conf.CheckFunc('PyObject_SetAttr'):
510        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'])
511        sys.exit(1)
512    
513    
514  # Commit changes to environment  # Commit changes to environment
515  env = conf.Finish()  env = conf.Finish()
# Line 413  if env['usenetcdf']: Line 535  if env['usenetcdf']:
535    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
536    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
537    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
538    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
539    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
540    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
541    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
542    
543  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
544  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 559  if env['usepapi']:
559    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
560    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
561    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
562    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
563    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
564    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
565    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
566    
567  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
568  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 583  if env['usemkl']:
583    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
584    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
585    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
586    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
587    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
588    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
589    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
590    
591  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
592  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
593    
594    
595  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
596  if env['usemkl']:  if env['usemkl']:
597    env = conf.Finish()    env = conf.Finish()
# Line 492  if env['useumfpack']: Line 615  if env['useumfpack']:
615    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
616    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
617    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
618    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
619    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
620    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
621    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
622    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
623    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
624    
 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0  
625  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
626    if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
627  # 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?
628    
629  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
# Line 523  if env['usesilo']: Line 646  if env['usesilo']:
646    
647  # Add the path to Silo to environment env if it was found.  # Add the path to Silo to environment env if it was found.
648  # 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
649  # escriptreader library and tools.  # weipa library and tools.
650  if env['usesilo']:  if env['usesilo']:
651    env.AppendUnique(CPPPATH = [env['silo_path']])    env.AppendUnique(CPPPATH = [env['silo_path']])
652    env.AppendUnique(LIBPATH = [env['silo_lib_path']])    env.AppendUnique(LIBPATH = [env['silo_lib_path']])
653    env.Append(CPPDEFINES = ['HAVE_SILO'])  
654    ########### Lapack (optional) ##################################
655    
656    if env['uselapack']:
657        env.AppendUnique(CPPDEFINES='USE_LAPACK')
658        env.AppendUnique(CPPPATH = [env['lapack_path']])
659        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
660    
661        env.Append(LIBPATH = '/usr/lib/atlas')
662        env.Append(LIBS = [env['lapack_libs']])
663        if env['lapack_type']=='mkl':
664           if not env['usemkl']:
665            env['uselapack']=0
666            print "mkl_lapack requires mkl"
667           else:
668            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
669          
670    
671  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
672    
# Line 554  env.Append(BUILDERS = {'RunUnitTest' : r Line 693  env.Append(BUILDERS = {'RunUnitTest' : r
693  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)
694  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
695    
696    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
697    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
698    
699  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
700    if not env['usempi']: env['mpi_flavour']='none'
701    
702  # 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)
703  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 563  env_mpi = clone_env(env) Line 706  env_mpi = clone_env(env)
706  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
707    
708  if env_mpi['usempi']:  if env_mpi['usempi']:
709    VALID_MPIs=[ "MPT", "OPENMPI", "MPICH", "OPENMPI", "INTELMPI" ]    VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
710    if not env_mpi['mpi_flavour'] in VALID_MPIs:    if not env_mpi['mpi_flavour'] in VALID_MPIs:
711        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)
712    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
713    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
714    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
715    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
716    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
717    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
718    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
719    
720  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
721  # 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 724  if env_mpi['usempi'] and not conf.CheckC
724  if env_mpi['usempi']:  if env_mpi['usempi']:
725    env_mpi = conf.Finish()    env_mpi = conf.Finish()
726    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']])
727      # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
728      # On the other hand MPT and OpenMPI don't define the latter so we have to
729      # do that here
730      if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
731        env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
732  else:  else:
733    conf.Finish()    conf.Finish()
734    
# Line 597  if env_mpi['useparmetis']: Line 745  if env_mpi['useparmetis']:
745    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
746    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
747    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
748    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
749    #ensure that our path entries remain at the front    #ensure that our path entries remain at the front
750    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
751    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
752    
753  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
754  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 762  else:
762    
763  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
764    
 ############ 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)  
   
765  ############ Summarize our environment #########################  ############ Summarize our environment #########################
766    
767  print ""  print ""
768  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
769  print " Using python libraries"  print " Using python libraries"
770  print " Using numarray"  print " Using numpy"
771  print " Using boost"  print " Using boost"
772  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
773  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 647  if env['useparmetis']: print " Using Par Line 787  if env['useparmetis']: print " Using Par
787  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
788  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
789  else: print "   Not using PAPI"  else: print "   Not using PAPI"
790    if env['uselapack']: print "    Using Lapack"
791    else: print "   Not using Lapack"
792  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
793  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
794  print " Installing in", prefix  print " Installing in", prefix
# Line 666  if not env['usempi']: Execute(Delete(os. Line 808  if not env['usempi']: Execute(Delete(os.
808    
809  ############ Build the subdirectories ##########################  ############ Build the subdirectories ##########################
810    
811    if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
812    
813    
814  from grouptest import *  from grouptest import *
815    
816  TestGroups=[]  TestGroups=[]
817    
818    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
819    
820    ############ Now we switch on Warnings as errors ###############
821    
822    #this needs to be done after configuration because the scons test files have warnings in them
823    
824    if ((fatalwarning != "") and (env['usewarnings'])):
825      env.Append(CCFLAGS        = fatalwarning)
826      env_mpi.Append(CCFLAGS        = fatalwarning)
827    
828    
829  Export(  Export(
830    ["env",    ["env",
831     "env_mpi",     "env_mpi",
832     "clone_env",     "clone_env",
833       "dodgy_env",
834     "IS_WINDOWS_PLATFORM",     "IS_WINDOWS_PLATFORM",
835     "TestGroups"     "TestGroups",
836       "CallSConscript",
837       "cantusevariantdir"
838     ]     ]
839    )    )
840    
841  env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  CallSConscript(env, dirs = ['tools/CppUnitTest/src'], variant_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
842  env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)  CallSConscript(env, dirs = ['tools/escriptconvert'], variant_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
843  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  CallSConscript(env, dirs = ['paso/src'], variant_dir='build/$PLATFORM/paso', duplicate=0)
844  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  CallSConscript(env, dirs = ['weipa/src'], variant_dir='build/$PLATFORM/weipa', duplicate=0)
845  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  CallSConscript(env, dirs = ['escript/src'], variant_dir='build/$PLATFORM/escript', duplicate=0)
846  env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)  CallSConscript(env, dirs = ['esysUtils/src'], variant_dir='build/$PLATFORM/esysUtils', duplicate=0)
847  env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)  CallSConscript(env, dirs = ['finley/src'], variant_dir='build/$PLATFORM/finley', duplicate=0)
848  env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)  CallSConscript(env, dirs = ['modellib/py_src'], variant_dir='build/$PLATFORM/modellib', duplicate=0)
849  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)  CallSConscript(env, dirs = ['doc'], variant_dir='build/$PLATFORM/doc', duplicate=0)
850  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  CallSConscript(env, dirs = ['pyvisi/py_src'], variant_dir='build/$PLATFORM/pyvisi', duplicate=0)
851  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  CallSConscript(env, dirs = ['pycad/py_src'], variant_dir='build/$PLATFORM/pycad', duplicate=0)
852  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  CallSConscript(env, dirs = ['pythonMPI/src'], variant_dir='build/$PLATFORM/pythonMPI', duplicate=0)
853  env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)  CallSConscript(env, dirs = ['scripts'], variant_dir='build/$PLATFORM/scripts', duplicate=0)
854    CallSConscript(env, dirs = ['paso/profiling'], variant_dir='build/$PLATFORM/paso/profiling', duplicate=0)
855    
856    
857  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
# Line 713  env.Alias('remember_options', remember_l Line 873  env.Alias('remember_options', remember_l
873  ############### Record python interpreter version ##############  ############### Record python interpreter version ##############
874    
875  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
876    
877    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])
878      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
879    os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))    os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
880    
881  ############## Populate the buildvars file #####################  ############## Populate the buildvars file #####################
# Line 750  else: Line 912  else:
912      out+="n"      out+="n"
913  buildvars.write(out+"\n")  buildvars.write(out+"\n")
914  buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')  buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
915    out="lapack="
916    if env['uselapack']:
917       out+="y"
918    else:
919       out+="n"
920    out+="\nsilo="
921    if env['usesilo']:
922       out+="y"
923    else:
924       out+="n"
925    buildvars.write(out+"\n")
926  buildvars.close()  buildvars.close()
927    
928    
# Line 766  env.Alias('install_esysUtils', ['build_e Line 938  env.Alias('install_esysUtils', ['build_e
938  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
939  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
940    
941    env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
942    env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
943    
944    env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
945    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
946    
947  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'])
948  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'])
949    
# Line 776  env.Alias('install_finley', ['build_finl Line 954  env.Alias('install_finley', ['build_finl
954  build_all_list = []  build_all_list = []
955  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
956  build_all_list += ['build_paso']  build_all_list += ['build_paso']
957    build_all_list += ['build_weipa']
958  build_all_list += ['build_escript']  build_all_list += ['build_escript']
959  build_all_list += ['build_finley']  build_all_list += ['build_finley']
960  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
961  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
962  if env['usesilo']:  build_all_list += ['target_escript2silo']  build_all_list += ['target_escriptconvert']
963  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
964    
965  install_all_list = []  install_all_list = []
966  install_all_list += ['target_init']  install_all_list += ['target_init']
967  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
968  install_all_list += ['install_paso']  install_all_list += ['install_paso']
969    install_all_list += ['install_weipa']
970  install_all_list += ['install_escript']  install_all_list += ['install_escript']
971  install_all_list += ['install_finley']  install_all_list += ['install_finley']
972  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
973  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
974  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
975  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
976  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
977  if env['usesilo']:  install_all_list += ['target_install_escript2silo']  if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
978  install_all_list += ['remember_options']  install_all_list += ['remember_options']
979  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
980    
# Line 809  env.Alias('run_tests', ['install_all', ' Line 989  env.Alias('run_tests', ['install_all', '
989  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'])
990  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
991    
992    
993  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
994    
995  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])  env.Alias('api_epydoc','install_all')
996    
997    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
998    
999    build_platform=os.name
1000    
1001  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
1002     try:     try:
1003      utest=open("utest.sh","w")      utest=open("utest.sh","w")
1004      build_platform=os.name      #Sometimes Mac python says it is posix      #Sometimes Mac python says it is posix
1005      if (build_platform=='posix') and platform.system()=="Darwin":      if (build_platform=='posix') and platform.system()=="Darwin":
1006          build_platform='darwin'          build_platform='darwin'
1007      utest.write(GroupTest.makeHeader(build_platform))      utest.write(GroupTest.makeHeader(build_platform))
# Line 829  if not IS_WINDOWS_PLATFORM: Line 1014  if not IS_WINDOWS_PLATFORM:
1014      print "Error attempting to write unittests file."      print "Error attempting to write unittests file."
1015      sys.exit(1)      sys.exit(1)
1016    
1017       #Make sure that the escript wrapper is in place
1018       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
1019           print "Copying escript wrapper"
1020           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1021    
1022    ############ Targets to build PasoTests suite ################
1023    
1024    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1025    
1026    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.2358  
changed lines
  Added in v.3078

  ViewVC Help
Powered by ViewVC 1.1.26