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

Diff of /branches/escript3047_with_pastix2995/SConstruct

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

trunk/SConstruct revision 1708 by ksteube, Thu Aug 14 22:42:24 2008 UTC branches/escript3047_with_pastix2995/SConstruct revision 3049 by lgao, Fri Jun 25 04:20:29 2010 UTC
# Line 1  Line 1 
1  #         Copyright 2006 by ACcESS MNRF  
2    ########################################################
3    #
4    # Copyright (c) 2003-2010 by University of Queensland
5    # Earth Systems Science Computational Center (ESSCC)
6    # http://www.uq.edu.au/esscc
7  #  #
8  #              http://www.access.edu.au  # Primary Business: Queensland, Australia
9  #       Primary Business: Queensland, Australia  # Licensed under the Open Software License version 3.0
10  #  Licensed under the Open Software License version 3.0  # http://www.opensource.org/licenses/osl-3.0.php
11  #     http://www.opensource.org/licenses/osl-3.0.php  #
12    ########################################################
13    
14    
15  EnsureSConsVersion(0,96,91)  EnsureSConsVersion(0,96,91)
16  EnsurePythonVersion(2,3)  EnsurePythonVersion(2,3)
17    
18  import sys, os, re, socket  import sys, os, re, socket, platform, stat
19    # For copy()
20    import shutil
21    
22  # Add our extensions  # Add our extensions
23  if os.path.isdir('scons'): sys.path.append('scons')  if os.path.isdir('scons'): sys.path.append('scons')
# Line 26  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  if not os.path.isfile(options_file): options_file = False  #Determine where to read options from use:
43  else: print "Options file is", options_file  #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):
58      print "Options file not found (expected '%s')" % options_file
59      options_file = False
60    else:
61      print "Options file is", options_file
62    
63    #Does our scons support the newer Variables class or do we need to use Options?
64    
65  # Load options file and command-line arguments  try:
66  opts = Options(options_file, ARGUMENTS)     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')),
81      ('bininstall', 'where the esys binaries will be installed',            os.path.join(prefix,'bin')),
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'),
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', ''),
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', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
105    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'yes'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
106      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'),
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 71  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'),
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    # PASTIX
149      BoolVariable('usepastix', 'switch on/off the usage of PASTIX', 'no'),
150      ('pastix_path', 'Path to PASTIX includes', '/sw/libs/pastix/x86_64/gcc-4.3.2/pastix-2995/include'),
151      ('pastix_lib_path', 'Path to PASTIX libs', '/sw/libs/pastix/x86_64/gcc-4.3.2/pastix-2995/lib'),
152      ('pastix_libs', 'PASTIX libraries to link with', ['pastix']),
153      ('scotch_path', 'Path to SCOTCH includes', '/sw/libs/scotch/x86_64/gcc-4.3.2/scotch-5.1.8a/include'),
154      ('scotch_lib_path', 'Path to SCOTCH libs', '/sw/libs/scotch/x86_64/gcc-4.3.2/scotch-5.1.8a/lib'),
155      ('scotch_libs', 'SCOTCH libraries to link with', ['ptscotch','ptscotcherr','ptscotcherrexit']),
156  # UMFPACK  # UMFPACK
157    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
158    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
159    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
160    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
161    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
162    # Silo
163      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
164      ('silo_path', 'Path to Silo includes', '/usr/include'),
165      ('silo_lib_path', 'Path to Silo libs', usr_lib),
166      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
167  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
168    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
169    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 112  opts.AddOptions( Line 171  opts.AddOptions(
171  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
172    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
173    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
174    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
175    #Lapack options
176      BoolVariable('uselapack','switch on/off use of Lapack','no'),
177      ('lapack_path', 'Path to Lapack includes','/usr/include'),
178      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
179      ('lapack_libs', 'Lapack libraries to link with', []),
180      ('lapack_type', '{clapack,mkl}','clapack'),
181    # An option for specifying the compiler tools set (see windows branch).
182      ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
183    # finer control over library building, intel aggressive global optimisation
184    # works with dynamic libraries on windows.
185      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
186      ('share_paso', 'control static or dynamic paso lib', False),
187      ('env_export','Environment variables to be passed to children',[]),
188    #To enable passing function pointers through python
189      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
190  )  )
191    
192    
193    
194  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
195    
196  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
197  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
198    
199  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
200        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
201          env = Environment(tools = ['default'] + env['tools_names'],
202                            options = opts)
203  else:  else:
204     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'savanna':
205        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
206     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
207        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 131  else: Line 209  else:
209           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)
210     else:     else:
211        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
212    
213    # Override compiler choice if provided
214    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
215    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
216    
217  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
218    
219    ############ Make sure target directories exist ################
220    
221    if not os.path.isdir(env['bininstall']):
222        os.makedirs(env['bininstall'])
223    if not os.path.isdir(env['libinstall']):
224        os.makedirs(env['libinstall'])
225    if not os.path.isdir(env['pyinstall']):
226        os.makedirs(env['pyinstall'])
227    
228    ########## Copy required environment vars ######################
229    
230    for i in env['env_export']:
231       env.Append(ENV = {i:os.environ[i]})
232    
233  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
234    
235  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 142  if env['useMPI']: env['usempi'] = 1 Line 239  if env['useMPI']: env['usempi'] = 1
239  # Default compiler options (override allowed in hostname_options.py, but should not be necessary)  # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
240  # For both C and C++ you get: cc_flags and either the optim flags or debug flags  # For both C and C++ you get: cc_flags and either the optim flags or debug flags
241    
242    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
243    
244    cc_flags = ""
245    cc_optim = ""
246    cc_debug = ""
247    omp_optim = ""
248    omp_debug = ""
249    omp_libs = []
250    
251  if env["CC"] == "icc":  if env["CC"] == "icc":
252    # Intel compilers    # Intel compilers
253    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
254    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
255    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
256    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
257    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
258    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
259    pedantic      = ""    pedantic      = ""
260  elif env["CC"] == "gcc":    fatalwarning      = ""        # Switch to turn warnings into errors
261      sysheaderopt      = ""
262    elif env["CC"][:3] == "gcc":
263    # GNU C on any system    # GNU C on any system
264    cc_flags      = "-fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER"    cc_flags      = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
265    #the long long warning occurs on the Mac
266    cc_optim      = "-O3"    cc_optim      = "-O3"
267    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
268    omp_optim     = ""    omp_optim     = "-fopenmp"
269    omp_debug     = ""    omp_debug     = "-fopenmp"
270    omp_libs      = []    omp_libs      = []
271    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
272      fatalwarning      = "-Werror"
273      sysheaderopt      = "-isystem "
274  elif env["CC"] == "cl":  elif env["CC"] == "cl":
275    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
276    cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"    cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
# Line 169  elif env["CC"] == "cl": Line 280  elif env["CC"] == "cl":
280    omp_debug     = ""    omp_debug     = ""
281    omp_libs      = []    omp_libs      = []
282    pedantic      = ""    pedantic      = ""
283      fatalwarning      = ""
284      sysheaderopt      = ""
285    elif env["CC"] == "icl":
286      # intel C on Windows, see windows_intelc_options.py for a start
287      pedantic      = ""
288      fatalwarning      = ""
289      sysheaderopt      = ""
290    
291    
292  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
293  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 178  if env["omp_optim"]    == "-DEFAULT_4": env Line 297  if env["omp_optim"]    == "-DEFAULT_4": env
297  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
298  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
299    
300    #set up the autolazy values
301    if env['forcelazy']    != "leave_alone":
302      if env['forcelazy'] == 'on':
303        env.Append(CPPDEFINES=['FAUTOLAZYON'])
304      else:
305         if env['forcelazy'] == 'off':
306        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
307    
308    #set up the colective resolve values
309    if env['forcecollres']    != "leave_alone":
310      print env['forcecollres']
311      if env['forcecollres'] == 'on':
312        env.Append(CPPDEFINES=['FRESCOLLECTON'])
313      else:
314         if env['forcecollres'] == 'off':
315        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
316    
317    
318    if env['iknowwhatimdoing']:
319        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
320    
321  # 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
322  if not env["useopenmp"]:  if not env["useopenmp"]:
323    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 186  if not env["useopenmp"]: Line 326  if not env["useopenmp"]:
326    
327  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
328    
329    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
330    if IS_WINDOWS_PLATFORM:
331        LD_LIBRARY_PATH_KEY='PATH'
332        env['ENV']['LD_LIBRARY_PATH']=''
333    else:
334        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
335  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
336    
337  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
338  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
339    
340    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
341    except KeyError: pass
342    
343    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
344    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
345    
346    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
347    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
348    
349    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
350    except KeyError: pass
351    
352  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
353  except KeyError: pass  except KeyError: pass
354    
# Line 203  except KeyError: pass Line 361  except KeyError: pass
361  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
362  except KeyError: pass  except KeyError: pass
363    
364  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
365  except KeyError: pass  except KeyError: pass
366    
367  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 219  try: env['ENV']['HOME'] = os.environ['HO Line 377  try: env['ENV']['HOME'] = os.environ['HO
377  except KeyError: pass  except KeyError: pass
378    
379  # Configure for test suite  # Configure for test suite
380    
381    
382    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
383  env.PrependENVPath('PYTHONPATH', prefix)  env.PrependENVPath('PYTHONPATH', prefix)
384  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  env['ENV']['ESCRIPT_ROOT'] = prefix
385    
386  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
387    
# Line 234  def clone_env(env): Line 395  def clone_env(env):
395  env.Append(CPPPATH      = [Dir('include')])  env.Append(CPPPATH      = [Dir('include')])
396    
397  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
398  env.Append(LIBPATH      = [Dir('lib')])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
   
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
399    
400  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
401    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
402    if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
403    
404  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
405    
406  # MS Windows  # MS Windows
407  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
408    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
409    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
410      if not env['share_esysUtils'] :
411        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
412      if not env['share_paso'] :
413        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
414    
415    if env['usenetcdf']:    if env['usenetcdf']:
416      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
417    
418  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
419    
# Line 261  except: Line 427  except:
427  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
428  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
429    
430  ############ numarray (required) ###############################  ############ numpy (required) ###############################
431    
432  try:  try:
433    from numarray import identity    from numpy import identity
434  except ImportError:  except ImportError:
435    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
436    sys.exit(1)    sys.exit(1)
437    
438  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 276  conf = Configure(clone_env(env)) Line 442  conf = Configure(clone_env(env))
442    
443  # Test that the compiler is working  # Test that the compiler is working
444  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
445    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
446    sys.exit(1)     sys.exit(1)
447    
448  if not conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
449    env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
450    
451  ############ python libraries (required) #######################  ############ python libraries (required) #######################
452    
453  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
454    if not sysheaderopt =="":
455      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
456    else:
457      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
458    
459  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
460  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
461    
462    conf.env.PrependENVPath('PYTHONPATH', prefix)
463    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
464    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
465    
466  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
467    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'])
468    sys.exit(1)    sys.exit(1)
469  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
470    print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])    print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])
471    sys.exit(1)    sys.exit(1)
472    
473  ############ boost (required) ##################################  ############ boost (required) ##################################
474    
475  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
476    # This is required because we can't -isystem /usr/system because it breaks std includes
477      if os.path.normpath(env['boost_path']) =="/usr/include":
478        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
479      else:
480        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
481    else:
482      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
483    
484  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
485  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
486    
487  if not conf.CheckCXXHeader('boost/python.hpp'):  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['boost_lib_path']) # The wrapper script needs to find these libs
488    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])  #ensure that our path entries remain at the front
489    sys.exit(1)  conf.env.PrependENVPath('PYTHONPATH', prefix)
490  if not conf.CheckFunc('PyObject_SetAttr'):  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
491    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'])  
492    sys.exit(1)  
493    #Yep we still cant figure this one out. - working on it.
494    if not IS_WINDOWS_PLATFORM:
495      if not conf.CheckCXXHeader('boost/python.hpp'):
496        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
497        sys.exit(1)
498    
499      if not conf.CheckFunc('PyObject_SetAttr'):
500        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'])
501        sys.exit(1)
502    
503    
504  # Commit changes to environment  # Commit changes to environment
505  env = conf.Finish()  env = conf.Finish()
# Line 332  if env['usenetcdf']: Line 525  if env['usenetcdf']:
525    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
526    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
527    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
528      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['netCDF_lib_path'])  # The wrapper script needs to find these libs
529      #ensure that our path entries remain at the front
530      conf.env.PrependENVPath('PYTHONPATH', prefix)
531      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
532    
533  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
534  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 352  if env['usepapi']: Line 549  if env['usepapi']:
549    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
550    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
551    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
552      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['papi_lib_path'])    # The wrapper script needs to find these libs
553      #ensure that our path entries remain at the front
554      conf.env.PrependENVPath('PYTHONPATH', prefix)
555      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
556    
557  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
558  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 372  if env['usemkl']: Line 573  if env['usemkl']:
573    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
574    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
575    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
576      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mkl_lib_path']) # The wrapper script needs to find these libs
577      #ensure that our path entries remain at the front
578      conf.env.PrependENVPath('PYTHONPATH', prefix)
579      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
580    
581  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
582  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
583    
584    
585  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
586  if env['usemkl']:  if env['usemkl']:
# Line 399  if env['useumfpack']: Line 605  if env['useumfpack']:
605    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
606    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
607    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
608      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['umf_lib_path']) # The wrapper script needs to find these libs
609      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['amd_lib_path']) # The wrapper script needs to find these libs
610      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['blas_lib_path'])    # The wrapper script needs to find these libs
611      #ensure that our path entries remain at the front
612      conf.env.PrependENVPath('PYTHONPATH', prefix)
613      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
614    
615  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
616  if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0
617    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
618    
619  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
620  if env['useumfpack']:  if env['useumfpack']:
# Line 410  if env['useumfpack']: Line 623  if env['useumfpack']:
623  else:  else:
624    conf.Finish()    conf.Finish()
625    
626    ############ Silo (optional) ###################################
627    
628    if env['usesilo']:
629      conf = Configure(clone_env(env))
630      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
631      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
632      conf.env.AppendUnique(LIBS = [env['silo_libs']])
633      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
634      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
635      conf.Finish()
636    
637    # Add the path to Silo to environment env if it was found.
638    # Note that we do not add the libs since they are only needed for the
639    # weipa library and tools.
640    if env['usesilo']:
641      env.AppendUnique(CPPPATH = [env['silo_path']])
642      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
643    
644    ########### Lapack (optional) ##################################
645    
646    if env['uselapack']:
647        env.AppendUnique(CPPDEFINES='USE_LAPACK')
648        env.AppendUnique(CPPPATH = [env['lapack_path']])
649        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
650    
651        env.Append(LIBPATH = '/usr/lib/atlas')
652        env.Append(LIBS = [env['lapack_libs']])
653        if env['lapack_type']=='mkl':
654           if not env['usemkl']:
655            env['uselapack']=0
656            print "mkl_lapack requires mkl"
657           else:
658            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
659          
660    
661  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
662    
663  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 424  else: Line 672  else:
672  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
673  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
674    
675    ############ Add some custom builders ##########################
676    
677    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
678    env.Append(BUILDERS = {'PyCompile' : py_builder});
679    
680    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
681    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
682    
683    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
684    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
685    
686    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
687    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
688    
689  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
690    if not env['usempi']: env['mpi_flavour']='none'
691    
692  # 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)
693  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 433  env_mpi = clone_env(env) Line 696  env_mpi = clone_env(env)
696  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
697    
698  if env_mpi['usempi']:  if env_mpi['usempi']:
699      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
700      if not env_mpi['mpi_flavour'] in VALID_MPIs:
701          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
702    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
703    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
704    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
705      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mpi_lib_path']) # The wrapper script needs to find these libs
706      #ensure that our path entries remain at the front
707      conf.env.PrependENVPath('PYTHONPATH', prefix)
708      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
709    
710  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
711  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
712    
713  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
714  if env_mpi['usempi']:  if env_mpi['usempi']:
715    env_mpi = conf.Finish()    env_mpi = conf.Finish()
716    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']])
717      # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
718      # On the other hand MPT and OpenMPI don't define the latter so we have to
719      # do that here
720      if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
721        env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
722  else:  else:
723    conf.Finish()    conf.Finish()
724    
# Line 460  if env_mpi['useparmetis']: Line 735  if env_mpi['useparmetis']:
735    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
736    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
737    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
738      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_lib_path'])    # The wrapper script needs to find these libs
739      #ensure that our path entries remain at the front
740      conf.env.PrependENVPath('PYTHONPATH', prefix)
741      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
742    
743  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
744  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 473  else: Line 752  else:
752    
753  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
754    
755    ############ PASTIX (optional) ####################################
756    
757    # Start a new configure environment that reflects what we've already found
758    conf = Configure(clone_env(env_mpi))
759    
760    if not env_mpi['usempi']: env_mpi['usepastix'] = 0
761    
762    if env_mpi['usepastix']:
763      conf.env.AppendUnique(CPPPATH = [env_mpi['pastix_path']])
764      conf.env.AppendUnique(LIBPATH = [env_mpi['pastix_lib_path']])
765      conf.env.AppendUnique(LIBS    = [env_mpi['pastix_libs']])
766      conf.env.AppendUnique(CPPPATH = [env_mpi['scotch_path']])
767      conf.env.AppendUnique(LIBPATH = [env_mpi['scotch_lib_path']])
768      conf.env.AppendUnique(LIBS    = [env_mpi['scotch_libs']])
769      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['pastix_lib_path'])     # The wrapper script needs to find these libs
770      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['scotch_lib_path'])     # The wrapper script needs to find these libs
771      #ensure that our path entries remain at the front
772      conf.env.PrependENVPath('PYTHONPATH', prefix)
773      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
774    
775    if env_mpi['usepastix'] and not conf.CheckCHeader('pastix.h'): env_mpi['usepastix'] = 0
776    if env_mpi['usepastix'] and not conf.CheckFunc('dpastix'): env_mpi['usepastix'] = 0
777    
778    
779    # Add PASTIX to environment env_mpi if it was found
780    if env_mpi['usepastix']:
781      env_mpi = conf.Finish()
782      env_mpi.Append(CPPDEFINES = ['PASTIX'])
783    else:
784      conf.Finish()
785    
786    env['usepastix'] = env_mpi['usepastix']
787    
788  ############ Summarize our environment #########################  ############ Summarize our environment #########################
789    
790  print ""  print ""
791  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
792  print " Using python libraries"  print " Using python libraries"
793  print " Using numarray"  print " Using numpy"
794  print " Using boost"  print " Using boost"
795  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
796  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 486  if env['usevtk']: print "  Using VTK" Line 798  if env['usevtk']: print "  Using VTK"
798  else: print "   Not using VTK"  else: print "   Not using VTK"
799  if env['usemkl']: print "   Using MKL"  if env['usemkl']: print "   Using MKL"
800  else: print "   Not using MKL"  else: print "   Not using MKL"
801    if env['usepastix']: print "    Using PASTIX"
802    else: print "   Not using PASTIX"
803  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
804  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
805    if env['usesilo']: print "  Using Silo"
806    else: print "   Not using Silo"
807  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
808  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
809  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
810  else: print "   Not using MPI"  else: print "   Not using MPI"
811  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
812  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
813  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
814  else: print "   Not using PAPI"  else: print "   Not using PAPI"
815    if env['uselapack']: print "    Using Lapack"
816    else: print "   Not using Lapack"
817  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
818  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
819  print " Installing in", prefix  print " Installing in", prefix
820    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
821    else: print "   Not treating warnings as errors"
822  print ""  print ""
823    
824  ############ Add some custom builders ##########################  ############ Delete option-dependent files #####################
825    
826  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
827  env.Append(BUILDERS = {'PyCompile' : py_builder});  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
828    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
829    Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
830    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
831    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
832    
 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
