/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3977 - (hide annotations)
Thu Sep 20 04:27:10 2012 UTC (6 years, 11 months ago) by caltinay
File size: 40350 byte(s)
Export KMP_MONITOR_STACKSIZE so tests work on savanna.

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

  ViewVC Help
Powered by ViewVC 1.1.26