/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2232 by jfenwick, Fri Jan 30 05:24:02 2009 UTC revision 2430 by jfenwick, Wed May 20 03:20:57 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  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'),
97  # Python  # Python
98    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
99    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 85  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 188  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 220  if env["omp_optim"]    == "-DEFAULT_4": env Line 240  if env["omp_optim"]    == "-DEFAULT_4": env
240  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
241  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
242    
243    #set up the autolazy values
244    if env['forcelazy']    != "leave_alone":
245      if env['forcelazy'] == 'on':
246        env.Append(CPPDEFINES='FAUTOLAZYON')
247      else:
248         if env['forcelazy'] == 'off':
249        env.Append(CPPDEFINES='FAUTOLAZYOFF')
250    
251  # 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
252  if not env["useopenmp"]:  if not env["useopenmp"]:
253    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 228  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 245  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 261  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 287  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 324  conf = Configure(clone_env(env)) Line 371  conf = Configure(clone_env(env))
371    
372  # Test that the compiler is working  # Test that the compiler is working
373  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
374    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
375    sys.exit(1)     sys.exit(1)
376    
377  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
378    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
# Line 341  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'])
397    sys.exit(1)    sys.exit(1)
398  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
399    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'])
400    sys.exit(1)    sys.exit(1)
401    
402  ############ boost (required) ##################################  ############ boost (required) ##################################
403    
404  if not sysheaderopt =="":  if not sysheaderopt =="":
405    conf.env.Append(CCFLAGS=sysheaderopt+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'])
423    sys.exit(1)    sys.exit(1)
424    
425  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
426    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'])
427    sys.exit(1)    sys.exit(1)
# Line 393  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 414  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 435  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 463  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    
 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  
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.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
541    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
542    
543  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
544  if env['useumfpack']:  if env['useumfpack']:
# Line 511  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 523  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 532  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 549  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 560  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 601  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 616  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 ##########################
710    
711    from grouptest import *
712    
713    TestGroups=[]
714    
715  Export(  Export(
716    ["env",    ["env",
717     "env_mpi",     "env_mpi",
718     "clone_env",     "clone_env",
719     "IS_WINDOWS_PLATFORM"     "IS_WINDOWS_PLATFORM",
720       "TestGroups"
721     ]     ]
722    )    )
723    
# Line 646  env.SConscript(dirs = ['pythonMPI/src'], Line 735  env.SConscript(dirs = ['pythonMPI/src'],
735  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
736  env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)  env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
737    
738    
739  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
740    
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 686  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 700  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 714  env.Alias('build_cppunittest', ['target_ Line 849  env.Alias('build_cppunittest', ['target_
849  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
850  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
851  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'])
852    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
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:
859       try:
860        utest=open("utest.sh","w")
861        build_platform=os.name      #Sometimes Mac python says it is posix
862        if (build_platform=='posix') and platform.system()=="Darwin":
863            build_platform='darwin'
864        utest.write(GroupTest.makeHeader(build_platform))
865        for tests in TestGroups:
866            utest.write(tests.makeString())
867        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"
870       except IOError:
871        print "Error attempting to write unittests file."
872        sys.exit(1)
873    

Legend:
Removed from v.2232  
changed lines
  Added in v.2430

  ViewVC Help
Powered by ViewVC 1.1.26