833    
834  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  ############ Build the subdirectories ##########################
835  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
836    if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
837    
838    
839    from grouptest import *
840    
841    TestGroups=[]
842    
843    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
844    
845    ############ Now we switch on Warnings as errors ###############
846    
847    #this needs to be done after configuration because the scons test files have warnings in them
848    
849  ############ Build the desired subdirectories ##################  if ((fatalwarning != "") and (env['usewarnings'])):
850      env.Append(CCFLAGS        = fatalwarning)
851      env_mpi.Append(CCFLAGS        = fatalwarning)
852    
853  Export(["env", "env_mpi", "clone_env"])  
854    Export(
855      ["env",
856       "env_mpi",
857       "clone_env",
858       "dodgy_env",
859       "IS_WINDOWS_PLATFORM",
860       "TestGroups"
861       ]
862      )
863    
864  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)
865    env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
866  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
867    env.SConscript(dirs = ['weipa/src'], build_dir='build/$PLATFORM/weipa', duplicate=0)
868  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
869  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
870  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 526  env.SConscript(dirs = ['doc'], build_dir Line 873  env.SConscript(dirs = ['doc'], build_dir
873  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
874  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
875  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
876    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
877    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
878    
879    
880  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
881    
882  remember_list = []  remember_list = []
883    
884  if env['usedebug']:  if env['usedebug']:
885    remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Delete('$TARGET'))  
886    
887  if env['usempi']:  if env['usempi']:
888    remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Delete('$TARGET'))  
889    
890  if env['omp_optim'] != '':  if env['useopenmp']:
891    remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Delete('$TARGET'))  
892    
893  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
894    
895    
896    ############### Record python interpreter version ##############
897    
898    if not IS_WINDOWS_PLATFORM:
899    
900      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
901      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
902      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
903    
904    ############## Populate the buildvars file #####################
905    
906    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
907    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
908    
909    # Find the boost version by extracting it from version.hpp
910    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
911    boostversion='unknown'
912    try:
913        for line in boosthpp:
914            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
915            if ver:
916                boostversion=ver.group(1)
917    except StopIteration:
918        pass
919    buildvars.write("boost="+boostversion+"\n")
920    buildvars.write("svn_revision="+str(global_revision)+"\n")
921    out="usedebug="
922    if env['usedebug']:
923        out+="y"
924    else:
925        out+="n"
926    out+="\nusempi="
927    if env['usempi']:
928        out+="y"
929    else:
930        out+="n"
931    out+="\nuseopenmp="
932    if env['useopenmp']:
933        out+="y"
934    else:
935        out+="n"
936    buildvars.write(out+"\n")
937    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
938    out="lapack="
939    if env['uselapack']:
940       out+="y"
941    else:
942       out+="n"
943    out+="\nsilo="
944    if env['usesilo']:
945       out+="y"
946    else:
947       out+="n"
948    buildvars.write(out+"\n")
949    buildvars.close()
950    
951    
952  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
953    
954  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 560  env.Alias('install_esysUtils', ['build_e Line 961  env.Alias('install_esysUtils', ['build_e
961  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
962  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
963    
964    env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
965    env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
966    
967    env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
968    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
969    
970  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'])
971  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'])
972    
# Line 570  env.Alias('install_finley', ['build_finl Line 977  env.Alias('install_finley', ['build_finl
977  build_all_list = []  build_all_list = []
978  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
979  build_all_list += ['build_paso']  build_all_list += ['build_paso']
980    build_all_list += ['build_weipa']
981  build_all_list += ['build_escript']  build_all_list += ['build_escript']
982  build_all_list += ['build_finley']  build_all_list += ['build_finley']
983  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
984    #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
985    build_all_list += ['target_escriptconvert']
986  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
987    
988  install_all_list = []  install_all_list = []
989  install_all_list += ['target_init']  install_all_list += ['target_init']
990  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
991  install_all_list += ['install_paso']  install_all_list += ['install_paso']
992    install_all_list += ['install_weipa']
993  install_all_list += ['install_escript']  install_all_list += ['install_escript']
994  install_all_list += ['install_finley']  install_all_list += ['install_finley']
995  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
996  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
997  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
998  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
999    #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
1000    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
1001  install_all_list += ['remember_options']  install_all_list += ['remember_options']
1002  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
1003    
# Line 597  env.Alias('build_cppunittest', ['target_ Line 1010  env.Alias('build_cppunittest', ['target_
1010  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
1011  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
1012  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'])
1013    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
1014    
1015    
1016  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
1017    
1018  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
1019    
1020    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
1021    
1022    build_platform=os.name
1023    
1024    if not IS_WINDOWS_PLATFORM:
1025       try:
1026        utest=open("utest.sh","w")
1027        #Sometimes Mac python says it is posix
1028        if (build_platform=='posix') and platform.system()=="Darwin":
1029            build_platform='darwin'
1030        utest.write(GroupTest.makeHeader(build_platform))
1031        for tests in TestGroups:
1032            utest.write(tests.makeString())
1033        utest.close()
1034        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
1035        print "utest.sh written"
1036       except IOError:
1037        print "Error attempting to write unittests file."
1038        sys.exit(1)
1039    
1040       #Make sure that the escript wrapper is in place
1041       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
1042           print "Copying escript wrapper"
1043           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1044    
1045    ############ Targets to build PasoTests suite ################
1046    
1047    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1048    
1049    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.1708  
changed lines
  Added in v.3049

  ViewVC Help
Powered by ViewVC 1.1.26