/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

revision 2036 by jfenwick, Thu Nov 13 04:35:06 2008 UTC revision 3178 by caltinay, Tue Sep 14 00:31:59 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    # VisIt
160      BoolVariable('usevisit', 'switch on/off the usage of the VisIt sim library', 'no'),
161      ('visit_path', 'Path to VisIt libsim includes', '/usr/include'),
162      ('visit_lib_path', 'Path to VisIt sim library', usr_lib),
163  # AMD (used by UMFPACK)  # AMD (used by UMFPACK)
164    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),
165    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('amd_lib_path', 'Path to AMD libs', usr_lib),
# Line 127  opts.AddOptions( Line 168  opts.AddOptions(
168    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),
169    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('blas_lib_path', 'Path to BLAS libs', usr_lib),
170    ('blas_libs', 'BLAS libraries to link with', ['blas']),    ('blas_libs', 'BLAS libraries to link with', ['blas']),
171    #Lapack options
172      BoolVariable('uselapack','switch on/off use of Lapack','no'),
173      ('lapack_path', 'Path to Lapack includes','/usr/include'),
174      ('lapack_lib_path', 'Path to Lapack libs', usr_lib),
175      ('lapack_libs', 'Lapack libraries to link with', []),
176      ('lapack_type', '{clapack,mkl}','clapack'),
177  # An option for specifying the compiler tools set (see windows branch).  # An option for specifying the compiler tools set (see windows branch).
178    ('tools_names', 'allow control over the tools in the env setup', ['intelc'])    ('tools_names', 'allow control over the tools in the env setup', ['default']),
179    # finer control over library building, intel aggressive global optimisation
180    # works with dynamic libraries on windows.
181      ('share_esysUtils', 'control static or dynamic esysUtils lib', False),
182      ('share_paso', 'control static or dynamic paso lib', False),
183      ('env_export','Environment variables to be passed to children',[]),
184    #To enable passing function pointers through python
185      BoolVariable('iknowwhatimdoing','allow nonstandard C',False)
186  )  )
187    
188    
189    ###################
190    
191    # This is only to support old versions of scons which don't accept
192    # the variant_dir parameter (older than 0.98 I think).
193    # Once these are no longer an issue we can go back to a direct call
194    # to obj.SConscript
195    import SCons
196    vs=SCons.__version__.split('.')
197    cantusevariantdir=float(vs[0]+'.'+vs[1])<0.98
198    
199    
200    def CallSConscript(obj, **kw):
201        if cantusevariantdir:
202            if 'variant_dir' in kw:
203            kw['build_dir']=kw['variant_dir']
204            del kw['variant_dir']
205        obj.SConscript(**kw)
206    
207    
208  ############ Specify which compilers to use ####################  ############ Specify which compilers to use ####################
209    
210  # intelc uses regular expressions improperly and emits a warning about  # intelc uses regular expressions improperly and emits a warning about
# Line 141  if IS_WINDOWS_PLATFORM: Line 215  if IS_WINDOWS_PLATFORM:
215        env = Environment(tools = ['default'] + env['tools_names'],        env = Environment(tools = ['default'] + env['tools_names'],
216                          options = opts)                          options = opts)
217  else:  else:
218     if socket.gethostname().split('.')[0] == 'service0':     if os.uname()[4]=='ia64':
       env = Environment(tools = ['default', 'intelc'], options = opts)  
    elif os.uname()[4]=='ia64':  
