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

Diff of /branches/dirac/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 2967 by caltinay, Wed Mar 3 03:50:46 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', ['intelc']),
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    
185    
186  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
187    
188  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
189  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
190    
191  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
192        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
193          env = Environment(tools = ['default'] + env['tools_names'],
194                            options = opts)
195  else:  else:
196     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
197        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
198     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
199        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 133  else: Line 201  else:
201           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)
202     else:     else:
203        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
204    
205    # Override compiler choice if provided
206    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
207    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
208    
209  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
210    
211    ############ Make sure target directories exist ################
212    
213    if not os.path.isdir(env['bininstall']):
214        os.makedirs(env['bininstall'])
215    if not os.path.isdir(env['libinstall']):
216        os.makedirs(env['libinstall'])
217    if not os.path.isdir(env['pyinstall']):
218        os.makedirs(env['pyinstall'])
219    
220    ########## Copy required environment vars ######################
221    
222    for i in env['env_export']:
223       env.Append(ENV = {i:os.environ[i]})
224    
225  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
226    
227  # 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 231  if env['useMPI']: env['usempi'] = 1
231  # 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)
232  # 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
233    
234    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
235    
236    cc_flags = ""
237    cc_optim = ""
238    cc_debug = ""
239    omp_optim = ""
240    omp_debug = ""
241    omp_libs = []
242    
243  if env["CC"] == "icc":  if env["CC"] == "icc":
244    # Intel compilers    # Intel compilers
245    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
246    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
247    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
248    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
249    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
250    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
251    pedantic      = ""    pedantic      = ""
252  elif env["CC"] == "gcc":    fatalwarning      = ""        # Switch to turn warnings into errors
253      sysheaderopt      = ""
254    elif env["CC"][:3] == "gcc":
255    # GNU C on any system    # GNU C on any system
256    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"
257    #the long long warning occurs on the Mac
258    cc_optim      = "-O3"    cc_optim      = "-O3"
259    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
260    omp_optim     = ""    omp_optim     = "-fopenmp"
261    omp_debug     = ""    omp_debug     = "-fopenmp"
262    omp_libs      = []    omp_libs      = []
263    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
264      fatalwarning      = "-Werror"
265      sysheaderopt      = "-isystem "
266  elif env["CC"] == "cl":  elif env["CC"] == "cl":
267    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
268    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 272  elif env["CC"] == "cl":
272    omp_debug     = ""    omp_debug     = ""
273    omp_libs      = []    omp_libs      = []
274    pedantic      = ""    pedantic      = ""
275      fatalwarning      = ""
276      sysheaderopt      = ""
277    elif env["CC"] == "icl":
278      # intel C on Windows, see windows_intelc_options.py for a start
279      pedantic      = ""
280      fatalwarning      = ""
281      sysheaderopt      = ""
282    
283    
284  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
285  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 289  if env["omp_optim"]    == "-DEFAULT_4": env
289  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
290  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
291    
292    #set up the autolazy values
293    if env['forcelazy']    != "leave_alone":
294      if env['forcelazy'] == 'on':
295        env.Append(CPPDEFINES=['FAUTOLAZYON'])
296      else:
297         if env['forcelazy'] == 'off':
298        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
299    
300    #set up the colective resolve values
301    if env['forcecollres']    != "leave_alone":
302      print env['forcecollres']
303      if env['forcecollres'] == 'on':
304        env.Append(CPPDEFINES=['FRESCOLLECTON'])
305      else:
306         if env['forcecollres'] == 'off':
307        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
308    
309    
310    if env['iknowwhatimdoing']:
311        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
312    
313  # 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
314  if not env["useopenmp"]:  if not env["useopenmp"]:
315    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 188  if not env["useopenmp"]: Line 318  if not env["useopenmp"]:
318    
319  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
320    
321    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
322    if IS_WINDOWS_PLATFORM:
323        LD_LIBRARY_PATH_KEY='PATH'
324        env['ENV']['LD_LIBRARY_PATH']=''
325    else:
326        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
327  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
328    
329  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
330  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
331    
332    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
333    except KeyError: pass
334    
335    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
336    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
337    
338    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
339    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
340    
341    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
342    except KeyError: pass
343    
344  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
345  except KeyError: pass  except KeyError: pass
346    
# Line 205  except KeyError: pass Line 353  except KeyError: pass
353  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
354  except KeyError: pass  except KeyError: pass
355    
356  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
357  except KeyError: pass  except KeyError: pass
358    
359  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 369  try: env['ENV']['HOME'] = os.environ['HO
369  except KeyError: pass  except KeyError: pass
370    
371  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
372    
373    
374    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
375    env.PrependENVPath('PYTHONPATH', prefix)
376  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
377    
378  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 240  env.Append(CPPPATH     = [Dir('include')]) Line 389  env.Append(CPPPATH     = [Dir('include')])
389  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
390  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
391    
392  env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
393    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
 if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  
394  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
395    
396  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
397    
398  # MS Windows  # MS Windows
399  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
400    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
401    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
402      if not env['share_esysUtils'] :
403        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
404      if not env['share_paso'] :
405        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
406    
407    if env['usenetcdf']:    if env['usenetcdf']:
408      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
409    
410  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
411    
# Line 266  except: Line 419  except:
419  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
420  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
421    
422  ############ numarray (required) ###############################  ############ numpy (required) ###############################
423    
424  try:  try:
425    from numarray import identity    from numpy import identity
426  except ImportError:  except ImportError:
427    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
428    sys.exit(1)    sys.exit(1)
429    
430  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 281  conf = Configure(clone_env(env)) Line 434  conf = Configure(clone_env(env))
434    
435  # Test that the compiler is working  # Test that the compiler is working
436  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
437    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
438    sys.exit(1)     sys.exit(1)
439    
440  if not conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
441    env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
442    
443  ############ python libraries (required) #######################  ############ python libraries (required) #######################
444    
445  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
446    if not sysheaderopt =="":
447      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
448    else:
449      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
450    
451  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
452  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
453    
454    conf.env.PrependENVPath('PYTHONPATH', prefix)
455    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
456    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
457    
458  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
459    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'])
460    sys.exit(1)    sys.exit(1)
461  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
462    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'])
463    sys.exit(1)    sys.exit(1)
464    
465  ############ boost (required) ##################################  ############ boost (required) ##################################
466    
467  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
468    # This is required because we can't -isystem /usr/system because it breaks std includes
469      if os.path.normpath(env['boost_path']) =="/usr/include":
470        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
471      else:
472        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
473    else:
474      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
475    
476  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
477  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
478    
479  if not conf.CheckCXXHeader('boost/python.hpp'):  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['boost_lib_path']) # The wrapper script needs to find these libs
480    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])  #ensure that our path entries remain at the front
481    sys.exit(1)  conf.env.PrependENVPath('PYTHONPATH', prefix)
482  if not conf.CheckFunc('PyObject_SetAttr'):  conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
483    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'])  
484    sys.exit(1)  
485    #Yep we still cant figure this one out. - working on it.
486    if not IS_WINDOWS_PLATFORM:
487      if not conf.CheckCXXHeader('boost/python.hpp'):
488        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
489        sys.exit(1)
490    
491      if not conf.CheckFunc('PyObject_SetAttr'):
492        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'])
493        sys.exit(1)
494    
495    
496  # Commit changes to environment  # Commit changes to environment
497  env = conf.Finish()  env = conf.Finish()
# Line 337  if env['usenetcdf']: Line 517  if env['usenetcdf']:
517    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
518    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
519    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
520      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['netCDF_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['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
526  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 541  if env['usepapi']:
541    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
542    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
543    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
544      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['papi_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['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
550  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 565  if env['usemkl']:
565    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
566    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
567    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
568      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mkl_lib_path']) # The wrapper script needs to find these libs
569      #ensure that our path entries remain at the front
570      conf.env.PrependENVPath('PYTHONPATH', prefix)
571      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
572    
573  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
574  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
575    
576    
577  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
578  if env['usemkl']:  if env['usemkl']:
# Line 404  if env['useumfpack']: Line 597  if env['useumfpack']:
597    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
598    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
599    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
600      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['umf_lib_path']) # The wrapper script needs to find these libs
601      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['amd_lib_path']) # The wrapper script needs to find these libs
602      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['blas_lib_path'])    # The wrapper script needs to find these libs
603      #ensure that our path entries remain at the front
604      conf.env.PrependENVPath('PYTHONPATH', prefix)
605      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
606    
607  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
608  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
609    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
610    
611  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
612  if env['useumfpack']:  if env['useumfpack']:
# Line 415  if env['useumfpack']: Line 615  if env['useumfpack']:
615  else:  else:
616    conf.Finish()    conf.Finish()
617    
618    ############ Silo (optional) ###################################
619    
620    if env['usesilo']:
621      conf = Configure(clone_env(env))
622      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
623      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
624      conf.env.AppendUnique(LIBS = [env['silo_libs']])
625      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
626      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
627      conf.Finish()
628    
629    # Add the path to Silo to environment env if it was found.
630    # Note that we do not add the libs since they are only needed for the
631    # escriptexport library and tools.
632    if env['usesilo']:
633      env.AppendUnique(CPPPATH = [env['silo_path']])
634      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
635    
636    ########### Lapack (optional) ##################################
637    
638    if env['uselapack']:
639        env.AppendUnique(CPPDEFINES='USE_LAPACK')
640        env.AppendUnique(CPPPATH = [env['lapack_path']])
641        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
642    
643        env.Append(LIBPATH = '/usr/lib/atlas')
644        env.Append(LIBS = [env['lapack_libs']])
645        if env['lapack_type']=='mkl':
646           if not env['usemkl']:
647            env['uselapack']=0
648            print "mkl_lapack requires mkl"
649           else:
650            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
651          
652    
653  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
654    
655  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 429  else: Line 664  else:
664  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
665  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
666    
667    ############ Add some custom builders ##########################
668    
669    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
670    env.Append(BUILDERS = {'PyCompile' : py_builder});
671    
672    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
673    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
674    
675    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
676    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
677    
678    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
679    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
680    
681  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
682    if not env['usempi']: env['mpi_flavour']='none'
683    
684  # 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)
685  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 438  env_mpi = clone_env(env) Line 688  env_mpi = clone_env(env)
688  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
689    
690  if env_mpi['usempi']:  if env_mpi['usempi']:
691      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
692      if not env_mpi['mpi_flavour'] in VALID_MPIs:
693          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
694    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
695    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
696    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
697      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['mpi_lib_path']) # The wrapper script needs to find these libs
698      #ensure that our path entries remain at the front
699      conf.env.PrependENVPath('PYTHONPATH', prefix)
700      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
701    
702  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
703  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
704    
705  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
706  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 465  if env_mpi['useparmetis']: Line 722  if env_mpi['useparmetis']:
722    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
723    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
724    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
725      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['parmetis_lib_path'])    # The wrapper script needs to find these libs
726      #ensure that our path entries remain at the front
727      conf.env.PrependENVPath('PYTHONPATH', prefix)
728      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
729    
730  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
731  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 483  env['useparmetis'] = env_mpi['useparmeti Line 744  env['useparmetis'] = env_mpi['useparmeti
744  print ""  print ""
745  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
746  print " Using python libraries"  print " Using python libraries"
747  print " Using numarray"  print " Using numpy"
748  print " Using boost"  print " Using boost"
749  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
750  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 493  if env['usemkl']: print "  Using MKL" Line 754  if env['usemkl']: print "  Using MKL"
754  else: print "   Not using MKL"  else: print "   Not using MKL"
755  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
756  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
757    if env['usesilo']: print "  Using Silo"
758    else: print "   Not using Silo"
759  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
760  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
761  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
762  else: print "   Not using MPI"  else: print "   Not using MPI"
763  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
764  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
765  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
766  else: print "   Not using PAPI"  else: print "   Not using PAPI"
767    if env['uselapack']: print "    Using Lapack"
768    else: print "   Not using Lapack"
769  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
770  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
771  print " Installing in", prefix  print " Installing in", prefix
772    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
773    else: print "   Not treating warnings as errors"
774  print ""  print ""
775    
776  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
777    
778  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
779  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
780  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
781  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
782    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
783    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
784    
 ############ Add some custom builders ##########################  
785    
786  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});  
787    
788  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});  
789    
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
790    
791  ############ Build the subdirectories ##########################  from grouptest import *
792    
793    TestGroups=[]
794    
795    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
796    
797    ############ Now we switch on Warnings as errors ###############
798    
799    #this needs to be done after configuration because the scons test files have warnings in them
800    
801    if ((fatalwarning != "") and (env['usewarnings'])):
802      env.Append(CCFLAGS        = fatalwarning)
803      env_mpi.Append(CCFLAGS        = fatalwarning)
804    
805    
806  Export(["env", "env_mpi", "clone_env"])  Export(
807      ["env",
808       "env_mpi",
809       "clone_env",
810       "dodgy_env",
811       "IS_WINDOWS_PLATFORM",
812       "TestGroups"
813       ]
814      )
815    
816  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)
817    env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
818  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
819    env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
820  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
821  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
822  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 826  env.SConscript(dirs = ['pyvisi/py_src'],
826  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)
827  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
828  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
829    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
830    
831    
832  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
833    
834  remember_list = []  remember_list = []
835    
836  if env['usedebug']:  if env['usedebug']:
837    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'))
838    
839  if env['usempi']:  if env['usempi']:
840    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'))
841    
842  if env['omp_optim'] != '':  if env['useopenmp']:
843    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'))
844    
845  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
846    
847    
848    ############### Record python interpreter version ##############
849    
850    if not IS_WINDOWS_PLATFORM:
851    
852      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
853      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
854      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
855    
856    ############## Populate the buildvars file #####################
857    
858    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
859    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
860    
861    # Find the boost version by extracting it from version.hpp
862    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
863    boostversion='unknown'
864    try:
865        for line in boosthpp:
866            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
867            if ver:
868                boostversion=ver.group(1)
869    except StopIteration:
870        pass
871    buildvars.write("boost="+boostversion+"\n")
872    buildvars.write("svn_revision="+str(global_revision)+"\n")
873    out="usedebug="
874    if env['usedebug']:
875        out+="y"
876    else:
877        out+="n"
878    out+="\nusempi="
879    if env['usempi']:
880        out+="y"
881    else:
882        out+="n"
883    out+="\nuseopenmp="
884    if env['useopenmp']:
885        out+="y"
886    else:
887        out+="n"
888    buildvars.write(out+"\n")
889    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
890    out="lapack="
891    if env['uselapack']:
892       out+="y"
893    else:
894       out+="n"
895    out+="\nsilo="
896    if env['usesilo']:
897       out+="y"
898    else:
899       out+="n"
900    buildvars.write(out+"\n")
901    buildvars.close()
902    
903    
904  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
905    
906  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 913  env.Alias('install_esysUtils', ['build_e
913  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
914  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
915    
916    env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
917    env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
918    
919    env.Alias('build_escriptreader', ['target_install_escriptexport_headers', 'target_escriptreader_a'])
920    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
921    
922  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'])
923  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'])
924    
# Line 577  env.Alias('install_finley', ['build_finl Line 929  env.Alias('install_finley', ['build_finl
929  build_all_list = []  build_all_list = []
930  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
931  build_all_list += ['build_paso']  build_all_list += ['build_paso']
932    build_all_list += ['build_dataexporter']
933  build_all_list += ['build_escript']  build_all_list += ['build_escript']
934  build_all_list += ['build_finley']  build_all_list += ['build_finley']
935  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
936  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
937    build_all_list += ['target_escriptconvert']
938  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
939    
940  install_all_list = []  install_all_list = []
941  install_all_list += ['target_init']  install_all_list += ['target_init']
942  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
943  install_all_list += ['install_paso']  install_all_list += ['install_paso']
944    install_all_list += ['install_dataexporter']
945  install_all_list += ['install_escript']  install_all_list += ['install_escript']
946  install_all_list += ['install_finley']  install_all_list += ['install_finley']
947  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
948  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
949  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
950  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
951  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
952    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
953  install_all_list += ['remember_options']  install_all_list += ['remember_options']
954  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
955    
# Line 606  env.Alias('build_cppunittest', ['target_ Line 962  env.Alias('build_cppunittest', ['target_
962  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
963  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
964  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'])
965    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
966    
967    
968  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
969    
970  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
971    
972    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
973    
974    build_platform=os.name
975    
976    if not IS_WINDOWS_PLATFORM:
977       try:
978        utest=open("utest.sh","w")
979        #Sometimes Mac python says it is posix
980        if (build_platform=='posix') and platform.system()=="Darwin":
981            build_platform='darwin'
982        utest.write(GroupTest.makeHeader(build_platform))
983        for tests in TestGroups:
984            utest.write(tests.makeString())
985        utest.close()
986        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
987        print "utest.sh written"
988       except IOError:
989        print "Error attempting to write unittests file."
990        sys.exit(1)
991    
992       #Make sure that the escript wrapper is in place
993       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
994           print "Copying escript wrapper"
995           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
996    
997    ############ Targets to build PasoTests suite ################
998    
999    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1000    
1001    env.Alias('release_prep', ['docs', 'install_all'])

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

  ViewVC Help
Powered by ViewVC 1.1.26