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

Diff of /branches/refine/SConstruct

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

trunk/SConstruct revision 2027 by phornby, Tue Nov 11 02:52:24 2008 UTC branches/refine/SConstruct revision 3658 by jfenwick, Fri Nov 11 06:55:48 2011 UTC
# Line 1  Line 1 
   
1  ########################################################  ########################################################
2  #  #
3  # Copyright (c) 2003-2008 by University of Queensland  # Copyright (c) 2003-2010 by University of Queensland
4  # Earth Systems Science Computational Center (ESSCC)  # Earth Systems Science Computational Center (ESSCC)
5  # http://www.uq.edu.au/esscc  # http://www.uq.edu.au/esscc
6  #  #
# Line 11  Line 10 
10  #  #
11  ########################################################  ########################################################
12    
13    EnsureSConsVersion(0,98,1)
14    EnsurePythonVersion(2,5)
15    
16  EnsureSConsVersion(0,96,91)  import sys, os, platform, re
17  EnsurePythonVersion(2,3)  from distutils import sysconfig
18    from site_init import *
19  import sys, os, re, socket  
20    # Version number to check for in options file. Increment when new features are
21  # Add our extensions  # added or existing options changed.
22  if os.path.isdir('scons'): sys.path.append('scons')  REQUIRED_OPTS_VERSION=201
 import scons_extensions  
   
 # Use /usr/lib64 if available, else /usr/lib  
 usr_lib = '/usr/lib'  
 if os.path.isfile('/usr/lib64/libc.so'): usr_lib = '/usr/lib64'  
   
 # The string python2.4 or python2.5  
 python_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])  
23    
24  # MS Windows support, many thanks to PH  # MS Windows support, many thanks to PH
25  IS_WINDOWS_PLATFORM = (os.name== "nt")  IS_WINDOWS = (os.name == 'nt')
26    
27  prefix = ARGUMENTS.get('prefix', Dir('#.').abspath)  ########################## Determine options file ############################
28    # 1. command line
29    # 2. scons/<hostname>_options.py
30    # 3. name as part of a cluster
31    options_file=ARGUMENTS.get('options_file', None)
32    if not options_file:
33        ext_dir = os.path.join(os.getcwd(), 'scons')
34        hostname = platform.node().split('.')[0]
35        for name in hostname, effectiveName(hostname):
36            mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
37            options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
38            if os.path.isfile(options_file): break
39    
 # Read configuration options from file scons/<hostname>_options.py  
 hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0])  
 tmp = os.path.join("scons",hostname+"_options.py")  
 options_file = ARGUMENTS.get('options_file', tmp)  
