/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1789 by phornby, Mon Sep 15 08:34:44 2008 UTC revision 3077 by jfenwick, Mon Aug 2 23:01:14 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  # Load options file and command-line arguments  #Does our scons support the newer Variables class or do we need to use Options?
64  opts = Options(options_file, ARGUMENTS)  
65    try:
66       dummyvar=Variables
67       opts = Variables(options_file, ARGUMENTS)
68       adder = opts.AddVariables
69    except:
70       opts = Options(options_file, ARGUMENTS)
71       adder = opts.AddOptions
72       BoolVariable = BoolOption
73    
74  ############ Load build options ################################  ############ Load build options ################################
75    
76  opts.AddOptions(  adder(
77    #opts.AddOptions(
78  # Where to install esys stuff  # Where to install esys stuff
79    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
80    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),
# Line 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      ('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', ''),    ('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 73  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  # UMFPACK  # UMFPACK
149    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
150    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
151    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
152    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
153    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
154    # Silo
155      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
156      ('silo_path', 'Path to Silo includes', '/usr/include'),
157      ('silo_lib_path', 'Path to Silo libs', usr_lib),
158      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
159  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
160    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
161    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 114  opts.AddOptions( Line 163  opts.AddOptions(
163  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
164    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
165    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
166    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
167    #Lapack options
168      BoolVariable('uselapack','switch on/off use of Lapack','no'),
169      ('lapack_path', 'Path to Lapack includes','/usr/include'),
170      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
171      ('lapack_libs', 'Lapack libraries to link with', []),
172      ('lapack_type', '{clapack,mkl}','clapack'),
173    # An option for specifying the compiler tools set (see windows branch).
174      ('tools_names', 'allow control over the tools in the env setup', ['default']),
175    # finer control over library building, intel aggressive global optimisation
176    # works with dynamic libraries on windows.
177      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
178      ('share_paso', 'control static or dynamic paso lib', False),
179      ('env_export','Environment variables to be passed to children',[]),
180    #To enable passing function pointers through python
181      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
182  )  )
183    
184  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
# Line 123  opts.AddOptions( Line 187  opts.AddOptions(
187  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
188    
189  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
190        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
191          env = Environment(tools = ['default'] + env['tools_names'],
192                            options = opts)
193  else:  else:
194     if socket.gethostname().split('.')[0] == 'service0':     if os.uname()[4]=='ia64':
       env = Environment(tools = ['default', 'intelc'], options = opts)  
    elif os.uname()[4]=='ia64':  
195        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
196        if env['CXX'] == 'icpc':        if env['CXX'] == 'icpc':
197           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)
198     else:     else:
199        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
200          if env['tools_names']!='default':
201        env=Environment(tools = ['default'] +env['tools_names'], options=opts)
202    
203    
204    
205    
206    # Override compiler choice if provided
207    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
208    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
209    
210  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
211    
212    ############ Make sure target directories exist ################
213    
214    if not os.path.isdir(env['bininstall']):
215        os.makedirs(env['bininstall'])
216    if not os.path.isdir(env['libinstall']):
217        os.makedirs(env['libinstall'])
218    if not os.path.isdir(env['pyinstall']):
219        os.makedirs(env['pyinstall'])
220    
221    ########## Copy required environment vars ######################
222    
223    for i in env['env_export']:
224       env.Append(ENV = {i:os.environ[i]})
225    
226  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
227    
228  # 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 232  if env['useMPI']: env['usempi'] = 1
232  # 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)
233  # 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
234    
235    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
236    
237    cc_flags = ""
238    cc_optim = ""
239    cc_debug = ""
240    omp_optim = ""
241    omp_debug = ""
242    omp_libs = []
243    
244  if env["CC"] == "icc":  if env["CC"] == "icc":
245    # Intel compilers    # Intel compilers
246    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
247    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
248    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
249    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
250    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
251    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
252    pedantic      = ""    pedantic      = ""
253  elif env["CC"] == "gcc":    fatalwarning      = ""        # Switch to turn warnings into errors
254      sysheaderopt      = ""
255    elif env["CC"][:3] == "gcc":
256    # GNU C on any system    # GNU C on any system
257    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"
258    #the long long warning occurs on the Mac
259    cc_optim      = "-O3"    cc_optim      = "-O3"
260    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
261    omp_optim     = ""    omp_optim     = "-fopenmp"
262    omp_debug     = ""    omp_debug     = "-fopenmp"
263    omp_libs      = []    omp_libs      = []
264    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
265      fatalwarning      = "-Werror"
266      sysheaderopt      = "-isystem "
267  elif env["CC"] == "cl":  elif env["CC"] == "cl":
268    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
269    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 273  elif env["CC"] == "cl":
273    omp_debug     = ""    omp_debug     = ""
274    omp_libs      = []    omp_libs      = []
275    pedantic      = ""    pedantic      = ""
276      fatalwarning      = ""
277      sysheaderopt      = ""
278    elif env["CC"] == "icl":
279      # intel C on Windows, see windows_intelc_options.py for a start
280      pedantic      = ""
281      fatalwarning      = ""
282      sysheaderopt      = ""
283    
284    
285  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
286  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 290  if env["omp_optim"]    == "-DEFAULT_4": env
290  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
291  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
292    
293    #set up the autolazy values
294    if env['forcelazy']    != "leave_alone":
295      if env['forcelazy'] == 'on':
296        env.Append(CPPDEFINES=['FAUTOLAZYON'])
297      else:
298         if env['forcelazy'] == 'off':
299        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
300    
301    #set up the colective resolve values
302    if env['forcecollres']    != "leave_alone":
303      print env['forcecollres']
304      if env['forcecollres'] == 'on':
305        env.Append(CPPDEFINES=['FRESCOLLECTON'])
306      else:
307         if env['forcecollres'] == 'off':
308        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
309    
310    
311    if env['iknowwhatimdoing']:
312        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
313    
314  # 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
315  if not env["useopenmp"]:  if not env["useopenmp"]:
316    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 188  if not env["useopenmp"]: Line 319  if not env["useopenmp"]:
319    
320  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
321    
322    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
323    if IS_WINDOWS_PLATFORM:
324        LD_LIBRARY_PATH_KEY='PATH'
325        env['ENV']['LD_LIBRARY_PATH']=''
326    else:
327        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
328  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
329    
330  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
331  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
332    
333    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
334    except KeyError: pass
335    
336    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
337    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
338    
339    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
340    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
341    
342    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
343    except KeyError: pass
344    
345  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
346  except KeyError: pass  except KeyError: pass
347    
# Line 205  except KeyError: pass Line 354  except KeyError: pass
354  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
355  except KeyError: pass  except KeyError: pass
356    
357  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
358  except KeyError: pass  except KeyError: pass
359    
360  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 370  try: env['ENV']['HOME'] = os.environ['HO
370  except KeyError: pass  except KeyError: pass
371    
372  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
373    
374    
375    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
376    env.PrependENVPath('PYTHONPATH', prefix)
377  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
378    
379  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 240  env.Append(CPPPATH     = [Dir('include')]) Line 390  env.Append(CPPPATH     = [Dir('include')])
390  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
391  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
392    
393  env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
394    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
 if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  
395  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
396    
397  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
398    
399  # MS Windows  # MS Windows
400  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
401    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
402    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
403      if not env['share_esysUtils'] :
404        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
405      if not env['share_paso'] :
406        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
407    
408    if env['usenetcdf']:    if env['usenetcdf']:
409      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
410    
411  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
412    
# Line 266  except: Line 420  except:
420  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
421  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
422    
423  ############ numarray (required) ###############################  ############ numpy (required) ###############################
424    
425  try:  try:
426    from numarray import identity    from numpy import identity
427  except ImportError:  except ImportError:
428    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
429    sys.exit(1)    sys.exit(1)
430    
431  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 281  conf = Configure(clone_env(env)) Line 435  conf = Configure(clone_env(env))
435    
436  # Test that the compiler is working  # Test that the compiler is working
437  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
438    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
439    sys.exit(1)     sys.exit(1)
440    
441  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
442    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
443    
444  ############ python libraries (required) #######################  ############ python libraries (required) #######################
445    
446  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
447    if not sysheaderopt =="":
448      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
449    else:
450      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
451    
452  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
453  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
454    
455  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
456    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
457    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
458    
459  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
460    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'])
461    sys.exit(1)    sys.exit(1)
462  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
463    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'])
464    sys.exit(1)    sys.exit(1)
465    
466  ############ boost (required) ##################################  ############ boost (required) ##################################
467    
468  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
469    # This is required because we can't -isystem /usr/system because it breaks std includes
470      if os.path.normpath(env['boost_path']) =="/usr/include":
471        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
472      else:
473        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
474    else:
475      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
476    
477  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
478  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
479    
480  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['boost_lib_path']) # The wrapper script needs to find these libs
481    #ensure that our path entries remain at the front
482    conf.env.PrependENVPath('PYTHONPATH', prefix)
483    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
484    
485    
486    #Yep we still cant figure this one out. - working on it.
487    if not IS_WINDOWS_PLATFORM:
488      if not conf.CheckCXXHeader('boost/python.hpp'):
489        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
490        sys.exit(1)
491    
492      if not conf.CheckFunc('PyObject_SetAttr'):
493        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'])
494        sys.exit(1)
495    
 if not conf.CheckCXXHeader('boost/python.hpp'):  
   print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])  
   sys.exit(1)  
 if not conf.CheckFunc('PyObject_SetAttr'):  
   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'])  
   sys.exit(1)  
