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

Diff of /branches/dirac/SConstruct

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

revision 2063 by jfenwick, Wed Nov 19 04:59:43 2008 UTC revision 3078 by jfenwick, Tue Aug 3 03:12:16 2010 UTC
# Line 1  Line 1 
1    
2  ########################################################  ########################################################
3  #  #
4  # Copyright (c) 2003-2008 by University of Queensland  # Copyright (c) 2003-2010 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      ('cc', 'path to C compiler', 'DEFAULT'),
90      ('cxx', 'path to C++ compiler', 'DEFAULT'),
91    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),
92    # 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
93    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_flags', 'C/C++ compiler flags to use', '-DEFAULT_1'),
94    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cc_optim', 'C/C++ optimization flags to use', '-DEFAULT_2'),
95    ('cc_debug', 'C compiler debug flags to use', '-DEFAULT_3'),    ('cc_debug', 'C/C++ debug flags to use', '-DEFAULT_3'),
96    ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),    ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),
97    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),    ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),
98    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),    ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),
99    ('cc_extra', 'Extra C/C++ flags', ''),    ('cc_extra', 'Extra C compiler flags', ''),
100      ('cxx_extra', 'Extra C++ compiler flags', ''),
101    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
102    ('sys_libs', 'System libraries to link with', []),    ('sys_libs', 'System libraries to link with', []),
103    ('ar_flags', 'Static library archiver flags to use', ''),    ('ar_flags', 'Static library archiver flags to use', ''),
104    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('useopenmp', 'Compile parallel version using OpenMP', 'no'),
105    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'),
106    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'),
107      ('forcelazy','for testing use only - set the default value for autolazy','leave_alone'),
108      ('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'),
109  # Python  # Python
110    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),
111    ('python_lib_path', 'Path to Python libs', usr_lib),    ('python_lib_path', 'Path to Python libs', usr_lib),
# Line 85  opts.AddOptions( Line 116  opts.AddOptions(
116    ('boost_lib_path', 'Path to Boost libs', usr_lib),    ('boost_lib_path', 'Path to Boost libs', usr_lib),
117    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('boost_libs', 'Boost libraries to link with', ['boost_python']),
118  # NetCDF  # NetCDF
119    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),
120    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),
121    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),
122    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),
123  # MPI  # MPI
124    BoolOption('useMPI', 'For backwards compatibility', 'no'),    BoolVariable('useMPI', 'For backwards compatibility', 'no'),
125    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('usempi', 'Compile parallel version using MPI', 'no'),
126    ('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'),
127    ('mpi_path', 'Path to MPI includes', '/usr/include'),    ('mpi_path', 'Path to MPI includes', '/usr/include'),
128    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),    ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),
129    ('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),
130    ('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!)', []),
131      ('mpi_flavour','Type of MPI execution environment','none'),
132  # ParMETIS  # ParMETIS
133    BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),    BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),
134    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),    ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),
135    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),    ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),
136    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),    ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),
137  # PAPI  # PAPI
138    BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),    BoolVariable('usepapi', 'switch on/off the usage of PAPI', 'no'),
139    ('papi_path', 'Path to PAPI includes', '/usr/include'),    ('papi_path', 'Path to PAPI includes', '/usr/include'),
140    ('papi_lib_path', 'Path to PAPI libs', usr_lib),    ('papi_lib_path', 'Path to PAPI libs', usr_lib),
141    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
142    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),
143  # MKL  # MKL
144    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    BoolVariable('usemkl', 'switch on/off the usage of MKL', 'no'),
145    ('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'),
146    ('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'),
147    ('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']),
148  # UMFPACK  # UMFPACK
149    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),
150    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),
151    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),
152    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),
153    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),
154    # Silo
155      BoolVariable('usesilo', 'switch on/off the usage of Silo', 'yes'),
156      ('silo_path', 'Path to Silo includes', '/usr/include'),
157      ('silo_lib_path', 'Path to Silo libs', usr_lib),
158      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
159  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
160    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
161    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 127  opts.AddOptions( Line 164  opts.AddOptions(
164    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
165    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
166    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
167    #Lapack options
168      BoolVariable('uselapack','switch on/off use of Lapack','no'),
169      ('lapack_path', 'Path to Lapack includes','/usr/include'),
170      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
171      ('lapack_libs', 'Lapack libraries to link with', []),
172      ('lapack_type', '{clapack,mkl}','clapack'),
173  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
174    ('tools_names', 'allow control over the tools in the env setup', ['intelc']),    ('tools_names', 'allow control over the tools in the env setup', ['default']),
175  # finer control over library building, intel aggressive global optimisation  # finer control over library building, intel aggressive global optimisation
176  # works with dynamic libraries on windows.  # works with dynamic libraries on windows.
177    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),    ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
178    ('share_paso', 'control static or dynamic paso lib', False)    ('share_paso', 'control static or dynamic paso lib', False),
179      ('env_export','Environment variables to be passed to children',[]),
180    #To enable passing function pointers through python
181      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
182  )  )
183    
184    
185    ###################
186    
187    # This is only to support old versions of scons which don't accept
188    # the variant_dir parameter (older than 0.98 I think).
189    # Once these are no longer an issue we can go back to a direct call
190    # to obj.SConscript
191    import SCons
192    vs=SCons.__version__.split('.')
193    cantusevariantdir=float(vs[0]+'.'+vs[1])<0.98
194    
195    
196    def CallSConscript(obj, **kw):
197        if cantusevariantdir:
198            if 'variant_dir' in kw:
199            kw['build_dir']=kw['variant_dir']
200            del kw['variant_dir']
201        obj.SConscript(**kw)
202    
203    
204  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
205    
206  # 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 211  if IS_WINDOWS_PLATFORM:
211        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
212                          options = opts)                          options = opts)
213  else:  else:
214     if socket.gethostname().split('.')[0] == 'service0':     if os.uname()[4]=='ia64':
       env = Environment(tools = ['default', 'intelc'], options = opts)  
    elif os.uname()[4]=='ia64':  