219        env = Environment(tools = ['default', 'intelc'], options = opts)        env = Environment(tools = ['default', 'intelc'], options = opts)
220        if env['CXX'] == 'icpc':        if env['CXX'] == 'icpc':
221           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)
222     else:     else:
223        env = Environment(tools = ['default'], options = opts)        env = Environment(tools = ['default'], options = opts)
224          if env['tools_names']!='default':
225        env=Environment(tools = ['default'] +env['tools_names'], options=opts)
226    
227    # Override compiler choice if provided
228    if env['cc'] != 'DEFAULT': env['CC']=env['cc']
229    if env['cxx'] != 'DEFAULT': env['CXX']=env['cxx']
230    
231  Help(opts.GenerateHelpText(env))  Help(opts.GenerateHelpText(env))
232    
233    ############ Make sure target directories exist ################
234    
235    if not os.path.isdir(env['bininstall']):
236        os.makedirs(env['bininstall'])
237    if not os.path.isdir(env['libinstall']):
238        os.makedirs(env['libinstall'])
239    if not os.path.isdir(env['pyinstall']):
240        os.makedirs(env['pyinstall'])
241    
242    ########## Copy required environment vars ######################
243    
244    for i in env['env_export']:
245       env.Append(ENV = {i:os.environ[i]})
246    
247  ############ Fill in compiler options if not set above #########  ############ Fill in compiler options if not set above #########
248    
249  # 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 253  if env['useMPI']: env['usempi'] = 1
253  # 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)
254  # 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
255    
256    sysheaderopt = ""       # how do we indicate that a header is a system header. Use "" for no action.
257    
258    cc_flags = ""
259    cc_optim = ""
260    cc_debug = ""
261    omp_optim = ""
262    omp_debug = ""
263    omp_libs = []
264    
265  if env["CC"] == "icc":  if env["CC"] == "icc":
266    # Intel compilers    # Intel compilers
267    cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"    cc_flags      = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
268    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"    cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"
269    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
270    omp_optim     = "-openmp -openmp_report0"    omp_optim     = "-openmp -openmp_report0"
271    omp_debug     = "-openmp -openmp_report0"    omp_debug     = "-openmp -openmp_report0"
272    omp_libs      = ['guide', 'pthread']    omp_libs      = ['guide', 'pthread']
273    pedantic      = ""    pedantic      = ""
274    fatalwarning      = ""        # Switch to turn warnings into errors    fatalwarning      = ""        # Switch to turn warnings into errors
275  elif env["CC"] == "gcc":    sysheaderopt      = ""
276    elif env["CC"][:3] == "gcc":
277    # GNU C on any system    # GNU C on any system
278    cc_flags      = "-pedantic -Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -isystem /usr/include/boost/ -isystem /usr/include/python2.5/ -Wno-sign-compare -Wno-system-headers -Wno-strict-aliasing"    cc_flags      = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
279  #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  
280    cc_optim      = "-O3"    cc_optim      = "-O3"
281    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"    cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
282    omp_optim     = ""    omp_optim     = "-fopenmp"
283    omp_debug     = ""    omp_debug     = "-fopenmp"
284    omp_libs      = []    omp_libs      = []
285    pedantic      = "-pedantic-errors -Wno-long-long"    pedantic      = "-pedantic-errors -Wno-long-long"
286    fatalwarning      = "-Werror"    fatalwarning      = "-Werror"
287      sysheaderopt      = "-isystem "
288  elif env["CC"] == "cl":  elif env["CC"] == "cl":
289    # Microsoft Visual C on Windows    # Microsoft Visual C on Windows
290    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 295  elif env["CC"] == "cl":
295    omp_libs      = []    omp_libs      = []
296    pedantic      = ""    pedantic      = ""
297    fatalwarning      = ""    fatalwarning      = ""
298      sysheaderopt      = ""
299  elif env["CC"] == "icl":  elif env["CC"] == "icl":
300    # intel C on Windows, see windows_intelc_options.py for a start    # intel C on Windows, see windows_intelc_options.py for a start
301    pedantic      = ""    pedantic      = ""
302    fatalwarning      = ""    fatalwarning      = ""
303      sysheaderopt      = ""
304    
305    
306  # If not specified in hostname_options.py then set them here  # If not specified in hostname_options.py then set them here
307  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 311  if env["omp_optim"]    == "-DEFAULT_4": env
311  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug
312  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs
313    
314    #set up the autolazy values
315    if env['forcelazy']    != "leave_alone":
316      if env['forcelazy'] == 'on':
317        env.Append(CPPDEFINES=['FAUTOLAZYON'])
318      else:
319         if env['forcelazy'] == 'off':
320        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
321    
322    #set up the colective resolve values
323    if env['forcecollres']    != "leave_alone":
324      print env['forcecollres']
325      if env['forcecollres'] == 'on':
326        env.Append(CPPDEFINES=['FRESCOLLECTON'])
327      else:
328         if env['forcecollres'] == 'off':
329        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
330    
331    
332    if env['iknowwhatimdoing']:
333        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
334    
335  # 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
336  if not env["useopenmp"]:  if not env["useopenmp"]:
337    env['omp_optim'] = ""    env['omp_optim'] = ""
# Line 213  if not env["useopenmp"]: Line 340  if not env["useopenmp"]:
340    
341  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0
342    
343    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
344    if IS_WINDOWS_PLATFORM:
345        LD_LIBRARY_PATH_KEY='PATH'
346        env['ENV']['LD_LIBRARY_PATH']=''
347    else:
348        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
349  ############ Copy environment variables into scons env #########  ############ Copy environment variables into scons env #########
350    
351  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']
352  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1
353    
354    try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS']
355    except KeyError: pass
356    
357    try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS']
358    except KeyError: env['ENV']['ESCRIPT_NUM_PROCS']=1
359    
360    try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES']
361    except KeyError: env['ENV']['ESCRIPT_NUM_NODES']=1
362    
363    try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE']
364    except KeyError: pass
365    
366  try: env['ENV']['PATH'] = os.environ['PATH']  try: env['ENV']['PATH'] = os.environ['PATH']
367  except KeyError: pass  except KeyError: pass
368    
# Line 230  except KeyError: pass Line 375  except KeyError: pass
375  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']
376  except KeyError: pass  except KeyError: pass
377    
378  try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  try: env.PrependENVPath(LD_LIBRARY_PATH_KEY,os.environ['LD_LIBRARY_PATH'])
379  except KeyError: pass  except KeyError: pass
380    
381  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 391  try: env['ENV']['HOME'] = os.environ['HO
391  except KeyError: pass  except KeyError: pass
392    
393  # Configure for test suite  # Configure for test suite
 env.PrependENVPath('PYTHONPATH', prefix)  
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
394    
395    
396    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
397    env.PrependENVPath('PYTHONPATH', prefix)
398  env['ENV']['ESCRIPT_ROOT'] = prefix  env['ENV']['ESCRIPT_ROOT'] = prefix
399    
400  ############ Set up paths for Configure() ######################  ############ Set up paths for Configure() ######################
# Line 265  env.Append(CPPPATH     = [Dir('include')]) Line 411  env.Append(CPPPATH     = [Dir('include')])
411  # Add cc option -L<Escript>/trunk/lib  # Add cc option -L<Escript>/trunk/lib
412  env.Append(LIBPATH      = [Dir(env['libinstall'])])  env.Append(LIBPATH      = [Dir(env['libinstall'])])
413    
414  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
415    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
416  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
417    
418  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  if env['usepedantic']: env.Append(CCFLAGS = pedantic)
419    
420  # MS Windows  # MS Windows
421  if IS_WINDOWS_PLATFORM:  if IS_WINDOWS_PLATFORM:
422    env.PrependENVPath('PATH',    [env['boost_lib_path']])    env.AppendENVPath('PATH', [env['boost_lib_path']])
423    env.PrependENVPath('PATH',    [env['libinstall']])    env.AppendENVPath('PATH', [env['libinstall']])
424      if not env['share_esysUtils'] :
425        env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
426      if not env['share_paso'] :
427        env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
428    
429    if env['usenetcdf']:    if env['usenetcdf']:
430      env.PrependENVPath('PATH',  [env['netCDF_lib_path']])      env.AppendENVPath('PATH',   [env['netCDF_lib_path']])
431    
432  env.Append(ARFLAGS = env['ar_flags'])  env.Append(ARFLAGS = env['ar_flags'])
433    
# Line 289  except: Line 441  except:
441  if global_revision == "": global_revision="-2"  if global_revision == "": global_revision="-2"
442  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])
443    
444  ############ numarray (required) ###############################  ############ numpy (required) ###############################
445    
446  try:  try:
447    from numarray import identity    from numpy import identity
448  except ImportError:  except ImportError:
449    print "Cannot import numarray, you need to set your PYTHONPATH"    print "Cannot import numpy, you need to set your PYTHONPATH"
450    sys.exit(1)    sys.exit(1)
451    
452  ############ C compiler (required) #############################  ############ C compiler (required) #############################
# Line 304  conf = Configure(clone_env(env)) Line 456  conf = Configure(clone_env(env))
456    
457  # Test that the compiler is working  # Test that the compiler is working
458  if not conf.CheckFunc('printf'):  if not conf.CheckFunc('printf'):
459    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])     print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])
460    sys.exit(1)     sys.exit(1)
461    
462  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
463    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
464    
465  ############ python libraries (required) #######################  ############ python libraries (required) #######################
466    
467  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  
468    if not sysheaderopt =="":
469      conf.env.Append(CCFLAGS=sysheaderopt+env['python_path'])
470    else:
471      conf.env.AppendUnique(CPPPATH     = [env['python_path']])
472    
473  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])
474  conf.env.AppendUnique(LIBS      = [env['python_libs']])  conf.env.AppendUnique(LIBS      = [env['python_libs']])
475    
476  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  conf.env.PrependENVPath('PYTHONPATH', prefix)
477    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['python_lib_path'])    # The wrapper script needs to find these libs
478    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
479    
480  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
481    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'])
482    sys.exit(1)    sys.exit(1)
483  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
484    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'])
485    sys.exit(1)    sys.exit(1)
486    
487  ############ boost (required) ##################################  ############ boost (required) ##################################
488    
489  conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  if not sysheaderopt =="":
490    # This is required because we can't -isystem /usr/system because it breaks std includes
491      if os.path.normpath(env['boost_path']) =="/usr/include":
492        conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost'))
493      else:
494        conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path'])
495    else:
496      conf.env.AppendUnique(CPPPATH     = [env['boost_path']])
497    
498  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])
499  conf.env.AppendUnique(LIBS      = [env['boost_libs']])  conf.env.AppendUnique(LIBS      = [env['boost_libs']])
500    
501  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
502    #ensure that our path entries remain at the front
503    conf.env.PrependENVPath('PYTHONPATH', prefix)
504    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
505    
506    
507    #Yep we still cant figure this one out. - working on it.
508    if not IS_WINDOWS_PLATFORM:
509      if not conf.CheckCXXHeader('boost/python.hpp'):
510        print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])
511        sys.exit(1)
512    
513      if not conf.CheckFunc('PyObject_SetAttr'):
514        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'])
515        sys.exit(1)
516    
 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)  