40  if not os.path.isfile(options_file):  if not os.path.isfile(options_file):
41    options_file = False      print("\nWARNING:\nOptions file %s" % options_file)
42    print "Options file not found (expected '%s')" % tmp      print("not found! Default options will be used which is most likely suboptimal.")
43  else:      print("It is recommended that you copy one of the TEMPLATE files in the scons/")
44    print "Options file is", options_file      print("subdirectory and customize it to your needs.\n")
45        options_file = None
46  # Load options file and command-line arguments  
47  opts = Options(options_file, ARGUMENTS)  ############################### Build options ################################
48    
49  ############ Load build options ################################  default_prefix='/usr'
50    mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
51  opts.AddOptions(  lapack_flavours=('none', 'clapack', 'mkl')
52  # Where to install esys stuff  
53    ('prefix', 'where everything will be installed',                       Dir('#.').abspath),  vars = Variables(options_file, ARGUMENTS)
54    ('incinstall', 'where the esys headers will be installed',             os.path.join(Dir('#.').abspath,'include')),  vars.AddVariables(
55    ('bininstall', 'where the esys binaries will be installed',            os.path.join(prefix,'bin')),    PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
56    ('libinstall', 'where the esys libraries will be installed',           os.path.join(prefix,'lib')),    PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
57    ('pyinstall', 'where the esys python modules will be installed',       os.path.join(prefix,'esys')),    PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
58  # Compilation options    BoolVariable('verbose', 'Output full compile/link lines', False),
59    BoolOption('dodebug', 'For backwards compatibility', 'no'),  # Compiler/Linker options
60    BoolOption('usedebug', 'Do you want a debug build?', 'no'),    ('cc', 'Path to C compiler', 'default'),
61    BoolOption('usevtk', 'Do you want to use VTK?', 'yes'),    ('cxx', 'Path to C++ compiler', 'default'),
62    ('options_file', 'File of paths/options. Default: scons/<hostname>_options.py', options_file),    ('cc_flags', 'Base C/C++ compiler flags', 'default'),
63    ('win_cc_name', 'windows C compiler name if needed', 'msvc'),    ('cc_optim', 'Additional C/C++ flags for a non-debug build', 'default'),
64    # The strings -DDEFAULT_ get replaced by scons/<hostname>_options.py or by defaults below    ('cc_debug', 'Additional C/C++ flags for a debug build', 'default'),
65    ('cc_flags', 'C compiler flags to use', '-DEFAULT_1'),    ('cc_extra', 'Extra C compiler flags', ''),
66    ('cc_optim', 'C compiler optimization flags to use', '-DEFAULT_2'),    ('cxx_extra', 'Extra C++ compiler flags', ''),
   ('cc_debug', 'C compiler debug flags to use', '-DEFAULT_3'),  
   ('omp_optim', 'OpenMP compiler flags to use (Release build)', '-DEFAULT_4'),  
   ('omp_debug', 'OpenMP compiler flags to use (Debug build)', '-DEFAULT_5'),  
   ('omp_libs', 'OpenMP compiler libraries to link with', '-DEFAULT_6'),  
   ('cc_extra', 'Extra C/C++ flags', ''),  
67    ('ld_extra', 'Extra linker flags', ''),    ('ld_extra', 'Extra linker flags', ''),
68    ('sys_libs', 'System libraries to link with', []),    BoolVariable('werror','Treat compiler warnings as errors', True),
69    ('ar_flags', 'Static library archiver flags to use', ''),    BoolVariable('debug', 'Compile with debug flags', False),
70    BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'),    BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
71    BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'),    ('omp_flags', 'OpenMP compiler flags', 'default'),
72    BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'),    ('omp_ldflags', 'OpenMP linker flags', 'default'),
73  # Python  # Mandatory libraries
74    ('python_path', 'Path to Python includes', '/usr/include/'+python_version),    ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
75    ('python_lib_path', 'Path to Python libs', usr_lib),    ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
76    ('python_libs', 'Python libraries to link with', [python_version]),  # Mandatory for tests
77    ('python_cmd', 'Python command', 'python'),    ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
78  # Boost    ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
79    ('boost_path', 'Path to Boost includes', '/usr/include'),  # Optional libraries and options
80    ('boost_lib_path', 'Path to Boost libs', usr_lib),    EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
81    ('boost_libs', 'Boost libraries to link with', ['boost_python']),    ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
82  # NetCDF    ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
83    BoolOption('usenetcdf', 'switch on/off the usage of netCDF', 'yes'),    BoolVariable('netcdf', 'Enable netCDF file support', False),
84    ('netCDF_path', 'Path to netCDF includes', '/usr/include'),    ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
85    ('netCDF_lib_path', 'Path to netCDF libs', usr_lib),    ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
86    ('netCDF_libs', 'netCDF C++ libraries to link with', ['netcdf_c++', 'netcdf']),    BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
87  # MPI    ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
88    BoolOption('useMPI', 'For backwards compatibility', 'no'),    ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
89    BoolOption('usempi', 'Compile parallel version using MPI', 'no'),    BoolVariable('papi', 'Enable PAPI', False),
90    ('MPICH_IGNORE_CXX_SEEK', 'name of macro to ignore MPI settings of C++ SEEK macro (for MPICH)' , 'MPICH_IGNORE_CXX_SEEK'),    ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
   ('mpi_path', 'Path to MPI includes', '/usr/include'),  
   ('mpi_run', 'mpirun name' , 'mpiexec -np 1'),  
   ('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib),  
   ('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']),  
 # ParMETIS  
   BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'),  
   ('parmetis_path', 'Path to ParMETIS includes', '/usr/include'),  
   ('parmetis_lib_path', 'Path to ParMETIS library', usr_lib),  
   ('parmetis_libs', 'ParMETIS library to link with', ['parmetis', 'metis']),  
 # PAPI  
   BoolOption('usepapi', 'switch on/off the usage of PAPI', 'no'),  
   ('papi_path', 'Path to PAPI includes', '/usr/include'),  
   ('papi_lib_path', 'Path to PAPI libs', usr_lib),  
91    ('papi_libs', 'PAPI libraries to link with', ['papi']),    ('papi_libs', 'PAPI libraries to link with', ['papi']),
92    BoolOption('papi_instrument_solver', 'use PAPI in Solver.c to instrument each iteration of the solver', False),    BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
93  # MKL    BoolVariable('mkl', 'Enable the Math Kernel Library', False),
94    BoolOption('usemkl', 'switch on/off the usage of MKL', 'no'),    ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
95    ('mkl_path', 'Path to MKL includes', '/sw/sdev/cmkl/10.0.2.18/include'),    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
96    ('mkl_lib_path', 'Path to MKL libs', '/sw/sdev/cmkl/10.0.2.18/lib/em64t'),    BoolVariable('umfpack', 'Enable UMFPACK', False),
97    ('mkl_libs', 'MKL libraries to link with', ['mkl_solver', 'mkl_em64t', 'guide', 'pthread']),    ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
98  # UMFPACK    ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
99    BoolOption('useumfpack', 'switch on/off the usage of UMFPACK', 'no'),    BoolVariable('boomeramg', 'Enable BoomerAMG', False),
100    ('ufc_path', 'Path to UFconfig includes', '/usr/include/suitesparse'),    ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
101    ('umf_path', 'Path to UMFPACK includes', '/usr/include/suitesparse'),    ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
102    ('umf_lib_path', 'Path to UMFPACK libs', usr_lib),    EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
103    ('umf_libs', 'UMFPACK libraries to link with', ['umfpack']),    ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
104  # AMD (used by UMFPACK)    ('lapack_libs', 'LAPACK libraries to link with', []),
105    ('amd_path', 'Path to AMD includes', '/usr/include/suitesparse'),    BoolVariable('silo', 'Enable the Silo file format in weipa', False),
106    ('amd_lib_path', 'Path to AMD libs', usr_lib),    ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
107    ('amd_libs', 'AMD libraries to link with', ['amd']),    ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
108  # BLAS (used by UMFPACK)    BoolVariable('visit', 'Enable the VisIt simulation interface', False),
109    ('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'),    ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
110    ('blas_lib_path', 'Path to BLAS libs', usr_lib),    ('visit_libs', 'VisIt libraries to link with', ['simV2']),
111    ('blas_libs', 'BLAS libraries to link with', ['blas']),    BoolVariable('pyvisi', 'Enable pyvisi (deprecated, requires VTK module)', False),
112  # An option for specifying the compiler tools set (see windows branch).    BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
113    ('tools_names', 'allow control over the tools in the env setup', ['intelc'])  # Advanced settings
114      #dudley_assemble_flags = -funroll-loops      to actually do something
115      ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
116      ('refine_assemble_flags', 'compiler flags for some dudley optimisations', ''),
117      # To enable passing function pointers through python
118      BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
119      # An option for specifying the compiler tools (see windows branch)
120      ('tools_names', 'Compiler tools to use', ['default']),
121      ('env_export', 'Environment variables to be passed to tools',[]),
122      EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
123      EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
124      # finer control over library building, intel aggressive global optimisation
125      # works with dynamic libraries on windows.
126      ('build_shared', 'Build dynamic libraries only', False),
127      ('sys_libs', 'Extra libraries to link with', []),
128      ('escript_opts_version', 'Version of options file (do not specify on command line)'),
129      ('SVN_VERSION', 'Do not use from options file', -2),
130  )  )
131    
132  ############ Specify which compilers to use ####################  ##################### Create environment and help text #######################
   
 # intelc uses regular expressions improperly and emits a warning about  
 # failing to find the compilers.  This warning can be safely ignored.  
