/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1705 by ksteube, Thu Aug 14 05:56:40 2008 UTC revision 2366 by gross, Mon Apr 6 03:10:55 2009 UTC
# Line 1  Line 1 
1  #         Copyright 2006 by ACcESS MNRF  
2    ########################################################
3    #
4    # Copyright (c) 2003-2008 by University of Queensland
5    # Earth Systems Science Computational Center (ESSCC)
6    # http://www.uq.edu.au/esscc
7    #
8    # Primary Business: Queensland, Australia
9    # Licensed under the Open Software License version 3.0
10    # http://www.opensource.org/licenses/osl-3.0.php
11  #  #
12  #              http://www.access.edu.au  ########################################################
13  #       Primary Business: Queensland, Australia  
 #  Licensed under the Open Software License version 3.0  
 #     http://www.opensource.org/licenses/osl-3.0.php  
14    
15  EnsureSConsVersion(0,96,91)  EnsureSConsVersion(0,96,91)
16  EnsurePythonVersion(2,3)  EnsurePythonVersion(2,3)
17    
18  import sys, os, re, socket  import sys, os, re, socket, platform, stat
19    
20  # Add our extensions  # Add our extensions
21  if os.path.isdir('scons'): sys.path.append('scons')  if os.path.isdir('scons'): sys.path.append('scons')
# Line 30  prefix = ARGUMENTS.get('prefix', Dir('#. Line 37  prefix = ARGUMENTS.get('prefix', Dir('#.
37  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])
38  tmp = os.path.join("scons",hostname+"_options.py")  tmp = os.path.join("scons",hostname+"_options.py")
39  options_file = ARGUMENTS.get('options_file', tmp)  options_file = ARGUMENTS.get('options_file', tmp)
40  if not os.path.isfile(options_file): options_file = False  if not os.path.isfile(options_file):
41      options_file = False
42      print "Options file not found (expected '%s')" % tmp
43    else:
44      print "Options file is", options_file
45    
46  # Load options file and command-line arguments  # Load options file and command-line arguments
47  opts = Options(options_file, ARGUMENTS)  opts = Options(options_file, ARGUMENTS)
# Line 41  opts.AddOptions( Line 52  opts.AddOptions(
52  # Where to install esys stuff  # Where to install esys stuff
53    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
54    ('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')),
55      ('bininstall', 'where the esys binaries will be installed',            os.path.join(prefix,'bin')),
56    ('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')),
57    ('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')),
58  # Compilation options  # Compilation options
# Line 48  opts.AddOptions( Line 60  opts.AddOptions(
60    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolOption('usedebug', 'Do you want a debug build?', 'no'),
61    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),
62    ('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),
63      ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
64    # 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
65    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),
66    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),
# Line 56  opts.AddOptions( Line 69  opts.AddOptions(
69    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
70    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
71    ('cc_extra', 'Extra C/C++ flags', ''),    ('cc_extra', 'Extra C/C++ flags', ''),
72      ('ld_extra', 'Extra linker flags', ''),
73    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
74    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
75    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'),
76    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'yes'),    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
77      BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),
78      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
79  # Python  # Python
80    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
81    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 82  opts.AddOptions( Line 98  opts.AddOptions(
98    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
99    ('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),
100    ('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!)', ['mpich' , 'pthread', 'rt']),
101      ('mpi_flavour','Type of MPI execution environment','none'),
102  # ParMETIS  # ParMETIS
103    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
104    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
# Line 99  opts.AddOptions( Line 116  opts.AddOptions(
116    ('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'),
117    ('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']),
118  # UMFPACK  # UMFPACK
119    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'yes'),    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
120    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
121    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
122    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
123    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
124    # Silo
125      BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),
126      ('silo_path', 'Path to Silo includes', '/usr/include'),
127      ('silo_lib_path', 'Path to Silo libs', usr_lib),
128      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
129  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
130    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
131    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 111  opts.AddOptions( Line 133  opts.AddOptions(
133  # BLAS (used by UMFPACK)  # BLAS (used by UMFPACK)
134    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
135    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
136    ('blas_libs', 'BLAS libraries to link with', ['blas'])    ('blas_libs', 'BLAS libraries to link with', ['blas']),
137    # An option for specifying the compiler tools set (see windows branch).
138      ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
139    # finer control over library building, intel aggressive global optimisation
140    # works with dynamic libraries on windows.
141      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
142      ('share_paso', 'control static or dynamic paso lib', False)
143  )  )
144    
145  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
# Line 120  opts.AddOptions( Line 148  opts.AddOptions(
148  # failing to find the compilers.  This warning can be safely ignored.  # failing to find the compilers.  This warning can be safely ignored.
149    
150  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
151        env = Environment(tools = ['default', 'msvc'], options = opts)        env = Environment(options = opts)
152          env = Environment(tools = ['default'] + env['tools_names'],
153                            options = opts)
154  else:  else:
155     if socket.gethostname().split('.')[0] == 'service0':     if socket.gethostname().split('.')[0] == 'service0':
156        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 141  if env['useMPI']: env['usempi'] = 1 Line 171  if env['useMPI']: env['usempi'] = 1
171  # 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)
172  # 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
173    
174    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
175    
176  if env["CC"] == "icc":  if env["CC"] == "icc":
177    # Intel compilers    # Intel compilers
178    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
179    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
180    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
181    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
182    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
183    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
184    pedantic      = ""    pedantic      = ""
185      fatalwarning      = ""        # Switch to turn warnings into errors
186      sysheaderopt      = ""
187  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
188    # GNU C on any system    # GNU C on any system
189    cc_flags      = "-fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER"    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
190    #the long long warning occurs on the Mac
191    cc_optim      = "-O3"    cc_optim      = "-O3"
192    cc_debug      = "-g -O0 -UDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
193    omp_optim     = ""    omp_optim     = "-fopenmp"
194    omp_debug     = ""    omp_debug     = "-fopenmp"
195    omp_libs      = []    omp_libs      = ['gomp']
196    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
197      fatalwarning      = "-Werror"
198      sysheaderopt      = "-isystem "
199  elif env["CC"] == "cl":  elif env["CC"] == "cl":
200    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
201    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 168  elif env["CC"] == "cl": Line 205  elif env["CC"] == "cl":
205    omp_debug     = ""    omp_debug     = ""
206    omp_libs      = []    omp_libs      = []
207    pedantic      = ""    pedantic      = ""
208      fatalwarning      = ""
209      sysheaderopt      = ""
210    elif env["CC"] == "icl":
211      # intel C on Windows, see windows_intelc_options.py for a start
212      pedantic      = ""
213      fatalwarning      = ""
214      sysheaderopt      = ""
215    
216    
217  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
218  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 177  if env["omp_optim"]    == "-DEFAULT_4": env Line 222  if env["omp_optim"]    == "-DEFAULT_4": env
222  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
223  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
224    
225    #set up the autolazy values
226    if env['forcelazy']    != "leave_alone":
227      if env['forcelazy'] == 'on':
228        env.Append(CPPDEFINES='FAUTOLAZYON')
229      else:
230         if env['forcelazy'] == 'off':
231        env.Append(CPPDEFINES='FAUTOLAZYOFF')
232    
233  # 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
234  if not env["useopenmp"]:  if not env["useopenmp"]:
235    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 190  if env['omp_optim'] == "" and env['omp_d Line 243  if env['omp_optim'] == "" and env['omp_d
243  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
244  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
245    
246    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
247    except KeyError: pass
248    
249    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
250    except KeyError: pass
251    
252    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
253    except KeyError: pass
254    
255    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
256    except KeyError: pass
257    
258  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
259  except KeyError: pass  except KeyError: pass
260    
# Line 221  except KeyError: pass Line 286  except KeyError: pass
286  env.PrependENVPath('PYTHONPATH', prefix)  env.PrependENVPath('PYTHONPATH', prefix)
287  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
288    
289    env['ENV']['ESCRIPT_ROOT'] = prefix
290    
291  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
292    
293  # Make a copy of an environment  # Make a copy of an environment
# Line 233  def clone_env(env): Line 300  def clone_env(env):
300  env.Append(CPPPATH      = [Dir('include')])  env.Append(CPPPATH      = [Dir('include')])
301    
302  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
303  env.Append(LIBPATH      = [Dir('lib')])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
   
 env.Append(CPPDEFINES = ['ESCRIPT_EXPORTS', 'FINLEY_EXPORTS'])  
304    
305  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])
306    if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
307    
308  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
309    
310  # MS Windows  # MS Windows
311  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
312    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
313    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
314      if not env['share_esysUtils'] :
315        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
316      if not env['share_paso'] :
317        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
318    
319    if env['usenetcdf']:    if env['usenetcdf']:
320      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
321    
322  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
323    
# Line 275  conf = Configure(clone_env(env)) Line 346  conf = Configure(clone_env(env))
346    
347  # Test that the compiler is working  # Test that the compiler is working
348  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
349    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
350    sys.exit(1)     sys.exit(1)
351    
352  if not conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
353    env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
354    
355  ############ python libraries (required) #######################  ############ python libraries (required) #######################
356    
357  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
358    if not sysheaderopt =="":
359      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
360    else:
361      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
362    
363  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
364  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
365    
366    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs
367    conf.env.PrependENVPath('PYTHONPATH', prefix)
368    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
369    
370  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
371    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'])
372    sys.exit(1)    sys.exit(1)
373  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
374    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'])
375    sys.exit(1)    sys.exit(1)
376    
377  ############ boost (required) ##################################  ############ boost (required) ##################################
378    
379  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
380    # This is required because we can't -isystem /usr/system because it breaks std includes
381      if os.path.normpath(env['boost_path']) =="/usr/include":
382        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
383      else:
384        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
385    else:
386      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
387    
388  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
389  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
390    
391    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs
392    #ensure that our path entries remain at the front
393    conf.env.PrependENVPath('PYTHONPATH', prefix)
394    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
395    
396  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
397    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])    print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
398    sys.exit(1)    sys.exit(1)
399    
400  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
401    print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])    print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])
402    sys.exit(1)    sys.exit(1)
# Line 331  if env['usenetcdf']: Line 425  if env['usenetcdf']:
425    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
426    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
427    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
428      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs
429      #ensure that our path entries remain at the front
430      conf.env.PrependENVPath('PYTHONPATH', prefix)
431      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
432    
433  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
434  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 351  if env['usepapi']: Line 449  if env['usepapi']:
449    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
450    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
451    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
452      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs
453      #ensure that our path entries remain at the front
454      conf.env.PrependENVPath('PYTHONPATH', prefix)
455      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
456    
457  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
458  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 371  if env['usemkl']: Line 473  if env['usemkl']:
473    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
474    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
475    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
476      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs
477      #ensure that our path entries remain at the front
478      conf.env.PrependENVPath('PYTHONPATH', prefix)
479      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
480    
481  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
482  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
483    
484  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
485  if env['usemkl']:  if env['usemkl']:
# Line 398  if env['useumfpack']: Line 504  if env['useumfpack']:
504    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
505    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
506    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
507      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs
508      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs
509      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs
510      #ensure that our path entries remain at the front
511      conf.env.PrependENVPath('PYTHONPATH', prefix)
512      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
513    
 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  