517    
518  # Commit changes to environment  # Commit changes to environment
519  env = conf.Finish()  env = conf.Finish()
# Line 364  if env['usenetcdf']: Line 539  if env['usenetcdf']:
539    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])    conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])
540    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])
541    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])    conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])
542    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
543      #ensure that our path entries remain at the front
544      conf.env.PrependENVPath('PYTHONPATH', prefix)
545      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
546    
547  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0
548  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 385  if env['usepapi']: Line 563  if env['usepapi']:
563    conf.env.AppendUnique(CPPPATH = [env['papi_path']])    conf.env.AppendUnique(CPPPATH = [env['papi_path']])
564    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])
565    conf.env.AppendUnique(LIBS    = [env['papi_libs']])    conf.env.AppendUnique(LIBS    = [env['papi_libs']])
566    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
567      #ensure that our path entries remain at the front
568      conf.env.PrependENVPath('PYTHONPATH', prefix)
569      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
570    
571  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0
572  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 406  if env['usemkl']: Line 587  if env['usemkl']:
587    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])
588    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])
589    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])
590    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
591      #ensure that our path entries remain at the front
592      conf.env.PrependENVPath('PYTHONPATH', prefix)
593      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
594    
595  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
596  if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0
597    
598    
599  # Add MKL to environment env if it was found  # Add MKL to environment env if it was found
600  if env['usemkl']:  if env['usemkl']:
# Line 434  if env['useumfpack']: Line 619  if env['useumfpack']:
619    conf.env.AppendUnique(CPPPATH = [env['blas_path']])    conf.env.AppendUnique(CPPPATH = [env['blas_path']])
620    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])    conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])
621    conf.env.AppendUnique(LIBS    = [env['blas_libs']])    conf.env.AppendUnique(LIBS    = [env['blas_libs']])
622    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
623    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
624    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
625      #ensure that our path entries remain at the front
626      conf.env.PrependENVPath('PYTHONPATH', prefix)
627      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
628    
629  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0
630  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
631    # if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73?
632    
633  # Add UMFPACK to environment env if it was found  # Add UMFPACK to environment env if it was found
634  if env['useumfpack']:  if env['useumfpack']:
# Line 448  if env['useumfpack']: Line 637  if env['useumfpack']:
637  else:  else:
638    conf.Finish()    conf.Finish()
639    
640    ############ Silo (optional) ###################################
641    
642    if env['usesilo']:
643      conf = Configure(clone_env(env))
644      conf.env.AppendUnique(CPPPATH = [env['silo_path']])
645      conf.env.AppendUnique(LIBPATH = [env['silo_lib_path']])
646      conf.env.AppendUnique(LIBS = [env['silo_libs']])
647      if not conf.CheckCHeader('silo.h'): env['usesilo'] = 0
648      if not conf.CheckFunc('DBMkDir'): env['usesilo'] = 0
649      conf.Finish()
650    
651    # Add the path to Silo to environment env if it was found.
652    # Note that we do not add the libs since they are only needed for the
653    # weipa library and tools.
654    if env['usesilo']:
655      env.AppendUnique(CPPPATH = [env['silo_path']])
656      env.AppendUnique(LIBPATH = [env['silo_lib_path']])
657    
658    ############ VisIt (optional) ###################################
659    
660    if env['usevisit']:
661      env.AppendUnique(CPPPATH = [env['visit_path']])
662      env.AppendUnique(LIBPATH = [env['visit_lib_path']])
663    
664    ########### Lapack (optional) ##################################
665    
666    if env['uselapack']:
667        env.AppendUnique(CPPDEFINES='USE_LAPACK')
668        env.AppendUnique(CPPPATH = [env['lapack_path']])
669        env.AppendUnique(LIBPATH =[env['lapack_lib_path']])
670    
671        env.Append(LIBPATH = '/usr/lib/atlas')
672        env.Append(LIBS = [env['lapack_libs']])
673        if env['lapack_type']=='mkl':
674           if not env['usemkl']:
675            env['uselapack']=0
676            print "mkl_lapack requires mkl"
677           else:
678            env.AppendUnique(CPPDEFINES='MKL_LAPACK')
679          
680    
681  ############ Add the compiler flags ############################  ############ Add the compiler flags ############################
682    
683  # Enable debug by choosing either cc_debug or cc_optim  # Enable debug by choosing either cc_debug or cc_optim
# Line 462  else: Line 692  else:
692  env.Append(CCFLAGS      = env['cc_flags'])  env.Append(CCFLAGS      = env['cc_flags'])
693  env.Append(LIBS         = [env['omp_libs']])  env.Append(LIBS         = [env['omp_libs']])
694    
695    ############ Add some custom builders ##########################
696    
697    py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
698    env.Append(BUILDERS = {'PyCompile' : py_builder});
699    
700    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
701    env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
702    
703    runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
704    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
705    
706    epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True)
707    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
708    
709  ############ MPI (optional) ####################################  ############ MPI (optional) ####################################
710    if not env['usempi']: env['mpi_flavour']='none'
711    
712  # 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)
713  env_mpi = clone_env(env)  env_mpi = clone_env(env)
# Line 471  env_mpi = clone_env(env) Line 716  env_mpi = clone_env(env)
716  conf = Configure(clone_env(env_mpi))  conf = Configure(clone_env(env_mpi))
717    
718  if env_mpi['usempi']:  if env_mpi['usempi']:
719      VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ]
720      if not env_mpi['mpi_flavour'] in VALID_MPIs:
721          raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs)
722    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])
723    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])
724    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])
725    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
726      #ensure that our path entries remain at the front
727      conf.env.PrependENVPath('PYTHONPATH', prefix)
728      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
729    
730  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
731  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
732    
733  # Add MPI to environment env_mpi if it was found  # Add MPI to environment env_mpi if it was found
734  if env_mpi['usempi']:  if env_mpi['usempi']:
735    env_mpi = conf.Finish()    env_mpi = conf.Finish()
736    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']])
737      # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
738      # On the other hand MPT and OpenMPI don't define the latter so we have to
739      # do that here
740      if env['usenetcdf'] and env_mpi['mpi_flavour'] in ["MPT","OPENMPI"]:
741        env_mpi.Append(CPPDEFINES = ['MPI_INCLUDED'])
742  else:  else:
743    conf.Finish()    conf.Finish()
744    
# Line 499  if env_mpi['useparmetis']: Line 755  if env_mpi['useparmetis']:
755    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])    conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])
756    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])    conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])
757    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])    conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])
758    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
759      #ensure that our path entries remain at the front
760      conf.env.PrependENVPath('PYTHONPATH', prefix)
761      conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
762    
763  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
764  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 513  else: Line 772  else:
772    
773  env['useparmetis'] = env_mpi['useparmetis']  env['useparmetis'] = env_mpi['useparmetis']
774    
 ############ 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)  
   