133    
134  if IS_WINDOWS_PLATFORM:  # Intel's compiler uses regular expressions improperly and emits a warning
135        env = Environment(options = opts)  # about failing to find the compilers. This warning can be safely ignored.
       env = Environment(tools = ['default'] + env['tools_names'],  
                         options = opts)  
 else:  
    if socket.gethostname().split('.')[0] == 'service0':  
       env = Environment(tools = ['default', 'intelc'], options = opts)  
    elif os.uname()[4]=='ia64':  
       env = Environment(tools = ['default', 'intelc'], options = opts)  
       if env['CXX'] == 'icpc':  
          env['LINK'] = env['CXX'] # version >=9 of intel c++ compiler requires use of icpc to link in C++ runtimes (icc does not)  
    else:  
       env = Environment(tools = ['default'], options = opts)  
 Help(opts.GenerateHelpText(env))  
   
 ############ Fill in compiler options if not set above #########  
   
 # Backwards compatibility: allow dodebug=yes and useMPI=yes  
 if env['dodebug']: env['usedebug'] = 1  
 if env['useMPI']: env['usempi'] = 1  
   
 # Default compiler options (override allowed in hostname_options.py, but should not be necessary)  
 # For both C and C++ you get: cc_flags and either the optim flags or debug flags  
   
 if env["CC"] == "icc":  
   # Intel compilers  
   cc_flags      = "-fPIC -ansi -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"  
   cc_optim      = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias"  
   cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"  
   omp_optim     = "-openmp -openmp_report0"  
   omp_debug     = "-openmp -openmp_report0"  
   omp_libs      = ['guide', 'pthread']  
   pedantic      = ""  
   fatalwarning      = ""        # Switch to turn warnings into errors  
 elif env["CC"] == "gcc":  
   # GNU C on any system  
   cc_flags      = "-Wall -fPIC -ansi -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER -isystem /usr/include/boost/ -isystem /usr/include/python2.5/ -Wno-sign-compare"  
   cc_optim      = "-O3"  
   cc_debug      = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"  
   omp_optim     = ""  
   omp_debug     = ""  
   omp_libs      = []  
   pedantic      = "-pedantic-errors -Wno-long-long"  
   fatalwarning      = "-Werror"  
 elif env["CC"] == "cl":  
   # Microsoft Visual C on Windows  
   cc_flags      = "/FD /EHsc /GR /wd4068 -D_USE_MATH_DEFINES -DDLL_NETCDF"  
   cc_optim      = "/O2 /Op /MT /W3"  
   cc_debug      = "/Od /RTC1 /MTd /ZI -DBOUNDS_CHECK"  
   omp_optim     = ""  
   omp_debug     = ""  
   omp_libs      = []  
   pedantic      = ""  
   fatalwarning      = ""  
 elif env["CC"] == "icl":  
   # intel C on Windows, see windows_intelc_options.py for a start  
   pedantic      = ""  
   fatalwarning      = ""  
   
 # If not specified in hostname_options.py then set them here  
 if env["cc_flags"]  == "-DEFAULT_1": env['cc_flags'] = cc_flags  
 if env["cc_optim"]  == "-DEFAULT_2": env['cc_optim'] = cc_optim  
 if env["cc_debug"]  == "-DEFAULT_3": env['cc_debug'] = cc_debug  
 if env["omp_optim"] == "-DEFAULT_4": env['omp_optim'] = omp_optim  
 if env["omp_debug"] == "-DEFAULT_5": env['omp_debug'] = omp_debug  
 if env["omp_libs"]  == "-DEFAULT_6": env['omp_libs'] = omp_libs  
   
 # OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty  
 if not env["useopenmp"]:  
   env['omp_optim'] = ""  
   env['omp_debug'] = ""  
   env['omp_libs'] = []  
   
 if env['omp_optim'] == "" and env['omp_debug'] == "": env["useopenmp"] = 0  
   
 ############ Copy environment variables into scons env #########  
   
 try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS']  
 except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1  
   
 try: env['ENV']['PATH'] = os.environ['PATH']  
 except KeyError: pass  
   
 try: env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']  
 except KeyError: pass  
   
 try: env['ENV']['C_INCLUDE_PATH'] = os.environ['C_INCLUDE_PATH']  
 except KeyError: pass  
   
 try: env['ENV']['CPLUS_INCLUDE_PATH'] = os.environ['CPLUS_INCLUDE_PATH']  
 except KeyError: pass  
   
 try: env['ENV']['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']  
 except KeyError: pass  
   
 try: env['ENV']['LIBRARY_PATH'] = os.environ['LIBRARY_PATH']  
 except KeyError: pass  
   
 try: env['ENV']['DISPLAY'] = os.environ['DISPLAY']  
 except KeyError: pass  
136    
137  try: env['ENV']['XAUTHORITY'] = os.environ['XAUTHORITY']  # PATH is needed so the compiler, linker and tools are found if they are not
138  except KeyError: pass  # in default locations.
139    env = Environment(tools = ['default'], options = vars,
140                      ENV = {'PATH': os.environ['PATH']})
141    if env['tools_names'] != 'default':
142        env = Environment(tools = ['default'] + env['tools_names'], options = vars,
143                          ENV = {'PATH' : os.environ['PATH']})
144    
145    if options_file:
146        opts_valid=False
147        if 'escript_opts_version' in env.Dictionary() and \
148            int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
149                opts_valid=True
150        if opts_valid:
151            print("Using options in %s." % options_file)
152        else:
153            print("\nOptions file %s" % options_file)
154            print("is outdated! Please update the file by examining one of the TEMPLATE")
155            print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
156            Exit(1)
157    
158    # Generate help text (scons -h)
159    Help(vars.GenerateHelpText(env))
160    
161    # Check for superfluous options
162    if len(vars.UnknownVariables())>0:
163        for k in vars.UnknownVariables():
164            print("Unknown option '%s'" % k)
165        Exit(1)
166    
167    #################### Make sure install directories exist #####################
168    
169    env['BUILD_DIR']=env['build_dir']
170    prefix=Dir(env['prefix']).abspath
171    env['incinstall'] = os.path.join(prefix, 'include')
172    env['bininstall'] = os.path.join(prefix, 'bin')
173    env['libinstall'] = os.path.join(prefix, 'lib')
174    env['pyinstall']  = os.path.join(prefix, 'esys')
175    if not os.path.isdir(env['bininstall']):
176        os.makedirs(env['bininstall'])
177    if not os.path.isdir(env['libinstall']):
178        os.makedirs(env['libinstall'])
179    if not os.path.isdir(env['pyinstall']):
180        os.makedirs(env['pyinstall'])
181    
182    env.Append(CPPPATH = [env['incinstall']])
183    env.Append(LIBPATH = [env['libinstall']])
184    
185    ################# Fill in compiler options if not set above ##################
186    
187    if env['cc'] != 'default': env['CC']=env['cc']
188    if env['cxx'] != 'default': env['CXX']=env['cxx']
189    
190    # version >=9 of intel C++ compiler requires use of icpc to link in C++
191    # runtimes (icc does not)
192    if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
193        env['LINK'] = env['CXX']
194    
195    # default compiler/linker options
196    cc_flags = ''
197    cc_optim = ''
198    cc_debug = ''
199    omp_flags = ''
200    omp_ldflags = ''
201    fatalwarning = '' # switch to turn warnings into errors
202    sysheaderopt = '' # how to indicate that a header is a system header
203    
204    # env['CC'] might be a full path
205    cc_name=os.path.basename(env['CC'])
206    
207    if cc_name == 'icc':
208        # Intel compiler
209        cc_flags    = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
210        cc_optim    = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"
211        cc_debug    = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
212        omp_flags   = "-openmp -openmp_report0"
213        omp_ldflags = "-openmp -openmp_report0 -lguide -lpthread"
214        fatalwarning = "-Werror"
215    elif cc_name[:3] == 'gcc':
216        # GNU C on any system
217        cc_flags     = "-pedantic -Wall -fPIC -ffast-math -Wno-unknown-pragmas -DBLOCKTIMER  -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
218        cc_optim     = "-O3"
219        cc_debug     = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
220        omp_flags    = "-fopenmp"
221        omp_ldflags  = "-fopenmp"
222        fatalwarning = "-Werror"
223        sysheaderopt = "-isystem"
224    elif cc_name == 'cl':
225        # Microsoft Visual C on Windows
226        cc_flags     = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
227        cc_optim     = "/O2 /Op /W3"
228        cc_debug     = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
229        fatalwarning = "/WX"
230    elif cc_name == 'icl':
231        # Intel C on Windows
232        cc_flags     = '/EHsc /GR /MD'
233        cc_optim     = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
234        cc_debug     = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
235        omp_flags    = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
236        omp_ldflags  = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
237    
238    # set defaults if not otherwise specified
239    if env['cc_flags']    == 'default': env['cc_flags'] = cc_flags
240    if env['cc_optim']    == 'default': env['cc_optim'] = cc_optim
241    if env['cc_debug']    == 'default': env['cc_debug'] = cc_debug
242    if env['omp_flags']   == 'default': env['omp_flags'] = omp_flags
243    if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
244    if env['cc_extra']  != '': env.Append(CFLAGS = env['cc_extra'])
245    if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
246    if env['ld_extra']  != '': env.Append(LINKFLAGS = env['ld_extra'])
247    
248    # set up the autolazy values
249    if env['forcelazy'] == 'on':
250        env.Append(CPPDEFINES=['FAUTOLAZYON'])
251    elif env['forcelazy'] == 'off':
252        env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
253    
254    # set up the collective resolve values
255    if env['forcecollres'] == 'on':
256        env.Append(CPPDEFINES=['FRESCOLLECTON'])
257    elif env['forcecollres'] == 'off':
258        env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
259    
260    # allow non-standard C if requested
261    if env['iknowwhatimdoing']:
262        env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
263    
264    # Disable OpenMP if no flags provided
265    if env['openmp'] and env['omp_flags'] == '':
266       print("OpenMP requested but no flags provided - disabling OpenMP!")
267       env['openmp'] = False
268    
269    if env['openmp']:
270        env.Append(CCFLAGS = env['omp_flags'])
271        if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
272    else:
273        env['omp_flags']=''
274        env['omp_ldflags']=''
275    
276  try: env['ENV']['HOME'] = os.environ['HOME']  # add debug/non-debug compiler flags
277  except KeyError: pass  if env['debug']:
278        env.Append(CCFLAGS = env['cc_debug'])
279    else:
280        env.Append(CCFLAGS = env['cc_optim'])
281    
282  # Configure for test suite  # always add cc_flags
283  env.PrependENVPath('PYTHONPATH', prefix)  env.Append(CCFLAGS = env['cc_flags'])
 env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall'])  
