/[escript]/branches/refine/SConstruct
ViewVC logotype

Diff of /branches/refine/SConstruct

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

revision 2040 by phornby, Sat Nov 15 12:43:11 2008 UTC revision 2603 by jfenwick, Wed Aug 12 00:44:35 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    
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  #Holds names of variables from the calling environment which need to be passed
37  hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])  #to tools
38  tmp = os.path.join("scons",hostname+"_options.py")  env_export=[]
39  options_file = ARGUMENTS.get('options_file', tmp)  
40    #Determine where to read options from use:
41    #1. command line
42    #2. scons/<hostname>_options.py
43    #3. name as part of a cluster
44    options_file=ARGUMENTS.get('options_file', None)
45    effective_hostname=socket.gethostname().split('.')[0]
46    if not options_file:
47      mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
48      options_file = os.path.join("scons",mangledhostname+"_options.py")
49      #If there is no options file with that name see if there is a substitute
50      if not os.path.isfile(options_file):
51        effective_hostname = scons_extensions.effectiveName(effective_hostname)
52        mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname)
53        options_file = os.path.join("scons",mangledhostname+"_options.py")
54    
55  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
56      print "Options file not found (expected '%s')" % options_file
57    options_file = False    options_file = False
   print "Options file not found (expected '%s')" % tmp  
