/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1866 by ksteube, Thu Oct 9 04:01:06 2008 UTC revision 2930 by caltinay, Mon Feb 8 06:25:43 2010 UTC
# Line 1  Line 1 
1    
2  ########################################################  ########################################################
3  #  #
4  # Copyright (c) 2003-2008 by University of Queensland  # Copyright (c) 2003-2010 by University of Queensland
5  # Earth Systems Science Computational Center (ESSCC)  # Earth Systems Science Computational Center (ESSCC)
6  # http://www.uq.edu.au/esscc  # http://www.uq.edu.au/esscc
7  #  #
# Line 15  Line 15 
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 33  IS_WINDOWS_PLATFORM = (os.name== "nt") Line 35  IS_WINDOWS_PLATFORM = (os.name== "nt")
35    
36  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
37    
38  # 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    #Determine where to read options from use:
43    #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):  if not os.path.isfile(options_file):
58      print "Options file not found (expected '%s')" % options_file
59    options_file = False    options_file = False
   print "Options file not found"  
60  else:  else:
61    print "Options file is", options_file    print "Options file is", options_file
62    
63  # Load options file and command-line arguments  #Does our scons support the newer Variables class or do we need to use Options?
64  opts = Options(options_file, ARGUMENTS)  
65    try:
66       dummyvar=Variables
67       opts = Variables(options_file, ARGUMENTS)
68       adder = opts.AddVariables
69    except:
70       opts = Options(options_file, ARGUMENTS)
71       adder = opts.AddOptions
72       BoolVariable = BoolOption
73    
74  ############ Load build options ################################  ############ Load build options ################################
75    
76  opts.AddOptions(  adder(
77    #opts.AddOptions(
78  # Where to install esys stuff  # Where to install esys stuff
79    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
80    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),
# Line 56  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 compiler flags to use', '-DEFAULT_1'),
94    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),
# Line 71  opts.AddOptions( Line 100  opts.AddOptions(
100    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
101    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
102    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
103    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
104    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'yes'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
105      BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
106      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
107      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
108  # Python  # Python
109    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
110    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 83  opts.AddOptions( Line 115  opts.AddOptions(
115    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
116    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
117  # NetCDF  # NetCDF
118    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
119    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
120    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
121    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
122  # MPI  # MPI
123    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
124    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
125    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),
126    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
127    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
128    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),    ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),
129    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),    ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', []),
130      ('mpi_flavour','Type of MPI execution environment','none'),
131  # ParMETIS  # ParMETIS
132    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
133    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
134    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
135    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
136  # PAPI  # PAPI
137    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
138    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
139    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
140    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
141    BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),    BoolVariable('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),
142  # MKL  # MKL
143    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
144    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),
145    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),
146    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),
147  # UMFPACK  # UMFPACK
148    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
149    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
150    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
151    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
152    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
153    # Silo
154      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
155      ('silo_path', 'Path to Silo includes', '/usr/include'),
156      ('silo_lib_path', 'Path to Silo libs', usr_lib),
157      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
158  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
159    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
160    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 124  opts.AddOptions( Line 162  opts.AddOptions(
162  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
163    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
164    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
165    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
166    #Lapack options
167      BoolVariable('uselapack','switch on/off use of Lapack','no'),
168      ('lapack_path', 'Path to Lapack includes','/usr/include'),
169      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
170      ('lapack_libs', 'Lapack libraries to link with', []),
171      ('lapack_type', '{clapack,mkl}','clapack'),
172    # An option for specifying the compiler tools set (see windows branch).
173      ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
174    # finer control over library building, intel aggressive global optimisation
175    # works with dynamic libraries on windows.
176      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
177      ('share_paso', 'control static or dynamic paso lib', False),
178      ('env_export','Environment variables to be passed to children',[]),
179    #To enable passing function pointers through python
180      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
181  )  )
182    
183    
184    
185  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
186    
187  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
188  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
189    
190  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
191        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
192          env = Environment(tools = ['default'] + env['tools_names'],
193                            options = opts)
194  else:  else:
195     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
196        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
197     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
198        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 143  else: Line 200  else:
200           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
201     else:     else:
202        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
203    
204    # Override compiler choice if provided
205    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
206    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
207    
208  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
209    
210    ############ Make sure target directories exist ################
211    
212    if not os.path.isdir(env['bininstall']):
213        os.makedirs(env['bininstall'])
214    if not os.path.isdir(env['libinstall']):
215        os.makedirs(env['libinstall'])
216    if not os.path.isdir(env['pyinstall']):
217        os.makedirs(env['pyinstall'])
218    
219    ########## Copy required environment vars ######################
220    
221    for i in env['env_export']:
222       env.Append(ENV = {i:os.environ[i]})
223    
224  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
225    
226  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 154  if env['useMPI']: env['usempi'] = 1 Line 230  if env['useMPI']: env['usempi'] = 1
230  # 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)
231  # 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
232    
233    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
234    
235    cc_flags = ""
236    cc_optim = ""
237    cc_debug = ""
238    omp_optim = ""
239    omp_debug = ""
240    omp_libs = []
241    
242  if env["CC"] == "icc":  if env["CC"] == "icc":
243    # Intel compilers    # Intel compilers
244    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
245    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
246    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
248    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
249    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
250    pedantic      = ""    pedantic      = ""
251  elif env["CC"] == "gcc":    fatalwarning      = ""        # Switch to turn warnings into errors
252      sysheaderopt      = ""
253    elif env["CC"][:3] == "gcc":
254    # GNU C on any system    # GNU C on any system
255    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"
256    #the long long warning occurs on the Mac
257    cc_optim      = "-O3"    cc_optim      = "-O3"
258    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
259    omp_optim     = ""    omp_optim     = "-fopenmp"
260    omp_debug     = ""    omp_debug     = "-fopenmp"
261    omp_libs      = []    omp_libs      = []
262    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
263      fatalwarning      = "-Werror"
264      sysheaderopt      = "-isystem "
265  elif env["CC"] == "cl":  elif env["CC"] == "cl":
266    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
267    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 181  elif env["CC"] == "cl": Line 271  elif env["CC"] == "cl":
271    omp_debug     = ""    omp_debug     = ""
272    omp_libs      = []    omp_libs      = []
273    pedantic      = ""    pedantic      = ""
274      fatalwarning      = ""
275      sysheaderopt      = ""
276    elif env["CC"] == "icl":
277      # intel C on Windows, see windows_intelc_options.py for a start
278      pedantic      = ""
279      fatalwarning      = ""
280      sysheaderopt      = ""
281    
282    
283  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
284  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 190  if env["omp_optim"]    == "-DEFAULT_4": env Line 288  if env["omp_optim"]    == "-DEFAULT_4": env
288  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
289  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
290    
291    #set up the autolazy values
292    if env['forcelazy']    != "leave_alone":
293      if env['forcelazy'] == 'on':
294        env.Append(CPPDEFINES=['FAUTOLAZYON'])
295      else:
296         if env['forcelazy'] == 'off':
297        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
298    
299    #set up the colective resolve values
300    if env['forcecollres']    != "leave_alone":
301      print env['forcecollres']
302      if env['forcecollres'] == 'on':
303        env.Append(CPPDEFINES=['FRESCOLLECTON'])
304      else:
305         if env['forcecollres'] == 'off':
306        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
307    
308    
309    if env['iknowwhatimdoing']:
310        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
311    
312  # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty  # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty
313  if not env["useopenmp"]:  if not env["useopenmp"]:
314    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 198  if not env["useopenmp"]: Line 317  if not env["useopenmp"]:
317    
318  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
319    
320    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
321    if IS_WINDOWS_PLATFORM:
322        LD_LIBRARY_PATH_KEY='PATH'
323        env['ENV']['LD_LIBRARY_PATH']=''
324    else:
325        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
326  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
327    
328  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
329  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
330    
331    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
332    except KeyError: pass
333    
334    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
335    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
336    
337    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
338    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
339    
340    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
341    except KeyError: pass
342    
343  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
344  except KeyError: pass  except KeyError: pass
345    
# Line 215  except KeyError: pass Line 352  except KeyError: pass
352  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
353  except KeyError: pass  except KeyError: pass
354    
355  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
356  except KeyError: pass  except KeyError: pass
357    
358  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 231  try: env['ENV']['HOME'] = os.environ['HO Line 368  try: env['ENV']['HOME'] = os.environ['HO
368  except KeyError: pass  except KeyError: pass
369    
370  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
371    
372    
373    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
374    env.PrependENVPath('PYTHONPATH', prefix)
375  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
376    
377  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 250  env.Append(CPPPATH     = [Dir('include')]) Line 388  env.Append(CPPPATH     = [Dir('include')])
388  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
389  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
390    
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
   
391  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
392  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
393    
# Line 259  if env['usepedantic']: env.Append(CCFLAG Line 395  if env['usepedantic']: env.Append(CCFLAG
395    
396  # MS Windows  # MS Windows
397  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
398    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
399    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
400      if not env['share_esysUtils'] :
401        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
402      if not env['share_paso'] :
403        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
404    
405    if env['usenetcdf']:    if env['usenetcdf']:
406      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
407    
408  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
409    
# Line 276  except: Line 417  except:
417  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
418  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
419    
420  ############ numarray (required) ###############################  ############ numpy (required) ###############################
421    
422  try:  try:
423    from numarray import identity    from numpy import identity
424  except ImportError:  except ImportError:
425    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
426    sys.exit(1)    sys.exit(1)
427    
428  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 291  conf = Configure(clone_env(env)) Line 432  conf = Configure(clone_env(env))
432    
433  # Test that the compiler is working  # Test that the compiler is working
434  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
435    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
436    sys.exit(1)     sys.exit(1)
437    
438  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
439    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
440    
441  ############ python libraries (required) #######################  ############ python libraries (required) #######################
442    
443  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
444    if not sysheaderopt =="":
445      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
446    else:
447      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
448    
449  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
450  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
451    
452  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
453    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
454    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
455    
456  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
457    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'])
458    sys.exit(1)    sys.exit(1)
459  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
460    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'])
461    sys.exit(1)    sys.exit(1)
462    
463  ############ boost (required) ##################################  ############ boost (required) ##################################
464    
465  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
466    # This is required because we can't -isystem /usr/system because it breaks std includes
467      if os.path.normpath(env['boost_path']) =="/usr/include":
468        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
469      else:
470        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
471    else:
472      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
473    
474  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
475  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
476    
477  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
478    #ensure that our path entries remain at the front
479    conf.env.PrependENVPath('PYTHONPATH', prefix)
480    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
481    
482    
483    #Yep we still cant figure this one out. - working on it.
484    if not IS_WINDOWS_PLATFORM:
485      if not conf.CheckCXXHeader('boost/python.hpp'):
486        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
487        sys.exit(1)
488    
489      if not conf.CheckFunc('PyObject_SetAttr'):
490        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'])
491        sys.exit(1)
492    
 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)  