284    
285  env['ENV']['ESCRIPT_ROOT'] = prefix  # add system libraries
286    env.AppendUnique(LIBS = env['sys_libs'])
287    
 ############ Set up paths for Configure() ######################  
288    
289  # Make a copy of an environment  global_revision=ARGUMENTS.get('SVN_VERSION', None)
290  # Use env.Clone if available, but fall back on env.Copy for older version of scons  if global_revision:
291  def clone_env(env):      global_revision = re.sub(':.*', '', global_revision)
292    if 'Clone' in dir(env): return env.Clone()    # scons-0.98      global_revision = re.sub('[^0-9]', '', global_revision)
293    else:                   return env.Copy() # scons-0.96      if global_revision == '': global_revision='-2'
294    else:
295      # Get the global Subversion revision number for the getVersion() method
296      try:
297        global_revision = os.popen('svnversion -n .').read()
298        global_revision = re.sub(':.*', '', global_revision)
299        global_revision = re.sub('[^0-9]', '', global_revision)
300        if global_revision == '': global_revision='-2'
301      except:
302        global_revision = '-1'
303    env['svn_revision']=global_revision
304    env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
305    
306    if IS_WINDOWS:
307        if not env['build_shared']:
308            env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
309            env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
310    
311    ###################### Copy required environment vars ########################
312    
313    # Windows doesn't use LD_LIBRARY_PATH but PATH instead
314    if IS_WINDOWS:
315        LD_LIBRARY_PATH_KEY='PATH'
316        env['ENV']['LD_LIBRARY_PATH']=''
317    else:
318        LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
319    
320  # Add cc option -I<Escript>/trunk/include  # the following env variables are exported for the unit tests
 env.Append(CPPPATH      = [Dir('include')])  
321    
322  # Add cc option -L<Escript>/trunk/lib  for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
323  env.Append(LIBPATH      = [Dir(env['libinstall'])])      try:
324            env['ENV'][key] = os.environ[key]
325        except KeyError:
326            env['ENV'][key] = 1
327    
328    env_export=env['env_export']
329    env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','TMPDIR','TEMP','TMP'])
330    
331    for key in set(env_export):
332        try:
333            env['ENV'][key] = os.environ[key]
334        except KeyError:
335            pass
336    
337  if env['cc_extra'] != '': env.Append(CCFLAGS = env['cc_extra'])  try:
338  if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])      env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
339    except KeyError:
340        pass
341    
342    # these shouldn't be needed
343    #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
344    #    try:
345    #        env['ENV'][key] = os.environ[key]
346    #    except KeyError:
347    #        pass
348    
349  if env['usepedantic']: env.Append(CCFLAGS = pedantic)  try:
350        env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
351    except KeyError:
352        pass
353    
354  # MS Windows  ######################## Add some custom builders ############################
 if IS_WINDOWS_PLATFORM:  
   env.PrependENVPath('PATH',    [env['boost_lib_path']])  
   env.PrependENVPath('PATH',    [env['libinstall']])  
   if env['usenetcdf']:  
     env.PrependENVPath('PATH',  [env['netCDF_lib_path']])  
355    
356  env.Append(ARFLAGS = env['ar_flags'])  py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
357    env.Append(BUILDERS = {'PyCompile' : py_builder});
358    
359  # Get the global Subversion revision number for getVersion() method  runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
360  try:  env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
    global_revision = os.popen("svnversion -n .").read()  
    global_revision = re.sub(":.*", "", global_revision)  
    global_revision = re.sub("[^0-9]", "", global_revision)  
 except:  
    global_revision="-1"  
 if global_revision == "": global_revision="-2"  
 env.Append(CPPDEFINES = ["SVN_VERSION="+global_revision])  
361    
362  ############ numarray (required) ###############################  runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
363    env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
364    
365  try:  epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
366    from numarray import identity  env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
 except ImportError:  
   print "Cannot import numarray, you need to set your PYTHONPATH"  
   sys.exit(1)  