514  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
515    if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
516    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
517    
518  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
519  if env['useumfpack']:  if env['useumfpack']:
# Line 409  if env['useumfpack']: Line 522  if env['useumfpack']:
522  else:  else:
523    conf.Finish()    conf.Finish()
524    
525    ############ Silo (optional) ###################################
526    
527    if env['usesilo']:
528      conf = Configure(clone_env(env))
529      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
530      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
531      conf.env.AppendUnique(LIBS = [env['silo_libs']])
532      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
533      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
534      conf.Finish()
535    
536    # Add the path to Silo to environment env if it was found.
537    # Note that we do not add the libs since they are only needed for the
538    # escriptreader library and tools.
539    if env['usesilo']:
540      env.AppendUnique(CPPPATH = [env['silo_path']])
541      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
542      env.Append(CPPDEFINES = ['HAVE_SILO'])
543    
544  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
545    
546  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 423  else: Line 555  else:
555  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
556  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
557    
558    ############ Add some custom builders ##########################
559    
560    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
561    env.Append(BUILDERS = {'PyCompile' : py_builder});
562    
563    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
564    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
565    
566    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
567    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
568    
569  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
570    if not env['usempi']: env['mpi_flavour']='none'
571    
572  # 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)
573  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 432  env_mpi = clone_env(env) Line 576  env_mpi = clone_env(env)
576  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
577    
578  if env_mpi['usempi']:  if env_mpi['usempi']:
579      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
580      if not env_mpi['mpi_flavour'] in VALID_MPIs:
581          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
582    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
583    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
584    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
585      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs
586      #ensure that our path entries remain at the front
587      conf.env.PrependENVPath('PYTHONPATH', prefix)
588      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
589    
590  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
591  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
592    
593  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
594  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 448  else: Line 599  else:
599    
600  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
601    
602    
603  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
604    
605  # Start a new configure environment that reflects what we've already found  # Start a new configure environment that reflects what we've already found
# Line 459  if env_mpi['useparmetis']: Line 611  if env_mpi['useparmetis']:
611    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
612    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
613    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
614      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs
615      #ensure that our path entries remain at the front
616      conf.env.PrependENVPath('PYTHONPATH', prefix)
617      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
618    
619  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
620  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 472  else: Line 628  else:
628    
629  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
630    
631    ############ Now we switch on Warnings as errors ###############
632    
633    #this needs to be done after configuration because the scons test files have warnings in them
634    
635    if ((fatalwarning != "") and (env['usewarnings'])):
636      env.Append(CCFLAGS        = fatalwarning)
637      env_mpi.Append(CCFLAGS        = fatalwarning)
638    
639  ############ Summarize our environment #########################  ############ Summarize our environment #########################
640    
641  print ""  print ""
# Line 487  if env['usemkl']: print "  Using MKL" Line 651  if env['usemkl']: print "  Using MKL"
651  else: print "   Not using MKL"  else: print "   Not using MKL"
652  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
653  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
654    if env['usesilo']: print "  Using Silo"
655    else: print "   Not using Silo"
656  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
657  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
658  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
659  else: print "   Not using MPI"  else: print "   Not using MPI"
660  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
661  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 498  else: print "  Not using PAPI" Line 664  else: print "  Not using PAPI"
664  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
665  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
666  print " Installing in", prefix  print " Installing in", prefix
667    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
668    else: print "   Not treating warnings as errors"
669  print ""  print ""
670    
671  ############ Add some custom builders ##########################  ############ Delete option-dependent files #####################
   
 py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  
 env.Append(BUILDERS = {'PyCompile' : py_builder});  
   
 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