493    
494  # Commit changes to environment  # Commit changes to environment
495  env = conf.Finish()  env = conf.Finish()
# Line 351  if env['usenetcdf']: Line 515  if env['usenetcdf']:
515    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
516    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
517    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
518    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
519      #ensure that our path entries remain at the front
520      conf.env.PrependENVPath('PYTHONPATH', prefix)
521      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
522    
523  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
524  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 372  if env['usepapi']: Line 539  if env['usepapi']:
539    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
540    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
541    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
542    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
543      #ensure that our path entries remain at the front
544      conf.env.PrependENVPath('PYTHONPATH', prefix)
545      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
546    
547  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
548  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 393  if env['usemkl']: Line 563  if env['usemkl']:
563    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
564    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
565    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
566    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
567      #ensure that our path entries remain at the front
568      conf.env.PrependENVPath('PYTHONPATH', prefix)
569      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
570    
571  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
572  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
573    
574    
575  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
576  if env['usemkl']:  if env['usemkl']:
# Line 421  if env['useumfpack']: Line 595  if env['useumfpack']:
595    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
596    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
597    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
598    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
599    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
600    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
601      #ensure that our path entries remain at the front
602      conf.env.PrependENVPath('PYTHONPATH', prefix)
603      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
604    
605  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
606  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
607    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
608    
609  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
610  if env['useumfpack']:  if env['useumfpack']:
# Line 435  if env['useumfpack']: Line 613  if env['useumfpack']:
613  else:  else:
614    conf.Finish()    conf.Finish()
615    
616    ############ Silo (optional) ###################################
617    
618    if env['usesilo']:
619      conf = Configure(clone_env(env))
620      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
621      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
622      conf.env.AppendUnique(LIBS = [env['silo_libs']])
623      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
624      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
625      conf.Finish()
626    
627    # Add the path to Silo to environment env if it was found.
628    # Note that we do not add the libs since they are only needed for the
629    # escriptexport library and tools.
630    if env['usesilo']:
631      env.AppendUnique(CPPPATH = [env['silo_path']])
632      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
633    
634    ########### Lapack (optional) ##################################
635    
636    if env['uselapack']:
637        env.AppendUnique(CPPDEFINES='USE_LAPACK')
638        env.AppendUnique(CPPPATH = [env['lapack_path']])
639        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
640    
641        env.Append(LIBPATH = '/usr/lib/atlas')
642        env.Append(LIBS = [env['lapack_libs']])
643        if env['lapack_type']=='mkl':
644           if not env['usemkl']:
645            env['uselapack']=0
646            print "mkl_lapack requires mkl"
647           else:
648            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
649          
650    
651  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
652    
653  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 449  else: Line 662  else:
662  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
663  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
664    
665    ############ Add some custom builders ##########################
666    
667    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
668    env.Append(BUILDERS = {'PyCompile' : py_builder});
669    
670    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
671    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
672    
673    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
674    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
675    
676    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
677    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
678    
679  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
680    if not env['usempi']: env['mpi_flavour']='none'
681    
682  # 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)
683  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 458  env_mpi = clone_env(env) Line 686  env_mpi = clone_env(env)
686  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
687    
688  if env_mpi['usempi']:  if env_mpi['usempi']:
689      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
690      if not env_mpi['mpi_flavour'] in VALID_MPIs:
691          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
692    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
693    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
694    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
695    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
696      #ensure that our path entries remain at the front
697      conf.env.PrependENVPath('PYTHONPATH', prefix)
698      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
699    
700  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
701  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
702    
703  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
704  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 486  if env_mpi['useparmetis']: Line 720  if env_mpi['useparmetis']:
720    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
721    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
722    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
723    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
724      #ensure that our path entries remain at the front
725      conf.env.PrependENVPath('PYTHONPATH', prefix)
726      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
727    
728  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
729  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 505  env['useparmetis'] = env_mpi['useparmeti Line 742  env['useparmetis'] = env_mpi['useparmeti
742  print ""  print ""
743  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
744  print " Using python libraries"  print " Using python libraries"
745  print " Using numarray"  print " Using numpy"
746  print " Using boost"  print " Using boost"
747  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
748  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 515  if env['usemkl']: print "  Using MKL" Line 752  if env['usemkl']: print "  Using MKL"
752  else: print "   Not using MKL"  else: print "   Not using MKL"
753  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
754  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
755    if env['usesilo']: print "  Using Silo"
756    else: print "   Not using Silo"
757  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
758  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
759  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
760  else: print "   Not using MPI"  else: print "   Not using MPI"
761  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
762  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
763  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
764  else: print "   Not using PAPI"  else: print "   Not using PAPI"
765    if env['uselapack']: print "    Using Lapack"
766    else: print "   Not using Lapack"
767  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
768  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
769  print " Installing in", prefix  print " Installing in", prefix
770    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
771    else: print "   Not treating warnings as errors"
772  print ""  print ""
773    
774  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
775    
776  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
777  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
778  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
779  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
780    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
781    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
782    
 ############ Add some custom builders ##########################  
783    
784  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});  
785    
786  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});  
787    
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
788    
789  ############ Build the subdirectories ##########################  from grouptest import *
790    
791    TestGroups=[]
792    
793  Export(["env", "env_mpi", "clone_env"])  dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
794    
795    ############ Now we switch on Warnings as errors ###############
796    
797    #this needs to be done after configuration because the scons test files have warnings in them
798    
799    if ((fatalwarning != "") and (env['usewarnings'])):
800      env.Append(CCFLAGS        = fatalwarning)
801      env_mpi.Append(CCFLAGS        = fatalwarning)
802    
803    
804    Export(
805      ["env",
806       "env_mpi",
807       "clone_env",
808       "dodgy_env",
809       "IS_WINDOWS_PLATFORM",
810       "TestGroups"
811       ]
812      )
813    
814  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)
815    env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
816  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
817    env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0)
818  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
819  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
820  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 561  env.SConscript(dirs = ['pyvisi/py_src'], Line 824  env.SConscript(dirs = ['pyvisi/py_src'],
824  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)
825  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
826  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
827    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
828    
829    
830  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
831    
832  remember_list = []  remember_list = []
833    
834  if env['usedebug']:  if env['usedebug']:
835    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'))
836    
837  if env['usempi']:  if env['usempi']:
838    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'))
839    
840  if env['omp_optim'] != '':  if env['useopenmp']:
841    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'))
842    
843  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
844    
845    
846    ############### Record python interpreter version ##############
847    
848    if not IS_WINDOWS_PLATFORM:
849    
850      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
851      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
852      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
853    
854    ############## Populate the buildvars file #####################
855    
856    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
857    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
858    
859    # Find the boost version by extracting it from version.hpp
860    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
861    boostversion='unknown'
862    try:
863        for line in boosthpp:
864            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
865            if ver:
866                boostversion=ver.group(1)
867    except StopIteration:
868        pass
869    buildvars.write("boost="+boostversion+"\n")
870    buildvars.write("svn_revision="+str(global_revision)+"\n")
871    out="usedebug="
872    if env['usedebug']:
873        out+="y"
874    else:
875        out+="n"
876    out+="\nusempi="
877    if env['usempi']:
878        out+="y"
879    else:
880        out+="n"
881    out+="\nuseopenmp="
882    if env['useopenmp']:
883        out+="y"
884    else:
885        out+="n"
886    buildvars.write(out+"\n")
887    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
888    out="lapack="
889    if env['uselapack']:
890       out+="y"
891    else:
892       out+="n"
893    out+="\nsilo="
894    if env['usesilo']:
895       out+="y"
896    else:
897       out+="n"
898    buildvars.write(out+"\n")
899    buildvars.close()
900    
901    
902  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
903    
904  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 589  env.Alias('install_esysUtils', ['build_e Line 911  env.Alias('install_esysUtils', ['build_e
911  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
912  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
913    
914    env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so'])
915    env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py'])
916    
917    env.Alias('build_escriptreader', ['target_install_escriptexport_headers', 'target_escriptreader_a'])
918    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
919    
920  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'])
921  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'])
922    
# Line 599  env.Alias('install_finley', ['build_finl Line 927  env.Alias('install_finley', ['build_finl
927  build_all_list = []  build_all_list = []
928  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
929  build_all_list += ['build_paso']  build_all_list += ['build_paso']
930    build_all_list += ['build_dataexporter']
931  build_all_list += ['build_escript']  build_all_list += ['build_escript']
932  build_all_list += ['build_finley']  build_all_list += ['build_finley']
933  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
934  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
935    build_all_list += ['target_escriptconvert']
936  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
937    
938  install_all_list = []  install_all_list = []
939  install_all_list += ['target_init']  install_all_list += ['target_init']
940  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
941  install_all_list += ['install_paso']  install_all_list += ['install_paso']
942    install_all_list += ['install_dataexporter']
943  install_all_list += ['install_escript']  install_all_list += ['install_escript']
944  install_all_list += ['install_finley']  install_all_list += ['install_finley']
945  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
946  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
947  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
948  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
949  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
950    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
951  install_all_list += ['remember_options']  install_all_list += ['remember_options']
952  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
953    
# Line 628  env.Alias('build_cppunittest', ['target_ Line 960  env.Alias('build_cppunittest', ['target_
960  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
961  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
962  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'])
963    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
964    
965    
966  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
967    
968  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
969    
970    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
971    
972    build_platform=os.name
973    
974    if not IS_WINDOWS_PLATFORM:
975       try:
976        utest=open("utest.sh","w")
977        #Sometimes Mac python says it is posix
978        if (build_platform=='posix') and platform.system()=="Darwin":
979            build_platform='darwin'
980        utest.write(GroupTest.makeHeader(build_platform))
981        for tests in TestGroups:
982            utest.write(tests.makeString())
983        utest.close()
984        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
985        print "utest.sh written"
986       except IOError:
987        print "Error attempting to write unittests file."
988        sys.exit(1)
989    
990       #Make sure that the escript wrapper is in place
991       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
992           print "Copying escript wrapper"
993           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
994    
995    ############ Targets to build PasoTests suite ################
996    
997    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
998    
999    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.1866  
changed lines
  Added in v.2930

  ViewVC Help
Powered by ViewVC 1.1.26