367    
368  ############ C compiler (required) #############################  ############################ Dependency checks ###############################
369    
370  # Create a Configure() environment for checking existence of required libraries and headers  # Create a Configure() environment to check for compilers and python
371  conf = Configure(clone_env(env))  conf = Configure(env.Clone())
372    
373  # Test that the compiler is working  ######## Test that the compilers work
374  if not conf.CheckFunc('printf'):  
375    print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC'])  if 'CheckCC' in dir(conf): # exists since scons 1.1.0
376    sys.exit(1)      if not conf.CheckCC():
377            print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
378            Exit(1)
379        if not conf.CheckCXX():
380            print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
381            Exit(1)
382    else:
383        if not conf.CheckFunc('printf', language='c'):
384            print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
385            Exit(1)
386        if not conf.CheckFunc('printf', language='c++'):
387            print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
388            Exit(1)
389    
390  if conf.CheckFunc('gethostname'):  if conf.CheckFunc('gethostname'):
391    conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])      conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
392    
393  ############ python libraries (required) #######################  ######## Python headers & library (required)
394    
395  conf.env.AppendUnique(CPPPATH       = [env['python_path']])  python_inc_path=sysconfig.get_python_inc()
396  conf.env.AppendUnique(LIBPATH       = [env['python_lib_path']])  if IS_WINDOWS:
397  conf.env.AppendUnique(LIBS      = [env['python_libs']])      python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
398    elif env['PLATFORM']=='darwin':
399        python_lib_path=sysconfig.get_config_var('LIBPL')
400    else:
401        python_lib_path=sysconfig.get_config_var('LIBDIR')
402    #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
403    if IS_WINDOWS:
404        python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
405    else:
406        python_libs=['python'+sysconfig.get_python_version()]
407    
408  conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path'])  # The wrapper script needs to find these libs  if sysheaderopt == '':
409        conf.env.AppendUnique(CPPPATH = [python_inc_path])
410    else:
411        conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])
412    
413    conf.env.AppendUnique(LIBPATH = [python_lib_path])
414    conf.env.AppendUnique(LIBS = python_libs)
415    # The wrapper script needs to find the libs
416    conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)
417    
418  if not conf.CheckCHeader('Python.h'):  if not conf.CheckCHeader('Python.h'):
419    print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path'])      print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))
420    sys.exit(1)      Exit(1)
421  if not conf.CheckFunc('Py_Main'):  if not conf.CheckFunc('Py_Exit'):
422    print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path'])      print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))
423    sys.exit(1)      Exit(1)
   
 ############ boost (required) ##################################  
   
 conf.env.AppendUnique(CPPPATH       = [env['boost_path']])  
 conf.env.AppendUnique(LIBPATH       = [env['boost_lib_path']])  
 conf.env.AppendUnique(LIBS      = [env['boost_libs']])  
   
 conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path'])   # The wrapper script needs to find these libs  
   
 if not conf.CheckCXXHeader('boost/python.hpp'):  
   print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path'])  
   sys.exit(1)  
 if not conf.CheckFunc('PyObject_SetAttr'):  
   print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path'])  
   sys.exit(1)  
424    
425  # Commit changes to environment  # Commit changes to environment
426  env = conf.Finish()  env = conf.Finish()
427    
428  ############ VTK (optional) ####################################  ######## boost (required)
   
 if env['usevtk']:  
   try:  
     import vtk  
     env['usevtk'] = 1  
   except ImportError:  
     env['usevtk'] = 0  
   
 # Add VTK to environment env if it was found  
 if env['usevtk']:  
   env.Append(CPPDEFINES = ['USE_VTK'])  
429    
430  ############ NetCDF (optional) #################################  boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')
431    if sysheaderopt == '':
432  conf = Configure(clone_env(env))      env.AppendUnique(CPPPATH = [boost_inc_path])
   
 if env['usenetcdf']:  
   conf.env.AppendUnique(CPPPATH = [env['netCDF_path']])  
   conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']])  
   conf.env.AppendUnique(LIBS    = [env['netCDF_libs']])  
   conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path'])    # The wrapper script needs to find these libs  
   
 if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0  
 if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0  
   
 # Add NetCDF to environment env if it was found  
 if env['usenetcdf']:  
   env = conf.Finish()  
   env.Append(CPPDEFINES = ['USE_NETCDF'])  
433  else:  else:
434    conf.Finish()      # This is required because we can't -isystem /usr/include since it breaks
435        # std includes
436  ############ PAPI (optional) ###################################      if os.path.normpath(boost_inc_path) == '/usr/include':
437            conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])
438        else:
439            env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])
440    
441    env.AppendUnique(LIBPATH = [boost_lib_path])
442    env.AppendUnique(LIBS = env['boost_libs'])
443    env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)
444    
445  # Start a new configure environment that reflects what we've already found  ######## numpy (required)
 conf = Configure(clone_env(env))  
446    
447  if env['usepapi']:  try:
448    conf.env.AppendUnique(CPPPATH = [env['papi_path']])      from numpy import identity
449    conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']])  except ImportError:
450    conf.env.AppendUnique(LIBS    = [env['papi_libs']])      print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
451    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path'])  # The wrapper script needs to find these libs      Exit(1)
452    
453  if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0  ######## CppUnit (required for tests)
 if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0  
454    
455  # Add PAPI to environment env if it was found  try:
456  if env['usepapi']:      cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
457    env = conf.Finish()      env.AppendUnique(CPPPATH = [cppunit_inc_path])
458    env.Append(CPPDEFINES = ['BLOCKPAPI'])      env.AppendUnique(LIBPATH = [cppunit_lib_path])
459  else:      env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
460    conf.Finish()      env['cppunit']=True
461    except:
462  ############ MKL (optional) ####################################      env['cppunit']=False
463    
464  # Start a new configure environment that reflects what we've already found  ######## VTK (optional)
 conf = Configure(clone_env(env))  
