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

Diff of /branches/diaplayground/SConstruct

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

revision 1141 by gross, Tue May 15 04:24:51 2007 UTC revision 4640 by jfenwick, Fri Jan 31 00:56:51 2014 UTC
# Line 1  Line 1 
1  #         Copyright 2006 by ACcESS MNRF  ##############################################################################
2  #  #
3  #              http://www.access.edu.au  # Copyright (c) 2003-2013 by University of Queensland
4  #       Primary Business: Queensland, Australia  # http://www.uq.edu.au
 #  Licensed under the Open Software License version 3.0  
 #     http://www.opensource.org/licenses/osl-3.0.php  
   
 # top-level Scons configuration file for all esys13 modules  
 # Begin initialisation Section  
 # all of this section just intialises default environments and helper  
 # scripts. You shouldn't need to modify this section.  
 EnsureSConsVersion(0,96,91)  
 EnsurePythonVersion(2,3)  
   
 #===============================================================  
 #   import tools:  
 import glob  
 import sys, os  
 import socket  
 # Add our extensions  
 if sys.path.count('scons')==0: sys.path.append('scons')  
 import scons_extensions  
   
 #===============================================================  
 #   check on windows or linux platform  
5  #  #
6  IS_WINDOWS_PLATFORM = (os.name== "nt")  # Primary Business: Queensland, Australia
7    # Licensed under the Open Software License version 3.0
8    # http://www.opensource.org/licenses/osl-3.0.php
9    #
10    # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11    # Development since 2012 by School of Earth Sciences
12    #
13    ##############################################################################
14    
15    EnsureSConsVersion(0,98,1)
16    EnsurePythonVersion(2,5)
17    
18    import atexit, sys, os, platform, re
19    from distutils import sysconfig
20    from dependencies import *
21    from site_init import *
22    
23    # Version number to check for in options file. Increment when new features are
24    # added or existing options changed.
25    REQUIRED_OPTS_VERSION=201
26    
27    # MS Windows support, many thanks to PH
28    IS_WINDOWS = (os.name == 'nt')
29    
30    IS_OSX = (os.uname()[0] == 'Darwin')
31    
32    ########################## Determine options file ############################
33    # 1. command line
34    # 2. scons/<hostname>_options.py
35    # 3. name as part of a cluster
36    options_file=ARGUMENTS.get('options_file', None)
37    if not options_file:
38        ext_dir = os.path.join(os.getcwd(), 'scons')
39        hostname = platform.node().split('.')[0]
40        for name in hostname, effectiveName(hostname):
41            mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
42            options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
43            if os.path.isfile(options_file): break
44    
45    if not os.path.isfile(options_file):
46        print("\nWARNING:\nOptions file %s" % options_file)
47        print("not found! Default options will be used which is most likely suboptimal.")
48        print("We recommend that you copy one of the TEMPLATE files in the scons/")
49        print("subdirectory and customize it to your needs.\n")
50        options_file = None
51    
52    ############################### Build options ################################
53    
54    default_prefix='/usr'
55    mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
56    lapack_flavours=('none', 'clapack', 'mkl')
57    
58    vars = Variables(options_file, ARGUMENTS)
59    vars.AddVariables(
60      PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
61      PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
62      PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
63      BoolVariable('verbose', 'Output full compile/link lines', False),
64    # Compiler/Linker options
65      ('cxx', 'Path to C++ compiler', 'default'),
66      ('cc_flags', 'Base C++ compiler flags', 'default'),
67      ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
68      ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
69      ('cxx_extra', 'Extra C++ compiler flags', ''),
70      ('ld_extra', 'Extra linker flags', ''),
71      BoolVariable('werror','Treat compiler warnings as errors', True),
72      BoolVariable('debug', 'Compile with debug flags', False),
73      BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
74      ('omp_flags', 'OpenMP compiler flags', 'default'),
75      ('omp_ldflags', 'OpenMP linker flags', 'default'),
76    # Mandatory libraries
77      ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
78      ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
79    # Mandatory for tests
80      ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
81      ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
82    # Optional libraries and options
83      EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
84      ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
85      ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
86      BoolVariable('netcdf', 'Enable netCDF file support', False),
87      ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
88      ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
89      BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
90      ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
91      ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
92      BoolVariable('papi', 'Enable PAPI', False),
93      ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
94      ('papi_libs', 'PAPI libraries to link with', ['papi']),
95      BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
96      BoolVariable('mkl', 'Enable the Math Kernel Library', False),
97      ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
98      ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
99      BoolVariable('umfpack', 'Enable UMFPACK', False),
100      ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
101      ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
102      BoolVariable('boomeramg', 'Enable BoomerAMG', False),
103      ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
104      ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
105      EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
106      ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
107      ('lapack_libs', 'LAPACK libraries to link with', []),
108      BoolVariable('silo', 'Enable the Silo file format in weipa', False),
109      ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
110      ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
111      BoolVariable('visit', 'Enable the VisIt simulation interface', False),
112      ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
113      ('visit_libs', 'VisIt libraries to link with', ['simV2']),
114      BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
115    # Advanced settings
116      #dudley_assemble_flags = -funroll-loops      to actually do something
117      ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
118      # To enable passing function pointers through python
119      BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
120      # An option for specifying the compiler tools (see windows branch)
121      ('tools_names', 'Compiler tools to use', ['default']),
122      ('env_export', 'Environment variables to be passed to tools',[]),
123      EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
124      EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
125      # finer control over library building, intel aggressive global optimisation
126      # works with dynamic libraries on windows.
127      ('build_shared', 'Build dynamic libraries only', False),
128      ('sys_libs', 'Extra libraries to link with', []),
129      ('escript_opts_version', 'Version of options file (do not specify on command line)'),
130      ('SVN_VERSION', 'Do not use from options file', -2),
131      ('pythoncmd', 'which python to compile with','python'),
132      ('usepython3', 'Is this a python3 build? (experimental)', False),
133      ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
134      ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
135      ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
136      BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
137    )
138    
139  if IS_WINDOWS_PLATFORM:  ##################### Create environment and help text #######################
    tools_prefix="C:\\Program Files\\"  
 else:  
    tools_prefix="/usr/local/"  