215        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
216        if env['CXX'] == 'icpc':        if env['CXX'] == 'icpc':
217           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)
218     else:     else:
219        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
220          if env['tools_names']!='default':
221        env=Environment(tools = ['default'] +env['tools_names'], options=opts)
222    
223    # Override compiler choice if provided
224    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
225    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
226    
227  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
228    
229    ############ Make sure target directories exist ################
230    
231    if not os.path.isdir(env['bininstall']):
232        os.makedirs(env['bininstall'])
233    if not os.path.isdir(env['libinstall']):
234        os.makedirs(env['libinstall'])
235    if not os.path.isdir(env['pyinstall']):
236        os.makedirs(env['pyinstall'])
237    
238    ########## Copy required environment vars ######################
239    
240    for i in env['env_export']:
241       env.Append(ENV = {i:os.environ[i]})
242    
243  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
244    
245  # 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 249  if env['useMPI']: env['usempi'] = 1
249  # 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)
250  # 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
251    
252    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
253    
254    cc_flags = ""
255    cc_optim = ""
256    cc_debug = ""
257    omp_optim = ""
258    omp_debug = ""
259    omp_libs = []
260    
261  if env["CC"] == "icc":  if env["CC"] == "icc":
262    # Intel compilers    # Intel compilers
263    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
264    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"
265    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
266    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
# Line 174  if env["CC"] == "icc": Line 268  if env["CC"] == "icc":
268    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
269    pedantic      = ""    pedantic      = ""
270    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
271  elif env["CC"] == "gcc":    sysheaderopt      = ""
272    elif env["CC"][:3] == "gcc":
273    # GNU C on any system    # GNU C on any system
274    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -isystem " + env['boost_path'] + "/boost -isystem " + env['python_path'] + " -Wno-sign-compare -Wno-system-headers -Wno-strict-aliasing -Wno-long-long"    cc_flags      = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing"
 #the strict aliasing warning is triggered by some type punning in the boost headers for version 1.34  
 #isystem does not seem to prevent this  
