/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2286 by jfenwick, Mon Feb 23 02:50:06 2009 UTC revision 2455 by jfenwick, Wed Jun 3 03:29:07 2009 UTC
# 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, platform  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 33  IS_WINDOWS_PLATFORM = (os.name== "nt") Line 33  IS_WINDOWS_PLATFORM = (os.name== "nt")
33    
34  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)
35    
36  # Read configuration options from file scons/<hostname>_options.py  #Determine where to read options from use:
37  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])  #1. command line
38  tmp = os.path.join("scons",hostname+"_options.py")  #2. scons/<hostname>_options.py
39  options_file = ARGUMENTS.get('options_file', tmp)  #3. name as part of a cluster
40    options_file=ARGUMENTS.get('options_file', None)
41    if not options_file:
42      hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])
43      options_file = os.path.join("scons",hostname+"_options.py")
44      #If there is no options file with that name see if there is a substitute
45      if not os.path.isfile(options_file):
46        tmp = scons_extensions.effectiveName(hostname)
47        options_file = os.path.join("scons",tmp+"_options.py")
48    
49  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
50      print "Options file not found (expected '%s')" % options_file
51    options_file = False    options_file = False
   print "Options file not found (expected '%s')" % tmp  
52  else:  else:
53    print "Options file is", options_file    print "Options file is", options_file
54    
55  # Load options file and command-line arguments  #Does our scons support the newer Variables class or do we need to use Options?
56  opts = Options(options_file, ARGUMENTS)  
57    try:
58       dummyvar=Variables
59       opts = Variables(options_file, ARGUMENTS)
60       adder = opts.AddVariables
61    except:
62       opts = Options(options_file, ARGUMENTS)
63       adder = opts.AddOptions
64       BoolVariable = BoolOption
65    
66  ############ Load build options ################################  ############ Load build options ################################
67    
68  opts.AddOptions(  adder(
69    #opts.AddOptions(
70  # Where to install esys stuff  # Where to install esys stuff
71    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
72    ('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 74  opts.AddOptions(
74    ('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')),
75    ('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')),
76  # Compilation options  # Compilation options
77    BoolOption('dodebug', 'For backwards compatibility', 'no'),    BoolVariable('dodebug', 'For backwards compatibility', 'no'),
78    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolVariable('usedebug', 'Do you want a debug build?', 'no'),
79    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolVariable('usevtk', 'Do you want to use VTK?', 'yes'),
80    ('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),
81    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
82    # 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 90  opts.AddOptions(
90    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
91    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
92    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
93    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
94    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
95    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
96    ('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'),
97  # Python  # Python
98    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
# Line 86  opts.AddOptions( Line 104  opts.AddOptions(
104    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
105    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
106  # NetCDF  # NetCDF
107    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
108    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
109    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
110    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
111  # MPI  # MPI
112    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
113    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
114    ('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'),
115    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
116    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
117    ('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),
118    ('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']),
119      ('mpi_flavour','Type of MPI execution environment','none'),
120  # ParMETIS  # ParMETIS
121    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
122    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
123    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
124    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
125  # PAPI  # PAPI
126    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
127    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
128    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
129    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
130    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),
131  # MKL  # MKL
132    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
133    ('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'),
134    ('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'),
135    ('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']),
136  # UMFPACK  # UMFPACK
137    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
138    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
139    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
140    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
141    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
142  # Silo  # Silo
143    BoolOption('usesilo', 'switch on/off the usage of Silo', 'yes'),    BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
144    ('silo_path', 'Path to Silo includes', '/usr/include'),    ('silo_path', 'Path to Silo includes', '/usr/include'),
145    ('silo_lib_path', 'Path to Silo libs', usr_lib),    ('silo_lib_path', 'Path to Silo libs', usr_lib),
146    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
# Line 189  elif env["CC"] == "gcc": Line 208  elif env["CC"] == "gcc":
208  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
209    cc_optim      = "-O3"    cc_optim      = "-O3"
210    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
211    omp_optim     = ""    omp_optim     = "-fopenmp"
212    omp_debug     = ""    omp_debug     = "-fopenmp"
213    omp_libs      = []    omp_libs      = ['gomp']
214    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
215    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
216    sysheaderopt      = "-isystem "    sysheaderopt      = "-isystem "
# Line 237  if not env["useopenmp"]: Line 256  if not env["useopenmp"]:
256    
257  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
258    
259    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
260    if IS_WINDOWS_PLATFORM:
261        LD_LIBRARY_PATH_KEY='PATH'
262        env['ENV']['LD_LIBRARY_PATH']=''
263    else:
264        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
265  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
266    
267  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
268  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
269    
270    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
271    except KeyError: pass
272    
273    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
274    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
275    
276    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
277    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
278    
279    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
280    except KeyError: pass
281    
282  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
283  except KeyError: pass  except KeyError: pass
284    
# Line 254  except KeyError: pass Line 291  except KeyError: pass
291  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
292  except KeyError: pass  except KeyError: pass
293    
294  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
295  except KeyError: pass  except KeyError: pass
296    
297  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 307  try: env['ENV']['HOME'] = os.environ['HO
307  except KeyError: pass  except KeyError: pass
308    
309  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
310    
311    
312    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
313    env.PrependENVPath('PYTHONPATH', prefix)
314  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
315    
316  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 296  if env['usepedantic']: env.Append(CCFLAG Line 334  if env['usepedantic']: env.Append(CCFLAG
334    
335  # MS Windows  # MS Windows
336  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
337    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
338    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
339    if not env['share_esysUtils'] :    if not env['share_esysUtils'] :
340      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
341    if not env['share_paso'] :    if not env['share_paso'] :
342      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
343    
344    if env['usenetcdf']:    if env['usenetcdf']:
345      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
346    
347  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
348    
# Line 318  except: Line 356  except:
356  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
357  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
358    
359  ############ numarray (required) ###############################  ############ numpy (required) ###############################
360    
361  try:  try:
362    from numarray import identity    from numpy import identity
363  except ImportError:  except ImportError:
364    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
365    sys.exit(1)    sys.exit(1)
366    
367  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 350  else: Line 388  else:
388  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
389  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
390    
391  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
392    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
393    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
394    
395  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
396    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'])
# Line 362  if not conf.CheckFunc('Py_Exit'): Line 402  if not conf.CheckFunc('Py_Exit'):
402  ############ boost (required) ##################################  ############ boost (required) ##################################
403    
404  if not sysheaderopt =="":  if not sysheaderopt =="":
405    conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))  # This is required because we can't -isystem /usr/system because it breaks std includes
406      if os.path.normpath(env['boost_path']) =="/usr/include":
407        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
408      else:
409        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
410  else:  else:
411    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])    conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
412    
413  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
414  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
415    
416  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
417    #ensure that our path entries remain at the front
418    conf.env.PrependENVPath('PYTHONPATH', prefix)
419    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
420    
421  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
422    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'])
# Line 403  if env['usenetcdf']: Line 450  if env['usenetcdf']:
450    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
451    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
452    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
453    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
454      #ensure that our path entries remain at the front
455      conf.env.PrependENVPath('PYTHONPATH', prefix)
456      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
457    
458  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
459  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 424  if env['usepapi']: Line 474  if env['usepapi']:
474    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
475    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
476    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
477    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
478      #ensure that our path entries remain at the front
479      conf.env.PrependENVPath('PYTHONPATH', prefix)
480      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
481    
482  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
483  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 445  if env['usemkl']: Line 498  if env['usemkl']:
498    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
499    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
500    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
501    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
502      #ensure that our path entries remain at the front
503      conf.env.PrependENVPath('PYTHONPATH', prefix)
504      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
505    
506  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
507  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
508    
509  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
510  if env['usemkl']:  if env['usemkl']:
# Line 473  if env['useumfpack']: Line 529  if env['useumfpack']:
529    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
530    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
531    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
532    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
533    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
534    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
535      #ensure that our path entries remain at the front
536      conf.env.PrependENVPath('PYTHONPATH', prefix)
537      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
538    
539  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
540  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
# Line 521  else: Line 580  else:
580  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
581  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
582    
   