496    
497  # Commit changes to environment  # Commit changes to environment
498  env = conf.Finish()  env = conf.Finish()
# Line 341  if env['usenetcdf']: Line 518  if env['usenetcdf']:
518    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
519    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
520    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
521    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['netCDF_lib_path'])  # The wrapper script needs to find these libs
522      #ensure that our path entries remain at the front
523      conf.env.PrependENVPath('PYTHONPATH', prefix)
524      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
525    
526  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
527  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 362  if env['usepapi']: Line 542  if env['usepapi']:
542    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
543    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
544    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
545    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['papi_lib_path'])    # The wrapper script needs to find these libs
546      #ensure that our path entries remain at the front
547      conf.env.PrependENVPath('PYTHONPATH', prefix)
548      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
549    
550  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
551  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 383  if env['usemkl']: Line 566  if env['usemkl']:
566    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
567    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
568    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
569    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mkl_lib_path']) # The wrapper script needs to find these libs
570      #ensure that our path entries remain at the front
571      conf.env.PrependENVPath('PYTHONPATH', prefix)
572      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
573    
574  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
575  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
576    
577    
578  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
579  if env['usemkl']:  if env['usemkl']:
# Line 411  if env['useumfpack']: Line 598  if env['useumfpack']:
598    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
599    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
600    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
601    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['umf_lib_path']) # The wrapper script needs to find these libs
602    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['amd_lib_path']) # The wrapper script needs to find these libs
603    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['blas_lib_path'])    # The wrapper script needs to find these libs
604      #ensure that our path entries remain at the front
605      conf.env.PrependENVPath('PYTHONPATH', prefix)
606      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
607    
608  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
609  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
610    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
611    
612  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
613  if env['useumfpack']:  if env['useumfpack']:
# Line 425  if env['useumfpack']: Line 616  if env['useumfpack']:
616  else:  else:
617    conf.Finish()    conf.Finish()
618    
619    ############ Silo (optional) ###################################
620    
621    if env['usesilo']:
622      conf = Configure(clone_env(env))
623      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
624      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
625      conf.env.AppendUnique(LIBS = [env['silo_libs']])
626      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
627      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
628      conf.Finish()
629    
630    # Add the path to Silo to environment env if it was found.
631    # Note that we do not add the libs since they are only needed for the
632    # weipa library and tools.
633    if env['usesilo']:
634      env.AppendUnique(CPPPATH = [env['silo_path']])
635      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
636    
637    ########### Lapack (optional) ##################################
638    
639    if env['uselapack']:
640        env.AppendUnique(CPPDEFINES='USE_LAPACK')
641        env.AppendUnique(CPPPATH = [env['lapack_path']])
642        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
643    
644        env.Append(LIBPATH = '/usr/lib/atlas')
645        env.Append(LIBS = [env['lapack_libs']])
646        if env['lapack_type']=='mkl':
647           if not env['usemkl']:
648            env['uselapack']=0
649            print "mkl_lapack requires mkl"
650           else:
651            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
652          
653    
654  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
655    
656  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 439  else: Line 665  else:
665  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
666  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
667    
668    ############ Add some custom builders ##########################
669    
670    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
671    env.Append(BUILDERS = {'PyCompile' : py_builder});
672    
673    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
674    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
675    
676    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
677    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
678    
679    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
680    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
681    
682  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
683    if not env['usempi']: env['mpi_flavour']='none'
684    
685  # 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)
686  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 448  env_mpi = clone_env(env) Line 689  env_mpi = clone_env(env)
689  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
690    
691  if env_mpi['usempi']:  if env_mpi['usempi']:
692      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
693      if not env_mpi['mpi_flavour'] in VALID_MPIs:
694          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
695    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
696    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
697    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
698    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mpi_lib_path']) # The wrapper script needs to find these libs
699      #ensure that our path entries remain at the front
700      conf.env.PrependENVPath('PYTHONPATH', prefix)
701      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
702    
703  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
704  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
705    
706  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
707  if env_mpi['usempi']:  if env_mpi['usempi']:
708    env_mpi = conf.Finish()    env_mpi = conf.Finish()
709    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']])
710      # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
711      # On the other hand MPT and OpenMPI don't define the latter so we have to
712      # do that here
713      if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
714        env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
715  else:  else:
716    conf.Finish()    conf.Finish()
717    
# Line 476  if env_mpi['useparmetis']: Line 728  if env_mpi['useparmetis']:
728    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
729    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
730    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
731    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_lib_path'])    # The wrapper script needs to find these libs
732      #ensure that our path entries remain at the front
733      conf.env.PrependENVPath('PYTHONPATH', prefix)
734      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
735    
736  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
737  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 495  env['useparmetis'] = env_mpi['useparmeti Line 750  env['useparmetis'] = env_mpi['useparmeti
750  print ""  print ""
751  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
752  print " Using python libraries"  print " Using python libraries"
753  print " Using numarray"  print " Using numpy"
754  print " Using boost"  print " Using boost"
755  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
756  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 505  if env['usemkl']: print "  Using MKL" Line 760  if env['usemkl']: print "  Using MKL"
760  else: print "   Not using MKL"  else: print "   Not using MKL"
761  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
762  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
763    if env['usesilo']: print "  Using Silo"
764    else: print "   Not using Silo"
765  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
766  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
767  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
768  else: print "   Not using MPI"  else: print "   Not using MPI"
769  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
770  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
771  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
772  else: print "   Not using PAPI"  else: print "   Not using PAPI"
773    if env['uselapack']: print "    Using Lapack"
774    else: print "   Not using Lapack"
775  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
776  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
777  print " Installing in", prefix  print " Installing in", prefix
778    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
779    else: print "   Not treating warnings as errors"
780  print ""  print ""
781    
782  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
783    
784  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
785  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
786  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
787  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
788    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
789    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
790    
 ############ Add some custom builders ##########################  
791    
792  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});  
793    
794  runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
795    
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
796    
797  ############ Build the subdirectories ##########################  from grouptest import *
798    
799    TestGroups=[]
800    
801    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
802    
803    ############ Now we switch on Warnings as errors ###############
804    
805    #this needs to be done after configuration because the scons test files have warnings in them
806    
807    if ((fatalwarning != "") and (env['usewarnings'])):
808      env.Append(CCFLAGS        = fatalwarning)
809      env_mpi.Append(CCFLAGS        = fatalwarning)
810    
811    
812  Export(["env", "env_mpi", "clone_env"])  Export(
813      ["env",
814       "env_mpi",
815       "clone_env",
816       "dodgy_env",
817       "IS_WINDOWS_PLATFORM",
818       "TestGroups"
819       ]
820      )
821    
822  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)
823    env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
824  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
825    env.SConscript(dirs = ['weipa/src'], build_dir='build/$PLATFORM/weipa', duplicate=0)
826  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
827  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
828  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 551  env.SConscript(dirs = ['pyvisi/py_src'], Line 832  env.SConscript(dirs = ['pyvisi/py_src'],
832  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)
833  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
834  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
835    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
836    
837    
838  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
839    
840  remember_list = []  remember_list = []
841    
842  if env['usedebug']:  if env['usedebug']:
843    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'))
844    
845  if env['usempi']:  if env['usempi']:
846    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'))
847    
848  if env['omp_optim'] != '':  if env['useopenmp']:
849    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'))
850    
851  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
852    
853    
854    ############### Record python interpreter version ##############
855    
856    if not IS_WINDOWS_PLATFORM:
857    
858      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
859      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
860      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
861    
862    ############## Populate the buildvars file #####################
863    
864    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
865    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
866    
867    # Find the boost version by extracting it from version.hpp
868    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
869    boostversion='unknown'
870    try:
871        for line in boosthpp:
872            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
873            if ver:
874                boostversion=ver.group(1)
875    except StopIteration:
876        pass
877    buildvars.write("boost="+boostversion+"\n")
878    buildvars.write("svn_revision="+str(global_revision)+"\n")
879    out="usedebug="
880    if env['usedebug']:
881        out+="y"
882    else:
883        out+="n"
884    out+="\nusempi="
885    if env['usempi']:
886        out+="y"
887    else:
888        out+="n"
889    out+="\nuseopenmp="
890    if env['useopenmp']:
891        out+="y"
892    else:
893        out+="n"
894    buildvars.write(out+"\n")
895    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
896    out="lapack="
897    if env['uselapack']:
898       out+="y"
899    else:
900       out+="n"
901    out+="\nsilo="
902    if env['usesilo']:
903       out+="y"
904    else:
905       out+="n"
906    buildvars.write(out+"\n")
907    buildvars.close()
908    
909    
910  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
911    
912  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 579  env.Alias('install_esysUtils', ['build_e Line 919  env.Alias('install_esysUtils', ['build_e
919  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
920  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
921    
922    env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
923    env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
924    
925    env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
926    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
927    
928  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'])
929  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'])
930    
# Line 589  env.Alias('install_finley', ['build_finl Line 935  env.Alias('install_finley', ['build_finl
935  build_all_list = []  build_all_list = []
936  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
937  build_all_list += ['build_paso']  build_all_list += ['build_paso']
938    build_all_list += ['build_weipa']
939  build_all_list += ['build_escript']  build_all_list += ['build_escript']
940  build_all_list += ['build_finley']  build_all_list += ['build_finley']
941  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
942  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
943    build_all_list += ['target_escriptconvert']
944  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
945    
946  install_all_list = []  install_all_list = []
947  install_all_list += ['target_init']  install_all_list += ['target_init']
948  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
949  install_all_list += ['install_paso']  install_all_list += ['install_paso']
950    install_all_list += ['install_weipa']
951  install_all_list += ['install_escript']  install_all_list += ['install_escript']
952  install_all_list += ['install_finley']  install_all_list += ['install_finley']
953  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
954  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
955  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
956  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
957  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
958    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
959  install_all_list += ['remember_options']  install_all_list += ['remember_options']
960  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
961    
# Line 618  env.Alias('build_cppunittest', ['target_ Line 968  env.Alias('build_cppunittest', ['target_
968  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
969  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
970  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'])
971    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
972    
973    
974  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
975    
976  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
977    
978    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
979    
980    build_platform=os.name
981    
982    if not IS_WINDOWS_PLATFORM:
983       try:
984        utest=open("utest.sh","w")
985        #Sometimes Mac python says it is posix
986        if (build_platform=='posix') and platform.system()=="Darwin":
987            build_platform='darwin'
988        utest.write(GroupTest.makeHeader(build_platform))
989        for tests in TestGroups:
990            utest.write(tests.makeString())
991        utest.close()
992        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
993        print "utest.sh written"
994       except IOError:
995        print "Error attempting to write unittests file."
996        sys.exit(1)
997    
998       #Make sure that the escript wrapper is in place
999       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
1000           print "Copying escript wrapper"
1001           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1002    
1003    ############ Targets to build PasoTests suite ################
1004    
1005    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1006    
1007    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.1789  
changed lines
  Added in v.3077

  ViewVC Help
Powered by ViewVC 1.1.26