275  #the long long warning occurs on the Mac  #the long long warning occurs on the Mac
276    cc_optim      = "-O3"    cc_optim      = "-O3"
277    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
278    omp_optim     = ""    omp_optim     = "-fopenmp"
279    omp_debug     = ""    omp_debug     = "-fopenmp"
280    omp_libs      = []    omp_libs      = []
281    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
282    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
283      sysheaderopt      = "-isystem "
284  elif env["CC"] == "cl":  elif env["CC"] == "cl":
285    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
286    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 197  elif env["CC"] == "cl": Line 291  elif env["CC"] == "cl":
291    omp_libs      = []    omp_libs      = []
292    pedantic      = ""    pedantic      = ""
293    fatalwarning      = ""    fatalwarning      = ""
294      sysheaderopt      = ""
295  elif env["CC"] == "icl":  elif env["CC"] == "icl":
296    # intel C on Windows, see windows_intelc_options.py for a start    # intel C on Windows, see windows_intelc_options.py for a start
297    pedantic      = ""    pedantic      = ""
298    fatalwarning      = ""    fatalwarning      = ""
299      sysheaderopt      = ""
300    
301    
302  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
303  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags
# Line 210  if env["omp_optim"]    == "-DEFAULT_4": env Line 307  if env["omp_optim"]    == "-DEFAULT_4": env
307  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
308  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
309    
310    #set up the autolazy values
311    if env['forcelazy']    != "leave_alone":
312      if env['forcelazy'] == 'on':
313        env.Append(CPPDEFINES=['FAUTOLAZYON'])
314      else:
315         if env['forcelazy'] == 'off':
316        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
317    
318    #set up the colective resolve values
319    if env['forcecollres']    != "leave_alone":
320      print env['forcecollres']
321      if env['forcecollres'] == 'on':
322        env.Append(CPPDEFINES=['FRESCOLLECTON'])
323      else:
324         if env['forcecollres'] == 'off':
325        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
326    
327    
328    if env['iknowwhatimdoing']:
329        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
330    
331  # 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
332  if not env["useopenmp"]:  if not env["useopenmp"]:
333    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 218  if not env["useopenmp"]: Line 336  if not env["useopenmp"]:
336    
337  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
338    
339    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
340    if IS_WINDOWS_PLATFORM:
341        LD_LIBRARY_PATH_KEY='PATH'
342        env['ENV']['LD_LIBRARY_PATH']=''
343    else:
344        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
345  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
346    
347  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
348  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
349    
350    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
351    except KeyError: pass
352    
353    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
354    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
355    
356    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
357    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
358    
359    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
360    except KeyError: pass
361    
362  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
363  except KeyError: pass  except KeyError: pass
364    
# Line 235  except KeyError: pass Line 371  except KeyError: pass
371  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
372  except KeyError: pass  except KeyError: pass
373    
374  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
375  except KeyError: pass  except KeyError: pass
376    
377  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']
# Line 251  try: env['ENV']['HOME'] = os.environ['HO Line 387  try: env['ENV']['HOME'] = os.environ['HO
387  except KeyError: pass  except KeyError: pass
388    
389  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
390    
391    
392    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
393    env.PrependENVPath('PYTHONPATH', prefix)
394  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
395    
396  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 270  env.Append(CPPPATH     = [Dir('include')]) Line 407  env.Append(CPPPATH     = [Dir('include')])
407  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
408  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
409    
410  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
411    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
412  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
413    
414  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
415    
416  # MS Windows  # MS Windows
417  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
418    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
419    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
420    if not env['share_esysUtils'] :    if not env['share_esysUtils'] :
421      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])      env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
422    if not env['share_paso'] :    if not env['share_paso'] :
423      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])      env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
424    
425    if env['usenetcdf']:    if env['usenetcdf']:
426      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
427    
428  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
429    
# Line 299  except: Line 437  except:
437  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
438  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
439    
440  ############ numarray (required) ###############################  ############ numpy (required) ###############################
441    
442  try:  try:
443    from numarray import identity    from numpy import identity
444  except ImportError:  except ImportError:
445    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
446    sys.exit(1)    sys.exit(1)
447    
448  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 314  conf = Configure(clone_env(env)) Line 452  conf = Configure(clone_env(env))
452    
453  # Test that the compiler is working  # Test that the compiler is working
454  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
455    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
456    sys.exit(1)     sys.exit(1)
457    
458  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
459    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
460    
461  ############ python libraries (required) #######################  ############ python libraries (required) #######################
462    
463  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
464    if not sysheaderopt =="":
465      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
466    else:
467      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
468    
469  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
470  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
471    
472  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
473    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
474    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
475    
476  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
477    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'])
478    sys.exit(1)    sys.exit(1)
479  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
480    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'])
481    sys.exit(1)    sys.exit(1)
482    
483  ############ boost (required) ##################################  ############ boost (required) ##################################
484    
485  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
486    # This is required because we can't -isystem /usr/system because it breaks std includes
487      if os.path.normpath(env['boost_path']) =="/usr/include":
488        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
489      else:
490        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
491    else:
492      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
493    
494  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
495  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
496    
497  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
498    #ensure that our path entries remain at the front
499    conf.env.PrependENVPath('PYTHONPATH', prefix)
500    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
501    
502    
503    #Yep we still cant figure this one out. - working on it.
504    if not IS_WINDOWS_PLATFORM:
505      if not conf.CheckCXXHeader('boost/python.hpp'):
506        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
507        sys.exit(1)
508    
509      if not conf.CheckFunc('PyObject_SetAttr'):
510        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'])
511        sys.exit(1)
512    
 if not conf.CheckCXXHeader('boost/python.hpp'):  
   print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])  
   sys.exit(1)  
 if not conf.CheckFunc('PyObject_SetAttr'):  
   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'])  
   sys.exit(1)  