583  ############ Add some custom builders ##########################  ############ Add some custom builders ##########################
584    
585  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 533  env.Append(BUILDERS = {'RunUnitTest' : r Line 591  env.Append(BUILDERS = {'RunUnitTest' : r
591  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)
592  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
593    
594    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
595    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
596    
597  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
598    if not env['usempi']: env['mpi_flavour']='none'
599    
600  # 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)
601  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 542  env_mpi = clone_env(env) Line 604  env_mpi = clone_env(env)
604  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
605    
606  if env_mpi['usempi']:  if env_mpi['usempi']:
607      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
608      if not env_mpi['mpi_flavour'] in VALID_MPIs:
609          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
610    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
611    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
612    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
613    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
614      #ensure that our path entries remain at the front
615      conf.env.PrependENVPath('PYTHONPATH', prefix)
616      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
617    
618  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
619  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
620    
621  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
622  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 559  else: Line 627  else:
627    
628  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
629    
630    
631  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
632    
633  # 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 570  if env_mpi['useparmetis']: Line 639  if env_mpi['useparmetis']:
639    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
640    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
641    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
642    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
643      #ensure that our path entries remain at the front
644      conf.env.PrependENVPath('PYTHONPATH', prefix)
645      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
646    
647  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
648  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 611  if env['usesilo']: print " Using Silo" Line 683  if env['usesilo']: print " Using Silo"
683  else: print "   Not using Silo"  else: print "   Not using Silo"
684  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
685  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
686  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
687  else: print "   Not using MPI"  else: print "   Not using MPI"
688  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
689  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 626  print "" Line 698  print ""
698    
699  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
700    
701  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
702  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
703  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
704  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
705    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
706    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
707    
708    
709  ############ Build the subdirectories ##########################  ############ Build the subdirectories ##########################
# Line 667  env.SConscript(dirs = ['paso/profiling'] Line 741  env.SConscript(dirs = ['paso/profiling']
741  remember_list = []  remember_list = []
742    
743  if env['usedebug']:  if env['usedebug']:
744    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'))
745    
746  if env['usempi']:  if env['usempi']:
747    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'))
748    
749  if env['omp_optim'] != '':  if env['useopenmp']:
750    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'))
751    
752  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
753    
754    
755    ############### Record python interpreter version ##############
756    
757    if not IS_WINDOWS_PLATFORM:
758      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
759      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
760    
761    ############## Populate the buildvars file #####################
762    
763    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
764    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
765    
766    # Find the boost version by extracting it from version.hpp
767    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
768    boostversion='unknown'
769    try:
770        for line in boosthpp:
771            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
772            if ver:
773                boostversion=ver.group(1)
774    except StopIteration:
775        pass
776    buildvars.write("boost="+boostversion+"\n")
777    buildvars.write("svn_revision="+str(global_revision)+"\n")
778    out="usedebug="
779    if env['usedebug']:
780        out+="y"
781    else:
782        out+="n"
783    out+="\nusempi="
784    if env['usempi']:
785        out+="y"
786    else:
787        out+="n"
788    out+="\nuseopenmp="
789    if env['useopenmp']:
790        out+="y"
791    else:
792        out+="n"
793    buildvars.write(out+"\n")
794    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
795    
796    buildvars.close()
797    
798    
799  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
800    
801  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 702  build_all_list += ['build_paso'] Line 821  build_all_list += ['build_paso']
821  build_all_list += ['build_escript']  build_all_list += ['build_escript']
822  build_all_list += ['build_finley']  build_all_list += ['build_finley']
823  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
824  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
825  if env['usesilo']:  build_all_list += ['target_escript2silo']  if env['usesilo']:  build_all_list += ['target_escript2silo']
826  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
827    
# Line 716  install_all_list += ['target_install_pyv Line 835  install_all_list += ['target_install_pyv
835  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
836  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
837  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
838  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
839  if env['usesilo']:  install_all_list += ['target_install_escript2silo']  if env['usesilo']:  install_all_list += ['target_install_escript2silo']
840  install_all_list += ['remember_options']  install_all_list += ['remember_options']
841  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
# Line 734  env.Alias('build_full',['install_all','b Line 853  env.Alias('build_full',['install_all','b
853    
854  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
855    
856  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'])
857    
858  if not IS_WINDOWS_PLATFORM:  if not IS_WINDOWS_PLATFORM:
859     try:     try:
# Line 746  if not IS_WINDOWS_PLATFORM: Line 865  if not IS_WINDOWS_PLATFORM:
865      for tests in TestGroups:      for tests in TestGroups:
866          utest.write(tests.makeString())          utest.write(tests.makeString())
867      utest.close()      utest.close()
868        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
869      print "utest.sh written"      print "utest.sh written"
870     except IOError:     except IOError:
871      print "Error attempting to write unittests file."      print "Error attempting to write unittests file."

Legend:
Removed from v.2286  
changed lines
  Added in v.2455

  ViewVC Help
Powered by ViewVC 1.1.26