/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2273 by jfenwick, Tue Feb 17 01:22:48 2009 UTC revision 2742 by jfenwick, Thu Nov 12 06:03:37 2009 UTC
# Line 1  Line 1 
1    
2  ########################################################  ########################################################
3  #  #
4  # Copyright (c) 2003-2008 by University of Queensland  # Copyright (c) 2003-2009 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 (expected '%s')" % tmp  
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    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
90    # 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
# Line 72  opts.AddOptions( Line 98  opts.AddOptions(
98    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
99    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
100    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
101    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
102    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
103    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
104    ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),    ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
105      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
106  # Python  # Python
107    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
108    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 86  opts.AddOptions( Line 113  opts.AddOptions(
113    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
114    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
115  # NetCDF  # NetCDF
116    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
117    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
118    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
119    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
120  # MPI  # MPI
121    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
122    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
123    ('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'),
124    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
125    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
126    ('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),
127    ('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!)', []),
128      ('mpi_flavour','Type of MPI execution environment','none'),
129  # ParMETIS  # ParMETIS
130    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
131    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
132    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
133    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
134  # PAPI  # PAPI
135    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
136    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
137    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
138    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
139    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),
140  # MKL  # MKL
141    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
142    ('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'),
143    ('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'),
144    ('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']),
145  # UMFPACK  # UMFPACK
146    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
147    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
148    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
149    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
150    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
151  # Silo  # Silo
152    BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),    BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
153    ('silo_path', 'Path to Silo includes', '/usr/include'),    ('silo_path', 'Path to Silo includes', '/usr/include'),
154    ('silo_lib_path', 'Path to Silo libs', usr_lib),    ('silo_lib_path', 'Path to Silo libs', usr_lib),
155    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
# Line 133  opts.AddOptions( Line 161  opts.AddOptions(
161    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
162    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
163    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
164    #Lapack options
165      BoolVariable('uselapack','switch on/off use of Lapack','no'),
166      ('lapack_path', 'Path to Lapack includes','/usr/include'),
167      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
168      ('lapack_libs', 'Lapack libraries to link with', []),
169      ('lapack_type', '{clapack,mkl}','clapack'),
170  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
171    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
172  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
173  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
174    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
175    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
176      ('env_export','Environment variables to be passed to children',[])
177  )  )
178    
179    
180    
181  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
182    
183  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 151  if IS_WINDOWS_PLATFORM: Line 188  if IS_WINDOWS_PLATFORM:
188        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
189                          options = opts)                          options = opts)
190  else:  else:
191     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
192        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
193     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
194        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 161  else: Line 198  else:
198        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
199  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
200    
201    
202    ############ Make sure target directories exist ################
203    
204    if not os.path.isdir(env['bininstall']):
205        os.makedirs(env['bininstall'])
206    if not os.path.isdir(env['libinstall']):
207        os.makedirs(env['libinstall'])
208    if not os.path.isdir(env['pyinstall']):
209        os.makedirs(env['pyinstall'])
210    
211    ########## Copy required environment vars ######################
212    
213    for i in env['env_export']:
214       env.Append(ENV = {i:os.environ[i]})
215    
216  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
217    
218  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 189  elif env["CC"] == "gcc": Line 241  elif env["CC"] == "gcc":
241  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
242    cc_optim      = "-O3"    cc_optim      = "-O3"
243    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
244    omp_optim     = ""    omp_optim     = "-fopenmp"
245    omp_debug     = ""    omp_debug     = "-fopenmp"
246    omp_libs      = []    omp_libs      = []
247    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
248    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
# Line 224  if env["omp_libs"] == "-DEFAULT_6": env[ Line 276  if env["omp_libs"] == "-DEFAULT_6": env[
276  #set up the autolazy values  #set up the autolazy values
277  if env['forcelazy']    != "leave_alone":  if env['forcelazy']    != "leave_alone":
278    if env['forcelazy'] == 'on':    if env['forcelazy'] == 'on':
279      env.Append(CPPDEFINES='FAUTOLAZYON')      env.Append(CPPDEFINES=['FAUTOLAZYON'])
280    else:    else:
281       if env['forcelazy'] == 'off':       if env['forcelazy'] == 'off':
282      env.Append(CPPDEFINES='FAUTOLAZYOFF')      env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
283    
284    #set up the colective resolve values
285    if env['forcecollres']    != "leave_alone":
286      print env['forcecollres']
287      if env['forcecollres'] == 'on':
288        env.Append(CPPDEFINES=['FRESCOLLECTON'])
289      else:
290         if env['forcecollres'] == 'off':
291        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
292    
293    
294  # 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
295  if not env["useopenmp"]:  if not env["useopenmp"]:
# Line 237  if not env["useopenmp"]: Line 299  if not env["useopenmp"]:
299    
300  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
301    
302    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
303    if IS_WINDOWS_PLATFORM:
304        LD_LIBRARY_PATH_KEY='PATH'
305        env['ENV']['LD_LIBRARY_PATH']=''
306    else:
307        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
308  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
309    
310  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
311  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
312    
313    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
314    except KeyError: pass
315    
316    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
317    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
318    
319    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
320    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
321    
322    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
323    except KeyError: pass
324    
325  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
326  except KeyError: pass  except KeyError: pass
327    
# Line 254  except KeyError: pass Line 334  except KeyError: pass
334  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
335  except KeyError: pass  except KeyError: pass
336    
337  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
338  except KeyError: pass  except KeyError: pass
339    
340  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 270  try: env['ENV']['HOME'] = os.environ['HO Line 350  try: env['ENV']['HOME'] = os.environ['HO
350  except KeyError: pass  except KeyError: pass
351    
352  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
353    
354    
355    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
356    env.PrependENVPath('PYTHONPATH', prefix)
357  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
358    
359  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 296  if env['usepedantic']: env.Append(CCFLAG Line 377  if env['usepedantic']: env.Append(CCFLAG
377    
378  # MS Windows  # MS Windows
379  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
380    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
381    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
382    if not env['share_esysUtils'] :    if not env['share_esysUtils'] :
383      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
384    if not env['share_paso'] :    if not env['share_paso'] :
385      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
386    
387    if env['usenetcdf']:    if env['usenetcdf']:
388      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
389    
390  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
391    
# Line 318  except: Line 399  except:
399  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
400  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
401    
402  ############ numarray (required) ###############################  ############ numpy (required) ###############################
403    
404  try:  try:
405    from numarray import identity    from numpy import identity
406  except ImportError:  except ImportError:
407    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
408    sys.exit(1)    sys.exit(1)
409    
410  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 333  conf = Configure(clone_env(env)) Line 414  conf = Configure(clone_env(env))
414    
415  # Test that the compiler is working  # Test that the compiler is working
416  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
417    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
418    sys.exit(1)     sys.exit(1)
419    
420  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
421    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
# Line 350  else: Line 431  else:
431  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
432  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
433    
434  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
435    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
436    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
437    
438  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
439    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'])
440    sys.exit(1)    sys.exit(1)
441  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
442    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'])
443    sys.exit(1)    sys.exit(1)
444    
445  ############ boost (required) ##################################  ############ boost (required) ##################################
446    
447  if not sysheaderopt =="":  if not sysheaderopt =="":
448    conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path']+'boost')  # This is required because we can't -isystem /usr/system because it breaks std includes
449      if os.path.normpath(env['boost_path']) =="/usr/include":
450        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
451      else:
452        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
453  else:  else:
454    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
455    
456  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
457  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
458    
459  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
460    #ensure that our path entries remain at the front
461    conf.env.PrependENVPath('PYTHONPATH', prefix)
462    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
463    
464  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
465    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'])
466    sys.exit(1)    sys.exit(1)
467    
468  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
469    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'])
470    sys.exit(1)    sys.exit(1)
# Line 402  if env['usenetcdf']: Line 493  if env['usenetcdf']:
493    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
494    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
495    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
496    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
497      #ensure that our path entries remain at the front
498      conf.env.PrependENVPath('PYTHONPATH', prefix)
499      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
500    
501  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
502  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 423  if env['usepapi']: Line 517  if env['usepapi']:
517    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
518    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
519    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
520    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
521      #ensure that our path entries remain at the front
522      conf.env.PrependENVPath('PYTHONPATH', prefix)
523      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
524    
525  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
526  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 444  if env['usemkl']: Line 541  if env['usemkl']:
541    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
542    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
543    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
544    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
545      #ensure that our path entries remain at the front
546      conf.env.PrependENVPath('PYTHONPATH', prefix)
547      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
548    
549  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0
550  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
551    
552  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
553  if env['usemkl']:  if env['usemkl']:
# Line 472  if env['useumfpack']: Line 572  if env['useumfpack']:
572    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
573    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
574    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
575    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
576    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
577    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
578      #ensure that our path entries remain at the front
579      conf.env.PrependENVPath('PYTHONPATH', prefix)
580      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
581    
582  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
583  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
584  if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?  # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
585    
586  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
587  if env['useumfpack']:  if env['useumfpack']:
# Line 506  if env['usesilo']: Line 609  if env['usesilo']:
609    env.AppendUnique(LIBPATH = [env['silo_lib_path']])    env.AppendUnique(LIBPATH = [env['silo_lib_path']])
610    env.Append(CPPDEFINES = ['HAVE_SILO'])    env.Append(CPPDEFINES = ['HAVE_SILO'])
611    
612    ########### Lapack (optional) ##################################
613    
614    
615    if env['uselapack']:
616        env.AppendUnique(CPPDEFINES='USE_LAPACK')
617        env.AppendUnique(CPPPATH = [env['lapack_path']])
618        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
619    
620        env.Append(LIBPATH = '/usr/lib/atlas')
621        env.Append(LIBS = [env['lapack_libs']])
622        if env['lapack_type']=='mkl':
623           env.AppendUnique(CPPDEFINES='MKL_LAPACK')
624    
625  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
626    
627  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 520  else: Line 636  else:
636  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
637  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
638    
   
639  ############ Add some custom builders ##########################  ############ Add some custom builders ##########################
640    
641  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
# Line 532  env.Append(BUILDERS = {'RunUnitTest' : r Line 647  env.Append(BUILDERS = {'RunUnitTest' : r
647  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
648  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
649    
650    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
651    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
652    
653  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
654    if not env['usempi']: env['mpi_flavour']='none'
655    
656  # 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)
657  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 541  env_mpi = clone_env(env) Line 660  env_mpi = clone_env(env)
660  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
661    
662  if env_mpi['usempi']:  if env_mpi['usempi']:
663      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
664      if not env_mpi['mpi_flavour'] in VALID_MPIs:
665          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
666    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
667    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
668    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
669    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
670      #ensure that our path entries remain at the front
671      conf.env.PrependENVPath('PYTHONPATH', prefix)
672      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
673    
674  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
675  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
676    
677  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
678  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 558  else: Line 683  else:
683    
684  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
685    
686    
687  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
688    
689  # 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 569  if env_mpi['useparmetis']: Line 695  if env_mpi['useparmetis']:
695    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
696    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
697    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
698    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
699      #ensure that our path entries remain at the front
700      conf.env.PrependENVPath('PYTHONPATH', prefix)
701      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
702    
703  if env_mpi['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
704  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 596  if ((fatalwarning != "") and (env['usewa Line 725  if ((fatalwarning != "") and (env['usewa
725  print ""  print ""
726  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
727  print " Using python libraries"  print " Using python libraries"
728  print " Using numarray"  print " Using numpy"
729  print " Using boost"  print " Using boost"
730  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
731  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 610  if env['usesilo']: print " Using Silo" Line 739  if env['usesilo']: print " Using Silo"
739  else: print "   Not using Silo"  else: print "   Not using Silo"
740  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
741  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
742  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
743  else: print "   Not using MPI"  else: print "   Not using MPI"
744  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
745  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 625  print "" Line 754  print ""
754    
755  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
756    
757  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
758  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
759  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
760  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
761    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
762    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
763    
764    
765  ############ Build the subdirectories ##########################  ############ Build the subdirectories ##########################
# Line 666  env.SConscript(dirs = ['paso/profiling'] Line 797  env.SConscript(dirs = ['paso/profiling']
797  remember_list = []  remember_list = []
798    
799  if env['usedebug']:  if env['usedebug']:
800    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'))
801    
802  if env['usempi']:  if env['usempi']:
803    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'))
804    
805  if env['omp_optim'] != '':  if env['useopenmp']:
806    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'))
807    
808  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
809    
810    
811    ############### Record python interpreter version ##############
812    
813    if not IS_WINDOWS_PLATFORM:
814      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
815      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
816    
817    ############## Populate the buildvars file #####################
818    
819    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
820    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
821    
822    # Find the boost version by extracting it from version.hpp
823    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
824    boostversion='unknown'
825    try:
826        for line in boosthpp:
827            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
828            if ver:
829                boostversion=ver.group(1)
830    except StopIteration:
831        pass
832    buildvars.write("boost="+boostversion+"\n")
833    buildvars.write("svn_revision="+str(global_revision)+"\n")
834    out="usedebug="
835    if env['usedebug']:
836        out+="y"
837    else:
838        out+="n"
839    out+="\nusempi="
840    if env['usempi']:
841        out+="y"
842    else:
843        out+="n"
844    out+="\nuseopenmp="
845    if env['useopenmp']:
846        out+="y"
847    else:
848        out+="n"
849    buildvars.write(out+"\n")
850    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
851    buildvars.write("lapack=")
852    if env['uselapack']:
853       buildvars.write('y')
854    else:
855       buildvars.write('n')
856    buildvars.write('\n')
857    buildvars.close()
858    
859    
860  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
861    
862  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 701  build_all_list += ['build_paso'] Line 882  build_all_list += ['build_paso']
882  build_all_list += ['build_escript']  build_all_list += ['build_escript']
883  build_all_list += ['build_finley']  build_all_list += ['build_finley']
884  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
885  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
886  if env['usesilo']:  build_all_list += ['target_escript2silo']  if env['usesilo']:  build_all_list += ['target_escript2silo']
887  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
888    
# Line 715  install_all_list += ['target_install_pyv Line 896  install_all_list += ['target_install_pyv
896  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
897  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
898  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
899  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
900  if env['usesilo']:  install_all_list += ['target_install_escript2silo']  if env['usesilo']:  install_all_list += ['target_install_escript2silo']
901  install_all_list += ['remember_options']  install_all_list += ['remember_options']
902  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
# Line 729  env.Alias('build_cppunittest', ['target_ Line 910  env.Alias('build_cppunittest', ['target_
910  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
911  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
912  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'])
913    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
914    
915  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
916    
917  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
918    
919    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
920    
921  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
922     try:     try:
923      utest=open("utest.sh","w")      utest=open("utest.sh","w")
924      utest.write(GroupTest.makeHeader())      build_platform=os.name      #Sometimes Mac python says it is posix
925        if (build_platform=='posix') and platform.system()=="Darwin":
926            build_platform='darwin'
927        utest.write(GroupTest.makeHeader(build_platform))
928      for tests in TestGroups:      for tests in TestGroups:
929          utest.write(tests.makeString())          utest.write(tests.makeString())
930      utest.close()      utest.close()
931        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
932      print "utest.sh written"      print "utest.sh written"
933     except IOError:     except IOError:
934      print "Error attempting to write unittests file."      print "Error attempting to write unittests file."
935      sys.exit(1)      sys.exit(1)
936    
937       #Make sure that the escript wrapper is in place
938       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
939           print "Copying escript wrapper"
940           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))

Legend:
Removed from v.2273  
changed lines
  Added in v.2742

  ViewVC Help
Powered by ViewVC 1.1.26