513    
514  # Commit changes to environment  # Commit changes to environment
515  env = conf.Finish()  env = conf.Finish()
# Line 374  if env['usenetcdf']: Line 535  if env['usenetcdf']:
535    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
536    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
537    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
538    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
539      #ensure that our path entries remain at the front
540      conf.env.PrependENVPath('PYTHONPATH', prefix)
541      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
542    
543  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
544  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 395  if env['usepapi']: Line 559  if env['usepapi']:
559    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
560    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
561    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
562    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
563      #ensure that our path entries remain at the front
564      conf.env.PrependENVPath('PYTHONPATH', prefix)
565      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
566    
567  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
568  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 416  if env['usemkl']: Line 583  if env['usemkl']:
583    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
584    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
585    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
586    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
587      #ensure that our path entries remain at the front
588      conf.env.PrependENVPath('PYTHONPATH', prefix)
589      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
590    
591  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
592  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
593    
594    
595  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
596  if env['usemkl']:  if env['usemkl']:
# Line 444  if env['useumfpack']: Line 615  if env['useumfpack']:
615    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
616    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
617    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
618    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
619    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
620    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
621      #ensure that our path entries remain at the front
622      conf.env.PrependENVPath('PYTHONPATH', prefix)
623      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
624    
625  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
626  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
627    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
628    
629  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
630  if env['useumfpack']:  if env['useumfpack']:
# Line 458  if env['useumfpack']: Line 633  if env['useumfpack']:
633  else:  else:
634    conf.Finish()    conf.Finish()
635    
636    ############ Silo (optional) ###################################
637    
638    if env['usesilo']:
639      conf = Configure(clone_env(env))
640      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
641      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
642      conf.env.AppendUnique(LIBS = [env['silo_libs']])
643      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
644      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
645      conf.Finish()
646    
647    # Add the path to Silo to environment env if it was found.
648    # Note that we do not add the libs since they are only needed for the
649    # weipa library and tools.
650    if env['usesilo']:
651      env.AppendUnique(CPPPATH = [env['silo_path']])
652      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
653    
654    ########### Lapack (optional) ##################################
655    
656    if env['uselapack']:
657        env.AppendUnique(CPPDEFINES='USE_LAPACK')
658        env.AppendUnique(CPPPATH = [env['lapack_path']])
659        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
660    
661        env.Append(LIBPATH = '/usr/lib/atlas')
662        env.Append(LIBS = [env['lapack_libs']])
663        if env['lapack_type']=='mkl':
664           if not env['usemkl']:
665            env['uselapack']=0
666            print "mkl_lapack requires mkl"
667           else:
668            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
669          
670    
671  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
672    
673  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 472  else: Line 682  else:
682  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
683  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
684    
685    ############ Add some custom builders ##########################
686    
687    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
688    env.Append(BUILDERS = {'PyCompile' : py_builder});
689    
690    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
691    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
692    
693    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
694    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
695    
696    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
697    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
698    
699  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
700    if not env['usempi']: env['mpi_flavour']='none'
701    
702  # 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)
703  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 481  env_mpi = clone_env(env) Line 706  env_mpi = clone_env(env)
706  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
707    
708  if env_mpi['usempi']:  if env_mpi['usempi']:
709      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
710      if not env_mpi['mpi_flavour'] in VALID_MPIs:
711          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
712    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
713    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
714    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
715    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
716      #ensure that our path entries remain at the front
717      conf.env.PrependENVPath('PYTHONPATH', prefix)
718      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
719    
720  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
721  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
722    
723  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
724  if env_mpi['usempi']:  if env_mpi['usempi']:
725    env_mpi = conf.Finish()    env_mpi = conf.Finish()
726    env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])    env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])
727      # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
728      # On the other hand MPT and OpenMPI don't define the latter so we have to
729      # do that here
730      if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
731        env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
732  else:  else:
733    conf.Finish()    conf.Finish()
734    
# Line 509  if env_mpi['useparmetis']: Line 745  if env_mpi['useparmetis']:
745    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
746    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
747    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
748    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
749      #ensure that our path entries remain at the front
750      conf.env.PrependENVPath('PYTHONPATH', prefix)
751      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
752    
753  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
754  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 523  else: Line 762  else:
762    
763  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
764    
 ############ Now we switch on Warnings as errors ###############  
   
 #this needs to be done after configuration because the scons test files have warnings in them  
   
 if ((fatalwarning != "") and (env['usewarnings'])):  
   env.Append(CCFLAGS        = fatalwarning)  
   env_mpi.Append(CCFLAGS        = fatalwarning)  
   