775  ############ Summarize our environment #########################  ############ Summarize our environment #########################
776    
777  print ""  print ""
778  print "Summary of configuration (see ./config.log for information)"  print "Summary of configuration (see ./config.log for information)"
779  print " Using python libraries"  print " Using python libraries"
780  print " Using numarray"  print " Using numpy"
781  print " Using boost"  print " Using boost"
782  if env['usenetcdf']: print "    Using NetCDF"  if env['usenetcdf']: print "    Using NetCDF"
783  else: print "   Not using NetCDF"  else: print "   Not using NetCDF"
784  if env['usevtk']: print "   Using VTK"  if env['usevtk']: print "   Using VTK"
785  else: print "   Not using VTK"  else: print "   Not using VTK"
786    if env['usevisit']: print " Using VisIt"
787    else: print "   Not using VisIt"
788  if env['usemkl']: print "   Using MKL"  if env['usemkl']: print "   Using MKL"
789  else: print "   Not using MKL"  else: print "   Not using MKL"
790  if env['useumfpack']: print "   Using UMFPACK"  if env['useumfpack']: print "   Using UMFPACK"
791  else: print "   Not using UMFPACK"  else: print "   Not using UMFPACK"
792    if env['usesilo']: print "  Using Silo"
793    else: print "   Not using Silo"
794  if env['useopenmp']: print "    Using OpenMP"  if env['useopenmp']: print "    Using OpenMP"
795  else: print "   Not using OpenMP"  else: print "   Not using OpenMP"
796  if env['usempi']: print "   Using MPI"  if env['usempi']: print "   Using MPI (flavour = %s)"%env['mpi_flavour']
797  else: print "   Not using MPI"  else: print "   Not using MPI"
798  if env['useparmetis']: print "  Using ParMETIS"  if env['useparmetis']: print "  Using ParMETIS"
799  else: print "   Not using ParMETIS (requires MPI)"  else: print "   Not using ParMETIS (requires MPI)"
800  if env['usepapi']: print "  Using PAPI"  if env['usepapi']: print "  Using PAPI"
801  else: print "   Not using PAPI"  else: print "   Not using PAPI"
802    if env['uselapack']: print "    Using Lapack"
803    else: print "   Not using Lapack"
804  if env['usedebug']: print " Compiling for debug"  if env['usedebug']: print " Compiling for debug"
805  else: print "   Not compiling for debug"  else: print "   Not compiling for debug"
806  print " Installing in", prefix  print " Installing in", prefix
# Line 553  print "" Line 810  print ""
810    
811  ############ Delete option-dependent files #####################  ############ Delete option-dependent files #####################
812    
813  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug")))
814  Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi")))
815  Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp")))
816  if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  Execute(Delete(os.path.join(env['libinstall'],"buildvars")))
817    if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI")))
818    
 ############ Add some custom builders ##########################  