140    
141  #==============================================================================================      # Intel's compiler uses regular expressions improperly and emits a warning
142  #      # about failing to find the compilers. This warning can be safely ignored.
 #    get the iinstallation prefix  
 #  
 prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)  
 print "Install prefix is: ", prefix  
143    
144  # Default options and options help text  # PATH is needed so the compiler, linker and tools are found if they are not
145  # These are defaults and can be overridden using command line arguments or an options file.  # in default locations.
146  # if the options_file or ARGUMENTS do not exist then the ones listed as default here are used  env = Environment(tools = ['default'], options = vars,
147  # DO NOT CHANGE THEM HERE                    ENV = {'PATH': os.environ['PATH']})
148  # Where to install?  
149  #==============================================================================================      # set the vars for clang
150  #      def mkclang(env):
151  #    get the options file if present:      env['CXX']='clang++'
152  #  
153  if ARGUMENTS.get('options_file',0):  if env['tools_names'] != 'default':
154     options_file = ARGUMENTS.get('options_file',0)      zz=env['tools_names']
155  else:      if 'clang' in zz:
156     from string import ascii_letters,digits          zz.remove('clang')
157     hostname=""          zz.insert(0, mkclang)
158     for s in socket.gethostname().split('.')[0]:      env = Environment(tools = ['default'] + env['tools_names'], options = vars,
159        if s in ascii_letters+digits:                        ENV = {'PATH' : os.environ['PATH']})
160           hostname+=s  
161        else:  if options_file:
162           hostname+="_"      opts_valid=False
163     options_file = os.path.join("scons",hostname+"_options.py")      if 'escript_opts_version' in env.Dictionary() and \
164              int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
165  if os.path.isfile(options_file):              opts_valid=True
166     print "option file is ",options_file,"."      if opts_valid:
167  else:          print("Using options in %s." % options_file)
168     print "option file is ",options_file, "(not present)."      else:
169  # and load it          print("\nOptions file %s" % options_file)
170  opts = Options(options_file, ARGUMENTS)          print("is outdated! Please update the file by examining one of the TEMPLATE")
171  #================================================================          print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
172  #          Exit(1)
173  #   check if UMFPACK is installed on the system:  
174  #  # Generate help text (scons -h)
175  umf_path_default=None  Help(vars.GenerateHelpText(env))
176  umf_lib_path_default=None  
177  umf_libs_default=None  # Check for superfluous options
178  if IS_WINDOWS_PLATFORM:  if len(vars.UnknownVariables())>0:
179     pass      for k in vars.UnknownVariables():
180  else:          print("Unknown option '%s'" % k)
181     if os.path.isdir('/opt/UMFPACK/Include') and os.path.isdir('/opt/UMFPACK/Lib'):      Exit(1)
182        umf_path_default='/opt/UMFPACK/Include'  
183        umf_lib_path_default='/opt/UMFPACK/Lib'  # create dictionary which will be populated with info for buildvars file
184        umf_libs_default=['umfpack']  env['buildvars']={}
185    # create list which will be populated with warnings if there are any
186  amd_path_default=None  env['warnings']=[]
187  amd_lib_path_default=None  
188  amd_libs_default=None  #################### Make sure install directories exist #####################
189  if IS_WINDOWS_PLATFORM:  
190     pass  env['BUILD_DIR']=Dir(env['build_dir']).abspath
191  else:  prefix=Dir(env['prefix']).abspath
192     if os.path.isdir('/opt/AMD/Include') and os.path.isdir('/opt/AMD/Lib'):  env['buildvars']['prefix']=prefix
193        amd_path_default='/opt/AMD/Include'  env['incinstall'] = os.path.join(prefix, 'include')
194        amd_lib_path_default='/opt/AMD/Lib'  env['bininstall'] = os.path.join(prefix, 'bin')
195        amd_libs_default=['amd']  env['libinstall'] = os.path.join(prefix, 'lib')
196    env['pyinstall']  = os.path.join(prefix, 'esys')
197  ufc_path_default=None  if not os.path.isdir(env['bininstall']):
198  if IS_WINDOWS_PLATFORM:      os.makedirs(env['bininstall'])
199     pass  if not os.path.isdir(env['libinstall']):
200  else:      os.makedirs(env['libinstall'])
201     if os.path.isdir('/opt/UFconfig'):  if not os.path.isdir(env['pyinstall']):
202          ufc_path_default='/opt/UFconfig'      os.makedirs(env['pyinstall'])
203  #==========================================================================  
204  #  env.Append(CPPPATH = [env['incinstall']])
205  #    python installation:  env.Append(LIBPATH = [env['libinstall']])
206  #  
207  if IS_WINDOWS_PLATFORM:  ################# Fill in compiler options if not set above ##################
208     python_path_default='C:\\Program Files\\python%s%s'%(sys.version_info[0],sys.version_info[1])+"\\include"  
209     python_lib_path_default='C:\\Program Files\\python%s%s'%(sys.version_info[0],sys.version_info[1])+"\\libs"  if env['cxx'] != 'default': env['CXX']=env['cxx']
210     python_libs_default=["python%s%s"%(sys.version_info[0],sys.version_info[1])]  
211  else:  # version >=9 of intel C++ compiler requires use of icpc to link in C++
212     python_path_default='/usr/include/python%s.%s'%(sys.version_info[0],sys.version_info[1])  # runtimes (icc does not)
213     python_lib_path_default='/usr/lib'  if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
214     python_libs_default=["python%s.%s"%(sys.version_info[0],sys.version_info[1])]      env['LINK'] = env['CXX']
215  #==========================================================================  
216  #  # default compiler/linker options
217  #    boost installation:  cc_flags = ''
218  #  cc_optim = ''
219  if IS_WINDOWS_PLATFORM:  cc_debug = ''
220     boost_libs_path_default='C:\\Program Files\\boost\\lib\\'  omp_flags = ''
221     boost_libs_default=None  omp_ldflags = ''
222     for i in os.listdir(boost_libs_path_default):  fatalwarning = '' # switch to turn warnings into errors
223        name=os.path.splitext(i)  sysheaderopt = '' # how to indicate that a header is a system header
224        if name[1] == ".dll" and name[0].startswith("boost_python"):  
225            if boost_libs_default == None:  # env['CC'] might be a full path
226           boost_libs_default= [ name[0] ]  cc_name=os.path.basename(env['CXX'])
227        else:  
228           if not name[0].find("-gd-"): boost_libs_default=[ name[0] ]  if cc_name == 'icpc':
229     boost_path_default='C:\\Program Files\\boost\\include\\boost-%s'%(boost_libs_default[0].split("-")[-1],)      # Intel compiler
230  else:      # #1875: offsetof applied to non-POD types is nonstandard (in boost)
231     boost_path_default='/usr/include'      # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
232     boost_libs_path_default='/usr/lib'      cc_flags    = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas -DBLOCKTIMER -DCORE_ID1"
233     boost_libs_default=['boost_python']      cc_optim    = "-O3 -ftz -fno-alias -ipo -xHost"
234  #==========================================================================      cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
235  #      omp_flags   = "-openmp"
236  #    check if netCDF is installed on the system:      omp_ldflags = "-openmp -openmp_report=1"
237  #      fatalwarning = "-Werror"
238  netCDF_path_default=None  elif cc_name[:3] == 'g++':
239  netCDF_lib_path_default=None      # GNU C on any system
240  netCDF_libs_default=None      # note that -ffast-math is not used because it breaks isnan(),
241  useNetCDF_default='no'      # see mantis #691
242  netcdf_dir=os.path.join(tools_prefix,'netcdf')      cc_flags     = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
243  if os.path.isdir(os.path.join(netcdf_dir,'include')) and os.path.isdir(os.path.join(netcdf_dir,'lib')):      cc_optim     = "-O3"
244       netCDF_path_default=os.path.join(netcdf_dir,'include')      cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
245       netCDF_lib_path_default=os.path.join(netcdf_dir,'lib')      omp_flags    = "-fopenmp"
246       netCDF_libs_default=['netcdf_cpp',  'netcdf' ]      omp_ldflags  = "-fopenmp"
247       if IS_WINDOWS_PLATFORM:      fatalwarning = "-Werror"
248          useNetCDF_default='no' # be default netcdf is not supported on windows.      sysheaderopt = "-isystem"
249       else:  elif cc_name == 'cl':
250          useNetCDF_default='yes'      # Microsoft Visual C on Windows
251  #==========================================================================      cc_flags     = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
252  #      cc_optim     = "/O2 /Op /W3"
253  #    compile:      cc_debug     = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
254  #      fatalwarning = "/WX"
255  if IS_WINDOWS_PLATFORM:  elif cc_name == 'icl':
256      # cc_flags_default  = '/GR /EHsc /MD /Qc99 /Qopenmp /Qopenmp-report1 /O3 /G7 /Qprec /Qpar-report1 /QxP /QaxP'      # Intel C on Windows
257      # cc_flags_debug_default  = '/Od /MDd /RTC1 /GR /EHsc /Qc99 /Qopenmp /Qopenmp-report1 /Qprec'      cc_flags     = '/EHsc /GR /MD'
258      cc_flags_default  = '/nologo /EHsc /GR  /wd4068 /O2 /Op /MT /W3 /Ob0 /Z7'      cc_optim     = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
259      cc_flags_debug_default  ='/nologo /EHsc /GR  /wd4068 /Od /RTC1 /MTd /ZI /Ob0 /Z7'      cc_debug     = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
260            omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
261      cc_flags_default  = '/nologo /EHsc /GR  /O2 /MT /W3 /Ob0 /Z7 /wd4068'      omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
262      cc_flags_debug_default  ='/nologo /EHsc /GR /Od /RTC1 /MTd /W3 /Ob0 /Z7/wd4068'  
263      cxx_flags_default = ''  env['sysheaderopt']=sysheaderopt
264      cxx_flags_debug_default = ''  
265      cc_common_flags = '/FD /EHsc /GR /wd4068 '  # set defaults if not otherwise specified
266  else:  if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
267     cc_flags_default='-O3 -std=c99 -ffast-math -fpic -Wno-unknown-pragmas -ansi -pedantic-errors'  if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
268     cc_flags_debug_default='-g -O0 -ffast-math -std=c99 -fpic -Wno-unknown-pragmas -ansi -pedantic-errors'  if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
269     cxx_flags_default='--no-warn -ansi'  if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
270     cxx_flags_debug_default='--no-warn -ansi -DDOASSERT'  if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
271  #==============================================================================================      if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
272  # Default options and options help text  if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
273  # These are defaults and can be overridden using command line arguments or an options file.  
274  # if the options_file or ARGUMENTS do not exist then the ones listed as default here are used  if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
275  # DO NOT CHANGE THEM HERE  
276  opts.AddOptions(  if env['usepython3']:
277  # Where to install esys stuff      env.Append(CPPDEFINES=['ESPYTHON3'])
278    ('incinstall', 'where the esys headers will be installed', prefix+'/include'),  
279    ('libinstall', 'where the esys libraries will be installed', prefix+'/lib'),  # set up the autolazy values
280    ('pyinstall', 'where the esys python modules will be installed', prefix),  if env['forcelazy'] == 'on':
281    ('src_zipfile', 'the source zip file will be installed.', prefix+"/release/escript_src.zip"),      env.Append(CPPDEFINES=['FAUTOLAZYON'])
282    ('test_zipfile', 'the test zip file will be installed.', prefix+"/release/escript_tests.zip"),  elif env['forcelazy'] == 'off':
283    ('src_tarfile', 'the source tar file will be installed.', prefix+"/release/escript_src.tar.gz"),      env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
284    ('test_tarfile', 'the test tar file will be installed.', prefix+"/release/escript_tests.tar.gz"),  
285    ('examples_tarfile', 'the examples tar file will be installed.', prefix+"/release/doc/escript_examples.tar.gz"),  # set up the collective resolve values
286    ('examples_zipfile', 'the examples zip file will be installed.', prefix+"/release/doc/escript_examples.zip"),  if env['forcecollres'] == 'on':
287    ('guide_pdf', 'name of the user guide in pdf format', prefix+"/release/doc/user/guide.pdf"),      env.Append(CPPDEFINES=['FRESCOLLECTON'])
288    ('api_epydoc', 'name of the epydoc api docs directory',prefix+"/release/doc/epydoc"),  elif env['forcecollres'] == 'off':
289    ('guide_html', 'name of the directory for user guide in html format', prefix+"/release/doc/user/html"),      env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
290  # Compilation options  
291    BoolOption('dodebug', 'Do you want a debug build?', 'no'),  # allow non-standard C if requested
292    ('options_file', "Optional file containing preferred options. Ignored if it doesn't exist (default: scons/<hostname>_options.py)", options_file),  if env['iknowwhatimdoing']:
293    ('cc_defines','C/C++ defines to use', None),      env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
294    ('cc_flags','C compiler flags to use (Release build)', cc_flags_default),  
295    ('cc_flags_debug', 'C compiler flags to use (Debug build)', cc_flags_debug_default),  # Disable OpenMP if no flags provided
296    ('cxx_flags', 'C++ compiler flags to use (Release build)', cxx_flags_default),  if env['openmp'] and env['omp_flags'] == '':
297    ('cxx_flags_debug', 'C++ compiler flags to use (Debug build)', cxx_flags_debug_default),     env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
298    ('ar_flags', 'Static library archiver flags to use', None),     env['openmp'] = False
299    ('sys_libs', 'System libraries to link with', None),  
300    ('tar_flags','flags for zip files','-c -z'),  if env['openmp']:
301  # MKL      env.Append(CCFLAGS = env['omp_flags'])
302    PathOption('mkl_path', 'Path to MKL includes', None),      if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
303    PathOption('mkl_lib_path', 'Path to MKL libs', None),  else:
304    ('mkl_libs', 'MKL libraries to link with', None),      env['omp_flags']=''
305  # SCSL      env['omp_ldflags']=''
306    PathOption('scsl_path', 'Path to SCSL includes', None),  
307    PathOption('scsl_lib_path', 'Path to SCSL libs', None),  env['buildvars']['openmp']=int(env['openmp'])
308    ('scsl_libs', 'SCSL libraries to link with', None),  
309    ('scsl_libs_MPI', 'SCSL libraries to link with for MPI build', None),  # add debug/non-debug compiler flags
310  # UMFPACK  env['buildvars']['debug']=int(env['debug'])
311    PathOption('ufc_path', 'Path to UFconfig includes', ufc_path_default),  if env['debug']:
312    PathOption('umf_path', 'Path to UMFPACK includes', umf_path_default),      env.Append(CCFLAGS = env['cc_debug'])
313    PathOption('umf_lib_path', 'Path to UMFPACK libs', umf_lib_path_default),  else:
314    ('umf_libs', 'UMFPACK libraries to link with', umf_libs_default),      env.Append(CCFLAGS = env['cc_optim'])
315  # AMD (used by UMFPACK)  
316    PathOption('amd_path', 'Path to AMD includes', amd_path_default),  # always add cc_flags
317    PathOption('amd_lib_path', 'Path to AMD libs', amd_lib_path_default),  env.Append(CCFLAGS = env['cc_flags'])
318    ('amd_libs', 'AMD libraries to link with', amd_libs_default),  
319  # BLAS  # add system libraries
320    PathOption('blas_path', 'Path to BLAS includes', None),  env.AppendUnique(LIBS = env['sys_libs'])
321    PathOption('blas_lib_path', 'Path to BLAS libs', None),  
322    ('blas_libs', 'BLAS libraries to link with', None),  # determine svn revision
323  # netCDF  global_revision=ARGUMENTS.get('SVN_VERSION', None)
324    ('useNetCDF', 'switch on/off the usage of netCDF', useNetCDF_default),  if global_revision:
325    PathOption('netCDF_path', 'Path to netCDF includes', netCDF_path_default),      global_revision = re.sub(':.*', '', global_revision)
326    PathOption('netCDF_lib_path', 'Path to netCDF libs', netCDF_lib_path_default),      global_revision = re.sub('[^0-9]', '', global_revision)
327    ('netCDF_libs', 'netCDF C++ libraries to link with', netCDF_libs_default),      if global_revision == '': global_revision='-2'
 # Python  
 # locations of include files for python  
   PathOption('python_path', 'Path to Python includes', python_path_default),  
   PathOption('python_lib_path', 'Path to Python libs', python_lib_path_default),  
   ('python_libs', 'Python libraries to link with', python_libs_default),  
 # Boost  
   PathOption('boost_path', 'Path to Boost includes', boost_path_default),  
   PathOption('boost_libs_path', 'Path to Boost libs', boost_libs_path_default),  
   ('boost_libs', 'Boost libraries to link with', boost_libs_default),  
 # Doc building  
 #  PathOption('doxygen_path', 'Path to Doxygen executable', None),  
 #  PathOption('epydoc_path', 'Path to Epydoc executable', None),  
 # PAPI  
   PathOption('papi_path', 'Path to PAPI includes', None),  
   PathOption('papi_lib_path', 'Path to PAPI libs', None),  
   ('papi_libs', 'PAPI libraries to link with', None),  
 # MPI  
   BoolOption('useMPI', 'Compile parallel version using MPI', 'no'),  
 )  
 #=================================================================================================  
 #  
 #   Note: On the Altix the intel compilers are not automatically  
 #   detected by scons intelc.py script. The Altix has a different directory  
 #   path and in some locations the "modules" facility is used to support  
 #   multiple compiler versions. This forces the need to import the users PATH  
 #   environment which isn't the "scons way"  
 #   This doesn't impact linux and windows which will use the default compiler (g++ or msvc, or the intel compiler if it is installed on both platforms)  
 #   FIXME: Perhaps a modification to intelc.py will allow better support for ia64 on altix  
 #  
 if IS_WINDOWS_PLATFORM:  
       env = Environment(tools = ['default', 'msvc'], options = opts)  
