/[escript]/trunk/SConstruct
ViewVC logotype

Diff of /trunk/SConstruct

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

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

  ViewVC Help
Powered by ViewVC 1.1.26