765  ############ Summarize our environment #########################  ############ Summarize our environment #########################
766    
767  print ""  print ""
768  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
769  print " Using python libraries"  print " Using python libraries"
770  print " Using numarray"  print " Using numpy"
771  print " Using boost"  print " Using boost"
772  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
773  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
# Line 546  if env['usemkl']: print "  Using MKL" Line 777  if env['usemkl']: print "  Using MKL"
777  else: print "   Not using MKL"  else: print "   Not using MKL"
778  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
779  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
780    if env['usesilo']: print "  Using Silo"
781    else: print "   Not using Silo"
782  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
783  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
784  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
785  else: print "   Not using MPI"  else: print "   Not using MPI"
786  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
787  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
788  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
789  else: print "   Not using PAPI"  else: print "   Not using PAPI"
790    if env['uselapack']: print "    Using Lapack"
791    else: print "   Not using Lapack"
792  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
793  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
794  print " Installing in", prefix  print " Installing in", prefix
# Line 563  print "" Line 798  print ""
798    
799  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
800    
801  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
802  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
803  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
804  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"pyversion")))
805    Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
806    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
807    
 ############ Add some custom builders ##########################  
808    
809  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});  
810    
811  runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)  if env['usepedantic']: env_mpi.Append(CCFLAGS = pedantic)
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
812    
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
813    
814  ############ Build the subdirectories ##########################  from grouptest import *
815    
816    TestGroups=[]
817    
818    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
819    
820    ############ Now we switch on Warnings as errors ###############
821    
822    #this needs to be done after configuration because the scons test files have warnings in them
823    
824    if ((fatalwarning != "") and (env['usewarnings'])):
825      env.Append(CCFLAGS        = fatalwarning)
826      env_mpi.Append(CCFLAGS        = fatalwarning)
827    
828    
829  Export(  Export(
830    ["env",    ["env",
831     "env_mpi",     "env_mpi",
832     "clone_env",     "clone_env",
833     "IS_WINDOWS_PLATFORM"     "dodgy_env",
834       "IS_WINDOWS_PLATFORM",
835       "TestGroups",
836       "CallSConscript",
837       "cantusevariantdir"
838     ]     ]
839    )    )
840    
841  env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  CallSConscript(env, dirs = ['tools/CppUnitTest/src'], variant_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)
842  env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  CallSConscript(env, dirs = ['tools/escriptconvert'], variant_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0)
843  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  CallSConscript(env, dirs = ['paso/src'], variant_dir='build/$PLATFORM/paso', duplicate=0)
844  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  CallSConscript(env, dirs = ['weipa/src'], variant_dir='build/$PLATFORM/weipa', duplicate=0)
845  env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)  CallSConscript(env, dirs = ['escript/src'], variant_dir='build/$PLATFORM/escript', duplicate=0)
846  env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)  CallSConscript(env, dirs = ['esysUtils/src'], variant_dir='build/$PLATFORM/esysUtils', duplicate=0)
847  env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)  CallSConscript(env, dirs = ['finley/src'], variant_dir='build/$PLATFORM/finley', duplicate=0)
848  env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)  CallSConscript(env, dirs = ['modellib/py_src'], variant_dir='build/$PLATFORM/modellib', duplicate=0)
849  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  CallSConscript(env, dirs = ['doc'], variant_dir='build/$PLATFORM/doc', duplicate=0)
850  env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  CallSConscript(env, dirs = ['pyvisi/py_src'], variant_dir='build/$PLATFORM/pyvisi', duplicate=0)
851  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  CallSConscript(env, dirs = ['pycad/py_src'], variant_dir='build/$PLATFORM/pycad', duplicate=0)
852    CallSConscript(env, dirs = ['pythonMPI/src'], variant_dir='build/$PLATFORM/pythonMPI', duplicate=0)
853    CallSConscript(env, dirs = ['scripts'], variant_dir='build/$PLATFORM/scripts', duplicate=0)
854    CallSConscript(env, dirs = ['paso/profiling'], variant_dir='build/$PLATFORM/paso/profiling', duplicate=0)
855    
856    
857  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
858    
859  remember_list = []  remember_list = []
860    
861  if env['usedebug']:  if env['usedebug']:
862    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'))
863    
864  if env['usempi']:  if env['usempi']:
865    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'))
866    
867  if env['omp_optim'] != '':  if env['useopenmp']:
868    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'))
869    
870  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
871    
872    
873    ############### Record python interpreter version ##############
874    
875    if not IS_WINDOWS_PLATFORM:
876    
877      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
878      if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
879      os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion"))
880    
881    ############## Populate the buildvars file #####################
882    
883    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
884    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
885    
886    # Find the boost version by extracting it from version.hpp
887    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
888    boostversion='unknown'
889    try:
890        for line in boosthpp:
891            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
892            if ver:
893                boostversion=ver.group(1)
894    except StopIteration:
895        pass
896    buildvars.write("boost="+boostversion+"\n")
897    buildvars.write("svn_revision="+str(global_revision)+"\n")
898    out="usedebug="
899    if env['usedebug']:
900        out+="y"
901    else:
902        out+="n"
903    out+="\nusempi="
904    if env['usempi']:
905        out+="y"
906    else:
907        out+="n"
908    out+="\nuseopenmp="
909    if env['useopenmp']:
910        out+="y"
911    else:
912        out+="n"
913    buildvars.write(out+"\n")
914    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
915    out="lapack="
916    if env['uselapack']:
917       out+="y"
918    else:
919       out+="n"
920    out+="\nsilo="
921    if env['usesilo']:
922       out+="y"
923    else:
924       out+="n"
925    buildvars.write(out+"\n")
926    buildvars.close()
927    
928    
929  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
930    
931  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 628  env.Alias('install_esysUtils', ['build_e Line 938  env.Alias('install_esysUtils', ['build_e
938  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
939  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
940    
941    env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
942    env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
943    
944    env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
945    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
946    
947  env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])  env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])
948  env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])  env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])
949    
# Line 638  env.Alias('install_finley', ['build_finl Line 954  env.Alias('install_finley', ['build_finl
954  build_all_list = []  build_all_list = []
955  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
956  build_all_list += ['build_paso']  build_all_list += ['build_paso']
957    build_all_list += ['build_weipa']
958  build_all_list += ['build_escript']  build_all_list += ['build_escript']
959  build_all_list += ['build_finley']  build_all_list += ['build_finley']
960  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
961  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
962    build_all_list += ['target_escriptconvert']
963  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
964    
965  install_all_list = []  install_all_list = []
966  install_all_list += ['target_init']  install_all_list += ['target_init']
967  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
968  install_all_list += ['install_paso']  install_all_list += ['install_paso']
969    install_all_list += ['install_weipa']
970  install_all_list += ['install_escript']  install_all_list += ['install_escript']
971  install_all_list += ['install_finley']  install_all_list += ['install_finley']
972  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
973  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
974  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
975  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
976  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
977    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
978  install_all_list += ['remember_options']  install_all_list += ['remember_options']
979  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
980    
# Line 667  env.Alias('build_cppunittest', ['target_ Line 987  env.Alias('build_cppunittest', ['target_
987  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
988  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
989  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'])
990    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
991    
992    
993  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
994    
995  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
996    
997    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
998    
999    build_platform=os.name
1000    
1001    if not IS_WINDOWS_PLATFORM:
1002       try:
1003        utest=open("utest.sh","w")
1004        #Sometimes Mac python says it is posix
1005        if (build_platform=='posix') and platform.system()=="Darwin":
1006            build_platform='darwin'
1007        utest.write(GroupTest.makeHeader(build_platform))
1008        for tests in TestGroups:
1009            utest.write(tests.makeString())
1010        utest.close()
1011        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
1012        print "utest.sh written"
1013       except IOError:
1014        print "Error attempting to write unittests file."
1015        sys.exit(1)
1016    
1017       #Make sure that the escript wrapper is in place
1018       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
1019           print "Copying escript wrapper"
1020           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1021    
1022    ############ Targets to build PasoTests suite ################
1023    
1024    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1025    
1026    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.2063  
changed lines
  Added in v.3078

  ViewVC Help
Powered by ViewVC 1.1.26