328  else:  else:
329     if os.uname()[4]=='ia64':    # Get the global Subversion revision number for the getVersion() method
330        env = Environment(tools = ['default', 'intelc'], options = opts)    try:
331        if env['CXX'] == 'icpc':      global_revision = os.popen('svnversion -n .').read()
332           env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not). FIXME: this behaviour could be directly incorporated into scons intelc.py      global_revision = re.sub(':.*', '', global_revision)
333     else:      global_revision = re.sub('[^0-9]', '', global_revision)
334        env = Environment(tools = ['default'], options = opts)      if global_revision == '': global_revision='-2'
335  Help(opts.GenerateHelpText(env))    except:
336  #=================================================================================================      global_revision = '-1'
337  #  env['svn_revision']=global_revision
338  #     Initialise Scons Build Environment  env['buildvars']['svn_revision']=global_revision
339  #     check for user environment variables we are interested in  env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
340  try:  
341     python_path = os.environ['PYTHONPATH']  if IS_WINDOWS:
342     env['ENV']['PYTHONPATH'] = python_path      if not env['build_shared']:
343  except KeyError:          env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
344     python_path = ''          env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
345    
346  try:  # VSL random numbers
347     path = os.environ['PATH']  env['buildvars']['vsl_random']=int(env['vsl_random'])
348     env['ENV']['PATH'] = path  if env['vsl_random']:
349  except KeyError:      env.Append(CPPDEFINES = ['MKLRANDOM'])
350     path = ''  
351  try:  env['IS_WINDOWS']=IS_WINDOWS
352     ld_library_path = os.environ['LD_LIBRARY_PATH']  
353     env['ENV']['LD_LIBRARY_PATH'] = ld_library_path  ###################### Copy required environment vars ########################
354  except KeyError:  
355     ld_library_path = ''  # Windows doesn't use LD_LIBRARY_PATH but PATH instead
356  #==========================================================================  if IS_WINDOWS:
357  #      LD_LIBRARY_PATH_KEY='PATH'
358  #    Add some customer builders      env['ENV']['LD_LIBRARY_PATH']=''
 #  
 py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  
 env.Append(BUILDERS = {'PyCompile' : py_builder});  
   
 if IS_WINDOWS_PLATFORM:  
    runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix='.exe', single_source=True)  
