/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2054 by phornby, Mon Nov 17 13:20:41 2008 UTC revision 2604 by jfenwick, Wed Aug 12 01:21:46 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'),
105  # Python  # Python
106    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
107    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 85  opts.AddOptions( Line 112  opts.AddOptions(
112    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
113    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
114  # NetCDF  # NetCDF
115    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
116    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
117    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
118    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
119  # MPI  # MPI
120    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
121    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
122    ('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'),
123    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
124    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
125    ('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),
126    ('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']),
127      ('mpi_flavour','Type of MPI execution environment','none'),
128  # ParMETIS  # ParMETIS
129    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
130    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
131    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
132    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
133  # PAPI  # PAPI
134    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
135    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
136    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
137    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
138    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),
139  # MKL  # MKL
140    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
141    ('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'),
142    ('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'),
143    ('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']),
144  # UMFPACK  # UMFPACK
145    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
146    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
147    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
148    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
149    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
150    # Silo
151      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
152      ('silo_path', 'Path to Silo includes', '/usr/include'),
153      ('silo_lib_path', 'Path to Silo libs', usr_lib),
154      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
155  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
156    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
157    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 132  opts.AddOptions( Line 165  opts.AddOptions(
165  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
166  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
167    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
168    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
169      ('env_export','Environment variables to be passed to children',[])
170  )  )
171    
172    
173    
174  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
175    
176  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 145  if IS_WINDOWS_PLATFORM: Line 181  if IS_WINDOWS_PLATFORM:
181        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
182                          options = opts)                          options = opts)
183  else:  else:
184     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
185        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
186     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
187        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 155  else: Line 191  else:
191        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
192  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
193    
194    
195    ############ Make sure target directories exist ################
196    
197    if not os.path.isdir(env['bininstall']):
198        os.makedirs(env['bininstall'])
199    if not os.path.isdir(env['libinstall']):
200        os.makedirs(env['libinstall'])
201    if not os.path.isdir(env['pyinstall']):
202        os.makedirs(env['pyinstall'])
203    
204    ########## Copy required environment vars ######################
205    
206    for i in env['env_export']:
207       env.Append(ENV = {i:os.environ[i]})
208    
209  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
210    
211  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 164  if env['useMPI']: env['usempi'] = 1 Line 215  if env['useMPI']: env['usempi'] = 1
215  # Default compiler options (override allowed in hostname_options.py, but should not be necessary)  # Default compiler options (override allowed in hostname_options.py, but should not be necessary)
216  # For both C and C++ you get: cc_flags and either the optim flags or debug flags  # For both C and C++ you get: cc_flags and either the optim flags or debug flags
217    
218    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
219    
220  if env["CC"] == "icc":  if env["CC"] == "icc":
221    # Intel compilers    # Intel compilers
222    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
# Line 174  if env["CC"] == "icc": Line 227  if env["CC"] == "icc":
227    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
228    pedantic      = ""    pedantic      = ""
229    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
230      sysheaderopt      = ""
231  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
232    # GNU C on any system    # GNU C on any system
233    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -isystem " + env['boost_path'] + " -isystem " + env['python_path'] + " -Wno-sign-compare -Wno-system-headers -Wno-strict-aliasing"    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
234  #the strict aliasing warning is triggered by some type punning in the boost headers for version 1.34  #the long long warning occurs on the Mac
 #isystem does not seem to prevent this  