465    
466  if env['usemkl']:  if env['pyvisi']:
467    conf.env.AppendUnique(CPPPATH = [env['mkl_path']])      try:
468    conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']])          import vtk
469    conf.env.AppendUnique(LIBS    = [env['mkl_libs']])          env['pyvisi'] = True
470    conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path'])   # The wrapper script needs to find these libs      except ImportError:
471            print("Cannot import vtk, disabling pyvisi.")
472            env['pyvisi'] = False
473    
474    ######## netCDF (optional)
475    
476    netcdf_inc_path=''
477    netcdf_lib_path=''
478    if env['netcdf']:
479        netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')
480        env.AppendUnique(CPPPATH = [netcdf_inc_path])
481        env.AppendUnique(LIBPATH = [netcdf_lib_path])
482        env.AppendUnique(LIBS = env['netcdf_libs'])
483        env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)
484        env.Append(CPPDEFINES = ['USE_NETCDF'])
485    
486    ######## PAPI (optional)
487    
488    papi_inc_path=''
489    papi_lib_path=''
490    if env['papi']:
491        papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')
492        env.AppendUnique(CPPPATH = [papi_inc_path])
493        env.AppendUnique(LIBPATH = [papi_lib_path])
494        env.AppendUnique(LIBS = env['papi_libs'])
495        env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)
496        env.Append(CPPDEFINES = ['BLOCKPAPI'])
497    
498    ######## MKL (optional)
499    
500    mkl_inc_path=''
501    mkl_lib_path=''
502    if env['mkl']:
503        mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')
504        env.AppendUnique(CPPPATH = [mkl_inc_path])
505        env.AppendUnique(LIBPATH = [mkl_lib_path])
506        env.AppendUnique(LIBS = env['mkl_libs'])
507        env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)
508        env.Append(CPPDEFINES = ['MKL'])
509    
510    ######## UMFPACK (optional)
511    
512    umfpack_inc_path=''
513    umfpack_lib_path=''
514    if env['umfpack']:
515        umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')
516        env.AppendUnique(CPPPATH = [umfpack_inc_path])
517        env.AppendUnique(LIBPATH = [umfpack_lib_path])
518        env.AppendUnique(LIBS = env['umfpack_libs'])
519        env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)
520        env.Append(CPPDEFINES = ['UMFPACK'])
521    
522    ######## LAPACK (optional)
523    
524    if env['lapack']=='mkl' and not env['mkl']:
525        print("mkl_lapack requires MKL!")
526        Exit(1)
527    
528    env['uselapack'] = env['lapack']!='none'
529    lapack_inc_path=''
530    lapack_lib_path=''
531    if env['uselapack']:
532        header='clapack.h'
533        if env['lapack']=='mkl':
534            env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])
535            header='mkl_lapack.h'
536        lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')
537        env.AppendUnique(CPPPATH = [lapack_inc_path])
538        env.AppendUnique(LIBPATH = [lapack_lib_path])
539        env.AppendUnique(LIBS = env['lapack_libs'])
540        env.Append(CPPDEFINES = ['USE_LAPACK'])
541    
542    ######## Silo (optional)
543    
544    silo_inc_path=''
545    silo_lib_path=''
546    if env['silo']:
547        silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')
548        env.AppendUnique(CPPPATH = [silo_inc_path])
549        env.AppendUnique(LIBPATH = [silo_lib_path])
550        # Note that we do not add the libs since they are only needed for the
551        # weipa library and tools.
552        #env.AppendUnique(LIBS = [env['silo_libs']])
553    
554    ######## VSL random numbers (optional)
555    if env['vsl_random']:
556        env.Append(CPPDEFINES = ['MKLRANDOM'])
557    
558    ######## VisIt (optional)
559    
560    visit_inc_path=''
561    visit_lib_path=''
562    if env['visit']:
563        visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')
564        env.AppendUnique(CPPPATH = [visit_inc_path])
565        env.AppendUnique(LIBPATH = [visit_lib_path])
566    
567    ######## MPI (optional)
568    
569    if env['mpi']=='no':
570        env['mpi']='none'
571    
572    env['usempi'] = env['mpi']!='none'
573    mpi_inc_path=''
574    mpi_lib_path=''
575    if env['usempi']:
576        mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')
577        env.AppendUnique(CPPPATH = [mpi_inc_path])
578        env.AppendUnique(LIBPATH = [mpi_lib_path])
579        env.AppendUnique(LIBS = env['mpi_libs'])
580        env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)
581        env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])
582        # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
583        # On the other hand MPT and OpenMPI don't define the latter so we have to
584        # do that here
585        if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
586            env.Append(CPPDEFINES = ['MPI_INCLUDED'])
587    
588    ######## BOOMERAMG (optional)
589    
590    if env['mpi'] == 'none': env['boomeramg'] = False
591    
592    boomeramg_inc_path=''
593    boomeramg_lib_path=''
594    if env['boomeramg']:
595        boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
596        env.AppendUnique(CPPPATH = [boomeramg_inc_path])
597        env.AppendUnique(LIBPATH = [boomeramg_lib_path])
598        env.AppendUnique(LIBS = env['boomeramg_libs'])
599        env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
600        env.Append(CPPDEFINES = ['BOOMERAMG'])
601    
602    ######## ParMETIS (optional)
603    
604    if not env['usempi']: env['parmetis'] = False
605    
606    parmetis_inc_path=''
607    parmetis_lib_path=''
608    if env['parmetis']:
609        parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')
610        env.AppendUnique(CPPPATH = [parmetis_inc_path])
611        env.AppendUnique(LIBPATH = [parmetis_lib_path])
612        env.AppendUnique(LIBS = env['parmetis_libs'])
613        env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
614        env.Append(CPPDEFINES = ['USE_PARMETIS'])
615    
616  if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0  ######## gmsh (optional, for tests)
 if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0  
617    
618  # Add MKL to environment env if it was found  try:
619  if env['usemkl']:      import subprocess
620    env = conf.Finish()      p=subprocess.Popen(['gmsh', '-info'], stderr=subprocess.PIPE)
621    env.Append(CPPDEFINES = ['MKL'])      _,e=p.communicate()
622        if e.split().count("MPI"):
623            env['gmsh']='m'
624        else:
625            env['gmsh']='s'
626    except OSError:
627        env['gmsh']=False
628    
629    ######## PDFLaTeX (for documentation)
630    if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
631        env['pdflatex']=True
632  else:  else:
633    conf.Finish()      env['pdflatex']=False
634    
635  ############ UMFPACK (optional) ################################  ######################## Summarize our environment ###########################
636    
637  # Start a new configure environment that reflects what we've already found  # keep some of our install paths first in the list for the unit tests
638  conf = Configure(clone_env(env))  env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
639    env.PrependENVPath('PYTHONPATH', prefix)
640  if env['useumfpack']:  env['ENV']['ESCRIPT_ROOT'] = prefix
   conf.env.AppendUnique(CPPPATH = [env['ufc_path']])  
   conf.env.AppendUnique(CPPPATH = [env['umf_path']])  
   conf.env.AppendUnique(LIBPATH = [env['umf_lib_path']])  
   conf.env.AppendUnique(LIBS    = [env['umf_libs']])  
   conf.env.AppendUnique(CPPPATH = [env['amd_path']])  
   conf.env.AppendUnique(LIBPATH = [env['amd_lib_path']])  
   conf.env.AppendUnique(LIBS    = [env['amd_libs']])  
   conf.env.AppendUnique(CPPPATH = [env['blas_path']])  
   conf.env.AppendUnique(LIBPATH = [env['blas_lib_path']])  
   conf.env.AppendUnique(LIBS    = [env['blas_libs']])  
   conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path'])   # The wrapper script needs to find these libs  
   conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path'])   # The wrapper script needs to find these libs  
   conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path'])  # The wrapper script needs to find these libs  
   
 if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0  
 if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0  
641    
642  # Add UMFPACK to environment env if it was found  if not env['verbose']:
643  if env['useumfpack']:      env['CCCOMSTR'] = "Compiling $TARGET"
644    env = conf.Finish()      env['CXXCOMSTR'] = "Compiling $TARGET"
645    env.Append(CPPDEFINES = ['UMFPACK'])      env['SHCCCOMSTR'] = "Compiling $TARGET"
646        env['SHCXXCOMSTR'] = "Compiling $TARGET"
647        env['ARCOMSTR'] = "Linking $TARGET"
648        env['LINKCOMSTR'] = "Linking $TARGET"
649        env['SHLINKCOMSTR'] = "Linking $TARGET"
650        env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
651        env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
652        env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
653        env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
654        #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
655    
656    print("")
657    print("*** Config Summary (see config.log and lib/buildvars for details) ***")
658    print("Escript/Finley revision %s"%global_revision)
659    print("  Install prefix:  %s"%env['prefix'])
660    print("          Python:  %s"%sysconfig.PREFIX)
661    print("           boost:  %s"%env['boost_prefix'])
662    print("           numpy:  YES")
663    if env['usempi']:
664        print("             MPI:  YES (flavour: %s)"%env['mpi'])
665  else:  else:
666    conf.Finish()      print("             MPI:  DISABLED")
667    if env['uselapack']:
668  ############ Add the compiler flags ############################      print("          LAPACK:  YES (flavour: %s)"%env['lapack'])
   
 # Enable debug by choosing either cc_debug or cc_optim  
 if env['usedebug']:  
   env.Append(CCFLAGS        = env['cc_debug'])  
   env.Append(CCFLAGS        = env['omp_debug'])  