359  else:  else:
360     runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', single_source=True)      LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
361    
362  runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
363    
364  # Convert the options which are held in environment variable into python variables for ease of handling and configure compilation options  # the following env variables are exported for the unit tests
 try:  
    incinstall = env['incinstall']  
    env.Append(CPPPATH = [incinstall,])  
 except KeyError:  
    incinstall = None  
 try:  
    libinstall = env['libinstall']  
    env.Append(LIBPATH = [libinstall,]) # ksteube adds -L for building of libescript.so libfinley.so escriptcpp.so finleycpp.so  
    env.PrependENVPath('LD_LIBRARY_PATH', libinstall)  
    if env['PLATFORM'] == "win32":  
       env.PrependENVPath('PATH', libinstall)  
       env.PrependENVPath('PATH', env['boost_libs_path'])  
 except KeyError:  
    libinstall = None  
 try:  
    pyinstall = env['pyinstall']+'/esys' # all targets will install into pyinstall/esys but PYTHONPATH points at straight pyinstall so you go import esys.escript etc  
    env.PrependENVPath('PYTHONPATH', env['pyinstall'])  
 except KeyError:  
    pyinstall = None  
 try:  
    dodebug = env['dodebug']  
 except KeyError:  
    dodebug = None  
 try:  
    useMPI = env['useMPI']  
 except KeyError:  
    useMPI = None  
 try:  
    cc_defines = env['cc_defines']  
    env.Append(CPPDEFINES = cc_defines)  
 except KeyError:  
    pass  
