/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3967 - (hide annotations)
Mon Sep 17 04:02:58 2012 UTC (6 years, 1 month ago) by jfenwick
File size: 40423 byte(s)
Changes to SConstruct to allow building with clang

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 import subprocess
20     from subprocess import PIPE, Popen
21 jgs 214
22 jfenwick 3259 # Version number to check for in options file. Increment when new features are
23     # added or existing options changed.
24 caltinay 3597 REQUIRED_OPTS_VERSION=201
25 ksteube 1705
26     # MS Windows support, many thanks to PH
27 jfenwick 3259 IS_WINDOWS = (os.name == 'nt')
28 gross 806
29 jfenwick 3259 ########################## Determine options file ############################
30     # 1. command line
31     # 2. scons/<hostname>_options.py
32     # 3. name as part of a cluster
33 jfenwick 2391 options_file=ARGUMENTS.get('options_file', None)
34     if not options_file:
35 jfenwick 3259 ext_dir = os.path.join(os.getcwd(), 'scons')
36     hostname = platform.node().split('.')[0]
37     for name in hostname, effectiveName(hostname):
38     mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
39     options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
40     if os.path.isfile(options_file): break
41 jfenwick 2391
42 ksteube 1866 if not os.path.isfile(options_file):
43 jfenwick 3259 print("\nWARNING:\nOptions file %s" % options_file)
44     print("not found! Default options will be used which is most likely suboptimal.")
45     print("It is recommended that you copy one of the TEMPLATE files in the scons/")
46     print("subdirectory and customize it to your needs.\n")
47     options_file = None
48 ksteube 1217
49 jfenwick 3259 ############################### Build options ################################
50 gross 1149
51 jfenwick 3259 default_prefix='/usr'
52 jfenwick 3618 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
53 jfenwick 3259 lapack_flavours=('none', 'clapack', 'mkl')
54 jfenwick 2430
55 jfenwick 3259 vars = Variables(options_file, ARGUMENTS)
56     vars.AddVariables(
57     PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
58     PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
59 caltinay 3349 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
60 jfenwick 3259 BoolVariable('verbose', 'Output full compile/link lines', False),
61     # Compiler/Linker options
62     ('cc', 'Path to C compiler', 'default'),
63     ('cxx', 'Path to C++ compiler', 'default'),
64     ('cc_flags', 'Base C/C++ compiler flags', 'default'),
65     ('cc_optim', 'Additional C/C++ flags for a non-debug build', 'default'),
66     ('cc_debug', 'Additional C/C++ flags for a debug build', 'default'),
67 caltinay 2967 ('cc_extra', 'Extra C compiler flags', ''),
68     ('cxx_extra', 'Extra C++ compiler flags', ''),
69 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
70 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
71     BoolVariable('debug', 'Compile with debug flags', False),
72     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
73     ('omp_flags', 'OpenMP compiler flags', 'default'),
74     ('omp_ldflags', 'OpenMP linker flags', 'default'),
75     # Mandatory libraries
76     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
77 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
78 caltinay 3597 # Mandatory for tests
79     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
80     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
81 jfenwick 3259 # Optional libraries and options
82     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
83     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
84     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
85     BoolVariable('netcdf', 'Enable netCDF file support', False),
86     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
87     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
88     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
89     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
90     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
91     BoolVariable('papi', 'Enable PAPI', False),
92     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
93 ksteube 1705 ('papi_libs', 'PAPI libraries to link with', ['papi']),
94 jfenwick 3259 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
95     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
96     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
97     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
98     BoolVariable('umfpack', 'Enable UMFPACK', False),
99     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
100     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
101 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
102     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
103     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
104 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
105     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
106     ('lapack_libs', 'LAPACK libraries to link with', []),
107     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
108     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
109 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
110 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
111     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
112     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
113 jfenwick 3506 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
114 jfenwick 3259 # Advanced settings
115     #dudley_assemble_flags = -funroll-loops to actually do something
116     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
117     # To enable passing function pointers through python
118     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
119     # An option for specifying the compiler tools (see windows branch)
120     ('tools_names', 'Compiler tools to use', ['default']),
121     ('env_export', 'Environment variables to be passed to tools',[]),
122     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
123     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
124     # finer control over library building, intel aggressive global optimisation
125     # works with dynamic libraries on windows.
126 caltinay 3598 ('build_shared', 'Build dynamic libraries only', False),
127 jfenwick 3259 ('sys_libs', 'Extra libraries to link with', []),
128     ('escript_opts_version', 'Version of options file (do not specify on command line)'),
129 jfenwick 3618 ('SVN_VERSION', 'Do not use from options file', -2),
130 jfenwick 3851 ('pythoncmd', 'which python to compile with','python'),
131 jfenwick 3892 ('usepython3', 'Is this a python3 build? (experimental)', False),
132     ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
133 jfenwick 3942 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
134     ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
135 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
136 robwdcock 682 )
137 phornby 1232
138 jfenwick 3259 ##################### Create environment and help text #######################
139 jfenwick 3078
140 jfenwick 3259 # Intel's compiler uses regular expressions improperly and emits a warning
141     # about failing to find the compilers. This warning can be safely ignored.
142 jfenwick 3078
143 caltinay 3319 # PATH is needed so the compiler, linker and tools are found if they are not
144     # in default locations.
145     env = Environment(tools = ['default'], options = vars,
146     ENV = {'PATH': os.environ['PATH']})
147 jfenwick 3967
148    
149     #set the vars for clang
150     def mkclang(env):
151     env['CC']='clang'
152     env['CXX']='clang++'
153    
154    
155 jfenwick 3259 if env['tools_names'] != 'default':
156 jfenwick 3967 zz=env['tools_names']
157     if 'clang' in zz:
158     zz.remove('clang')
159     zz.insert(0, mkclang)
160 caltinay 3319 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
161     ENV = {'PATH' : os.environ['PATH']})
162 jfenwick 3078
163 jfenwick 3259 if options_file:
164     opts_valid=False
165     if 'escript_opts_version' in env.Dictionary() and \
166     int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
167     opts_valid=True
168     if opts_valid:
169     print("Using options in %s." % options_file)
170     else:
171     print("\nOptions file %s" % options_file)
172     print("is outdated! Please update the file by examining one of the TEMPLATE")
173     print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
174     Exit(1)
175 jfenwick 3078
176 jfenwick 3259 # Generate help text (scons -h)
177     Help(vars.GenerateHelpText(env))
178 jfenwick 3078
179 jfenwick 3259 # Check for superfluous options
180 caltinay 3268 if len(vars.UnknownVariables())>0:
181     for k in vars.UnknownVariables():
182     print("Unknown option '%s'" % k)
183     Exit(1)
184 jfenwick 3078
185 jfenwick 3259 #################### Make sure install directories exist #####################
186 ksteube 1705
187 caltinay 3349 env['BUILD_DIR']=env['build_dir']
188 jfenwick 3259 prefix=Dir(env['prefix']).abspath
189     env['incinstall'] = os.path.join(prefix, 'include')
190     env['bininstall'] = os.path.join(prefix, 'bin')
191     env['libinstall'] = os.path.join(prefix, 'lib')
192     env['pyinstall'] = os.path.join(prefix, 'esys')
193 jfenwick 2604 if not os.path.isdir(env['bininstall']):
194     os.makedirs(env['bininstall'])
195     if not os.path.isdir(env['libinstall']):
196     os.makedirs(env['libinstall'])
197     if not os.path.isdir(env['pyinstall']):
198     os.makedirs(env['pyinstall'])
199    
200 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
201     env.Append(LIBPATH = [env['libinstall']])
202 jfenwick 2603
203 jfenwick 3259 ################# Fill in compiler options if not set above ##################
204 ksteube 1312
205 jfenwick 3259 if env['cc'] != 'default': env['CC']=env['cc']
206     if env['cxx'] != 'default': env['CXX']=env['cxx']
207 gross 1024
208 jfenwick 3259 # version >=9 of intel C++ compiler requires use of icpc to link in C++
209     # runtimes (icc does not)
210     if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
211     env['LINK'] = env['CXX']
212 phornby 1243
213 jfenwick 3259 # default compiler/linker options
214     cc_flags = ''
215     cc_optim = ''
216     cc_debug = ''
217     omp_flags = ''
218     omp_ldflags = ''
219     fatalwarning = '' # switch to turn warnings into errors
220     sysheaderopt = '' # how to indicate that a header is a system header
221 jfenwick 2130
222 jfenwick 3259 # env['CC'] might be a full path
223     cc_name=os.path.basename(env['CC'])
224 caltinay 2882
225 jfenwick 3259 if cc_name == 'icc':
226     # Intel compiler
227     cc_flags = "-std=c99 -fPIC -wd161 -w1 -vec-report0 -DBLOCKTIMER -DCORE_ID1"
228     cc_optim = "-O3 -ftz -IPF_ftlacc- -IPF_fma -fno-alias -ip"
229     cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
230     omp_flags = "-openmp -openmp_report0"
231 caltinay 3814 omp_ldflags = "-openmp -openmp_report0 -lpthread"
232 jfenwick 3259 fatalwarning = "-Werror"
233     elif cc_name[:3] == 'gcc':
234     # GNU C on any system
235     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"
236     cc_optim = "-O3"
237     cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
238     omp_flags = "-fopenmp"
239     omp_ldflags = "-fopenmp"
240     fatalwarning = "-Werror"
241     sysheaderopt = "-isystem"
242     elif cc_name == 'cl':
243     # Microsoft Visual C on Windows
244     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
245     cc_optim = "/O2 /Op /W3"
246     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
247     fatalwarning = "/WX"
248     elif cc_name == 'icl':
249     # Intel C on Windows
250     cc_flags = '/EHsc /GR /MD'
251     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
252     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
253     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
254     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
255 phornby 1243
256 jfenwick 3259 # set defaults if not otherwise specified
257     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
258     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
259     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
260     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
261     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
262     if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
263     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
264     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
265 jfenwick 2130
266 jfenwick 3961 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
267    
268 jfenwick 3892 if env['usepython3']:
269     env.Append(CPPDEFINES=['ESPYTHON3'])
270    
271 jfenwick 3259 # set up the autolazy values
272     if env['forcelazy'] == 'on':
273     env.Append(CPPDEFINES=['FAUTOLAZYON'])
274     elif env['forcelazy'] == 'off':
275     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
276 ksteube 1312
277 jfenwick 3259 # set up the collective resolve values
278     if env['forcecollres'] == 'on':
279     env.Append(CPPDEFINES=['FRESCOLLECTON'])
280     elif env['forcecollres'] == 'off':
281     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
282 jfenwick 2273
283 jfenwick 3259 # allow non-standard C if requested
284 jfenwick 2827 if env['iknowwhatimdoing']:
285 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
286 jfenwick 2827
287 jfenwick 3259 # Disable OpenMP if no flags provided
288     if env['openmp'] and env['omp_flags'] == '':
289     print("OpenMP requested but no flags provided - disabling OpenMP!")
290     env['openmp'] = False
291 gross 1160
292 jfenwick 3259 if env['openmp']:
293     env.Append(CCFLAGS = env['omp_flags'])
294     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
295     else:
296     env['omp_flags']=''
297     env['omp_ldflags']=''
298 ksteube 1312
299 jfenwick 3259 # add debug/non-debug compiler flags
300     if env['debug']:
301     env.Append(CCFLAGS = env['cc_debug'])
302 gross 2423 else:
303 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
304 gross 1163
305 jfenwick 3259 # always add cc_flags
306     env.Append(CCFLAGS = env['cc_flags'])
307 phornby 1243
308 jfenwick 3259 # add system libraries
309     env.AppendUnique(LIBS = env['sys_libs'])
310 gross 2363
311 jfenwick 3618
312     global_revision=ARGUMENTS.get('SVN_VERSION', None)
313     if global_revision:
314     global_revision = re.sub(':.*', '', global_revision)
315     global_revision = re.sub('[^0-9]', '', global_revision)
316     if global_revision == '': global_revision='-2'
317     else:
318     # Get the global Subversion revision number for the getVersion() method
319     try:
320 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
321     global_revision = re.sub(':.*', '', global_revision)
322     global_revision = re.sub('[^0-9]', '', global_revision)
323     if global_revision == '': global_revision='-2'
324 jfenwick 3618 except:
325 jfenwick 3259 global_revision = '-1'
326 caltinay 3271 env['svn_revision']=global_revision
327 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
328 gross 2363
329 jfenwick 3259 if IS_WINDOWS:
330 caltinay 3602 if not env['build_shared']:
331 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
332     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
333 gross 2363
334 jfenwick 3259 ###################### Copy required environment vars ########################
335 gross 2363
336 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
337     if IS_WINDOWS:
338     LD_LIBRARY_PATH_KEY='PATH'
339     env['ENV']['LD_LIBRARY_PATH']=''
340     else:
341     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
342 robwdcock 682
343 caltinay 3319 # the following env variables are exported for the unit tests
344 phornby 1244
345 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
346     try:
347     env['ENV'][key] = os.environ[key]
348     except KeyError:
349     env['ENV'][key] = 1
350 robwdcock 682
351 jfenwick 3259 env_export=env['env_export']
352 caltinay 3466 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','TMPDIR','TEMP','TMP'])
353 robwdcock 682
354 jfenwick 3259 for key in set(env_export):
355     try:
356     env['ENV'][key] = os.environ[key]
357     except KeyError:
358     pass
359 ksteube 1312
360 jfenwick 3259 try:
361     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
362     except KeyError:
363     pass
364 ksteube 1312
365 jfenwick 3259 # these shouldn't be needed
366     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
367     # try:
368     # env['ENV'][key] = os.environ[key]
369     # except KeyError:
370     # pass
371 ksteube 1312
372 jfenwick 3259 try:
373     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
374     except KeyError:
375     pass
376 ksteube 1312
377 jfenwick 3259 ######################## Add some custom builders ############################
378 ksteube 1312
379 jfenwick 3851 if env['pythoncmd']=='python':
380     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
381     else:
382 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
383 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
384 gross 2423
385 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
386     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
387 gross 2423
388 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
389     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
390 ksteube 1756
391 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
392     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
393 ksteube 817
394 jfenwick 3259 ############################ Dependency checks ###############################
395 phornby 1246
396 jfenwick 3259 # Create a Configure() environment to check for compilers and python
397     conf = Configure(env.Clone())
398 phornby 1634
399 jfenwick 3259 ######## Test that the compilers work
400 ksteube 1705
401 jfenwick 3259 if 'CheckCC' in dir(conf): # exists since scons 1.1.0
402     if not conf.CheckCC():
403     print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
404     Exit(1)
405     if not conf.CheckCXX():
406     print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
407     Exit(1)
408     else:
409     if not conf.CheckFunc('printf', language='c'):
410     print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
411     Exit(1)
412     if not conf.CheckFunc('printf', language='c++'):
413     print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
414     Exit(1)
415 ksteube 1705
416 phornby 1789 if conf.CheckFunc('gethostname'):
417 jfenwick 3259 conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
418 gross 806
419 jfenwick 3259 ######## Python headers & library (required)
420 gross 806
421 jfenwick 3942 #First we check to see if the config file has specified
422     ##Where to find the filae. Ideally, this should be automatic
423     #But we need to deal with the case where python is not in its INSTALL
424     #Directory
425 jfenwick 3892 # Use the python scons is running
426     if env['pythoncmd']=='python':
427     python_inc_path=sysconfig.get_python_inc()
428     if IS_WINDOWS:
429     python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
430     elif env['PLATFORM']=='darwin':
431     python_lib_path=sysconfig.get_config_var('LIBPL')
432     else:
433     python_lib_path=sysconfig.get_config_var('LIBDIR')
434    
435     #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
436     if IS_WINDOWS:
437     python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
438     else:
439     python_libs=['python'+sysconfig.get_python_version()]
440    
441     #if we want to use a python other than the one scons is running
442 jfenwick 3259 else:
443 jfenwick 3892 initstring='from __future__ import print_function;from distutils import sysconfig;'
444     if env['pythonlibname']!='':
445     python_libs=env['pythonlibname']
446     else: # work it out by calling python
447     if IS_WINDOWS:
448     cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
449     else:
450     cmd='print("python"+sysconfig.get_python_version())'
451     p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
452     python_libs=p.stdout.readline()
453     if env['usepython3']: # This is to convert unicode str into py2 string
454     python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought
455     p.wait()
456     python_libs=python_libs.strip()
457 jfenwick 2130
458 jfenwick 3892
459     # Now we know whether we are using python3 or not
460     p=Popen([env['pythoncmd'], '-c', initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
461     python_inc_path=p.stdout.readline()
462     if env['usepython3']:
463 jfenwick 3851 python_inc_path=python_inc_path.encode()
464 jfenwick 3892 p.wait()
465     python_inc_path=python_inc_path.strip()
466     if IS_WINDOWS:
467 jfenwick 3851 cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
468 jfenwick 3892 elif env['PLATFORM']=='darwin':
469 jfenwick 3851 cmd="sysconfig.get_config_var(\"LIBPL\")"
470 jfenwick 3892 else:
471 jfenwick 3851 cmd="sysconfig.get_config_var(\"LIBDIR\")"
472    
473 jfenwick 3892 p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
474     python_lib_path=p.stdout.readline()
475     if env['usepython3']:
476     python_lib_path=python_lib_path.decode()
477     p.wait()
478     python_lib_path=python_lib_path.strip()
479 jfenwick 3851
480 jfenwick 3942 #Check for an override from the config file.
481     #Ideally, this should be automatic
482     #But we need to deal with the case where python is not in its INSTALL
483     #Directory
484     if env['pythonlibpath']!='':
485     python_lib_path=env['pythonlibpath']
486    
487     if env['pythonincpath']!='':
488     python_inc_path=env['pythonincpath']
489    
490    
491 jfenwick 3259 if sysheaderopt == '':
492     conf.env.AppendUnique(CPPPATH = [python_inc_path])
493 jfenwick 2130 else:
494 jfenwick 3259 conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])
495 jfenwick 2130
496 jfenwick 3259 conf.env.AppendUnique(LIBPATH = [python_lib_path])
497     conf.env.AppendUnique(LIBS = python_libs)
498     # The wrapper script needs to find the libs
499     conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)
500 gross 805
501 ksteube 1705 if not conf.CheckCHeader('Python.h'):
502 jfenwick 3259 print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))
503     Exit(1)
504 gross 2284 if not conf.CheckFunc('Py_Exit'):
505 jfenwick 3259 print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))
506     Exit(1)
507 gross 805
508 jfenwick 3892 ## reuse conf to check for numpy header (optional)
509 caltinay 3896 if env['usepython3']:
510     # FIXME: This is until we can work out how to make the checks in python 3
511     conf.env['numpy_h']=False
512     else:
513     if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
514     conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
515     conf.env['numpy_h']=True
516     else:
517     conf.env['numpy_h']=False
518 caltinay 3784
519 ksteube 1705 # Commit changes to environment
520     env = conf.Finish()
521 ksteube 1312
522 jfenwick 3259 ######## boost (required)
523 ksteube 1312
524 jfenwick 3259 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')
525     if sysheaderopt == '':
526     env.AppendUnique(CPPPATH = [boost_inc_path])
527 ksteube 1705 else:
528 jfenwick 3259 # This is required because we can't -isystem /usr/include since it breaks
529     # std includes
530     if os.path.normpath(boost_inc_path) == '/usr/include':
531     conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])
532     else:
533     env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])
534 ksteube 1312
535 jfenwick 3259 env.AppendUnique(LIBPATH = [boost_lib_path])
536     env.AppendUnique(LIBS = env['boost_libs'])
537     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)
538 ksteube 1705
539 jfenwick 3259 ######## numpy (required)
540 ksteube 1705
541 jfenwick 3851 if env['pythoncmd']=='python':
542     try:
543     from numpy import identity
544     except ImportError:
545     print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
546     Exit(1)
547     else:
548     p=subprocess.call([env['pythoncmd'],'-c','import numpy'])
549     if p!=0:
550     print("Cannot import numpy, you need to set your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
551     Exit(1)
552 ksteube 1705
553 caltinay 3597 ######## CppUnit (required for tests)
554    
555     try:
556     cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
557     env.AppendUnique(CPPPATH = [cppunit_inc_path])
558     env.AppendUnique(LIBPATH = [cppunit_lib_path])
559     env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
560     env['cppunit']=True
561     except:
562     env['cppunit']=False
563    
564 jfenwick 3259 ######## netCDF (optional)
565 gross 806
566 jfenwick 3259 netcdf_inc_path=''
567     netcdf_lib_path=''
568     if env['netcdf']:
569     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')
570     env.AppendUnique(CPPPATH = [netcdf_inc_path])
571     env.AppendUnique(LIBPATH = [netcdf_lib_path])
572     env.AppendUnique(LIBS = env['netcdf_libs'])
573     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)
574     env.Append(CPPDEFINES = ['USE_NETCDF'])
575 gross 806
576 jfenwick 3259 ######## PAPI (optional)
577 gross 805
578 jfenwick 3259 papi_inc_path=''
579     papi_lib_path=''
580     if env['papi']:
581     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')
582     env.AppendUnique(CPPPATH = [papi_inc_path])
583     env.AppendUnique(LIBPATH = [papi_lib_path])
584     env.AppendUnique(LIBS = env['papi_libs'])
585     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)
586     env.Append(CPPDEFINES = ['BLOCKPAPI'])
587 phornby 1246
588 jfenwick 3259 ######## MKL (optional)
589 jfenwick 2787
590 jfenwick 3259 mkl_inc_path=''
591     mkl_lib_path=''
592     if env['mkl']:
593     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')
594     env.AppendUnique(CPPPATH = [mkl_inc_path])
595     env.AppendUnique(LIBPATH = [mkl_lib_path])
596     env.AppendUnique(LIBS = env['mkl_libs'])
597     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)
598     env.Append(CPPDEFINES = ['MKL'])
599 gross 950
600 jfenwick 3259 ######## UMFPACK (optional)
601 ksteube 1705
602 jfenwick 3259 umfpack_inc_path=''
603     umfpack_lib_path=''
604     if env['umfpack']:
605     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')
606     env.AppendUnique(CPPPATH = [umfpack_inc_path])
607     env.AppendUnique(LIBPATH = [umfpack_lib_path])
608     env.AppendUnique(LIBS = env['umfpack_libs'])
609     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)
610     env.Append(CPPDEFINES = ['UMFPACK'])
611 ksteube 1705
612 jfenwick 3259 ######## LAPACK (optional)
613 ksteube 1705
614 jfenwick 3259 if env['lapack']=='mkl' and not env['mkl']:
615     print("mkl_lapack requires MKL!")
616     Exit(1)
617 ksteube 1705
618 jfenwick 3259 env['uselapack'] = env['lapack']!='none'
619     lapack_inc_path=''
620     lapack_lib_path=''
621 jfenwick 2742 if env['uselapack']:
622 jfenwick 3259 header='clapack.h'
623     if env['lapack']=='mkl':
624     env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])
625     header='mkl_lapack.h'
626     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')
627     env.AppendUnique(CPPPATH = [lapack_inc_path])
628     env.AppendUnique(LIBPATH = [lapack_lib_path])
629     env.AppendUnique(LIBS = env['lapack_libs'])
630     env.Append(CPPDEFINES = ['USE_LAPACK'])
631 jfenwick 2742
632 jfenwick 3259 ######## Silo (optional)
633 jfenwick 2742
634 jfenwick 3259 silo_inc_path=''
635     silo_lib_path=''
636     if env['silo']:
637     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')
638     env.AppendUnique(CPPPATH = [silo_inc_path])
639     env.AppendUnique(LIBPATH = [silo_lib_path])
640     # Note that we do not add the libs since they are only needed for the
641     # weipa library and tools.
642     #env.AppendUnique(LIBS = [env['silo_libs']])
643 ksteube 1459
644 jfenwick 3506 ######## VSL random numbers (optional)
645     if env['vsl_random']:
646     env.Append(CPPDEFINES = ['MKLRANDOM'])
647    
648 jfenwick 3259 ######## VisIt (optional)
649 robwdcock 682
650 jfenwick 3259 visit_inc_path=''
651     visit_lib_path=''
652     if env['visit']:
653     visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')
654     env.AppendUnique(CPPPATH = [visit_inc_path])
655     env.AppendUnique(LIBPATH = [visit_lib_path])
656 gross 707
657 jfenwick 3259 ######## MPI (optional)
658 jfenwick 2232
659 jfenwick 3618 if env['mpi']=='no':
660     env['mpi']='none'
661    
662 jfenwick 3259 env['usempi'] = env['mpi']!='none'
663     mpi_inc_path=''
664     mpi_lib_path=''
665     if env['usempi']:
666     mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')
667     env.AppendUnique(CPPPATH = [mpi_inc_path])
668     env.AppendUnique(LIBPATH = [mpi_lib_path])
669     env.AppendUnique(LIBS = env['mpi_libs'])
670     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)
671     env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])
672     # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
673     # On the other hand MPT and OpenMPI don't define the latter so we have to
674     # do that here
675     if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
676     env.Append(CPPDEFINES = ['MPI_INCLUDED'])
677 jfenwick 2232
678 lgao 3508 ######## BOOMERAMG (optional)
679    
680 lgao 3511 if env['mpi'] == 'none': env['boomeramg'] = False
681 lgao 3508
682     boomeramg_inc_path=''
683     boomeramg_lib_path=''
684     if env['boomeramg']:
685     boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
686     env.AppendUnique(CPPPATH = [boomeramg_inc_path])
687     env.AppendUnique(LIBPATH = [boomeramg_lib_path])
688     env.AppendUnique(LIBS = env['boomeramg_libs'])
689     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
690     env.Append(CPPDEFINES = ['BOOMERAMG'])
691    
692 jfenwick 3259 ######## ParMETIS (optional)
693 jfenwick 2232
694 jfenwick 3259 if not env['usempi']: env['parmetis'] = False
695 jfenwick 2232
696 jfenwick 3259 parmetis_inc_path=''
697     parmetis_lib_path=''
698     if env['parmetis']:
699     parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')
700     env.AppendUnique(CPPPATH = [parmetis_inc_path])
701     env.AppendUnique(LIBPATH = [parmetis_lib_path])
702     env.AppendUnique(LIBS = env['parmetis_libs'])
703     env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
704     env.Append(CPPDEFINES = ['USE_PARMETIS'])
705 jfenwick 2387
706 caltinay 3463 ######## gmsh (optional, for tests)
707    
708     try:
709     import subprocess
710 caltinay 3585 p=subprocess.Popen(['gmsh', '-info'], stderr=subprocess.PIPE)
711     _,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 3784 for i in 'debug','openmp','netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','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 jfenwick 3343 env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf'])
968 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
969 ksteube 1705
970 jfenwick 3259 if not IS_WINDOWS:
971     try:
972     utest=open('utest.sh','w')
973 caltinay 3804 utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix))
974 jfenwick 3259 for tests in TestGroups:
975     utest.write(tests.makeString())
976     utest.close()
977 jfenwick 3851 Execute(Chmod('utest.sh', 0o755))
978 jfenwick 3259 print("Generated utest.sh.")
979     except IOError:
980     print("Error attempting to write unittests file.")
981     Exit(1)
982 jfenwick 2879
983 caltinay 3604 # delete utest.sh upon cleanup
984     env.Clean('target_init', 'utest.sh')
985    
986 jfenwick 3259 # Make sure that the escript wrapper is in place
987     if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
988     print("Copying escript wrapper.")
989 jfenwick 3332 Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
990 jfenwick 2235

  ViewVC Help
Powered by ViewVC 1.1.26