672    
673  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
674  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
675    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
676  ############ Build the desired subdirectories ##################  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
677    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
678  Export(["env", "env_mpi", "clone_env"])  if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
679    
680    
681    ############ Build the subdirectories ##########################
682    
683    from grouptest import *
684    
685    TestGroups=[]
686    
687    Export(
688      ["env",
689       "env_mpi",
690       "clone_env",
691       "IS_WINDOWS_PLATFORM",
692       "TestGroups"
693       ]
694      )
695    
696  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)
697    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
698  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
699  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
700  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
# Line 525  env.SConscript(dirs = ['doc'], build_dir Line 704  env.SConscript(dirs = ['doc'], build_dir
704  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)
705  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)
706  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
707    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
708    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
709    
710    
711  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
712    
713  remember_list = []  remember_list = []
714    
715  if env['usedebug']:  if env['usedebug']:
716    remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Delete('$TARGET'))  
717    
718  if env['usempi']:  if env['usempi']:
719    remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Delete('$TARGET'))  
720    
721  if env['omp_optim'] != '':  if env['useopenmp']:
722    remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))    remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET'))
 else:  
   remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Delete('$TARGET'))  
723    
724  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
725    
726    
727    ############### Record python interpreter version ##############
728    
729    if not IS_WINDOWS_PLATFORM:
730      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
731      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
732    
733    ############## Populate the buildvars file #####################
734    
735    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
736    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
737    
738    # Find the boost version by extracting it from version.hpp
739    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
740    boostversion='unknown'
741    try:
742        for line in boosthpp:
743            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
744            if ver:
745                boostversion=ver.group(1)
746    except StopIteration:
747        pass
748    buildvars.write("boost="+boostversion+"\n")
749    buildvars.write("svn_revision="+str(global_revision)+"\n")
750    out="usedebug="
751    if env['usedebug']:
752        out+="y"
753    else:
754        out+="n"
755    out+="\nusempi="
756    if env['usempi']:
757        out+="y"
758    else:
759        out+="n"
760    out+="\nuseopenmp="
761    if env['useopenmp']:
762        out+="y"
763    else:
764        out+="n"
765    buildvars.write(out+"\n")
766    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
767    
768    buildvars.close()
769    
770    
771  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
772    
773  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 571  build_all_list += ['build_esysUtils'] Line 792  build_all_list += ['build_esysUtils']
792  build_all_list += ['build_paso']  build_all_list += ['build_paso']
793  build_all_list += ['build_escript']  build_all_list += ['build_escript']
794  build_all_list += ['build_finley']  build_all_list += ['build_finley']
795  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
796    if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
797    if env['usesilo']:  build_all_list += ['target_escript2silo']
798  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
799    
800  install_all_list = []  install_all_list = []
# Line 583  install_all_list += ['install_finley'] Line 806  install_all_list += ['install_finley']
806  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
807  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
808  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
809  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
810    if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
811    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
812  install_all_list += ['remember_options']  install_all_list += ['remember_options']
813  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
814    
# Line 596  env.Alias('build_cppunittest', ['target_ Line 821  env.Alias('build_cppunittest', ['target_
821  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
822  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
823  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'])
824    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
825    
826  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
827    
828  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
829    
830    if not IS_WINDOWS_PLATFORM:
831       try:
832        utest=open("utest.sh","w")
833        build_platform=os.name      #Sometimes Mac python says it is posix
834        if (build_platform=='posix') and platform.system()=="Darwin":
835            build_platform='darwin'
836        utest.write(GroupTest.makeHeader(build_platform))
837        for tests in TestGroups:
838            utest.write(tests.makeString())
839        utest.close()
840        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
841        print "utest.sh written"
842       except IOError:
843        print "Error attempting to write unittests file."
844        sys.exit(1)
845    

Legend:
Removed from v.1705  
changed lines
  Added in v.2366

  ViewVC Help
Powered by ViewVC 1.1.26