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

Diff of /branches/dirac/SConstruct

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

revision 2423 by gross, Thu May 14 05:02:20 2009 UTC revision 2923 by jfenwick, Thu Feb 4 04:05:36 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    #Holds names of variables from the calling environment which need to be passed
39    #to tools
40    env_export=[]
41    
42  #Determine where to read options from use:  #Determine where to read options from use:
43  #1. command line  #1. command line
44  #2. scons/<hostname>_options.py  #2. scons/<hostname>_options.py
45  #3. name as part of a cluster  #3. name as part of a cluster
46  options_file=ARGUMENTS.get('options_file', None)  options_file=ARGUMENTS.get('options_file', None)
47    effective_hostname=socket.gethostname().split('.')[0]
48  if not options_file:  if not options_file:
49    hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])    mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
50    options_file = os.path.join("scons",hostname+"_options.py")    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    #If there is no options file with that name see if there is a substitute
52    if not os.path.isfile(options_file):    if not os.path.isfile(options_file):
53      tmp = scons_extensions.effectiveName(hostname)      effective_hostname = scons_extensions.effectiveName(effective_hostname)
54      options_file = os.path.join("scons",tmp+"_options.py")      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    print "Options file not found (expected '%s')" % options_file
# Line 52  if not os.path.isfile(options_file): Line 60  if not os.path.isfile(options_file):
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 65  opts.AddOptions( Line 82  opts.AddOptions(
82    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),
83    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),
84  # Compilation options  # Compilation options
85    BoolOption('dodebug', 'For backwards compatibility', 'no'),    BoolVariable('dodebug', 'For backwards compatibility', 'no'),
86    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolVariable('usedebug', 'Do you want a debug build?', 'no'),
87    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolVariable('usevtk', 'Do you want to use VTK?', 'yes'),
88    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),
89      ('cc', 'path to C compiler', 'DEFAULT'),
90      ('cxx', 'path to C++ compiler', 'DEFAULT'),
91    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
92    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below
93    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
# Line 81  opts.AddOptions( Line 100  opts.AddOptions(
100    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
101    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
102    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
103    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
104    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
105    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
106    ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),    ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
107      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
108  # Python  # Python
109    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
110    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 95  opts.AddOptions( Line 115  opts.AddOptions(
115    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
116    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
117  # NetCDF  # NetCDF
118    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
119    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
120    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
121    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
122  # MPI  # MPI
123    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
124    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
125    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
126    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
127    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
128    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
129    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', []),
130    ('mpi_flavour','Type of MPI execution environment','none'),    ('mpi_flavour','Type of MPI execution environment','none'),
131  # ParMETIS  # ParMETIS
132    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
133    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
134    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
135    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
136  # PAPI  # PAPI
137    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
138    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
139    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
140    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
141    BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),    BoolVariable('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
142  # MKL  # MKL
143    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
144    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
145    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
146    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
147  # UMFPACK  # UMFPACK
148    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
149    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
150    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
151    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
152    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
153  # Silo  # Silo
154    BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),    BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
155    ('silo_path', 'Path to Silo includes', '/usr/include'),    ('silo_path', 'Path to Silo includes', '/usr/include'),
156    ('silo_lib_path', 'Path to Silo libs', usr_lib),    ('silo_lib_path', 'Path to Silo libs', usr_lib),
157    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
# Line 143  opts.AddOptions( Line 163  opts.AddOptions(
163    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
164    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
165    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
166    #Lapack options
167      BoolVariable('uselapack','switch on/off use of Lapack','no'),
168      ('lapack_path', 'Path to Lapack includes','/usr/include'),
169      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
170      ('lapack_libs', 'Lapack libraries to link with', []),
171      ('lapack_type', '{clapack,mkl}','clapack'),
172  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
173    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
174  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
175  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
176    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
177    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
178      ('env_export','Environment variables to be passed to children',[]),
179    #To enable passing function pointers through python
180      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
181  )  )
182    
183    
184    
185  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
186    
187  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 161  if IS_WINDOWS_PLATFORM: Line 192  if IS_WINDOWS_PLATFORM:
192        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
193                          options = opts)                          options = opts)
194  else:  else:
195     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
196        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
197     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
198        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 169  else: Line 200  else:
200           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
201     else:     else:
202        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
203    
204    # Override compiler choice if provided
205    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
206    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
207    
208  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
209    
210    ############ Make sure target directories exist ################
211    
212    if not os.path.isdir(env['bininstall']):
213        os.makedirs(env['bininstall'])
214    if not os.path.isdir(env['libinstall']):
215        os.makedirs(env['libinstall'])
216    if not os.path.isdir(env['pyinstall']):
217        os.makedirs(env['pyinstall'])
218    
219    ########## Copy required environment vars ######################
220    
221    for i in env['env_export']:
222       env.Append(ENV = {i:os.environ[i]})
223    
224  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
225    
226  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 182  if env['useMPI']: env['usempi'] = 1 Line 232  if env['useMPI']: env['usempi'] = 1
232    
233  sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.  sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
234    
235    cc_flags = ""
236    cc_optim = ""
237    cc_debug = ""
238    omp_optim = ""
239    omp_debug = ""
240    omp_libs = []
241    
242  if env["CC"] == "icc":  if env["CC"] == "icc":
243    # Intel compilers    # Intel compilers
244    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
245    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
246    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
# Line 193  if env["CC"] == "icc": Line 250  if env["CC"] == "icc":
250    pedantic      = ""    pedantic      = ""
251    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
252    sysheaderopt      = ""    sysheaderopt      = ""
253  elif env["CC"] == "gcc":  elif env["CC"][:3] == "gcc":
254    # GNU C on any system    # GNU C on any system
255    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"    cc_flags      = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
256  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
257    cc_optim      = "-O3"    cc_optim      = "-O3"
258    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
259    omp_optim     = "-fopenmp"    omp_optim     = "-fopenmp"
260    omp_debug     = "-fopenmp"    omp_debug     = "-fopenmp"
261    omp_libs      = ['gomp']    omp_libs      = []
262    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
263    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
264    sysheaderopt      = "-isystem "    sysheaderopt      = "-isystem "
# Line 234  if env["omp_libs"] == "-DEFAULT_6": env[ Line 291  if env["omp_libs"] == "-DEFAULT_6": env[
291  #set up the autolazy values  #set up the autolazy values
292  if env['forcelazy']    != "leave_alone":  if env['forcelazy']    != "leave_alone":
293    if env['forcelazy'] == 'on':    if env['forcelazy'] == 'on':
294      env.Append(CPPDEFINES='FAUTOLAZYON')      env.Append(CPPDEFINES=['FAUTOLAZYON'])
295    else:    else:
296       if env['forcelazy'] == 'off':       if env['forcelazy'] == 'off':
297      env.Append(CPPDEFINES='FAUTOLAZYOFF')      env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
298    
299    #set up the colective resolve values
300    if env['forcecollres']    != "leave_alone":
301      print env['forcecollres']
302      if env['forcecollres'] == 'on':
303        env.Append(CPPDEFINES=['FRESCOLLECTON'])
304      else:
305         if env['forcecollres'] == 'off':
306        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
307    
308    
309    if env['iknowwhatimdoing']:
310        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
311    
312  # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty  # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
313  if not env["useopenmp"]:  if not env["useopenmp"]:
# Line 282  except KeyError: pass Line 352  except KeyError: pass
352  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
353  except KeyError: pass  except KeyError: pass
354    
355  try: PrependENVPath['ENV'][LD_LIBRARY_PATH_KEY] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
356  except KeyError: pass  except KeyError: pass
357    
358  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 347  except: Line 417  except:
417  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
418  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
419    
420  ############ numarray (required) ###############################  ############ numpy (required) ###############################
421    
422  try:  try:
423    from numarray import identity    from numpy import identity
424  except ImportError:  except ImportError:
425    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
426    sys.exit(1)    sys.exit(1)
427    
428  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 497  if env['usemkl']: Line 567  if env['usemkl']:
567  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
568  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
569    
570    
571  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
572  if env['usemkl']:  if env['usemkl']:
573    env = conf.Finish()    env = conf.Finish()
# Line 527  if env['useumfpack']: Line 598  if env['useumfpack']:
598    conf.env.PrependENVPath('PYTHONPATH', prefix)    conf.env.PrependENVPath('PYTHONPATH', prefix)
599    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
600    
 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0  
