/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4078 - (hide annotations)
Fri Nov 16 07:50:49 2012 UTC (6 years, 11 months ago) by jfenwick
File size: 41179 byte(s)
Unit tests for binary install with no scons and no source tree.
Script for installing and testing a .deb within a chroot.



1 jfenwick 3982 ##############################################################################
2 jgs 214 #
3 jfenwick 3911 # Copyright (c) 2003-2012 by University of Queensland
4 jfenwick 3982 # http://www.uq.edu.au
5 ksteube 1811 #
6     # 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 jfenwick 3982 # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11     # Development since 2012 by School of Earth Sciences
12     #
13     ##############################################################################
14 jgs 455
15 jfenwick 3259 EnsureSConsVersion(0,98,1)
16     EnsurePythonVersion(2,5)
17 ksteube 1811
18 jfenwick 3259 import sys, os, platform, re
19     from distutils import sysconfig
20     from site_init import *
21 jfenwick 3851 from subprocess import PIPE, Popen
22 jgs 214
23 jfenwick 3259 # Version number to check for in options file. Increment when new features are
24     # added or existing options changed.
25 caltinay 3597 REQUIRED_OPTS_VERSION=201
26 ksteube 1705
27     # MS Windows support, many thanks to PH
28 jfenwick 3259 IS_WINDOWS = (os.name == 'nt')
29 gross 806
30 jfenwick 3259 ########################## Determine options file ############################
31     # 1. command line
32     # 2. scons/<hostname>_options.py
33     # 3. name as part of a cluster
34 jfenwick 2391 options_file=ARGUMENTS.get('options_file', None)
35     if not options_file:
36 jfenwick 3259 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 jfenwick 2391
43 ksteube 1866 if not os.path.isfile(options_file):
44 jfenwick 3259 print("\nWARNING:\nOptions file %s" % options_file)
45     print("not found! Default options will be used which is most likely suboptimal.")
46     print("It is recommended 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 ksteube 1217
50 jfenwick 3259 ############################### Build options ################################
51 gross 1149
52 jfenwick 3259 default_prefix='/usr'
53 jfenwick 3618 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
54 jfenwick 3259 lapack_flavours=('none', 'clapack', 'mkl')
55 jfenwick 2430
56 jfenwick 3259 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 caltinay 3349 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
61 jfenwick 3259 BoolVariable('verbose', 'Output full compile/link lines', False),
62     # Compiler/Linker options
63     ('cc', 'Path to C compiler', 'default'),
64     ('cxx', 'Path to C++ compiler', 'default'),
65     ('cc_flags', 'Base C/C++ compiler flags', 'default'),
66     ('cc_optim', 'Additional C/C++ flags for a non-debug build', 'default'),
67     ('cc_debug', 'Additional C/C++ flags for a debug build', 'default'),
68 caltinay 2967 ('cc_extra', 'Extra C compiler flags', ''),
69     ('cxx_extra', 'Extra C++ compiler flags', ''),
70 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
71 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
72     BoolVariable('debug', 'Compile with debug flags', False),
73     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
74     ('omp_flags', 'OpenMP compiler flags', 'default'),
75     ('omp_ldflags', 'OpenMP linker flags', 'default'),
76     # Mandatory libraries
77     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
78 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
79 caltinay 3597 # Mandatory for tests
80     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
81     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
82 jfenwick 3259 # Optional libraries and options
83     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
84     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
85     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
86     BoolVariable('netcdf', 'Enable netCDF file support', False),
87     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
88     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
89     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
90     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
91     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
92     BoolVariable('papi', 'Enable PAPI', False),
93     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
94 ksteube 1705 ('papi_libs', 'PAPI libraries to link with', ['papi']),
95 jfenwick 3259 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
96     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
97     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
98     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
99     BoolVariable('umfpack', 'Enable UMFPACK', False),
100     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
101     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
102 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
103     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
104     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
105 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
106     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
107     ('lapack_libs', 'LAPACK libraries to link with', []),
108     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
109     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
110 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
111 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
112     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
113     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
114 jfenwick 3506 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
115 jfenwick 3259 # Advanced settings
116     #dudley_assemble_flags = -funroll-loops to actually do something
117     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
118     # To enable passing function pointers through python
119     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
120     # An option for specifying the compiler tools (see windows branch)
121     ('tools_names', 'Compiler tools to use', ['default']),
122     ('env_export', 'Environment variables to be passed to tools',[]),
123     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
124     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
125     # finer control over library building, intel aggressive global optimisation
126     # works with dynamic libraries on windows.
127 caltinay 3598 ('build_shared', 'Build dynamic libraries only', False),
128 jfenwick 3259 ('sys_libs', 'Extra libraries to link with', []),
129     ('escript_opts_version', 'Version of options file (do not specify on command line)'),
130 jfenwick 3618 ('SVN_VERSION', 'Do not use from options file', -2),
131 jfenwick 3851 ('pythoncmd', 'which python to compile with','python'),
132 jfenwick 3892 ('usepython3', 'Is this a python3 build? (experimental)', False),
133     ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
134 jfenwick 3942 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
135     ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
136 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
137 robwdcock 682 )
138 phornby 1232
139 jfenwick 3259 ##################### Create environment and help text #######################
140 jfenwick 3078
141 jfenwick 3259 # Intel's compiler uses regular expressions improperly and emits a warning
142     # about failing to find the compilers. This warning can be safely ignored.
143 jfenwick 3078
144 caltinay 3319 # PATH is needed so the compiler, linker and tools are found if they are not
145     # in default locations.
146     env = Environment(tools = ['default'], options = vars,
147     ENV = {'PATH': os.environ['PATH']})
148 jfenwick 3967
149    
150     #set the vars for clang
151     def mkclang(env):
152     env['CC']='clang'
153     env['CXX']='clang++'
154    
155    
156 jfenwick 3259 if env['tools_names'] != 'default':
157 jfenwick 3967 zz=env['tools_names']
158     if 'clang' in zz:
159     zz.remove('clang')
160     zz.insert(0, mkclang)
161 caltinay 3319 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
162     ENV = {'PATH' : os.environ['PATH']})
163 jfenwick 3078
164 jfenwick 3259 if options_file:
165     opts_valid=False
166     if 'escript_opts_version' in env.Dictionary() and \
167     int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
168     opts_valid=True
169     if opts_valid:
170     print("Using options in %s." % options_file)
171     else:
172     print("\nOptions file %s" % options_file)
173     print("is outdated! Please update the file by examining one of the TEMPLATE")
174     print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
175     Exit(1)
176 jfenwick 3078
177 jfenwick 3259 # Generate help text (scons -h)
178     Help(vars.GenerateHelpText(env))
179 jfenwick 3078
180 jfenwick 3259 # Check for superfluous options
181 caltinay 3268 if len(vars.UnknownVariables())>0:
182     for k in vars.UnknownVariables():
183     print("Unknown option '%s'" % k)
184     Exit(1)
185 jfenwick 3078
186 jfenwick 3259 #################### Make sure install directories exist #####################
187 ksteube 1705
188 caltinay 4046 env['BUILD_DIR']=Dir(env['build_dir']).abspath
189 jfenwick 3259 prefix=Dir(env['prefix']).abspath
190     env['incinstall'] = os.path.join(prefix, 'include')
191     env['bininstall'] = os.path.join(prefix, 'bin')
192     env['libinstall'] = os.path.join(prefix, 'lib')
193     env['pyinstall'] = os.path.join(prefix, 'esys')
194 jfenwick 2604 if not os.path.isdir(env['bininstall']):
195     os.makedirs(env['bininstall'])
196     if not os.path.isdir(env['libinstall']):
197     os.makedirs(env['libinstall'])
198     if not os.path.isdir(env['pyinstall']):
199     os.makedirs(env['pyinstall'])
200    
201 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
202     env.Append(LIBPATH = [env['libinstall']])
203 jfenwick 2603
204 jfenwick 3259 ################# Fill in compiler options if not set above ##################
205 ksteube 1312
206 jfenwick 3259 if env['cc'] != 'default': env['CC']=env['cc']
207     if env['cxx'] != 'default': env['CXX']=env['cxx']
208 gross 1024
209 jfenwick 3259 # version >=9 of intel C++ compiler requires use of icpc to link in C++
210     # runtimes (icc does not)
211     if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
212     env['LINK'] = env['CXX']
213 phornby 1243
214 jfenwick 3259 # default compiler/linker options
215     cc_flags = ''
216     cc_optim = ''
217     cc_debug = ''
218     omp_flags = ''
219     omp_ldflags = ''
220     fatalwarning = '' # switch to turn warnings into errors
221     sysheaderopt = '' # how to indicate that a header is a system header
222 jfenwick 2130
223 jfenwick 3259 # env['CC'] might be a full path
224     cc_name=os.path.basename(env['CC'])
225 caltinay 2882
226 jfenwick 3259 if cc_name == 'icc':
227     # Intel compiler
228     cc_flags = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
229     cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"
230     cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
231     omp_flags = "-openmp -openmp_report0"
232 caltinay 3814 omp_ldflags = "-openmp -openmp_report0 -lpthread"
233 jfenwick 3259 fatalwarning = "-Werror"
234     elif cc_name[:3] == 'gcc':
235     # GNU C on any system
236     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"
237     cc_optim = "-O3"
238     cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
239     omp_flags = "-fopenmp"
240     omp_ldflags = "-fopenmp"
241     fatalwarning = "-Werror"
242     sysheaderopt = "-isystem"
243     elif cc_name == 'cl':
244     # Microsoft Visual C on Windows
245     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
246     cc_optim = "/O2 /Op /W3"
247     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
248     fatalwarning = "/WX"
249     elif cc_name == 'icl':
250     # Intel C on Windows
251     cc_flags = '/EHsc /GR /MD'
252     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
253     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
254     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
255     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
256 phornby 1243
257 jfenwick 3259 # set defaults if not otherwise specified
258     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
259     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
260     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
261     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
262     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
263     if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
264     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
265     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
266 jfenwick 2130
267 jfenwick 3961 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
268    
269 jfenwick 3892 if env['usepython3']:
270     env.Append(CPPDEFINES=['ESPYTHON3'])
271    
272 jfenwick 3259 # set up the autolazy values
273     if env['forcelazy'] == 'on':
274     env.Append(CPPDEFINES=['FAUTOLAZYON'])
275     elif env['forcelazy'] == 'off':
276     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
277 ksteube 1312
278 jfenwick 3259 # set up the collective resolve values
279     if env['forcecollres'] == 'on':
280     env.Append(CPPDEFINES=['FRESCOLLECTON'])
281     elif env['forcecollres'] == 'off':
282     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
283 jfenwick 2273
284 jfenwick 3259 # allow non-standard C if requested
285 jfenwick 2827 if env['iknowwhatimdoing']:
286 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
287 jfenwick 2827
288 jfenwick 3259 # Disable OpenMP if no flags provided
289     if env['openmp'] and env['omp_flags'] == '':
290     print("OpenMP requested but no flags provided - disabling OpenMP!")
291     env['openmp'] = False
292 gross 1160
293 jfenwick 3259 if env['openmp']:
294     env.Append(CCFLAGS = env['omp_flags'])
295     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
296     else:
297     env['omp_flags']=''
298     env['omp_ldflags']=''
299 ksteube 1312
300 jfenwick 3259 # add debug/non-debug compiler flags
301     if env['debug']:
302     env.Append(CCFLAGS = env['cc_debug'])
303 gross 2423 else:
304 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
305 gross 1163
306 jfenwick 3259 # always add cc_flags
307     env.Append(CCFLAGS = env['cc_flags'])
308 phornby 1243
309 jfenwick 3259 # add system libraries
310     env.AppendUnique(LIBS = env['sys_libs'])
311 gross 2363
312 jfenwick 3618
313     global_revision=ARGUMENTS.get('SVN_VERSION', None)
314     if global_revision:
315     global_revision = re.sub(':.*', '', global_revision)
316     global_revision = re.sub('[^0-9]', '', global_revision)
317     if global_revision == '': global_revision='-2'
318     else:
319     # Get the global Subversion revision number for the getVersion() method
320     try:
321 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
322     global_revision = re.sub(':.*', '', global_revision)
323     global_revision = re.sub('[^0-9]', '', global_revision)
324     if global_revision == '': global_revision='-2'
325 jfenwick 3618 except:
326 jfenwick 3259 global_revision = '-1'
327 caltinay 3271 env['svn_revision']=global_revision
328 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
329 gross 2363
330 jfenwick 3259 if IS_WINDOWS:
331 caltinay 3602 if not env['build_shared']:
332 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
333     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
334 gross 2363
335 jfenwick 3259 ###################### Copy required environment vars ########################
336 gross 2363
337 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
338     if IS_WINDOWS:
339     LD_LIBRARY_PATH_KEY='PATH'
340     env['ENV']['LD_LIBRARY_PATH']=''
341     else:
342     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
343 robwdcock 682
344 caltinay 3319 # the following env variables are exported for the unit tests
345 phornby 1244
346 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
347     try:
348     env['ENV'][key] = os.environ[key]
349     except KeyError:
350     env['ENV'][key] = 1
351 robwdcock 682
352 jfenwick 3259 env_export=env['env_export']
353 caltinay 3977 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP'])
354 robwdcock 682
355 jfenwick 3259 for key in set(env_export):
356     try:
357     env['ENV'][key] = os.environ[key]
358     except KeyError:
359     pass
360 ksteube 1312
361 jfenwick 3259 try:
362     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
363     except KeyError:
364     pass
365 ksteube 1312
366 jfenwick 3259 # these shouldn't be needed
367     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
368     # try:
369     # env['ENV'][key] = os.environ[key]
370     # except KeyError:
371     # pass
372 ksteube 1312
373 jfenwick 3259 try:
374     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
375     except KeyError:
376     pass
377 ksteube 1312
378 jfenwick 3259 ######################## Add some custom builders ############################
379 ksteube 1312
380 jfenwick 3851 if env['pythoncmd']=='python':
381     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
382     else:
383 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
384 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
385 gross 2423
386 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
387     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
388 gross 2423
389 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
390     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
391 ksteube 1756
392 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
393     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
394 ksteube 817
395 jfenwick 3259 ############################ Dependency checks ###############################
396 phornby 1246
397 jfenwick 3259 # Create a Configure() environment to check for compilers and python
398     conf = Configure(env.Clone())
399 phornby 1634
400 jfenwick 3259 ######## Test that the compilers work
401 ksteube 1705
402 jfenwick 3259 if 'CheckCC' in dir(conf): # exists since scons 1.1.0
403     if not conf.CheckCC():
404     print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
405     Exit(1)
406     if not conf.CheckCXX():
407     print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
408     Exit(1)
409     else:
410     if not conf.CheckFunc('printf', language='c'):
411     print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
412     Exit(1)
413     if not conf.CheckFunc('printf', language='c++'):
414     print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
415     Exit(1)
416 ksteube 1705
417 phornby 1789 if conf.CheckFunc('gethostname'):
418 jfenwick 3259 conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
419 gross 806
420 jfenwick 3259 ######## Python headers & library (required)
421 gross 806
422 jfenwick 3942 #First we check to see if the config file has specified
423     ##Where to find the filae. Ideally, this should be automatic
424     #But we need to deal with the case where python is not in its INSTALL
425     #Directory
426 jfenwick 3892 # Use the python scons is running
427     if env['pythoncmd']=='python':
428     python_inc_path=sysconfig.get_python_inc()
429     if IS_WINDOWS:
430     python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
431     elif env['PLATFORM']=='darwin':
432     python_lib_path=sysconfig.get_config_var('LIBPL')
433     else:
434     python_lib_path=sysconfig.get_config_var('LIBDIR')
435    
436     #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
437     if IS_WINDOWS:
438     python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
439     else:
440     python_libs=['python'+sysconfig.get_python_version()]
441    
442     #if we want to use a python other than the one scons is running
443 jfenwick 3259 else:
444 jfenwick 3892 initstring='from __future__ import print_function;from distutils import sysconfig;'
445     if env['pythonlibname']!='':
446     python_libs=env['pythonlibname']
447     else: # work it out by calling python
448     if IS_WINDOWS:
449     cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
450     else:
451     cmd='print("python"+sysconfig.get_python_version())'
452     p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
453     python_libs=p.stdout.readline()
454     if env['usepython3']: # This is to convert unicode str into py2 string
455     python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought
456     p.wait()
457     python_libs=python_libs.strip()
458 jfenwick 2130
459 jfenwick 3892
460     # Now we know whether we are using python3 or not
461     p=Popen([env['pythoncmd'], '-c', initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
462     python_inc_path=p.stdout.readline()
463     if env['usepython3']:
464 jfenwick 3851 python_inc_path=python_inc_path.encode()
465 jfenwick 3892 p.wait()
466     python_inc_path=python_inc_path.strip()
467     if IS_WINDOWS:
468 jfenwick 3851 cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
469 jfenwick 3892 elif env['PLATFORM']=='darwin':
470 jfenwick 3851 cmd="sysconfig.get_config_var(\"LIBPL\")"
471 jfenwick 3892 else:
472 jfenwick 3851 cmd="sysconfig.get_config_var(\"LIBDIR\")"
473    
474 jfenwick 3892 p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
475     python_lib_path=p.stdout.readline()
476     if env['usepython3']:
477     python_lib_path=python_lib_path.decode()
478     p.wait()
479     python_lib_path=python_lib_path.strip()
480 jfenwick 3851
481 jfenwick 3942 #Check for an override from the config file.
482     #Ideally, this should be automatic
483     #But we need to deal with the case where python is not in its INSTALL
484     #Directory
485     if env['pythonlibpath']!='':
486     python_lib_path=env['pythonlibpath']
487    
488     if env['pythonincpath']!='':
489     python_inc_path=env['pythonincpath']
490    
491    
492 jfenwick 3259 if sysheaderopt == '':
493     conf.env.AppendUnique(CPPPATH = [python_inc_path])
494 jfenwick 2130 else:
495 jfenwick 3259 conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])
496 jfenwick 2130
497 jfenwick 3259 conf.env.AppendUnique(LIBPATH = [python_lib_path])
498     conf.env.AppendUnique(LIBS = python_libs)
499     # The wrapper script needs to find the libs
500     conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)
501 gross 805
502 ksteube 1705 if not conf.CheckCHeader('Python.h'):
503 jfenwick 3259 print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))
504     Exit(1)
505 gross 2284 if not conf.CheckFunc('Py_Exit'):
506 jfenwick 3259 print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))
507     Exit(1)
508 gross 805
509 jfenwick 3892 ## reuse conf to check for numpy header (optional)
510 caltinay 3896 if env['usepython3']:
511     # FIXME: This is until we can work out how to make the checks in python 3
512     conf.env['numpy_h']=False
513     else:
514     if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
515     conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
516     conf.env['numpy_h']=True
517     else:
518     conf.env['numpy_h']=False
519 caltinay 3784
520 ksteube 1705 # Commit changes to environment
521     env = conf.Finish()
522 ksteube 1312
523 jfenwick 3259 ######## boost (required)
524 ksteube 1312
525 jfenwick 3259 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')
526     if sysheaderopt == '':
527     env.AppendUnique(CPPPATH = [boost_inc_path])
528 ksteube 1705 else:
529 jfenwick 3259 # This is required because we can't -isystem /usr/include since it breaks
530     # std includes
531     if os.path.normpath(boost_inc_path) == '/usr/include':
532     conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])
533     else:
534     env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])
535 ksteube 1312
536 jfenwick 3259 env.AppendUnique(LIBPATH = [boost_lib_path])
537     env.AppendUnique(LIBS = env['boost_libs'])
538     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)
539 ksteube 1705
540 jfenwick 3259 ######## numpy (required)
541 ksteube 1705
542 caltinay 3975 if not detectModule(env, 'numpy'):
543     print("Cannot import numpy. If it is installed try setting your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
544     Exit(1)
545 ksteube 1705
546 caltinay 3597 ######## CppUnit (required for tests)
547    
548     try:
549     cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
550     env.AppendUnique(CPPPATH = [cppunit_inc_path])
551     env.AppendUnique(LIBPATH = [cppunit_lib_path])
552     env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
553     env['cppunit']=True
554     except:
555     env['cppunit']=False
556    
557 caltinay 3975 ######## sympy (optional)
558    
559     if detectModule(env, 'sympy'):
560     env['sympy'] = True
561     else:
562     print("Cannot import sympy. Symbolic toolbox and nonlinear PDEs will not be available.")
563     env['sympy'] = False
564    
565 jfenwick 3259 ######## netCDF (optional)
566 gross 806
567 jfenwick 3259 netcdf_inc_path=''
568     netcdf_lib_path=''
569     if env['netcdf']:
570     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')
571     env.AppendUnique(CPPPATH = [netcdf_inc_path])
572     env.AppendUnique(LIBPATH = [netcdf_lib_path])
573     env.AppendUnique(LIBS = env['netcdf_libs'])
574     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)
575     env.Append(CPPDEFINES = ['USE_NETCDF'])
576 gross 806
577 jfenwick 3259 ######## PAPI (optional)
578 gross 805
579 jfenwick 3259 papi_inc_path=''
580     papi_lib_path=''
581     if env['papi']:
582     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')
583     env.AppendUnique(CPPPATH = [papi_inc_path])
584     env.AppendUnique(LIBPATH = [papi_lib_path])
585     env.AppendUnique(LIBS = env['papi_libs'])
586     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)
587     env.Append(CPPDEFINES = ['BLOCKPAPI'])
588 phornby 1246
589 jfenwick 3259 ######## MKL (optional)
590 jfenwick 2787
591 jfenwick 3259 mkl_inc_path=''
592     mkl_lib_path=''
593     if env['mkl']:
594     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')
595     env.AppendUnique(CPPPATH = [mkl_inc_path])
596     env.AppendUnique(LIBPATH = [mkl_lib_path])
597     env.AppendUnique(LIBS = env['mkl_libs'])
598     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)
599     env.Append(CPPDEFINES = ['MKL'])
600 gross 950
601 jfenwick 3259 ######## UMFPACK (optional)
602 ksteube 1705
603 jfenwick 3259 umfpack_inc_path=''
604     umfpack_lib_path=''
605     if env['umfpack']:
606     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')
607     env.AppendUnique(CPPPATH = [umfpack_inc_path])
608     env.AppendUnique(LIBPATH = [umfpack_lib_path])
609     env.AppendUnique(LIBS = env['umfpack_libs'])
610     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)
611     env.Append(CPPDEFINES = ['UMFPACK'])
612 ksteube 1705
613 jfenwick 3259 ######## LAPACK (optional)
614 ksteube 1705
615 jfenwick 3259 if env['lapack']=='mkl' and not env['mkl']:
616     print("mkl_lapack requires MKL!")
617     Exit(1)
618 ksteube 1705
619 jfenwick 3259 env['uselapack'] = env['lapack']!='none'
620     lapack_inc_path=''
621     lapack_lib_path=''
622 jfenwick 2742 if env['uselapack']:
623 jfenwick 3259 header='clapack.h'
624     if env['lapack']=='mkl':
625     env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])
626     header='mkl_lapack.h'
627     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')
628     env.AppendUnique(CPPPATH = [lapack_inc_path])
629     env.AppendUnique(LIBPATH = [lapack_lib_path])
630     env.AppendUnique(LIBS = env['lapack_libs'])
631     env.Append(CPPDEFINES = ['USE_LAPACK'])
632 jfenwick 2742
633 jfenwick 3259 ######## Silo (optional)
634 jfenwick 2742
635 jfenwick 3259 silo_inc_path=''
636     silo_lib_path=''
637     if env['silo']:
638     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')
639     env.AppendUnique(CPPPATH = [silo_inc_path])
640     env.AppendUnique(LIBPATH = [silo_lib_path])
641     # Note that we do not add the libs since they are only needed for the
642     # weipa library and tools.
643     #env.AppendUnique(LIBS = [env['silo_libs']])
644 ksteube 1459
645 jfenwick 3506 ######## VSL random numbers (optional)
646     if env['vsl_random']:
647     env.Append(CPPDEFINES = ['MKLRANDOM'])
648    
649 jfenwick 3259 ######## VisIt (optional)
650 robwdcock 682
651 jfenwick 3259 visit_inc_path=''
652     visit_lib_path=''
653     if env['visit']:
654     visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')
655     env.AppendUnique(CPPPATH = [visit_inc_path])
656     env.AppendUnique(LIBPATH = [visit_lib_path])
657 gross 707
658 jfenwick 3259 ######## MPI (optional)
659 jfenwick 2232
660 jfenwick 3618 if env['mpi']=='no':
661     env['mpi']='none'
662    
663 jfenwick 3259 env['usempi'] = env['mpi']!='none'
664     mpi_inc_path=''
665     mpi_lib_path=''
666     if env['usempi']:
667     mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')
668     env.AppendUnique(CPPPATH = [mpi_inc_path])
669     env.AppendUnique(LIBPATH = [mpi_lib_path])
670     env.AppendUnique(LIBS = env['mpi_libs'])
671     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)
672     env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])
673     # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
674     # On the other hand MPT and OpenMPI don't define the latter so we have to
675     # do that here
676     if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
677     env.Append(CPPDEFINES = ['MPI_INCLUDED'])
678 jfenwick 2232
679 lgao 3508 ######## BOOMERAMG (optional)
680    
681 lgao 3511 if env['mpi'] == 'none': env['boomeramg'] = False
682 lgao 3508
683     boomeramg_inc_path=''
684     boomeramg_lib_path=''
685     if env['boomeramg']:
686     boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
687     env.AppendUnique(CPPPATH = [boomeramg_inc_path])
688     env.AppendUnique(LIBPATH = [boomeramg_lib_path])
689     env.AppendUnique(LIBS = env['boomeramg_libs'])
690     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
691     env.Append(CPPDEFINES = ['BOOMERAMG'])
692    
693 jfenwick 3259 ######## ParMETIS (optional)
694 jfenwick 2232
695 jfenwick 3259 if not env['usempi']: env['parmetis'] = False
696 jfenwick 2232
697 jfenwick 3259 parmetis_inc_path=''
698     parmetis_lib_path=''
699     if env['parmetis']:
700     parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')
701     env.AppendUnique(CPPPATH = [parmetis_inc_path])
702     env.AppendUnique(LIBPATH = [parmetis_lib_path])
703     env.AppendUnique(LIBS = env['parmetis_libs'])
704     env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
705     env.Append(CPPDEFINES = ['USE_PARMETIS'])
706 jfenwick 2387
707 caltinay 3463 ######## gmsh (optional, for tests)
708    
709     try:
710 caltinay 3975 p=Popen(['gmsh', '-info'], stderr=PIPE)
711 caltinay 3585 _,e=p.communicate()
712     if e.split().count("MPI"):
713     env['gmsh']='m'
714     else:
715     env['gmsh']='s'
716 caltinay 3463 except OSError:
717     env['gmsh']=False
718    
719 caltinay 3604 ######## PDFLaTeX (for documentation)
720     if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
721     env['pdflatex']=True
722     else:
723     env['pdflatex']=False
724    
725 jfenwick 3259 ######################## Summarize our environment ###########################
726 ksteube 1705
727 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
728     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
729     env.PrependENVPath('PYTHONPATH', prefix)
730     env['ENV']['ESCRIPT_ROOT'] = prefix
731 ksteube 1705
732 jfenwick 3259 if not env['verbose']:
733     env['CCCOMSTR'] = "Compiling $TARGET"
734     env['CXXCOMSTR'] = "Compiling $TARGET"
735     env['SHCCCOMSTR'] = "Compiling $TARGET"
736     env['SHCXXCOMSTR'] = "Compiling $TARGET"
737     env['ARCOMSTR'] = "Linking $TARGET"
738     env['LINKCOMSTR'] = "Linking $TARGET"
739     env['SHLINKCOMSTR'] = "Linking $TARGET"
740 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
741     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
742     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
743     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
744 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
745 ksteube 1705
746 jfenwick 3259 print("")
747     print("*** Config Summary (see config.log and lib/buildvars for details) ***")
748     print("Escript/Finley revision %s"%global_revision)
749     print(" Install prefix: %s"%env['prefix'])
750     print(" Python: %s"%sysconfig.PREFIX)
751     print(" boost: %s"%env['boost_prefix'])
752     print(" numpy: YES")
753     if env['usempi']:
754     print(" MPI: YES (flavour: %s)"%env['mpi'])
755 ksteube 1312 else:
756 jfenwick 3259 print(" MPI: DISABLED")
757     if env['uselapack']:
758     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
759 ksteube 1705 else:
760 jfenwick 3259 print(" LAPACK: DISABLED")
761     d_list=[]
762     e_list=[]
763 caltinay 3975 for i in 'debug','openmp','boomeramg','mkl','netcdf','papi','parmetis','silo','sympy','umfpack','visit','vsl_random':
764 jfenwick 3259 if env[i]: e_list.append(i)
765     else: d_list.append(i)
766     for i in e_list:
767     print("%16s: YES"%i)
768     for i in d_list:
769     print("%16s: DISABLED"%i)
770 caltinay 3597 if env['cppunit']:
771     print(" CppUnit: FOUND")
772     else:
773     print(" CppUnit: NOT FOUND")
774 caltinay 3585 if env['gmsh']=='m':
775     print(" gmsh: FOUND, MPI-ENABLED")
776     elif env['gmsh']=='s':
777 caltinay 3463 print(" gmsh: FOUND")
778     else:
779     print(" gmsh: NOT FOUND")
780 caltinay 3784 if env['numpy_h']:
781     print(" numpy headers: FOUND")
782     else:
783     print(" numpy headers: NOT FOUND")
784 jfenwick 3851 print(" vsl_random: %s"%env['vsl_random'])
785 jfenwick 3506
786 jfenwick 3259 if ((fatalwarning != '') and (env['werror'])):
787     print(" Treating warnings as errors")
788     else:
789     print(" NOT treating warnings as errors")
790     print("")
791 ksteube 1215
792 jfenwick 3259 ####################### Configure the subdirectories #########################
793 ksteube 1247
794 jfenwick 2235 from grouptest import *
795    
796     TestGroups=[]
797    
798 jfenwick 3259 # keep an environment without warnings-as-errors
799     dodgy_env=env.Clone()
800 jfenwick 2827
801 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
802     # because the scons test files have warnings in them
803     if ((fatalwarning != '') and (env['werror'])):
804     env.Append(CCFLAGS = fatalwarning)
805 jfenwick 2827
806 phornby 2027 Export(
807 jfenwick 3259 ['env',
808     'dodgy_env',
809     'IS_WINDOWS',
810     'TestGroups'
811     ]
812     )
813 ksteube 1705
814 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
815     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
816     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
817     env.SConscript(dirs = ['escript/src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
818     env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
819 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
820 caltinay 3349 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
821     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
822 caltinay 3792 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
823 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
824 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
825     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
826     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
827 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
828 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
829 phornby 1243
830 jfenwick 3892
831 jfenwick 3259 ######################## Populate the buildvars file #########################
832 jfenwick 2235
833 jfenwick 3259 # remove obsolete file
834     if not env['usempi']:
835     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
836     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
837 phornby 1243
838 jfenwick 3259 # Try to extract the boost version from version.hpp
839     boosthpp=open(os.path.join(boost_inc_path, 'boost', 'version.hpp'))
840 jfenwick 2302 boostversion='unknown'
841     try:
842     for line in boosthpp:
843     ver=re.match(r'#define BOOST_VERSION (\d+)',line)
844     if ver:
845     boostversion=ver.group(1)
846 jfenwick 3259 except StopIteration:
847 jfenwick 2302 pass
848 jfenwick 3259 boosthpp.close()
849    
850 jfenwick 3892
851 jfenwick 3259 buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
852 jfenwick 2302 buildvars.write("svn_revision="+str(global_revision)+"\n")
853 jfenwick 3259 buildvars.write("prefix="+prefix+"\n")
854     buildvars.write("cc="+env['CC']+"\n")
855     buildvars.write("cxx="+env['CXX']+"\n")
856 jfenwick 3851 if env['pythoncmd']=='python':
857     buildvars.write("python="+sys.executable+"\n")
858     buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
859     else:
860     buildvars.write("python="+env['pythoncmd']+"\n")
861 jfenwick 3892 p=Popen([env['pythoncmd'], '-c', 'from __future__ import print_function;import sys;print(str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]))'], stdout=PIPE)
862 jfenwick 3851 verstring=p.stdout.readline().strip()
863     p.wait()
864 jfenwick 3892 buildvars.write("python_version="+verstring+"\n")
865 jfenwick 3259 buildvars.write("boost_inc_path="+boost_inc_path+"\n")
866     buildvars.write("boost_lib_path="+boost_lib_path+"\n")
867     buildvars.write("boost_version="+boostversion+"\n")
868     buildvars.write("debug=%d\n"%int(env['debug']))
869     buildvars.write("openmp=%d\n"%int(env['openmp']))
870     buildvars.write("mpi=%s\n"%env['mpi'])
871     buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
872     buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
873     buildvars.write("lapack=%s\n"%env['lapack'])
874 gross 3560 buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
875 lgao 3508 for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
876 jfenwick 3259 buildvars.write("%s=%d\n"%(i, int(env[i])))
877     if env[i]:
878     buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))
879     buildvars.write("%s_lib_path=%s\n"%(i, eval(i+'_lib_path')))
880 jfenwick 2302 buildvars.close()
881    
882 jfenwick 3259 ################### Targets to build and install libraries ###################
883 jfenwick 2302
884 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
885 ksteube 1705 env.Alias('target_init', [target_init])
886 caltinay 3604 # delete buildvars upon cleanup
887     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
888 ksteube 1705
889 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
890     # #include <paso/Common.h>
891     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
892     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
893 ksteube 1705
894 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
895     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
896 ksteube 1705
897 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
898     env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escript_py'])
899 caltinay 2810
900 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
901     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
902    
903 jfenwick 3259 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
904     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
905 caltinay 3096
906 jfenwick 3259 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
907     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
908 caltinay 2910
909 caltinay 3792 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
910     env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
911    
912 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
913     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
914 ksteube 1705
915 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
916     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
917 ksteube 1705
918 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
919 ksteube 1705 build_all_list = []
920     build_all_list += ['build_esysUtils']
921     build_all_list += ['build_paso']
922     build_all_list += ['build_escript']
923 jfenwick 3675 build_all_list += ['build_pasowrap']
924 jfenwick 3259 build_all_list += ['build_dudley']
925 ksteube 1705 build_all_list += ['build_finley']
926 caltinay 3792 build_all_list += ['build_ripley']
927 jfenwick 3259 build_all_list += ['build_weipa']
928     if not IS_WINDOWS: build_all_list += ['build_escriptreader']
929     if env['usempi']: build_all_list += ['build_pythonMPI']
930     build_all_list += ['build_escriptconvert']
931 ksteube 1705 env.Alias('build_all', build_all_list)
932    
933     install_all_list = []
934     install_all_list += ['target_init']
935     install_all_list += ['install_esysUtils']
936     install_all_list += ['install_paso']
937     install_all_list += ['install_escript']
938 jfenwick 3675 install_all_list += ['install_pasowrap']
939 jfenwick 3259 install_all_list += ['install_dudley']
940 ksteube 1705 install_all_list += ['install_finley']
941 caltinay 3792 install_all_list += ['install_ripley']
942 jfenwick 3259 install_all_list += ['install_weipa']
943     if not IS_WINDOWS: install_all_list += ['install_escriptreader']
944 caltinay 3947 install_all_list += ['install_downunder_py']
945 jfenwick 3259 install_all_list += ['install_modellib_py']
946     install_all_list += ['install_pycad_py']
947     if env['usempi']: install_all_list += ['install_pythonMPI']
948     install_all_list += ['install_escriptconvert']
949 ksteube 1705 env.Alias('install_all', install_all_list)
950    
951     # Default target is install
952     env.Default('install_all')
953    
954 jfenwick 3259 ################## Targets to build and run the test suite ###################
955 ksteube 1705
956 caltinay 3597 if not env['cppunit']:
957 jfenwick 3942 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')
958 caltinay 3597 env.Alias('run_tests', test_msg)
959     env.Alias('run_tests', ['install_all'])
960     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
961 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
962 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
963 ksteube 1705
964 jfenwick 3259 ##################### Targets to build the documentation #####################
965 artak 2820
966 jfenwick 2531 env.Alias('api_epydoc','install_all')
967 caltinay 4045 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
968 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
969 ksteube 1705
970 jfenwick 4078
971     # The test scripts are always generated, this target allows us to
972     # generate the testscripts without doing a full build
973     env.Alias('testscripts',[])
974    
975 jfenwick 3259 if not IS_WINDOWS:
976     try:
977     utest=open('utest.sh','w')
978 jfenwick 4078 utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, False))
979 jfenwick 3259 for tests in TestGroups:
980     utest.write(tests.makeString())
981     utest.close()
982 jfenwick 3851 Execute(Chmod('utest.sh', 0o755))
983 jfenwick 3259 print("Generated utest.sh.")
984 jfenwick 4078 # This version contains only python tests - I want this to be usable
985     # From a binary only install if you have the test files
986     utest=open('itest.sh','w')
987     utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, True))
988     for tests in TestGroups:
989     if tests.exec_cmd=='$PYTHONRUNNER ':
990     utest.write(tests.makeString())
991     utest.close()
992     Execute(Chmod('itest.sh', 0o755))
993     print("Generated itest.sh.")
994 jfenwick 3259 except IOError:
995     print("Error attempting to write unittests file.")
996     Exit(1)
997 jfenwick 2879
998 caltinay 3604 # delete utest.sh upon cleanup
999     env.Clean('target_init', 'utest.sh')
1000 jfenwick 4078 env.Clean('target_init', 'itest.sh')
1001 caltinay 3604
1002 jfenwick 3259 # Make sure that the escript wrapper is in place
1003     if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
1004     print("Copying escript wrapper.")
1005 jfenwick 3332 Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
1006 jfenwick 2235

  ViewVC Help
Powered by ViewVC 1.1.26