365    
366  if dodebug:  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
   if useMPI:  
367      try:      try:
368        flags = env['cc_flags_debug_MPI']          env['ENV'][key] = os.environ[key]
       env.Append(CCFLAGS = flags)  
369      except KeyError:      except KeyError:
370        pass          env['ENV'][key] = 1
371    else:  
372    env_export=env['env_export']
373    env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP'])
374    
375    for key in set(env_export):
376      try:      try:
377        flags = env['cc_flags_debug']          env['ENV'][key] = os.environ[key]
       env.Append(CCFLAGS = flags)  
378      except KeyError:      except KeyError:
       pass  
 else:  
   if useMPI:  
    try:  
      flags = env['cc_flags_MPI']  
      env.Append(CCFLAGS = flags)  
    except KeyError:  
       pass  
   else:  
    try:  
       flags = env['cc_flags']  
       env.Append(CCFLAGS = flags)  
    except KeyError:  
       pass  
 if dodebug:  
    if useMPI:  
      try:  
         flags = env['cxx_flags_debug_MPI']  
         env.Append(CXXFLAGS = flags)  
      except KeyError:  
         pass  
    else:  
      try:  
         flags = env['cxx_flags_debug']  
         env.Append(CXXFLAGS = flags)  
      except KeyError:  
379          pass          pass
 else:  
    if useMPI:  
      try:  
         flags = env['cxx_flags_MPI']  
         env.Append(CXXFLAGS = flags)  
      except KeyError:  
         pass  
    else:  
      try:  
         flags = env['cxx_flags']  
         env.Append(CXXFLAGS = flags)  
      except KeyError:  
         pass  
 try:  
    flags = env['ar_flags']  
    env.Append(ARFLAGS = flags)  
 except KeyError:  
    ar_flags = None  
 try:  
    sys_libs = env['sys_libs']  
 except KeyError:  
    sys_libs = []  
   
 try:  
    tar_flags = env['tar_flags']  
    env.Replace(TARFLAGS = tar_flags)  
 except KeyError:  
    pass  
   
 try:  
    includes = env['mkl_path']  
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
   
 try:  
    lib_path = env['mkl_lib_path']  
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
   
 if useMPI:  
    mkl_libs = []  
 else:  
    try:  
       mkl_libs = env['mkl_libs']  
    except KeyError:  
       mkl_libs = []  