601  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
602    if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
603  # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?  # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
604    
605  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
# Line 551  if env['usesilo']: Line 622  if env['usesilo']:
622    
623  # Add the path to Silo to environment env if it was found.  # Add the path to Silo to environment env if it was found.
624  # Note that we do not add the libs since they are only needed for the  # Note that we do not add the libs since they are only needed for the
625  # escriptreader library and tools.  # escriptexport library and tools.
626  if env['usesilo']:  if env['usesilo']:
627    env.AppendUnique(CPPPATH = [env['silo_path']])    env.AppendUnique(CPPPATH = [env['silo_path']])
628    env.AppendUnique(LIBPATH = [env['silo_lib_path']])    env.AppendUnique(LIBPATH = [env['silo_lib_path']])
629    env.Append(CPPDEFINES = ['HAVE_SILO'])  
630    ########### Lapack (optional) ##################################
631    
632    if env['uselapack']:
633        env.AppendUnique(CPPDEFINES='USE_LAPACK')
634        env.AppendUnique(CPPPATH = [env['lapack_path']])
635        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
636    
637        env.Append(LIBPATH = '/usr/lib/atlas')
638        env.Append(LIBS = [env['lapack_libs']])
639        if env['lapack_type']=='mkl':
640           if not env['usemkl']:
641            env['uselapack']=0
642            print "mkl_lapack requires mkl"
643           else:
644            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
645          
646    
647  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
648    
# Line 618  else: Line 705  else:
705    
706  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
707    
   