819    
820  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});  
821    
822  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});  
823    
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
824    
825  ############ Build the subdirectories ##########################  from grouptest import *
826    
827    TestGroups=[]
828    
829    dodgy_env=clone_env(env_mpi)    # Environment without pedantic options
830    
831    ############ Now we switch on Warnings as errors ###############
832    
833    #this needs to be done after configuration because the scons test files have warnings in them
834    
835    if ((fatalwarning != "") and (env['usewarnings'])):
836      env.Append(CCFLAGS        = fatalwarning)
837      env_mpi.Append(CCFLAGS        = fatalwarning)
838    
839    
840  Export(  Export(
841    ["env",    ["env",
842     "env_mpi",     "env_mpi",
843     "clone_env",     "clone_env",
844     "IS_WINDOWS_PLATFORM"     "dodgy_env",
845       "IS_WINDOWS_PLATFORM",
846       "TestGroups",
847       "CallSConscript",
848       "cantusevariantdir"
849     ]     ]
850    )    )
851    
852  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)
853  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)
854  env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  CallSConscript(env, dirs = ['paso/src'], variant_dir='build/$PLATFORM/paso', duplicate=0)
855  env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  CallSConscript(env, dirs = ['weipa/src'], variant_dir='build/$PLATFORM/weipa', duplicate=0)
856  env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)  CallSConscript(env, dirs = ['escript/src'], variant_dir='build/$PLATFORM/escript', duplicate=0)
857  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)
858  env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)  CallSConscript(env, dirs = ['finley/src'], variant_dir='build/$PLATFORM/finley', duplicate=0)
859  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)
860  env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  CallSConscript(env, dirs = ['doc'], variant_dir='build/$PLATFORM/doc', duplicate=0)
861  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)
862  env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  CallSConscript(env, dirs = ['pycad/py_src'], variant_dir='build/$PLATFORM/pycad', duplicate=0)
863    CallSConscript(env, dirs = ['pythonMPI/src'], variant_dir='build/$PLATFORM/pythonMPI', duplicate=0)
864    CallSConscript(env, dirs = ['scripts'], variant_dir='build/$PLATFORM/scripts', duplicate=0)
865    CallSConscript(env, dirs = ['paso/profiling'], variant_dir='build/$PLATFORM/paso/profiling', duplicate=0)
866    
867    
868  ############ Remember what optimizations we used ###############  ############ Remember what optimizations we used ###############
869    
870  remember_list = []  remember_list = []
871    
872  if env['usedebug']:  if env['usedebug']:
873    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'))
874    
875  if env['usempi']:  if env['usempi']:
876    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'))
877    
878  if env['omp_optim'] != '':  if env['useopenmp']:
879    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'))
880    
881  env.Alias('remember_options', remember_list)  env.Alias('remember_options', remember_list)
882    
883    
884    ############### Record python interpreter version ##############
885    
886    if not IS_WINDOWS_PLATFORM:
887    
888      versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
889    #  if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4]
890    
891    ############## Populate the buildvars file #####################
892    
893    buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w')
894    buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n')
895    
896    # Find the boost version by extracting it from version.hpp
897    boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp'))
898    boostversion='unknown'
899    try:
900        for line in boosthpp:
901            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
902            if ver:
903                boostversion=ver.group(1)
904    except StopIteration:
905        pass
906    buildvars.write("boost="+boostversion+"\n")
907    buildvars.write("svn_revision="+str(global_revision)+"\n")
908    out="usedebug="
909    if env['usedebug']:
910        out+="y"
911    else:
912        out+="n"
913    out+="\nusempi="
914    if env['usempi']:
915        out+="y"
916    else:
917        out+="n"
918    out+="\nuseopenmp="
919    if env['useopenmp']:
920        out+="y"
921    else:
922        out+="n"
923    buildvars.write(out+"\n")
924    buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n')
925    out="lapack="
926    if env['uselapack']:
927       out+="y"
928    else:
929       out+="n"
930    out+="\nsilo="
931    if env['usesilo']:
932       out+="y"
933    else:
934       out+="n"
935    out+="\nusevisit="
936    if env['usevisit']:
937       out+="y"
938    else:
939       out+="n"
940    buildvars.write(out+"\n")
941    buildvars.close()
942    
943    
944  ############ Targets to build and install libraries ############  ############ Targets to build and install libraries ############
945    
946  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))
# Line 618  env.Alias('install_esysUtils', ['build_e Line 953  env.Alias('install_esysUtils', ['build_e
953  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])
954  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])
955    
956    env.Alias('build_weipa', ['target_install_weipa_headers', 'target_weipa_so', 'target_weipacpp_so'])
957    env.Alias('install_weipa', ['build_weipa', 'target_install_weipa_so', 'target_install_weipacpp_so', 'target_install_weipa_py'])
958    
959    
960    env.Alias('build_escriptreader', ['target_install_weipa_headers', 'target_escriptreader_a'])
961    env.Alias('install_escriptreader', ['build_escriptreader', 'target_install_escriptreader_a'])
962    
963  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'])
964  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'])
965    
# Line 628  env.Alias('install_finley', ['build_finl Line 970  env.Alias('install_finley', ['build_finl
970  build_all_list = []  build_all_list = []
971  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
972  build_all_list += ['build_paso']  build_all_list += ['build_paso']
973    build_all_list += ['build_weipa']
974  build_all_list += ['build_escript']  build_all_list += ['build_escript']
975  build_all_list += ['build_finley']  build_all_list += ['build_finley']
976  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']
977  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    build_all_list += ['target_escript_wrapper']
978    build_all_list += ['target_escriptconvert']
979  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
980    
981  install_all_list = []  install_all_list = []
982  install_all_list += ['target_init']  install_all_list += ['target_init']
983  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
984  install_all_list += ['install_paso']  install_all_list += ['install_paso']
985    install_all_list += ['install_weipa']
986  install_all_list += ['install_escript']  install_all_list += ['install_escript']
987  install_all_list += ['install_finley']  install_all_list += ['install_finley']
988  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['target_install_pyvisi_py']
989  install_all_list += ['target_install_modellib_py']  install_all_list += ['target_install_modellib_py']
990  install_all_list += ['target_install_pycad_py']  install_all_list += ['target_install_pycad_py']
991  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']
992  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  #if not IS_WINDOWS_PLATFORM:    install_all_list += ['target_install_escript_wrapper']
993    if env['usesilo']:  install_all_list += ['target_install_escriptconvert']
994  install_all_list += ['remember_options']  install_all_list += ['remember_options']
995  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
996    
# Line 657  env.Alias('build_cppunittest', ['target_ Line 1003  env.Alias('build_cppunittest', ['target_
1003  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])
1004  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])
1005  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'])
1006    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
1007    
1008    
1009  ############ Targets to build the documentation ################  ############ Targets to build the documentation ################
1010    
1011  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  env.Alias('api_epydoc','install_all')
1012    
1013    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf', 'cookbook_pdf'])
1014    
1015    build_platform=os.name
1016    
1017    if not IS_WINDOWS_PLATFORM:
1018       try:
1019        utest=open("utest.sh","w")
1020        #Sometimes Mac python says it is posix
1021        if (build_platform=='posix') and platform.system()=="Darwin":
1022            build_platform='darwin'
1023        utest.write(GroupTest.makeHeader(build_platform))
1024        for tests in TestGroups:
1025            utest.write(tests.makeString())
1026        utest.close()
1027        os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH)
1028        print "utest.sh written"
1029       except IOError:
1030        print "Error attempting to write unittests file."
1031        sys.exit(1)
1032    
1033       #Make sure that the escript wrapper is in place
1034       if not os.path.isfile(os.path.join(env['bininstall'],'escript')):
1035           print "Copying escript wrapper"
1036           shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript'))
1037    
1038    ############ Targets to build PasoTests suite ################
1039    
1040    env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests')
1041    
1042    env.Alias('release_prep', ['docs', 'install_all'])

Legend:
Removed from v.2036  
changed lines
  Added in v.3178

  ViewVC Help
Powered by ViewVC 1.1.26