/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 1708 by ksteube, Thu Aug 14 22:42:24 2008 UTC revision 2387 by jfenwick, Wed Apr 15 05:05:27 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  else: print "Options file is", options_file    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 42  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 49  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 57  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 83  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 105  opts.AddOptions( Line 121  opts.AddOptions(
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 112  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 121  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 142  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 169  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 178  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 191  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 222  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 234  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 276  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 332  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 352  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 372  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 399  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 410  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 424  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    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
570    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
571    
572  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
573    if not env['usempi']: env['mpi_flavour']='none'
574    
575  # 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)
576  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 433  env_mpi = clone_env(env) Line 579  env_mpi = clone_env(env)
579  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
580    
581  if env_mpi['usempi']:  if env_mpi['usempi']:
582      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
583      if not env_mpi['mpi_flavour'] in VALID_MPIs:
584          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
585    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
586    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
587    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
588      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs
589      #ensure that our path entries remain at the front
590      conf.env.PrependENVPath('PYTHONPATH', prefix)
591      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
592    
593  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
594  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
595    
596  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
597  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 449  else: Line 602  else:
602    
603  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
604    
605    
606  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
607    
608  # 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 460  if env_mpi['useparmetis']: Line 614  if env_mpi['useparmetis']:
614    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
615    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
616    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
617      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs
618      #ensure that our path entries remain at the front
619      conf.env.PrependENVPath('PYTHONPATH', prefix)
620      conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])
621    
622  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
623  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 473  else: Line 631  else:
631    
632  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
633    
634    ############ Now we switch on Warnings as errors ###############
635    
636    #this needs to be done after configuration because the scons test files have warnings in them
637    
638    if ((fatalwarning != "") and (env['usewarnings'])):
639      env.Append(CCFLAGS        = fatalwarning)
640      env_mpi.Append(CCFLAGS        = fatalwarning)
641    
642  ############ Summarize our environment #########################  ############ Summarize our environment #########################
643    
644  print ""  print ""
# Line 488  if env['usemkl']: print "  Using MKL" Line 654  if env['usemkl']: print "  Using MKL"
654  else: print "   Not using MKL"  else: print "   Not using MKL"
655  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
656  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
657    if env['usesilo']: print "  Using Silo"
658    else: print "   Not using Silo"
659  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
660  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
661  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
662  else: print "   Not using MPI"  else: print "   Not using MPI"
663  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
664  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 499  else: print "  Not using PAPI" Line 667  else: print "  Not using PAPI"
667  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
668  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
669  print " Installing in", prefix  print " Installing in", prefix
670    if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"
671    else: print "   Not treating warnings as errors"
672  print ""  print ""
673    
674  ############ 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});  
675    
676  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")))
677  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
678    Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
679  ############ Build the desired subdirectories ##################  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
680    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
681  Export(["env", "env_mpi", "clone_env"])  if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
682    
683    
684    ############ Build the subdirectories ##########################
685    
686    from grouptest import *
687    
688    TestGroups=[]
689    
690    Export(
691      ["env",
692       "env_mpi",
693       "clone_env",
694       "IS_WINDOWS_PLATFORM",
695       "TestGroups"
696       ]
697      )
698    
699  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)
700    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
701  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
702  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
703  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 526  env.SConscript(dirs = ['doc'], build_dir Line 707  env.SConscript(dirs = ['doc'], build_dir
707  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)
708  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)
709  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
710    env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
711    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
712    
713    
714  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
715    
716  remember_list = []  remember_list = []
717    
718  if env['usedebug']:  if env['usedebug']:
719    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'))  
720    
721  if env['usempi']:  if env['usempi']:
722    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'))  
723    
724  if env['omp_optim'] != '':  if env['useopenmp']:
725    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'))  
726    
727  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
728    
729    
730    ############### Record python interpreter version ##############
731    
732    if not IS_WINDOWS_PLATFORM:
733      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
734      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
735    
736    ############## Populate the buildvars file #####################
737    
738    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
739    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
740    
741    # Find the boost version by extracting it from version.hpp
742    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
743    boostversion='unknown'
744    try:
745        for line in boosthpp:
746            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
747            if ver:
748                boostversion=ver.group(1)
749    except StopIteration:
750        pass
751    buildvars.write("boost="+boostversion+"\n")
752    buildvars.write("svn_revision="+str(global_revision)+"\n")
753    out="usedebug="
754    if env['usedebug']:
755        out+="y"
756    else:
757        out+="n"
758    out+="\nusempi="
759    if env['usempi']:
760        out+="y"
761    else:
762        out+="n"
763    out+="\nuseopenmp="
764    if env['useopenmp']:
765        out+="y"
766    else:
767        out+="n"
768    buildvars.write(out+"\n")
769    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
770    
771    buildvars.close()
772    
773    
774  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
775    
776  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 572  build_all_list += ['build_esysUtils'] Line 795  build_all_list += ['build_esysUtils']
795  build_all_list += ['build_paso']  build_all_list += ['build_paso']
796  build_all_list += ['build_escript']  build_all_list += ['build_escript']
797  build_all_list += ['build_finley']  build_all_list += ['build_finley']
798  if env['usempi']: build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
799    if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper']
800    if env['usesilo']:  build_all_list += ['target_escript2silo']
801  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
802    
803  install_all_list = []  install_all_list = []
# Line 584  install_all_list += ['install_finley'] Line 809  install_all_list += ['install_finley']
809  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
810  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
811  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
812  if env['usempi']: install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
813    if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper']
814    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
815  install_all_list += ['remember_options']  install_all_list += ['remember_options']
816  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
817    
# Line 597  env.Alias('build_cppunittest', ['target_ Line 824  env.Alias('build_cppunittest', ['target_
824  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
825  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
826  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'])
827    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
828    
829  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
830    
831  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'])
832    
833    if not IS_WINDOWS_PLATFORM:
834       try:
835        utest=open("utest.sh","w")
836        build_platform=os.name      #Sometimes Mac python says it is posix
837        if (build_platform=='posix') and platform.system()=="Darwin":
838            build_platform='darwin'
839        utest.write(GroupTest.makeHeader(build_platform))
840        for tests in TestGroups:
841            utest.write(tests.makeString())
842        utest.close()
843        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
844        print "utest.sh written"
845       except IOError:
846        print "Error attempting to write unittests file."
847        sys.exit(1)
848    

Legend:
Removed from v.1708  
changed lines
  Added in v.2387

  ViewVC Help
Powered by ViewVC 1.1.26