708  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
709    
710  # Start a new configure environment that reflects what we've already found  # Start a new configure environment that reflects what we've already found
# Line 647  else: Line 733  else:
733    
734  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
735    
 ############ 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)  
   
736  ############ Summarize our environment #########################  ############ Summarize our environment #########################
737    
738  print ""  print ""
739  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
740  print " Using python libraries"  print " Using python libraries"
741  print " Using numarray"  print " Using numpy"
742  print " Using boost"  print " Using boost"
743  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
744  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 680  if env['useparmetis']: print " Using Par Line 758  if env['useparmetis']: print " Using Par
758  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
759  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
760  else: print "   Not using PAPI"  else: print "   Not using PAPI"
761    if env['uselapack']: print "    Using Lapack"
762    else: print "   Not using Lapack"
763  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
764  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
765  print " Installing in", prefix  print " Installing in", prefix
# Line 699  if not env['usempi']: Execute(Delete(os. Line 779  if not env['usempi']: Execute(Delete(os.
779    
780  ############ Build the subdirectories ##########################  ############ Build the subdirectories ##########################
781    
782    if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
783    
784    
785  from grouptest import *  from grouptest import *
786    
787  TestGroups=[]  TestGroups=[]
788    
789    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
790    
791    ############ Now we switch on Warnings as errors ###############
792    
793    #this needs to be done after configuration because the scons test files have warnings in them
794    
795    if ((fatalwarning != "") and (env['usewarnings'])):
796      env.Append(CCFLAGS        = fatalwarning)
797      env_mpi.Append(CCFLAGS        = fatalwarning)
798    
799    
800  Export(  Export(
801    ["env",    ["env",
802     "env_mpi",     "env_mpi",
803     "clone_env",     "clone_env",
804       "dodgy_env",
805     "IS_WINDOWS_PLATFORM",     "IS_WINDOWS_PLATFORM",
806     "TestGroups"     "TestGroups"
807     ]     ]
808    )    )
809    
810  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)
811  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)
812  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
813    env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
814  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
815  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
816  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 746  env.Alias('remember_options', remember_l Line 842  env.Alias('remember_options', remember_l
842  ############### Record python interpreter version ##############  ############### Record python interpreter version ##############
843    
844  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
845    
846    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])
847      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
848    os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))    os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
849    
850  ############## Populate the buildvars file #####################  ############## Populate the buildvars file #####################
# Line 783  else: Line 881  else:
881      out+="n"      out+="n"
882  buildvars.write(out+"\n")  buildvars.write(out+"\n")
883  buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')  buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
884    out="lapack="
885    if env['uselapack']:
886       out+="y"
887    else:
888       out+="n"
889    out+="\nsilo="
890    if env['usesilo']:
891       out+="y"
892    else:
893       out+="n"
894    buildvars.write(out+"\n")
895  buildvars.close()  buildvars.close()
896    
897    
# Line 799  env.Alias('install_esysUtils', ['build_e Line 907  env.Alias('install_esysUtils', ['build_e
907  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
908  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
909    
910    env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
911    env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
912    
913    env.Alias('build_escriptreader', ['target_install_escriptexport_headers', 'target_escriptreader_a'])
914    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
915    
916  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'])
917  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'])
918    
# Line 809  env.Alias('install_finley', ['build_finl Line 923  env.Alias('install_finley', ['build_finl
923  build_all_list = []  build_all_list = []
924  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
925  build_all_list += ['build_paso']  build_all_list += ['build_paso']
926    build_all_list += ['build_dataexporter']
927  build_all_list += ['build_escript']  build_all_list += ['build_escript']
928  build_all_list += ['build_finley']  build_all_list += ['build_finley']
929  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
930  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
931  if env['usesilo']:  build_all_list += ['target_escript2silo']  if env['usesilo']:  build_all_list += ['target_escriptconvert']
932  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
933    
934  install_all_list = []  install_all_list = []
935  install_all_list += ['target_init']  install_all_list += ['target_init']
936  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
937  install_all_list += ['install_paso']  install_all_list += ['install_paso']
938    install_all_list += ['install_dataexporter']
939  install_all_list += ['install_escript']  install_all_list += ['install_escript']
940  install_all_list += ['install_finley']  install_all_list += ['install_finley']
941  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
# Line 827  install_all_list += ['target_install_mod Line 943  install_all_list += ['target_install_mod
943  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
944  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
945  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
946  if env['usesilo']:  install_all_list += ['target_install_escript2silo']  if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
947  install_all_list += ['remember_options']  install_all_list += ['remember_options']
948  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
949    
# Line 842  env.Alias('run_tests', ['install_all', ' Line 958  env.Alias('run_tests', ['install_all', '
958  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'])
959  env.Alias('build_full',['install_all','build_tests','build_py_tests'])  env.Alias('build_full',['install_all','build_tests','build_py_tests'])
960    
961    
962  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
963    
964  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])  env.Alias('api_epydoc','install_all')
965    
966    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
967    
968    build_platform=os.name
969    
970  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
971     try:     try:
972      utest=open("utest.sh","w")      utest=open("utest.sh","w")
973      build_platform=os.name      #Sometimes Mac python says it is posix      #Sometimes Mac python says it is posix
974      if (build_platform=='posix') and platform.system()=="Darwin":      if (build_platform=='posix') and platform.system()=="Darwin":
975          build_platform='darwin'          build_platform='darwin'
976      utest.write(GroupTest.makeHeader(build_platform))      utest.write(GroupTest.makeHeader(build_platform))
# Line 862  if not IS_WINDOWS_PLATFORM: Line 983  if not IS_WINDOWS_PLATFORM:
983      print "Error attempting to write unittests file."      print "Error attempting to write unittests file."
984      sys.exit(1)      sys.exit(1)
985    
986       #Make sure that the escript wrapper is in place
987       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
988           print "Copying escript wrapper"
989           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
990    
991    ############ Targets to build PasoTests suite ################
992    
993    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
994    
995    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.2423  
changed lines
  Added in v.2923

  ViewVC Help
Powered by ViewVC 1.1.26