669  else:  else:
670    env.Append(CCFLAGS        = env['cc_optim'])      print("          LAPACK:  DISABLED")
671    env.Append(CCFLAGS        = env['omp_optim'])  d_list=[]
672    e_list=[]
673  # Always use cc_flags  for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
674  env.Append(CCFLAGS      = env['cc_flags'])      if env[i]: e_list.append(i)
675  env.Append(LIBS         = [env['omp_libs']])      else: d_list.append(i)
676    for i in e_list:
677  ############ MPI (optional) ####################################      print("%16s:  YES"%i)
678    for i in d_list:
679  # Create a modified environment for MPI programs (identical to env if usempi=no)      print("%16s:  DISABLED"%i)
680  env_mpi = clone_env(env)  if env['cppunit']:
681        print("         CppUnit:  FOUND")
 # Start a new configure environment that reflects what we've already found  
 conf = Configure(clone_env(env_mpi))  
   
 if env_mpi['usempi']:  
   conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']])  
   conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']])  
   conf.env.AppendUnique(LIBS    = [env_mpi['mpi_libs']])  
   conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path'])   # The wrapper script needs to find these libs  
   
 if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0  
 if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0  
   
 # Add MPI to environment env_mpi if it was found  
 if env_mpi['usempi']:  
   env_mpi = conf.Finish()  
   env_mpi.Append(CPPDEFINES = ['PASO_MPI', 'MPI_NO_CPPBIND', env_mpi['MPICH_IGNORE_CXX_SEEK']])  
682  else:  else:
683    conf.Finish()      print("         CppUnit:  NOT FOUND")
684    if env['gmsh']=='m':
685  env['usempi'] = env_mpi['usempi']      print("            gmsh:  FOUND, MPI-ENABLED")
686    elif env['gmsh']=='s':
687  ############ ParMETIS (optional) ###############################      print("            gmsh:  FOUND")
   
 # Start a new configure environment that reflects what we've already found  
 conf = Configure(clone_env(env_mpi))  
   
 if not env_mpi['usempi']: env_mpi['useparmetis'] = 0  
   
 if env_mpi['useparmetis']:  
   conf.env.AppendUnique(CPPPATH = [env_mpi['parmetis_path']])  
   conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']])  
   conf.env.AppendUnique(LIBS    = [env_mpi['parmetis_libs']])  
   conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path'])  # The wrapper script needs to find these libs  
   
 if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0  
 if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0  
   
 # Add ParMETIS to environment env_mpi if it was found  
 if env_mpi['useparmetis']:  
   env_mpi = conf.Finish()  
   env_mpi.Append(CPPDEFINES = ['USE_PARMETIS'])  
688  else:  else:
689    conf.Finish()      print("            gmsh:  NOT FOUND")
690    print("      vsl_random:  %s"%env['vsl_random'])
691  env['useparmetis'] = env_mpi['useparmetis']      
692    if ((fatalwarning != '') and (env['werror'])):
693  ############ Now we switch on Warnings as errors ###############      print("  Treating warnings as errors")
694    else:
695  #this needs to be done after configuration because the scons test files have warnings in them      print("  NOT treating warnings as errors")
696    print("")
 if ((fatalwarning != "") and (env['usewarnings'])):  
   env.Append(CCFLAGS        = fatalwarning)  
   env_mpi.Append(CCFLAGS        = fatalwarning)  
   
 ############ Summarize our environment #########################  
697    
698  print ""  ####################### Configure the subdirectories #########################
 print "Summary of configuration (see ./config.log for information)"  
 print " Using python libraries"  
 print " Using numarray"  
 print " Using boost"  
 if env['usenetcdf']: print "    Using NetCDF"  
 else: print "   Not using NetCDF"  
 if env['usevtk']: print "   Using VTK"  
 else: print "   Not using VTK"  
 if env['usemkl']: print "   Using MKL"  
 else: print "   Not using MKL"  
 if env['useumfpack']: print "   Using UMFPACK"  
 else: print "   Not using UMFPACK"  
 if env['useopenmp']: print "    Using OpenMP"  
 else: print "   Not using OpenMP"  
 if env['usempi']: print "   Using MPI"  
 else: print "   Not using MPI"  
 if env['useparmetis']: print "  Using ParMETIS"  
 else: print "   Not using ParMETIS (requires MPI)"  
 if env['usepapi']: print "  Using PAPI"  
 else: print "   Not using PAPI"  
 if env['usedebug']: print " Compiling for debug"  
 else: print "   Not compiling for debug"  
 print " Installing in", prefix  
 if ((fatalwarning != "") and (env['usewarnings'])): print " Treating warnings as errors"  
 else: print "   Not treating warnings as errors"  
 print ""  
699    
700  ############ Delete option-dependent files #####################  from grouptest import *
701    
702  Execute(Delete(env['libinstall'] + "/Compiled.with.debug"))  TestGroups=[]
 Execute(Delete(env['libinstall'] + "/Compiled.with.mpi"))  
 Execute(Delete(env['libinstall'] + "/Compiled.with.openmp"))  
 if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI"))  
703    
704  ############ Add some custom builders ##########################  # keep an environment without warnings-as-errors
705    dodgy_env=env.Clone()
706    
707  py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)  # now add warnings-as-errors flags. This needs to be done after configuration
708  env.Append(BUILDERS = {'PyCompile' : py_builder});  # because the scons test files have warnings in them
709    if ((fatalwarning != '') and (env['werror'])):
710  runUnitTest_builder = Builder(action = scons_extensions.runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)      env.Append(CCFLAGS = fatalwarning)
 env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});  
   
 runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)  
 env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});  
   
 ############ Build the subdirectories ##########################  
711    
712  Export(  Export(
713    ["env",    ['env',
714     "env_mpi",     'dodgy_env',
715     "clone_env",     'IS_WINDOWS',
716     "IS_WINDOWS_PLATFORM"     'TestGroups'
717     ]    ]
718    )  )
   
 env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0)  
 env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', 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)  
 env.SConscript(dirs = ['pythonMPI/src'], build_dir='build/$PLATFORM/pythonMPI', duplicate=0)  
 env.SConscript(dirs = ['scripts'], build_dir='build/$PLATFORM/scripts', duplicate=0)  
