/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4244 - (hide annotations)
Mon Feb 25 05:37:50 2013 UTC (6 years, 4 months ago) by jfenwick
File size: 41588 byte(s)
More testing and a target in scons for the pdf docs

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

  ViewVC Help
Powered by ViewVC 1.1.26