380    
381  try:  try:
382     includes = env['scsl_path']      env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
    env.Append(CPPPATH = [includes,])  
383  except KeyError:  except KeyError:
384     pass      pass
385    
386  try:  if IS_OSX:
    lib_path = env['scsl_lib_path']  
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
   
 if useMPI:  
   try:  
     scsl_libs = env['scsl_libs_MPI']  
   except KeyError:  
     scsl_libs = []  
 else:  
387    try:    try:
388      scsl_libs = env['scsl_libs']      env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
389    except KeyError:    except KeyError:
390      scsl_libs = []      pass
391    
 try:  
    includes = env['umf_path']  
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
392    
393  try:  # these shouldn't be needed
394     lib_path = env['umf_lib_path']  #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
395     env.Append(LIBPATH = [lib_path,])  #    try:
396  except KeyError:  #        env['ENV'][key] = os.environ[key]
397     pass  #    except KeyError:
398    #        pass
 if useMPI:  
     umf_libs = []  
 else:  
    try:  
       umf_libs = env['umf_libs']  
    except KeyError:  
       umf_libs = []  
399    
400  try:  try:
401     includes = env['ufc_path']      env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
    env.Append(CPPPATH = [includes,])  
402  except KeyError:  except KeyError:
403     pass      pass
404    
405  try:  ######################## Add some custom builders ############################
    includes = env['amd_path']  
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
406    
407  try:  if env['pythoncmd']=='python':
408     lib_path = env['amd_lib_path']      py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
   
 if useMPI:  
     amd_libs = []  
409  else:  else:
410     try:      py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
411        amd_libs = env['amd_libs']  env.Append(BUILDERS = {'PyCompile' : py_builder});
    except KeyError:  
       amd_libs = []  
   
 try:  
    includes = env['blas_path']  
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
   
 try:  
    lib_path = env['blas_lib_path']  
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
   
 try:  
    blas_libs = env['blas_libs']  
 except KeyError:  
    blas_libs = []  
   
 try:  
    useNetCDF = env['useNetCDF']  
 except KeyError:  
    useNetCDF = 'yes'  
    pass  
412    
413  if not useNetCDF == 'yes':  runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
414     print "Warning: Installation is not configured with netCDF. Some I/O function may not be available."  env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
     
 if useNetCDF == 'yes':  
    try:  
       includes = env['netCDF_path']  
       env.Append(CPPPATH = [includes,])  
    except KeyError:  
       pass  
   
    try:  
       lib_path = env['netCDF_lib_path']  
       if IS_WINDOWS_PLATFORM: env['ENV']['PATH']+=";"+lib_path  
       env.Append(LIBPATH = [ lib_path, ])  
    except KeyError:  
       pass  
   
    try:  
       netCDF_libs = env['netCDF_libs']  
    except KeyError:  
       netCDF_libs = [ ]  
 else:  
    netCDF_libs=[ ]  
415    
416  try:  runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
417     includes = env['boost_path']  env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
 try:  
    lib_path = env['boost_libs_path']  
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
 try:  
    boost_libs = env['boost_libs']  
 except KeyError:  
    boost_libs = None  
 try:  
    includes = env['python_path']  
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
 try:  
    lib_path = env['python_lib_path']  
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
 try:  
    python_libs = env['python_libs']  
 except KeyError:  
    python_libs = None  
 try:  
    doxygen_path = env['doxygen_path']  
 except KeyError:  
    doxygen_path = None  
 try:  
    epydoc_path = env['epydoc_path']  
 except KeyError:  
    epydoc_path = None  
 try:  
    includes = env['papi_path']  
    env.Append(CPPPATH = [includes,])  
 except KeyError:  
    pass  
 try:  
    lib_path = env['papi_lib_path']  
    env.Append(LIBPATH = [lib_path,])  
 except KeyError:  
    pass  
 try:  
    papi_libs = env['papi_libs']  
 except KeyError:  
    papi_libs = None  
418    
419    epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
420    env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
421    
422  try:  ############################ Dependency checks ###############################
    src_zipfile = env.File(env['src_zipfile'])  
 except KeyError:  
    src_zipfile = None  
 try:  
    test_zipfile = env.File(env['test_zipfile'])  
 except KeyError:  
    test_zipfile = None  
 try:  
    examples_zipfile = env.File(env['examples_zipfile'])  
 except KeyError:  
    examples_zipfile = None  