719    
720  ############ Remember what optimizations we used ###############  env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
721    env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
722    env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
723    env.SConscript(dirs = ['escript/src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
724    env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
725    env.SConscript(dirs = ['refine/src'], variant_dir='$BUILD_DIR/$PLATFORM/refine', duplicate=0)
726    env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
727    env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
728    env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
729    env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
730    env.SConscript(dirs = ['pyvisi/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pyvisi', duplicate=0)
731    env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
732    env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
733    env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
734    
735    ######################## Populate the buildvars file #########################
736    
737    # remove obsolete file
738    if not env['usempi']:
739        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
740        Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
741    
742    # Try to extract the boost version from version.hpp
743    boosthpp=open(os.path.join(boost_inc_path, 'boost', 'version.hpp'))
744    boostversion='unknown'
745    try:
746        for line in boosthpp:
747            ver=re.match(r'#define BOOST_VERSION (\d+)',line)
748            if ver:
749                boostversion=ver.group(1)
750    except StopIteration:
751        pass
752    boosthpp.close()
753    
754    buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
755    buildvars.write("svn_revision="+str(global_revision)+"\n")
756    buildvars.write("prefix="+prefix+"\n")
757    buildvars.write("cc="+env['CC']+"\n")
758    buildvars.write("cxx="+env['CXX']+"\n")
759    buildvars.write("python="+sys.executable+"\n")
760    buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
761    buildvars.write("boost_inc_path="+boost_inc_path+"\n")
762    buildvars.write("boost_lib_path="+boost_lib_path+"\n")
763    buildvars.write("boost_version="+boostversion+"\n")
764    buildvars.write("debug=%d\n"%int(env['debug']))
765    buildvars.write("openmp=%d\n"%int(env['openmp']))
766    buildvars.write("mpi=%s\n"%env['mpi'])
767    buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
768    buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
769    buildvars.write("lapack=%s\n"%env['lapack'])
770    buildvars.write("pyvisi=%d\n"%env['pyvisi'])
771    buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
772    for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
773        buildvars.write("%s=%d\n"%(i, int(env[i])))
774        if env[i]:
775            buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))
776            buildvars.write("%s_lib_path=%s\n"%(i, eval(i+'_lib_path')))
777    buildvars.close()
778    
779  remember_list = []  ################### Targets to build and install libraries ###################
780    
781  if env['usedebug']:  target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
782    remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET'))  env.Alias('target_init', [target_init])
783    # delete buildvars upon cleanup
784    env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
785    
786  if env['usempi']:  # The headers have to be installed prior to build in order to satisfy
787    remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET'))  # #include <paso/Common.h>
788    env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
789    env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
790    
791  if env['omp_optim'] != '':  env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
792    remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET'))  env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
793    
794  env.Alias('remember_options', remember_list)  env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
795    env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escript_py'])
796    
797  ############ Targets to build and install libraries ############  env.Alias('build_refine', ['install_refine_headers', 'build_refine_lib', 'build_refinecpp_lib'])
798    env.Alias('install_refine', ['build_refine', 'install_refine_lib', 'install_refinecpp_lib', 'install_refine_py'])
799    
 target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET'))  
 env.Alias('target_init', [target_init])  
800    
801  # The headers have to be installed prior to build in order to satisfy #include <paso/Common.h>  env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
802  env.Alias('build_esysUtils', ['target_install_esysUtils_headers', 'target_esysUtils_a'])  env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
 env.Alias('install_esysUtils', ['build_esysUtils', 'target_install_esysUtils_a'])  
803    
804  env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a'])  env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
805  env.Alias('install_paso', ['build_paso', 'target_install_paso_a'])  env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
806    
807  env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so'])  env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
808  env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py'])  env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
809    
810  env.Alias('build_finley', ['target_install_finley_headers', 'target_finley_so', 'target_finleycpp_so'])  env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
811  env.Alias('install_finley', ['build_finley', 'target_install_finley_so', 'target_install_finleycpp_so', 'target_install_finley_py'])  env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
812    
813  # Now gather all the above into a couple easy targets: build_all and install_all  # Now gather all the above into some easy targets: build_all and install_all
814  build_all_list = []  build_all_list = []
815  build_all_list += ['build_esysUtils']  build_all_list += ['build_esysUtils']
816  build_all_list += ['build_paso']  build_all_list += ['build_paso']
817  build_all_list += ['build_escript']  build_all_list += ['build_escript']
818    build_all_list += ['build_refine']
819    build_all_list += ['build_dudley']
820  build_all_list += ['build_finley']  build_all_list += ['build_finley']
821  if env['usempi']:       build_all_list += ['target_pythonMPI_exe']  build_all_list += ['build_weipa']
822  if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper']  if not IS_WINDOWS: build_all_list += ['build_escriptreader']
823    if env['usempi']:   build_all_list += ['build_pythonMPI']
824    build_all_list += ['build_escriptconvert']
825  env.Alias('build_all', build_all_list)  env.Alias('build_all', build_all_list)
826    
827  install_all_list = []  install_all_list = []
# Line 637  install_all_list += ['target_init'] Line 829  install_all_list += ['target_init']
829  install_all_list += ['install_esysUtils']  install_all_list += ['install_esysUtils']
830  install_all_list += ['install_paso']  install_all_list += ['install_paso']
831  install_all_list += ['install_escript']  install_all_list += ['install_escript']
832    install_all_list += ['install_refine']
833    install_all_list += ['install_dudley']
834  install_all_list += ['install_finley']  install_all_list += ['install_finley']
835  install_all_list += ['target_install_pyvisi_py']  install_all_list += ['install_weipa']
836  install_all_list += ['target_install_modellib_py']  if not IS_WINDOWS: install_all_list += ['install_escriptreader']
837  install_all_list += ['target_install_pycad_py']  install_all_list += ['install_pyvisi_py']
838  if env['usempi']:       install_all_list += ['target_install_pythonMPI_exe']  install_all_list += ['install_modellib_py']
839  if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper']  install_all_list += ['install_pycad_py']
840  install_all_list += ['remember_options']  if env['usempi']:   install_all_list += ['install_pythonMPI']
841    install_all_list += ['install_escriptconvert']
842  env.Alias('install_all', install_all_list)  env.Alias('install_all', install_all_list)
843    
844  # Default target is install  # Default target is install
845  env.Default('install_all')  env.Default('install_all')
846    
847  ############ Targets to build and run the test suite ###########  ################## Targets to build and run the test suite ###################
   
 env.Alias('build_cppunittest', ['target_install_cppunittest_headers', 'target_cppunittest_a'])  
 env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a'])  
 env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a'])  
 env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests'])  
   
 ############ Targets to build the documentation ################  
848    
849  env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html'])  test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')
850    if not env['cppunit']:
851        env.Alias('run_tests', test_msg)
852    env.Alias('run_tests', ['install_all'])
853    env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
854    env.Alias('build_full',['install_all','build_tests','build_py_tests'])
855    env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
856    
857    ##################### Targets to build the documentation #####################
858    
859    env.Alias('api_epydoc','install_all')
860    env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf'])
861    env.Alias('release_prep', ['docs', 'install_all'])
862    
863    if not IS_WINDOWS:
864        try:
865            utest=open('utest.sh','w')
866            utest.write(GroupTest.makeHeader(env['PLATFORM']))
867            for tests in TestGroups:
868                utest.write(tests.makeString())
869            utest.close()
870            Execute(Chmod('utest.sh', 0755))
871            print("Generated utest.sh.")
872        except IOError:
873            print("Error attempting to write unittests file.")
874            Exit(1)
875    
876        # delete utest.sh upon cleanup
877        env.Clean('target_init', 'utest.sh')
878    
879        # Make sure that the escript wrapper is in place
880        if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
881            print("Copying escript wrapper.")
882            Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
883    

Legend:
Removed from v.2027  
changed lines
  Added in v.3658

  ViewVC Help
Powered by ViewVC 1.1.26