235    cc_optim      = "-O3"    cc_optim      = "-O3"
236    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
237    omp_optim     = ""    omp_optim     = "-fopenmp"
238    omp_debug     = ""    omp_debug     = "-fopenmp"
239    omp_libs      = []    omp_libs      = ['gomp']
240    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
241    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
242      sysheaderopt      = "-isystem "
243  elif env["CC"] == "cl":  elif env["CC"] == "cl":
244    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
245    cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"    cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"
# Line 196  elif env["CC"] == "cl": Line 250  elif env["CC"] == "cl":
250    omp_libs      = []    omp_libs      = []
251    pedantic      = ""    pedantic      = ""
252    fatalwarning      = ""    fatalwarning      = ""
253      sysheaderopt      = ""
254  elif env["CC"] == "icl":  elif env["CC"] == "icl":
255    # intel C on Windows, see windows_intelc_options.py for a start    # intel C on Windows, see windows_intelc_options.py for a start
256    pedantic      = ""    pedantic      = ""
257    fatalwarning      = ""    fatalwarning      = ""
258      sysheaderopt      = ""
259    
260    
261  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
262  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 209  if env["omp_optim"]    == "-DEFAULT_4": env Line 266  if env["omp_optim"]    == "-DEFAULT_4": env
266  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
267  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
268    
269    #set up the autolazy values
270    if env['forcelazy']    != "leave_alone":
271      if env['forcelazy'] == 'on':
272        env.Append(CPPDEFINES='FAUTOLAZYON')
273      else:
274         if env['forcelazy'] == 'off':
275        env.Append(CPPDEFINES='FAUTOLAZYOFF')
276    
277  # 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
278  if not env["useopenmp"]:  if not env["useopenmp"]:
279    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 217  if not env["useopenmp"]: Line 282  if not env["useopenmp"]:
282    
283  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
284    
285    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
286    if IS_WINDOWS_PLATFORM:
287        LD_LIBRARY_PATH_KEY='PATH'
288        env['ENV']['LD_LIBRARY_PATH']=''
289    else:
290        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
291  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
292    
293  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
294  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
295    
296    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
297    except KeyError: pass
298    
299    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
300    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
301    
302    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
303    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
304    
305    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
306    except KeyError: pass
307    
308  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
309  except KeyError: pass  except KeyError: pass
310    
# Line 234  except KeyError: pass Line 317  except KeyError: pass
317  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
318  except KeyError: pass  except KeyError: pass
319    
320  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
321  except KeyError: pass  except KeyError: pass
322    
323  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 250  try: env['ENV']['HOME'] = os.environ['HO Line 333  try: env['ENV']['HOME'] = os.environ['HO
333  except KeyError: pass  except KeyError: pass
334    
335  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
336    
337    
338    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
339    env.PrependENVPath('PYTHONPATH', prefix)
340  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
341    
342  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 276  if env['usepedantic']: env.Append(CCFLAG Line 360  if env['usepedantic']: env.Append(CCFLAG
360    
361  # MS Windows  # MS Windows
362  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
363    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
364    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
365    if not env['share_esysUtils'] :    if not env['share_esysUtils'] :
366      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
367    if not env['share_paso'] :    if not env['share_paso'] :
368      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
369    
370    if env['usenetcdf']:    if env['usenetcdf']:
371      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
372    
373  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
374    
# Line 298  except: Line 382  except:
382  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
383  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
384    
385  ############ numarray (required) ###############################  ############ numpy (required) ###############################
386    
387  try:  try:
388    from numarray import identity    from numpy import identity
389  except ImportError:  except ImportError:
390    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
391    sys.exit(1)    sys.exit(1)
392    
393  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 313  conf = Configure(clone_env(env)) Line 397  conf = Configure(clone_env(env))
397    
398  # Test that the compiler is working  # Test that the compiler is working
399  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
400    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
401    sys.exit(1)     sys.exit(1)
402    
403  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
404    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
405    
406  ############ python libraries (required) #######################  ############ python libraries (required) #######################
407    
408  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
409    if not sysheaderopt =="":
410      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
411    else:
412      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
413    
414  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
415  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
416    
417  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
418    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
419    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
420    
421  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
422    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'])
423    sys.exit(1)    sys.exit(1)
424  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
425    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'])
426    sys.exit(1)    sys.exit(1)
427    
428  ############ boost (required) ##################################  ############ boost (required) ##################################
429    
430  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
431    # This is required because we can't -isystem /usr/system because it breaks std includes
432      if os.path.normpath(env['boost_path']) =="/usr/include":
433        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
434      else:
435        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
436    else:
437      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
438    
439  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
440  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
441    
442  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
443    #ensure that our path entries remain at the front
444    conf.env.PrependENVPath('PYTHONPATH', prefix)
445    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
446    
447  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
448    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'])
449    sys.exit(1)    sys.exit(1)
450    
451  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
452    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'])
453    sys.exit(1)    sys.exit(1)
# Line 373  if env['usenetcdf']: Line 476  if env['usenetcdf']:
476    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
477    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
478    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
479    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
480      #ensure that our path entries remain at the front
481      conf.env.PrependENVPath('PYTHONPATH', prefix)
482      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
483    
484  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
485  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 394  if env['usepapi']: Line 500  if env['usepapi']:
500    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
501    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
502    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
503    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
504      #ensure that our path entries remain at the front
505      conf.env.PrependENVPath('PYTHONPATH', prefix)
506      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
507    
508  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
509  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 415  if env['usemkl']: Line 524  if env['usemkl']:
524    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
525    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
526    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
527    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
528      #ensure that our path entries remain at the front
529      conf.env.PrependENVPath('PYTHONPATH', prefix)
530      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
531    
532  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
533  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
534    
535  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
536  if env['usemkl']:  if env['usemkl']:
# Line 443  if env['useumfpack']: Line 555  if env['useumfpack']:
555    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
556    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
557    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
558    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
559    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
560    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
561      #ensure that our path entries remain at the front
562      conf.env.PrependENVPath('PYTHONPATH', prefix)
563      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
564    
565  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
566  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
567    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
568    
569  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
570  if env['useumfpack']:  if env['useumfpack']:
# Line 457  if env['useumfpack']: Line 573  if env['useumfpack']:
573  else:  else:
574    conf.Finish()    conf.Finish()
575    
576    ############ Silo (optional) ###################################
577    
578    if env['usesilo']:
579      conf = Configure(clone_env(env))
580      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
581      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
582      conf.env.AppendUnique(LIBS = [env['silo_libs']])
583      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
584      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
585      conf.Finish()
586    
587    # Add the path to Silo to environment env if it was found.
588    # Note that we do not add the libs since they are only needed for the
589    # escriptreader library and tools.
590    if env['usesilo']:
591      env.AppendUnique(CPPPATH = [env['silo_path']])
592      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
593      env.Append(CPPDEFINES = ['HAVE_SILO'])
594    
595  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
596    
597  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 471  else: Line 606  else:
606  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
607  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
608    
609    ############ Add some custom builders ##########################
610    
611    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
612    env.Append(BUILDERS = {'PyCompile' : py_builder});
613    
614    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
615    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
616    
617    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
618    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
619    
620    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
621    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
622    
623  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
624    if not env['usempi']: env['mpi_flavour']='none'
625    
626  # 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)
627  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 480  env_mpi = clone_env(env) Line 630  env_mpi = clone_env(env)
630  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
631    
632  if env_mpi['usempi']:  if env_mpi['usempi']:
633      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
634      if not env_mpi['mpi_flavour'] in VALID_MPIs:
635          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
636    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
637    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
638    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
639    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
640      #ensure that our path entries remain at the front
641      conf.env.PrependENVPath('PYTHONPATH', prefix)
642      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
643    
644  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
645  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
646    
647  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
648  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 497  else: Line 653  else:
653    
654  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
655    
656    
657  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
658    
659  # 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 508  if env_mpi['useparmetis']: Line 665  if env_mpi['useparmetis']:
665    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
666    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
667    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
668    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
669      #ensure that our path entries remain at the front
670      conf.env.PrependENVPath('PYTHONPATH', prefix)
671      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
672    
673  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
674  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 535  if ((fatalwarning != "") and (env['usewa Line 695  if ((fatalwarning != "") and (env['usewa
695  print ""  print ""
696  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
697  print " Using python libraries"  print " Using python libraries"
698  print " Using numarray"  print " Using numpy"
699  print " Using boost"  print " Using boost"
700  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
701  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 545  if env['usemkl']: print "  Using MKL" Line 705  if env['usemkl']: print "  Using MKL"
705  else: print "   Not using MKL"  else: print "   Not using MKL"
706  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
707  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
708    if env['usesilo']: print "  Using Silo"
709    else: print "   Not using Silo"
710  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
711  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
712  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
713  else: print "   Not using MPI"  else: print "   Not using MPI"
714  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
715  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 562  print "" Line 724  print ""
724    
725  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
726    
727  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
728  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
729  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
730  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
731    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
732    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
733    
 ############ Add some custom builders ##########################  
734    
735  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  ############ Build the subdirectories ##########################
 env.Append(BUILDERS = {'PyCompile' : py_builder});  
736    
737  runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  from grouptest import *
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
738    
739  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  TestGroups=[]
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
   
 ############ Build the subdirectories ##########################  
740    
741  Export(  Export(
742    ["env",    ["env",
743     "env_mpi",     "env_mpi",
744     "clone_env",     "clone_env",
745     "IS_WINDOWS_PLATFORM"     "IS_WINDOWS_PLATFORM",
746       "TestGroups"
747     ]     ]
748    )    )
749    
750  env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
751    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
752  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
753  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
754  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)
# Line 599  env.SConscript(dirs = ['pyvisi/py_src'], Line 759  env.SConscript(dirs = ['pyvisi/py_src'],
759  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)
760  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
761  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
762    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
763    
764    
765  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
766    
767  remember_list = []  remember_list = []
768    
769  if env['usedebug']:  if env['usedebug']:
770    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'))
771    
772  if env['usempi']:  if env['usempi']:
773    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'))
774    
775  if env['omp_optim'] != '':  if env['useopenmp']:
776    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'))
777    
778  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
779    
780    
781    ############### Record python interpreter version ##############
782    
783    if not IS_WINDOWS_PLATFORM:
784      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
785      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
786    
787    ############## Populate the buildvars file #####################
788    
789    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
790    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
791    
792    # Find the boost version by extracting it from version.hpp
793    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
794    boostversion='unknown'
795    try:
796        for line in boosthpp:
797            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
798            if ver:
799                boostversion=ver.group(1)
800    except StopIteration:
801        pass
802    buildvars.write("boost="+boostversion+"\n")
803    buildvars.write("svn_revision="+str(global_revision)+"\n")
804    out="usedebug="
805    if env['usedebug']:
806        out+="y"
807    else:
808        out+="n"
809    out+="\nusempi="
810    if env['usempi']:
811        out+="y"
812    else:
813        out+="n"
814    out+="\nuseopenmp="
815    if env['useopenmp']:
816        out+="y"
817    else:
818        out+="n"
819    buildvars.write(out+"\n")
820    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
821    
822    buildvars.close()
823    
824    
825  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
826    
827  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 640  build_all_list += ['build_paso'] Line 847  build_all_list += ['build_paso']
847  build_all_list += ['build_escript']  build_all_list += ['build_escript']
848  build_all_list += ['build_finley']  build_all_list += ['build_finley']
849  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
850  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
851    if env['usesilo']:  build_all_list += ['target_escript2silo']
852  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
853    
854  install_all_list = []  install_all_list = []
# Line 653  install_all_list += ['target_install_pyv Line 861  install_all_list += ['target_install_pyv
861  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
862  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
863  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
864  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
865    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
866  install_all_list += ['remember_options']  install_all_list += ['remember_options']
867  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
868    
# Line 666  env.Alias('build_cppunittest', ['target_ Line 875  env.Alias('build_cppunittest', ['target_
875  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
876  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
877  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'])
878    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
879    
880  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
881    
882  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
883    
884    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
885    
886    if not IS_WINDOWS_PLATFORM:
887       try:
888        utest=open("utest.sh","w")
889        build_platform=os.name      #Sometimes Mac python says it is posix
890        if (build_platform=='posix') and platform.system()=="Darwin":
891            build_platform='darwin'
892        utest.write(GroupTest.makeHeader(build_platform))
893        for tests in TestGroups:
894            utest.write(tests.makeString())
895        utest.close()
896        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
897        print "utest.sh written"
898       except IOError:
899        print "Error attempting to write unittests file."
900        sys.exit(1)
901    
902       #Make sure that the escript wrapper is in place
903       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
904           print "Copying escript wrapper"
905           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))

Legend:
Removed from v.2054  
changed lines
  Added in v.2604

  ViewVC Help
Powered by ViewVC 1.1.26