423    
424  try:  ######## Compiler
425     src_tarfile = env.File(env['src_tarfile'])  env=checkCompiler(env)
 except KeyError:  
    src_tarfile = None  
 try:  
    test_tarfile = env.File(env['test_tarfile'])  
 except KeyError:  
    test_tarfile = None  
 try:  
    examples_tarfile = env.File(env['examples_tarfile'])  
 except KeyError:  
    examples_tarfile = None  
426    
427  try:  ######## Python headers & library (required)
428     guide_pdf = env.File(env['guide_pdf'])  env=checkPython(env)
429  except KeyError:  
430     guide_pdf = None  ######## boost & boost-python (required)
431    env=checkBoost(env)
432    
433    ######## numpy (required) and numpy headers (optional)
434    env=checkNumpy(env)
435    
436    ######## CppUnit (required for tests)
437    env=checkCppUnit(env)
438    
439    ######## optional python modules (sympy, pyproj)
440    env=checkOptionalModules(env)
441    
442    ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
443    env=checkOptionalLibraries(env)
444    
445    ######## PDFLaTeX (for documentation)
446    env=checkPDFLatex(env)
447    
448    # keep some of our install paths first in the list for the unit tests
449    env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
450    env.PrependENVPath('PYTHONPATH', prefix)
451    env['ENV']['ESCRIPT_ROOT'] = prefix
452    
453    if not env['verbose']:
454        env['CXXCOMSTR'] = "Compiling $TARGET"
455        env['SHCXXCOMSTR'] = "Compiling $TARGET"
456        env['ARCOMSTR'] = "Linking $TARGET"
457        env['LINKCOMSTR'] = "Linking $TARGET"
458        env['SHLINKCOMSTR'] = "Linking $TARGET"
459        env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
460        env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
461        env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
462        env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
463        #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
464    
465    ####################### Configure the subdirectories #########################
466    
467    # remove obsolete files
468    if not env['usempi']:
469        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
470        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
471    
472    from grouptest import *
473    TestGroups=[]
474    
475    # keep an environment without warnings-as-errors
476    dodgy_env=env.Clone()
477    
478    # now add warnings-as-errors flags. This needs to be done after configuration
479    # because the scons test files have warnings in them
480    if ((fatalwarning != '') and (env['werror'])):
481        env.Append(CCFLAGS = fatalwarning)
482    
483    Export(
484      ['env',
485       'dodgy_env',
486       'IS_WINDOWS',
487       'TestGroups'
488      ]
489    )
490    
491  try:  env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
492     guide_html_index = env.File('index.htm',env['guide_html'])  env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
493  except KeyError:  env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
494     guide_html_index = None  env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
495    
496    #This will pull in the escriptcore/py_src and escriptcore/test
497    env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
498    #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
499    env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
500    env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
501    env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
502    env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
503    env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
504    env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
505    env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
506    env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
507    env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
508    env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
509    env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
510    
511    
512    ######################## Populate the buildvars file #########################
513    
514    write_buildvars(env)
515    
516    ################### Targets to build and install libraries ###################
517    
518    target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
519    env.Alias('target_init', [target_init])
520    # delete buildvars upon cleanup
521    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
522    
523    # The headers have to be installed prior to build in order to satisfy
524    # #include <paso/Common.h>
525    env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
526    env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
527    
528    env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
529    env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
530    
531    env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
532    env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
533    
534    env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
535    env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
536    
537    env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
538    env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
539    
540    env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
541    env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
542    
543    env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
544    env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
545    
546    env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
547    env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
548    
549    env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
550    env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
551    
552    # Now gather all the above into some easy targets: build_all and install_all
553    build_all_list = []
554    build_all_list += ['build_esysUtils']
555    build_all_list += ['build_paso']
556    build_all_list += ['build_escript']
557    build_all_list += ['build_pasowrap']
558    build_all_list += ['build_dudley']
559    build_all_list += ['build_finley']
560    build_all_list += ['build_ripley']
561    build_all_list += ['build_weipa']
562    if not IS_WINDOWS: build_all_list += ['build_escriptreader']
563    if env['usempi']:   build_all_list += ['build_pythonMPI']
564    build_all_list += ['build_escriptconvert']
565    env.Alias('build_all', build_all_list)
566    
567    install_all_list = []
568    install_all_list += ['target_init']
569    install_all_list += ['install_esysUtils']
570    install_all_list += ['install_paso']
571    install_all_list += ['install_escript']
572    install_all_list += ['install_pasowrap']
573    install_all_list += ['install_dudley']
574    install_all_list += ['install_finley']
575    install_all_list += ['install_ripley']
576    install_all_list += ['install_weipa']
577    if not IS_WINDOWS: install_all_list += ['install_escriptreader']
578    install_all_list += ['install_downunder_py']
579    install_all_list += ['install_modellib_py']
580    install_all_list += ['install_pycad_py']
581    if env['usempi']:   install_all_list += ['install_pythonMPI']
582    install_all_list += ['install_escriptconvert']
583    env.Alias('install_all', install_all_list)
584    
585    # Default target is install
586    env.Default('install_all')
587    
588    ################## Targets to build and run the test suite ###################
589    
590    if not env['cppunit']:
591        test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
592        env.Alias('run_tests', test_msg)
593        env.Alias('build_tests', '')
594    env.Alias('run_tests', ['install_all'])
595    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
596    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
597    env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
598    
599    ##################### Targets to build the documentation #####################
600    
601    env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
602    env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
603    env.Alias('docs', ['basedocs', 'sphinxdoc'])
604    env.Alias('release_prep', ['docs', 'install_all'])
605    env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
606    
607    # The test scripts are always generated, this target allows us to
608    # generate the testscripts without doing a full build
609    env.Alias('testscripts',[])
610    
611    if not IS_WINDOWS:
612        generateTestScripts(env, TestGroups)
613    
614    
615    
616    ######################## Summarize our environment ###########################
617    def print_summary():
618        print("")
619        print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
620        print("Escript/Finley revision %s"%global_revision)
621        print("  Install prefix:  %s"%env['prefix'])
622        print("          Python:  %s"%sysconfig.PREFIX)
623        print("           boost:  %s"%env['boost_prefix'])
624        if env['numpy_h']:
625            print("           numpy:  YES (with headers)")
626        else:
627            print("           numpy:  YES (without headers)")
628        if env['usempi']:
629            print("             MPI:  YES (flavour: %s)"%env['mpi'])
630        else:
631            print("             MPI:  DISABLED")
632        if env['uselapack']:
633            print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
634        else:
635            print("          LAPACK:  DISABLED")
636        d_list=[]
637        e_list=[]
638        for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
639            if env[i]: e_list.append(i)
640            else: d_list.append(i)
641        for i in e_list:
642            print("%16s:  YES"%i)
643        for i in d_list:
644            print("%16s:  DISABLED"%i)
645        if env['cppunit']:
646            print("         CppUnit:  FOUND")
647        else:
648            print("         CppUnit:  NOT FOUND")
649        if env['gmsh']=='m':
650            print("            gmsh:  FOUND, MPI-ENABLED")
651        elif env['gmsh']=='s':
652            print("            gmsh:  FOUND")
653        else:
654            print("            gmsh:  NOT FOUND")
655    
656        if ((fatalwarning != '') and (env['werror'])):
657            print("  Treating warnings as errors")
658        else:
659            print("  NOT treating warnings as errors")
660        print("")
661        for w in env['warnings']:
662            print("WARNING: %s"%w)
663    
664  try:  atexit.register(print_summary)
    api_epydoc = env.Dir(env['api_epydoc'])  
 except KeyError:  
    api_epydoc = None  
