/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1771 by ksteube, Mon Sep 8 22:47:55 2008 UTC revision 2820 by artak, Thu Dec 10 05:03:11 2009 UTC
# Line 1  Line 1 
1  #         Copyright 2006 by ACcESS MNRF  
2    ########################################################
3    #
4    # Copyright (c) 2003-2009 by University of Queensland
5    # Earth Systems Science Computational Center (ESSCC)
6    # http://www.uq.edu.au/esscc
7    #
8    # Primary Business: Queensland, Australia
9    # Licensed under the Open Software License version 3.0
10    # http://www.opensource.org/licenses/osl-3.0.php
11  #  #
12  #              http://www.access.edu.au  ########################################################
13  #       Primary Business: Queensland, Australia  
 #  Licensed under the Open Software License version 3.0  
 #     http://www.opensource.org/licenses/osl-3.0.php  
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')),
# Line 46  opts.AddOptions( Line 82  opts.AddOptions(
82    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),
83    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),
84  # Compilation options  # Compilation options
85    BoolOption('dodebug', 'For backwards compatibility', 'no'),    BoolVariable('dodebug', 'For backwards compatibility', 'no'),
86    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolVariable('usedebug', 'Do you want a debug build?', 'no'),
87    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolVariable('usevtk', 'Do you want to use VTK?', 'yes'),
88    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),
89      ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
90    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below
91    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
92    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),
# Line 61  opts.AddOptions( Line 98  opts.AddOptions(
98    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
99    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
100    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
101    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
102    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'yes'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
103      BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
104      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
105      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
106  # Python  # Python
107    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
108    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 73  opts.AddOptions( Line 113  opts.AddOptions(
113    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
114    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
115  # NetCDF  # NetCDF
116    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
117    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
118    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
119    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
120  # MPI  # MPI
121    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
122    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
123    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
124    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
125    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
126    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
127    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', []),
128      ('mpi_flavour','Type of MPI execution environment','none'),
129  # ParMETIS  # ParMETIS
130    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
131    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
132    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
133    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
134  # PAPI  # PAPI
135    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
136    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
137    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
138    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
139    BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),    BoolVariable('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
140  # MKL  # MKL
141    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
142    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
143    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
144    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
145  # UMFPACK  # UMFPACK
146    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
147    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
148    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
149    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
150    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
151    # Silo
152      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
153      ('silo_path', 'Path to Silo includes', '/usr/include'),
154      ('silo_lib_path', 'Path to Silo libs', usr_lib),
155      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
156  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
157    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
158    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 114  opts.AddOptions( Line 160  opts.AddOptions(
160  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
161    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
162    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
163    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
164    #Lapack options
165      BoolVariable('uselapack','switch on/off use of Lapack','no'),
166      ('lapack_path', 'Path to Lapack includes','/usr/include'),
167      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
168      ('lapack_libs', 'Lapack libraries to link with', []),
169      ('lapack_type', '{clapack,mkl}','clapack'),
170    # An option for specifying the compiler tools set (see windows branch).
171      ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
172    # finer control over library building, intel aggressive global optimisation
173    # works with dynamic libraries on windows.
174      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
175      ('share_paso', 'control static or dynamic paso lib', False),
176      ('env_export','Environment variables to be passed to children',[])
177  )  )
178    
179    
180    
181  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
182    
183  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
184  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
185    
186  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
187        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
188          env = Environment(tools = ['default'] + env['tools_names'],
189                            options = opts)
190  else:  else:
191     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
192        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
193     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
194        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 135  else: Line 198  else:
198        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
199  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
200    
201    
202    ############ Make sure target directories exist ################
203    
204    if not os.path.isdir(env['bininstall']):
205        os.makedirs(env['bininstall'])
206    if not os.path.isdir(env['libinstall']):
207        os.makedirs(env['libinstall'])
208    if not os.path.isdir(env['pyinstall']):
209        os.makedirs(env['pyinstall'])
210    
211    ########## Copy required environment vars ######################
212    
213    for i in env['env_export']:
214       env.Append(ENV = {i:os.environ[i]})
215    
216  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
217    
218  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 144  if env['useMPI']: env['usempi'] = 1 Line 222  if env['useMPI']: env['usempi'] = 1
222  # 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)
223  # 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
224    
225    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
226    
227  if env["CC"] == "icc":  if env["CC"] == "icc":
228    # Intel compilers    # Intel compilers
229    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
230    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
231    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
232    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
233    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
234    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
235    pedantic      = ""    pedantic      = ""
236      fatalwarning      = ""        # Switch to turn warnings into errors
237      sysheaderopt      = ""
238  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
239    # GNU C on any system    # GNU C on any system
240    cc_flags      = "-fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER"    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
241    #the long long warning occurs on the Mac
242    cc_optim      = "-O3"    cc_optim      = "-O3"
243    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
244    omp_optim     = ""    omp_optim     = "-fopenmp"
245    omp_debug     = ""    omp_debug     = "-fopenmp"
246    omp_libs      = []    omp_libs      = []
247    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
248      fatalwarning      = "-Werror"
249      sysheaderopt      = "-isystem "
250  elif env["CC"] == "cl":  elif env["CC"] == "cl":
251    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
252    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 171  elif env["CC"] == "cl": Line 256  elif env["CC"] == "cl":
256    omp_debug     = ""    omp_debug     = ""
257    omp_libs      = []    omp_libs      = []
258    pedantic      = ""    pedantic      = ""
259      fatalwarning      = ""
260      sysheaderopt      = ""
261    elif env["CC"] == "icl":
262      # intel C on Windows, see windows_intelc_options.py for a start
263      pedantic      = ""
264      fatalwarning      = ""
265      sysheaderopt      = ""
266    
267    
268  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
269  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 180  if env["omp_optim"]    == "-DEFAULT_4": env Line 273  if env["omp_optim"]    == "-DEFAULT_4": env
273  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
274  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
275    
276    #set up the autolazy values
277    if env['forcelazy']    != "leave_alone":
278      if env['forcelazy'] == 'on':
279        env.Append(CPPDEFINES=['FAUTOLAZYON'])
280      else:
281         if env['forcelazy'] == 'off':
282        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
283    
284    #set up the colective resolve values
285    if env['forcecollres']    != "leave_alone":
286      print env['forcecollres']
287      if env['forcecollres'] == 'on':
288        env.Append(CPPDEFINES=['FRESCOLLECTON'])
289      else:
290         if env['forcecollres'] == 'off':
291        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
292    
293    
294  # 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
295  if not env["useopenmp"]:  if not env["useopenmp"]:
296    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 188  if not env["useopenmp"]: Line 299  if not env["useopenmp"]:
299    
300  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
301    
302    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
303    if IS_WINDOWS_PLATFORM:
304        LD_LIBRARY_PATH_KEY='PATH'
305        env['ENV']['LD_LIBRARY_PATH']=''
306    else:
307        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
308  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
309    
310  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
311  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
312    
313    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
314    except KeyError: pass
315    
316    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
317    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
318    
319    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
320    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
321    
322    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
323    except KeyError: pass
324    
325  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
326  except KeyError: pass  except KeyError: pass
327    
# Line 205  except KeyError: pass Line 334  except KeyError: pass
334  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
335  except KeyError: pass  except KeyError: pass
336    
337  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
338  except KeyError: pass  except KeyError: pass
339    
340  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 221  try: env['ENV']['HOME'] = os.environ['HO Line 350  try: env['ENV']['HOME'] = os.environ['HO
350  except KeyError: pass  except KeyError: pass
351    
352  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
353    
354    
355    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
356    env.PrependENVPath('PYTHONPATH', prefix)
357  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
358    
359  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 240  env.Append(CPPPATH     = [Dir('include')]) Line 370  env.Append(CPPPATH     = [Dir('include')])
370  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
371  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
372    
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
   
373  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
374  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
375    
# Line 249  if env['usepedantic']: env.Append(CCFLAG Line 377  if env['usepedantic']: env.Append(CCFLAG
377    
378  # MS Windows  # MS Windows
379  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
380    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
381    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
382      if not env['share_esysUtils'] :
383        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
384      if not env['share_paso'] :
385        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
386    
387    if env['usenetcdf']:    if env['usenetcdf']:
388      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
389    
390  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
391    
# Line 266  except: Line 399  except:
399  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
400  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
401    
402  ############ numarray (required) ###############################  ############ numpy (required) ###############################
403    
404  try:  try:
405    from numarray import identity    from numpy import identity
406  except ImportError:  except ImportError:
407    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
408    sys.exit(1)    sys.exit(1)
409    
410  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 281  conf = Configure(clone_env(env)) Line 414  conf = Configure(clone_env(env))
414    
415  # Test that the compiler is working  # Test that the compiler is working
416  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
417    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
418    sys.exit(1)     sys.exit(1)
419    
420  if not conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
421    env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
422    
423  ############ python libraries (required) #######################  ############ python libraries (required) #######################
424    
425  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
426    if not sysheaderopt =="":
427      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
428    else:
429      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
430    
431  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
432  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
433    
434    conf.env.PrependENVPath('PYTHONPATH', prefix)
435    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
436    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
437    
438  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
439    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'])
440    sys.exit(1)    sys.exit(1)
441  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
442    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'])
443    sys.exit(1)    sys.exit(1)
444    
445  ############ boost (required) ##################################  ############ boost (required) ##################################
446    
447  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
448    # This is required because we can't -isystem /usr/system because it breaks std includes
449      if os.path.normpath(env['boost_path']) =="/usr/include":
450        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
451      else:
452        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
453    else:
454      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
455    
456  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
457  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
458    
459    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['boost_lib_path']) # The wrapper script needs to find these libs
460    #ensure that our path entries remain at the front
461    conf.env.PrependENVPath('PYTHONPATH', prefix)
462    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
463    
464  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
465    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
466    sys.exit(1)    sys.exit(1)
467    
468  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
469    print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])    print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])
470    sys.exit(1)    sys.exit(1)
# Line 337  if env['usenetcdf']: Line 493  if env['usenetcdf']:
493    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
494    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
495    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
496      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['netCDF_lib_path'])  # The wrapper script needs to find these libs
497      #ensure that our path entries remain at the front
498      conf.env.PrependENVPath('PYTHONPATH', prefix)
499      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
500    
501  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
502  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 357  if env['usepapi']: Line 517  if env['usepapi']:
517    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
518    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
519    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
520      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['papi_lib_path'])    # The wrapper script needs to find these libs
521      #ensure that our path entries remain at the front
522      conf.env.PrependENVPath('PYTHONPATH', prefix)
523      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
524    
525  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
526  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 377  if env['usemkl']: Line 541  if env['usemkl']:
541    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
542    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
543    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
544      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mkl_lib_path']) # The wrapper script needs to find these libs
545      #ensure that our path entries remain at the front
546      conf.env.PrependENVPath('PYTHONPATH', prefix)
547      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
548    
549  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
550  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
551    
552    
553  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
554  if env['usemkl']:  if env['usemkl']:
# Line 404  if env['useumfpack']: Line 573  if env['useumfpack']:
573    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
574    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
575    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
576      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['umf_lib_path']) # The wrapper script needs to find these libs
577      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['amd_lib_path']) # The wrapper script needs to find these libs
578      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['blas_lib_path'])    # The wrapper script needs to find these libs
579      #ensure that our path entries remain at the front
580      conf.env.PrependENVPath('PYTHONPATH', prefix)
581      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
582    
583  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
584  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
585    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
586    
587  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
588  if env['useumfpack']:  if env['useumfpack']:
# Line 415  if env['useumfpack']: Line 591  if env['useumfpack']:
591  else:  else:
592    conf.Finish()    conf.Finish()
593    
594    ############ Silo (optional) ###################################
595    
596    if env['usesilo']:
597      conf = Configure(clone_env(env))
598      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
599      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
600      conf.env.AppendUnique(LIBS = [env['silo_libs']])
601      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
602      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
603      conf.Finish()
604    
605    # Add the path to Silo to environment env if it was found.
606    # Note that we do not add the libs since they are only needed for the
607    # escriptexport library and tools.
608    if env['usesilo']:
609      env.AppendUnique(CPPPATH = [env['silo_path']])
610      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
611      env.Append(CPPDEFINES = ['USE_SILO'])
612    
613    ########### Lapack (optional) ##################################
614    
615    
616    if env['uselapack']:
617        env.AppendUnique(CPPDEFINES='USE_LAPACK')
618        env.AppendUnique(CPPPATH = [env['lapack_path']])
619        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
620    
621        env.Append(LIBPATH = '/usr/lib/atlas')
622        env.Append(LIBS = [env['lapack_libs']])
623        if env['lapack_type']=='mkl':
624           if not env['usemkl']:
625            env['uselapack']=0
626            print "mkl_lapack requires mkl"
627           else:
628            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
629          
630    
631    
632  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
633    
634  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 429  else: Line 643  else:
643  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
644  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
645    
646    ############ Add some custom builders ##########################
647    
648    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
649    env.Append(BUILDERS = {'PyCompile' : py_builder});
650    
651    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
652    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
653    
654    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
655    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
656    
657    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
658    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
659    
660  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
661    if not env['usempi']: env['mpi_flavour']='none'
662    
663  # 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)
664  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 438  env_mpi = clone_env(env) Line 667  env_mpi = clone_env(env)
667  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
668    
669  if env_mpi['usempi']:  if env_mpi['usempi']:
670      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
671      if not env_mpi['mpi_flavour'] in VALID_MPIs:
672          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
673    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
674    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
675    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
676      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mpi_lib_path']) # The wrapper script needs to find these libs
677      #ensure that our path entries remain at the front
678      conf.env.PrependENVPath('PYTHONPATH', prefix)
679      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
680    
681  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
682  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
683    
684  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
685  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 454  else: Line 690  else:
690    
691  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
692    
693    
694  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
695    
696  # 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 465  if env_mpi['useparmetis']: Line 702  if env_mpi['useparmetis']:
702    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
703    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
704    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
705      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_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['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
711  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 478  else: Line 719  else:
719    
720  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
721    
722    ############ Now we switch on Warnings as errors ###############
723    
724    #this needs to be done after configuration because the scons test files have warnings in them
725    
726    if ((fatalwarning != "") and (env['usewarnings'])):
727      env.Append(CCFLAGS        = fatalwarning)
728      env_mpi.Append(CCFLAGS        = fatalwarning)
729    
730  ############ Summarize our environment #########################  ############ Summarize our environment #########################
731    
732  print ""  print ""
733  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
734  print " Using python libraries"  print " Using python libraries"
735  print " Using numarray"  print " Using numpy"
736  print " Using boost"  print " Using boost"
737  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
738  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 493  if env['usemkl']: print "  Using MKL" Line 742  if env['usemkl']: print "  Using MKL"
742  else: print "   Not using MKL"  else: print "   Not using MKL"
743  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
744  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
745    if env['usesilo']: print "  Using Silo"
746    else: print "   Not using Silo"
747  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
748  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
749  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
750  else: print "   Not using MPI"  else: print "   Not using MPI"
751  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
752  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
753  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
754  else: print "   Not using PAPI"  else: print "   Not using PAPI"
755    if env['uselapack']: print "    Using Lapack"
756    else: print "   Not using Lapack"
757  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
758  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
759  print " Installing in", prefix  print " Installing in", prefix
760    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
761    else: print "   Not treating warnings as errors"
762  print ""  print ""
763    
764  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
765    
766  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
767  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
768  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
769  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
770    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
771    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
772    
 ############ Add some custom builders ##########################  
773    
774  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  ############ Build the subdirectories ##########################
 env.Append(BUILDERS = {'PyCompile' : py_builder});  
775    
776  runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  from grouptest import *
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
777    
778  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  TestGroups=[]
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
779    
780  ############ Build the subdirectories ##########################  Export(
781      ["env",
782  Export(["env", "env_mpi", "clone_env"])     "env_mpi",
783       "clone_env",
784       "IS_WINDOWS_PLATFORM",
785       "TestGroups"
786       ]
787      )
788    
789  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)
790    env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
791  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
792    env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
793  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
794  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
795  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 539  env.SConscript(dirs = ['pyvisi/py_src'], Line 799  env.SConscript(dirs = ['pyvisi/py_src'],
799  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)
800  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
801  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
802    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
803    
804    
805  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
806    
807  remember_list = []  remember_list = []
808    
809  if env['usedebug']:  if env['usedebug']:
810    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'))
811    
812  if env['usempi']:  if env['usempi']:
813    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'))
814    
815  if env['omp_optim'] != '':  if env['useopenmp']:
816    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'))
817    
818  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
819    
820    
821    ############### Record python interpreter version ##############
822    
823    if not IS_WINDOWS_PLATFORM:
824    
825      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
826      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
827      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
828    
829    ############## Populate the buildvars file #####################
830    
831    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
832    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
833    
834    # Find the boost version by extracting it from version.hpp
835    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
836    boostversion='unknown'
837    try:
838        for line in boosthpp:
839            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
840            if ver:
841                boostversion=ver.group(1)
842    except StopIteration:
843        pass
844    buildvars.write("boost="+boostversion+"\n")
845    buildvars.write("svn_revision="+str(global_revision)+"\n")
846    out="usedebug="
847    if env['usedebug']:
848        out+="y"
849    else:
850        out+="n"
851    out+="\nusempi="
852    if env['usempi']:
853        out+="y"
854    else:
855        out+="n"
856    out+="\nuseopenmp="
857    if env['useopenmp']:
858        out+="y"
859    else:
860        out+="n"
861    buildvars.write(out+"\n")
862    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
863    out="lapack="
864    if env['uselapack']:
865       out+="y"
866    else:
867       out+="n"
868    out+="\nsilo="
869    if env['usesilo']:
870       out+="y"
871    else:
872       out+="n"
873    buildvars.write(out+"\n")
874    buildvars.close()
875    
876    
877  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
878    
879  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 567  env.Alias('install_esysUtils', ['build_e Line 886  env.Alias('install_esysUtils', ['build_e
886  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
887  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
888    
889    env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
890    env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
891    
892  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'])
893  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'])
894    
# Line 577  env.Alias('install_finley', ['build_finl Line 899  env.Alias('install_finley', ['build_finl
899  build_all_list = []  build_all_list = []
900  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
901  build_all_list += ['build_paso']  build_all_list += ['build_paso']
902    build_all_list += ['build_dataexporter']
903  build_all_list += ['build_escript']  build_all_list += ['build_escript']
904  build_all_list += ['build_finley']  build_all_list += ['build_finley']
905  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
906  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
907    if env['usesilo']:  build_all_list += ['target_escriptconvert']
908  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
909    
910  install_all_list = []  install_all_list = []
911  install_all_list += ['target_init']  install_all_list += ['target_init']
912  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
913  install_all_list += ['install_paso']  install_all_list += ['install_paso']
914    install_all_list += ['install_dataexporter']
915  install_all_list += ['install_escript']  install_all_list += ['install_escript']
916  install_all_list += ['install_finley']  install_all_list += ['install_finley']
917  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
918  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
919  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
920  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
921  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
922    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
923  install_all_list += ['remember_options']  install_all_list += ['remember_options']
924  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
925    
# Line 606  env.Alias('build_cppunittest', ['target_ Line 932  env.Alias('build_cppunittest', ['target_
932  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
933  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
934  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'])
935    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
936    
937    
938  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
939    
940  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
941    
942    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
943    
944    if not IS_WINDOWS_PLATFORM:
945       try:
946        utest=open("utest.sh","w")
947        build_platform=os.name      #Sometimes Mac python says it is posix
948        if (build_platform=='posix') and platform.system()=="Darwin":
949            build_platform='darwin'
950        utest.write(GroupTest.makeHeader(build_platform))
951        for tests in TestGroups:
952            utest.write(tests.makeString())
953        utest.close()
954        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
955        print "utest.sh written"
956       except IOError:
957        print "Error attempting to write unittests file."
958        sys.exit(1)
959    
960       #Make sure that the escript wrapper is in place
961       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
962           print "Copying escript wrapper"
963           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
964    
965    ############ Targets to build PasoTests suite ################
966    
967    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')

Legend:
Removed from v.1771  
changed lines
  Added in v.2820

  ViewVC Help
Powered by ViewVC 1.1.26