58  else:  else:
59    print "Options file is", options_file    print "Options file is", options_file
60    
61  # Load options file and command-line arguments  #Does our scons support the newer Variables class or do we need to use Options?
62  opts = Options(options_file, ARGUMENTS)  
63    try:
64       dummyvar=Variables
65       opts = Variables(options_file, ARGUMENTS)
66       adder = opts.AddVariables
67    except:
68       opts = Options(options_file, ARGUMENTS)
69       adder = opts.AddOptions
70       BoolVariable = BoolOption
71    
72  ############ Load build options ################################  ############ Load build options ################################
73    
74  opts.AddOptions(  adder(
75    #opts.AddOptions(
76  # Where to install esys stuff  # Where to install esys stuff
77    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),
78    ('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 80  opts.AddOptions(
80    ('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')),
81    ('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')),
82  # Compilation options  # Compilation options
83    BoolOption('dodebug', 'For backwards compatibility', 'no'),    BoolVariable('dodebug', 'For backwards compatibility', 'no'),
84    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    BoolVariable('usedebug', 'Do you want a debug build?', 'no'),
85    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    BoolVariable('usevtk', 'Do you want to use VTK?', 'yes'),
86    ('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),
87    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
88    # 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 96  opts.AddOptions(
96    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
97    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
98    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
99    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
100    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
101    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
102      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
103  # Python  # Python
104    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
105    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 85  opts.AddOptions( Line 110  opts.AddOptions(
110    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
111    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
112  # NetCDF  # NetCDF
113    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
114    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
115    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
116    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
117  # MPI  # MPI
118    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
119    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
120    ('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'),
121    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
122    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
123    ('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),
124    ('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']),
125      ('mpi_flavour','Type of MPI execution environment','none'),
126  # ParMETIS  # ParMETIS
127    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
128    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
129    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
130    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
131  # PAPI  # PAPI
132    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
133    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
134    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
135    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
136    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),
137  # MKL  # MKL
138    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
139    ('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'),
140    ('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'),
141    ('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']),
142  # UMFPACK  # UMFPACK
143    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
144    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
145    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
146    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
147    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
148    # Silo
149      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
150      ('silo_path', 'Path to Silo includes', '/usr/include'),
151      ('silo_lib_path', 'Path to Silo libs', usr_lib),
152      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
153  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
154    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
155    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 128  opts.AddOptions( Line 159  opts.AddOptions(
159    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
160    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
161  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
162    ('tools_names', 'allow control over the tools in the env setup', ['intelc'])    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),
163    # finer control over library building, intel aggressive global optimisation
164    # works with dynamic libraries on windows.
165      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
166      ('share_paso', 'control static or dynamic paso lib', False),
167      ('env_export','Environment variables to be passed to children',[])
168  )  )
169    
170  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
# Line 141  if IS_WINDOWS_PLATFORM: Line 177  if IS_WINDOWS_PLATFORM:
177        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
178                          options = opts)                          options = opts)
179  else:  else:
180     if socket.gethostname().split('.')[0] == 'service0':     if effective_hostname == 'service0':
181        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
182     elif os.uname()[4]=='ia64':     elif os.uname()[4]=='ia64':
183        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
# Line 151  else: Line 187  else:
187        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
188  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
189    
190    ########## Copy required environment vars ######################
191    
192    for i in env['env_export']:
193       env.Append(ENV = {i:os.environ[i]})
194    
195  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
196    
197  # Backwards compatibility: allow dodebug=yes and useMPI=yes  # Backwards compatibility: allow dodebug=yes and useMPI=yes
# Line 160  if env['useMPI']: env['usempi'] = 1 Line 201  if env['useMPI']: env['usempi'] = 1
201  # 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)
202  # 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
203    
204    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
205    
206  if env["CC"] == "icc":  if env["CC"] == "icc":
207    # Intel compilers    # Intel compilers
208    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
# Line 170  if env["CC"] == "icc": Line 213  if env["CC"] == "icc":
213    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
214    pedantic      = ""    pedantic      = ""
215    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
216      sysheaderopt      = ""
217  elif env["CC"] == "gcc":  elif env["CC"] == "gcc":
218    # GNU C on any system    # GNU C on any system
219    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"
220  #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  
221    cc_optim      = "-O3"    cc_optim      = "-O3"
222    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
223    omp_optim     = ""    omp_optim     = "-fopenmp"
224    omp_debug     = ""    omp_debug     = "-fopenmp"
225    omp_libs      = []    omp_libs      = ['gomp']
226    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
227    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
228      sysheaderopt      = "-isystem "
229  elif env["CC"] == "cl":  elif env["CC"] == "cl":
230    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
231    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 192  elif env["CC"] == "cl": Line 236  elif env["CC"] == "cl":
236    omp_libs      = []    omp_libs      = []
237    pedantic      = ""    pedantic      = ""
238    fatalwarning      = ""    fatalwarning      = ""
239      sysheaderopt      = ""
240  elif env["CC"] == "icl":  elif env["CC"] == "icl":
241    # intel C on Windows, see windows_intelc_options.py for a start    # intel C on Windows, see windows_intelc_options.py for a start
242    pedantic      = ""    pedantic      = ""
243    fatalwarning      = ""    fatalwarning      = ""
244      sysheaderopt      = ""
245    
246    
247  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
248  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 205  if env["omp_optim"]    == "-DEFAULT_4": env Line 252  if env["omp_optim"]    == "-DEFAULT_4": env
252  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
253  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
254    
255    #set up the autolazy values
256    if env['forcelazy']    != "leave_alone":
257      if env['forcelazy'] == 'on':
258        env.Append(CPPDEFINES='FAUTOLAZYON')
259      else:
260         if env['forcelazy'] == 'off':
261        env.Append(CPPDEFINES='FAUTOLAZYOFF')
262    
263  # 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
264  if not env["useopenmp"]:  if not env["useopenmp"]:
265    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 213  if not env["useopenmp"]: Line 268  if not env["useopenmp"]:
268    
269  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
270    
271    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
272    if IS_WINDOWS_PLATFORM:
273        LD_LIBRARY_PATH_KEY='PATH'
274        env['ENV']['LD_LIBRARY_PATH']=''
275    else:
276        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
277  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
278    
279  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
280  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
281    
282    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
283    except KeyError: pass
284    
285    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
286    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
287    
288    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
289    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
290    
291    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
292    except KeyError: pass
293    
294  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
295  except KeyError: pass  except KeyError: pass
296    
# Line 230  except KeyError: pass Line 303  except KeyError: pass
303  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
304  except KeyError: pass  except KeyError: pass
305    
306  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
307  except KeyError: pass  except KeyError: pass
308    
309  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 246  try: env['ENV']['HOME'] = os.environ['HO Line 319  try: env['ENV']['HOME'] = os.environ['HO
319  except KeyError: pass  except KeyError: pass
320    
321  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
322    
323    
324    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
325    env.PrependENVPath('PYTHONPATH', prefix)
326  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
327    
328  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 272  if env['usepedantic']: env.Append(CCFLAG Line 346  if env['usepedantic']: env.Append(CCFLAG
346    
347  # MS Windows  # MS Windows
348  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
349    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
350    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
351    env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])    if not env['share_esysUtils'] :
352        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
353      if not env['share_paso'] :
354        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
355    
356    if env['usenetcdf']:    if env['usenetcdf']:
357      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
358    
359  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
360    
# Line 291  except: Line 368  except:
368  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
369  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
370    
371  ############ numarray (required) ###############################  ############ numpy (required) ###############################
372    
373  try:  try:
374    from numarray import identity    from numpy import identity
375  except ImportError:  except ImportError:
376    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
377    sys.exit(1)    sys.exit(1)
378    
379  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 306  conf = Configure(clone_env(env)) Line 383  conf = Configure(clone_env(env))
383    
384  # Test that the compiler is working  # Test that the compiler is working
385  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
386    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
387    sys.exit(1)     sys.exit(1)
388    
389  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
390    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
391    
392  ############ python libraries (required) #######################  ############ python libraries (required) #######################
393    
394  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
395    if not sysheaderopt =="":
396      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
397    else:
398      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
399    
400  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
401  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
402    
403  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
404    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
405    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
406    
407  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
408    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'])
409    sys.exit(1)    sys.exit(1)
410  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
411    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'])
412    sys.exit(1)    sys.exit(1)
413    
414  ############ boost (required) ##################################  ############ boost (required) ##################################
415    
416  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
417    # This is required because we can't -isystem /usr/system because it breaks std includes
418      if os.path.normpath(env['boost_path']) =="/usr/include":
419        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
420      else:
421        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
422    else:
423      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
424    
425  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
426  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
427    
428  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
429    #ensure that our path entries remain at the front
430    conf.env.PrependENVPath('PYTHONPATH', prefix)
431    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
432    
433  if not conf.CheckCXXHeader('boost/python.hpp'):  if not conf.CheckCXXHeader('boost/python.hpp'):
434    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'])
435    sys.exit(1)    sys.exit(1)
436    
437  if not conf.CheckFunc('PyObject_SetAttr'):  if not conf.CheckFunc('PyObject_SetAttr'):
438    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'])
439    sys.exit(1)    sys.exit(1)
# Line 366  if env['usenetcdf']: Line 462  if env['usenetcdf']:
462    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
463    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
464    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
465    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
466      #ensure that our path entries remain at the front
467      conf.env.PrependENVPath('PYTHONPATH', prefix)
468      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
469    
470  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
471  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 387  if env['usepapi']: Line 486  if env['usepapi']:
486    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
487    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
488    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
489    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
490      #ensure that our path entries remain at the front
491      conf.env.PrependENVPath('PYTHONPATH', prefix)
492      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
493    
494  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
495  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 408  if env['usemkl']: Line 510  if env['usemkl']:
510    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
511    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
512    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
513    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
514      #ensure that our path entries remain at the front
515      conf.env.PrependENVPath('PYTHONPATH', prefix)
516      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
517    
518  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
519  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
520    
521  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
522  if env['usemkl']:  if env['usemkl']:
# Line 436  if env['useumfpack']: Line 541  if env['useumfpack']:
541    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
542    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
543    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
544    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
545    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
546    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
547      #ensure that our path entries remain at the front
548      conf.env.PrependENVPath('PYTHONPATH', prefix)
549      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
550    
551  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
552  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
553    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
554    
555  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
556  if env['useumfpack']:  if env['useumfpack']:
# Line 450  if env['useumfpack']: Line 559  if env['useumfpack']:
559  else:  else:
560    conf.Finish()    conf.Finish()
561    
562    ############ Silo (optional) ###################################
563    
564    if env['usesilo']:
565      conf = Configure(clone_env(env))
566      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
567      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
568      conf.env.AppendUnique(LIBS = [env['silo_libs']])
569      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
570      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
571      conf.Finish()
572    
573    # Add the path to Silo to environment env if it was found.
574    # Note that we do not add the libs since they are only needed for the
575    # escriptreader library and tools.
576    if env['usesilo']:
577      env.AppendUnique(CPPPATH = [env['silo_path']])
578      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
579      env.Append(CPPDEFINES = ['HAVE_SILO'])
580    
581  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
582    
583  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 464  else: Line 592  else:
592  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
593  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
594    
595    ############ Add some custom builders ##########################
596    
597    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
598    env.Append(BUILDERS = {'PyCompile' : py_builder});
599    
600    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
601    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
602    
603    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
604    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
605    
606    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
607    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
608    
609  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
610    if not env['usempi']: env['mpi_flavour']='none'
611    
612  # 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)
613  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 473  env_mpi = clone_env(env) Line 616  env_mpi = clone_env(env)
616  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
617    
618  if env_mpi['usempi']:  if env_mpi['usempi']:
619      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
620      if not env_mpi['mpi_flavour'] in VALID_MPIs:
621          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
622    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
623    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
624    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
625    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
626      #ensure that our path entries remain at the front
627      conf.env.PrependENVPath('PYTHONPATH', prefix)
628      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
629    
630  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
631  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
632    
633  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
634  if env_mpi['usempi']:  if env_mpi['usempi']:
# Line 490  else: Line 639  else:
639    
640  env['usempi'] = env_mpi['usempi']  env['usempi'] = env_mpi['usempi']
641    
642    
643  ############ ParMETIS (optional) ###############################  ############ ParMETIS (optional) ###############################
644    
645  # 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 501  if env_mpi['useparmetis']: Line 651  if env_mpi['useparmetis']:
651    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
652    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
653    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
654    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
655      #ensure that our path entries remain at the front
656      conf.env.PrependENVPath('PYTHONPATH', prefix)
657      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
658    
659  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
660  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 528  if ((fatalwarning != "") and (env['usewa Line 681  if ((fatalwarning != "") and (env['usewa
681  print ""  print ""
682  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
683  print " Using python libraries"  print " Using python libraries"
684  print " Using numarray"  print " Using numpy"
685  print " Using boost"  print " Using boost"
686  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
687  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 538  if env['usemkl']: print "  Using MKL" Line 691  if env['usemkl']: print "  Using MKL"
691  else: print "   Not using MKL"  else: print "   Not using MKL"
692  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
693  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
694    if env['usesilo']: print "  Using Silo"
695    else: print "   Not using Silo"
696  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
697  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
698  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
699  else: print "   Not using MPI"  else: print "   Not using MPI"
700  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
701  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
# Line 555  print "" Line 710  print ""
710    
711  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
712    
713  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
714  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
715  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
716  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
717    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
718    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
719    
 ############ Add some custom builders ##########################  
720    
721  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});  
   
 runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
722    
723  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  from grouptest import *
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
724    
725  ############ Build the subdirectories ##########################  TestGroups=[]
726    
727  Export(  Export(
728    ["env",    ["env",
729     "env_mpi",     "env_mpi",
730     "clone_env",     "clone_env",
731     "IS_WINDOWS_PLATFORM"     "IS_WINDOWS_PLATFORM",
732       "TestGroups"
733     ]     ]
734    )    )
735    
736  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)
737    env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0)
738  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)
739  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)
740  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 592  env.SConscript(dirs = ['pyvisi/py_src'], Line 745  env.SConscript(dirs = ['pyvisi/py_src'],
745  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)
746  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)
747  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)
748    env.SConscript(dirs = ['paso/profiling'], build_dir='build/$PLATFORM/paso/profiling', duplicate=0)
749    
750    
751  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
752    
753  remember_list = []  remember_list = []
754    
755  if env['usedebug']:  if env['usedebug']:
756    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'))
757    
758  if env['usempi']:  if env['usempi']:
759    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'))
760    
761  if env['omp_optim'] != '':  if env['useopenmp']:
762    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'))
763    
764  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
765    
766    
767    ############### Record python interpreter version ##############
768    
769    if not IS_WINDOWS_PLATFORM:
770      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
771      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
772    
773    ############## Populate the buildvars file #####################
774    
775    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
776    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
777    
778    # Find the boost version by extracting it from version.hpp
779    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
780    boostversion='unknown'
781    try:
782        for line in boosthpp:
783            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
784            if ver:
785                boostversion=ver.group(1)
786    except StopIteration:
787        pass
788    buildvars.write("boost="+boostversion+"\n")
789    buildvars.write("svn_revision="+str(global_revision)+"\n")
790    out="usedebug="
791    if env['usedebug']:
792        out+="y"
793    else:
794        out+="n"
795    out+="\nusempi="
796    if env['usempi']:
797        out+="y"
798    else:
799        out+="n"
800    out+="\nuseopenmp="
801    if env['useopenmp']:
802        out+="y"
803    else:
804        out+="n"
805    buildvars.write(out+"\n")
806    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
807    
808    buildvars.close()
809    
810    
811  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
812    
813  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 633  build_all_list += ['build_paso'] Line 833  build_all_list += ['build_paso']
833  build_all_list += ['build_escript']  build_all_list += ['build_escript']
834  build_all_list += ['build_finley']  build_all_list += ['build_finley']
835  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
836  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
837    if env['usesilo']:  build_all_list += ['target_escript2silo']
838  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
839    
840  install_all_list = []  install_all_list = []
# Line 646  install_all_list += ['target_install_pyv Line 847  install_all_list += ['target_install_pyv
847  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
848  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
849  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
850  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
851    if env['usesilo']:  install_all_list += ['target_install_escript2silo']
852  install_all_list += ['remember_options']  install_all_list += ['remember_options']
853  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
854    
# Line 659  env.Alias('build_cppunittest', ['target_ Line 861  env.Alias('build_cppunittest', ['target_
861  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
862  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
863  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'])
864    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
865    
866  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
867    
868  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
869    
870    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf'])
871    
872    if not IS_WINDOWS_PLATFORM:
873       try:
874        utest=open("utest.sh","w")
875        build_platform=os.name      #Sometimes Mac python says it is posix
876        if (build_platform=='posix') and platform.system()=="Darwin":
877            build_platform='darwin'
878        utest.write(GroupTest.makeHeader(build_platform))
879        for tests in TestGroups:
880            utest.write(tests.makeString())
881        utest.close()
882        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
883        print "utest.sh written"
884       except IOError:
885        print "Error attempting to write unittests file."
886        sys.exit(1)
887    

Legend:
Removed from v.2040  
changed lines
  Added in v.2603

  ViewVC Help
Powered by ViewVC 1.1.26