665    
 # Zipgets  
 env.Default(libinstall)  
 env.Default(incinstall)  
 env.Default(pyinstall)  
 env.Alias('release_src',[ src_zipfile, src_tarfile ])  
 env.Alias('release_tests',[ test_zipfile, test_tarfile])  
 env.Alias('release_examples',[ examples_zipfile, examples_tarfile])  
 env.Alias('api_epydoc',api_epydoc)  
 env.Alias('guide_pdf', guide_pdf)  
 env.Alias('docs',[ 'release_examples', 'guide_pdf', guide_html_index, api_epydoc])  
 env.Alias('release', ['release_src', 'release_tests', 'docs'])  
 env.Alias('build_tests')    # target to build all C++ tests  
 env.Alias('build_py_tests') # target to build all python tests  
 env.Alias('build_all_tests', [ 'build_tests', 'build_py_tests' ] ) # target to build all python tests  
 env.Alias('run_tests', 'build_tests')   # target to run all C++ test  
 env.Alias('py_tests', 'build_py_tests') # taget to run all released python tests  
 env.Alias('all_tests', ['run_tests', 'py_tests']) # target to run all C++ and released python tests  
   
 # Python install - esys __init__.py  
 init_target = env.Command(pyinstall+'/__init__.py', None, Touch('$TARGET'))  
 env.Alias(init_target)  
   
 # Allow sconscripts to see the env  
 Export(["IS_WINDOWS_PLATFORM", "env", "incinstall", "libinstall", "pyinstall", "dodebug", "mkl_libs", "scsl_libs", "umf_libs", "amd_libs", "blas_libs", "netCDF_libs", "useNetCDF",  
     "boost_libs", "python_libs", "doxygen_path", "epydoc_path", "papi_libs",  
         "sys_libs", "test_zipfile", "src_zipfile", "test_tarfile", "src_tarfile", "examples_tarfile", "examples_zipfile",  
         "guide_pdf", "guide_html_index", "api_epydoc", "useMPI" ])  
   
 # End initialisation section  
 # Begin configuration section  
 # adds this file and the scons option directore to the source tar  
 release_srcfiles=[env.File('SConstruct'),]+[ env.File(x) for x in glob.glob('scons/*.py') ]  
 release_testfiles=[env.File('README_TESTS'),]  
 env.Zip(src_zipfile, release_srcfiles)  
 env.Zip(test_zipfile, release_testfiles)  
 try:  
    env.Tar(src_tarfile, release_srcfiles)  
    env.Tar(test_tarfile, release_testfiles)  
 except AttributeError:  
    pass  
 # Insert new components to be build here  
 # FIXME: might be nice to replace this verbosity with a list of targets and some  
 # FIXME: nifty python to create the lengthy but very similar env.Sconscript lines  
 # Third Party libraries  
 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  
 # C/C++ Libraries  
 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0)  
 # bruce is removed for now as it doesn't really do anything  
 # env.SConscript(dirs = ['bruce/src'], build_dir='build/$PLATFORM/bruce', duplicate=0)  
 env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0)  
 env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0)  
 env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0)  
 env.SConscript(dirs = ['modellib/py_src'], build_dir='build/$PLATFORM/modellib', duplicate=0)  
 env.SConscript(dirs = ['doc'], build_dir='build/$PLATFORM/doc', duplicate=0)  
 env.SConscript(dirs = ['pyvisi/py_src'], build_dir='build/$PLATFORM/pyvisi', duplicate=0)  
 env.SConscript(dirs = ['pycad/py_src'], build_dir='build/$PLATFORM/pycad', duplicate=0)  
   
 # added by Ben Cumming  
 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  
 #env.SConscript(dirs = ['../test'], build_dir='../test/build', duplicate=0)  

Legend:
Removed from v.1141  
changed lines
  Added in v.4640

  ViewVC Help
Powered by ViewVC 1.1.26