/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4167 - (hide annotations)
Fri Jan 25 05:21:30 2013 UTC (6 years, 5 months ago) by jfenwick
File size: 41292 byte(s)
fixes for doco for earlier releases
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     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"
238     cc_optim = "-O3"
239     cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
240     omp_flags = "-fopenmp"
241     omp_ldflags = "-fopenmp"
242     fatalwarning = "-Werror"
243     sysheaderopt = "-isystem"
244     elif cc_name == 'cl':
245     # Microsoft Visual C on Windows
246     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
247     cc_optim = "/O2 /Op /W3"
248     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
249     fatalwarning = "/WX"
250     elif cc_name == 'icl':
251     # Intel C on Windows
252     cc_flags = '/EHsc /GR /MD'
253     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
254     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
255     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
256     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
257 phornby 1243
258 jfenwick 3259 # set defaults if not otherwise specified
259     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
260     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
261     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
262     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
263     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
264     if env['cc_extra'] != '': env.Append(CFLAGS = env['cc_extra'])
265     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
266     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
267 jfenwick 2130
268 jfenwick 3961 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
269    
270 jfenwick 3892 if env['usepython3']:
271     env.Append(CPPDEFINES=['ESPYTHON3'])
272    
273 jfenwick 3259 # set up the autolazy values
274     if env['forcelazy'] == 'on':
275     env.Append(CPPDEFINES=['FAUTOLAZYON'])
276     elif env['forcelazy'] == 'off':
277     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
278 ksteube 1312
279 jfenwick 3259 # set up the collective resolve values
280     if env['forcecollres'] == 'on':
281     env.Append(CPPDEFINES=['FRESCOLLECTON'])
282     elif env['forcecollres'] == 'off':
283     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
284 jfenwick 2273
285 jfenwick 3259 # allow non-standard C if requested
286 jfenwick 2827 if env['iknowwhatimdoing']:
287 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
288 jfenwick 2827
289 jfenwick 3259 # Disable OpenMP if no flags provided
290     if env['openmp'] and env['omp_flags'] == '':
291     print("OpenMP requested but no flags provided - disabling OpenMP!")
292     env['openmp'] = False
293 gross 1160
294 jfenwick 3259 if env['openmp']:
295     env.Append(CCFLAGS = env['omp_flags'])
296     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
297     else:
298     env['omp_flags']=''
299     env['omp_ldflags']=''
300 ksteube 1312
301 jfenwick 3259 # add debug/non-debug compiler flags
302     if env['debug']:
303     env.Append(CCFLAGS = env['cc_debug'])
304 gross 2423 else:
305 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
306 gross 1163
307 jfenwick 3259 # always add cc_flags
308     env.Append(CCFLAGS = env['cc_flags'])
309 phornby 1243
310 jfenwick 3259 # add system libraries
311     env.AppendUnique(LIBS = env['sys_libs'])
312 gross 2363
313 jfenwick 3618
314     global_revision=ARGUMENTS.get('SVN_VERSION', None)
315     if global_revision:
316     global_revision = re.sub(':.*', '', global_revision)
317     global_revision = re.sub('[^0-9]', '', global_revision)
318     if global_revision == '': global_revision='-2'
319     else:
320     # Get the global Subversion revision number for the getVersion() method
321     try:
322 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
323     global_revision = re.sub(':.*', '', global_revision)
324     global_revision = re.sub('[^0-9]', '', global_revision)
325     if global_revision == '': global_revision='-2'
326 jfenwick 3618 except:
327 jfenwick 3259 global_revision = '-1'
328 caltinay 3271 env['svn_revision']=global_revision
329 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
330 gross 2363
331 jfenwick 3259 if IS_WINDOWS:
332 caltinay 3602 if not env['build_shared']:
333 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
334     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
335 gross 2363
336 jfenwick 3259 ###################### Copy required environment vars ########################
337 gross 2363
338 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
339     if IS_WINDOWS:
340     LD_LIBRARY_PATH_KEY='PATH'
341     env['ENV']['LD_LIBRARY_PATH']=''
342     else:
343     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
344 robwdcock 682
345 caltinay 3319 # the following env variables are exported for the unit tests
346 phornby 1244
347 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
348     try:
349     env['ENV'][key] = os.environ[key]
350     except KeyError:
351     env['ENV'][key] = 1
352 robwdcock 682
353 jfenwick 3259 env_export=env['env_export']
354 caltinay 3977 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP'])
355 robwdcock 682
356 jfenwick 3259 for key in set(env_export):
357     try:
358     env['ENV'][key] = os.environ[key]
359     except KeyError:
360     pass
361 ksteube 1312
362 jfenwick 3259 try:
363     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
364     except KeyError:
365     pass
366 ksteube 1312
367 jfenwick 3259 # these shouldn't be needed
368     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
369     # try:
370     # env['ENV'][key] = os.environ[key]
371     # except KeyError:
372     # pass
373 ksteube 1312
374 jfenwick 3259 try:
375     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
376     except KeyError:
377     pass
378 ksteube 1312
379 jfenwick 3259 ######################## Add some custom builders ############################
380 ksteube 1312
381 jfenwick 3851 if env['pythoncmd']=='python':
382     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
383     else:
384 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
385 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
386 gross 2423
387 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
388     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
389 gross 2423
390 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
391     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
392 ksteube 1756
393 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
394     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
395 ksteube 817
396 jfenwick 3259 ############################ Dependency checks ###############################
397 phornby 1246
398 jfenwick 3259 # Create a Configure() environment to check for compilers and python
399     conf = Configure(env.Clone())
400 phornby 1634
401 jfenwick 3259 ######## Test that the compilers work
402 ksteube 1705
403 jfenwick 3259 if 'CheckCC' in dir(conf): # exists since scons 1.1.0
404     if not conf.CheckCC():
405     print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
406     Exit(1)
407     if not conf.CheckCXX():
408     print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
409     Exit(1)
410     else:
411     if not conf.CheckFunc('printf', language='c'):
412     print("Cannot run C compiler '%s' (check config.log)" % (env['CC']))
413     Exit(1)
414     if not conf.CheckFunc('printf', language='c++'):
415     print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX']))
416     Exit(1)
417 ksteube 1705
418 phornby 1789 if conf.CheckFunc('gethostname'):
419 jfenwick 3259 conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME'])
420 gross 806
421 jfenwick 3259 ######## Python headers & library (required)
422 gross 806
423 jfenwick 3942 #First we check to see if the config file has specified
424     ##Where to find the filae. Ideally, this should be automatic
425     #But we need to deal with the case where python is not in its INSTALL
426     #Directory
427 jfenwick 3892 # Use the python scons is running
428     if env['pythoncmd']=='python':
429     python_inc_path=sysconfig.get_python_inc()
430     if IS_WINDOWS:
431     python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs')
432     elif env['PLATFORM']=='darwin':
433     python_lib_path=sysconfig.get_config_var('LIBPL')
434     else:
435     python_lib_path=sysconfig.get_config_var('LIBDIR')
436    
437     #python_libs=[sysconfig.get_config_var('LDLIBRARY')] # only on linux
438     if IS_WINDOWS:
439     python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])]
440     else:
441     python_libs=['python'+sysconfig.get_python_version()]
442    
443     #if we want to use a python other than the one scons is running
444 jfenwick 3259 else:
445 jfenwick 3892 initstring='from __future__ import print_function;from distutils import sysconfig;'
446     if env['pythonlibname']!='':
447     python_libs=env['pythonlibname']
448     else: # work it out by calling python
449     if IS_WINDOWS:
450     cmd='print("python%s%s"%(sys.version_info[0], sys.version_info[1]))'
451     else:
452     cmd='print("python"+sysconfig.get_python_version())'
453     p=Popen([env['pythoncmd'], '-c', initstring+cmd], stdout=PIPE)
454     python_libs=p.stdout.readline()
455     if env['usepython3']: # This is to convert unicode str into py2 string
456     python_libs=python_libs.encode() # If scons runs on py3 then this must be rethought
457     p.wait()
458     python_libs=python_libs.strip()
459 jfenwick 2130
460 jfenwick 3892
461     # Now we know whether we are using python3 or not
462     p=Popen([env['pythoncmd'], '-c', initstring+'print(sysconfig.get_python_inc())'], stdout=PIPE)
463     python_inc_path=p.stdout.readline()
464     if env['usepython3']:
465 jfenwick 3851 python_inc_path=python_inc_path.encode()
466 jfenwick 3892 p.wait()
467     python_inc_path=python_inc_path.strip()
468     if IS_WINDOWS:
469 jfenwick 3851 cmd="os.path.join(sysconfig.get_config_var('prefix'), 'libs')"
470 jfenwick 3892 elif env['PLATFORM']=='darwin':
471 jfenwick 3851 cmd="sysconfig.get_config_var(\"LIBPL\")"
472 jfenwick 3892 else:
473 jfenwick 3851 cmd="sysconfig.get_config_var(\"LIBDIR\")"
474    
475 jfenwick 3892 p=Popen([env['pythoncmd'], '-c', initstring+'print('+cmd+')'], stdout=PIPE)
476     python_lib_path=p.stdout.readline()
477     if env['usepython3']:
478     python_lib_path=python_lib_path.decode()
479     p.wait()
480     python_lib_path=python_lib_path.strip()
481 jfenwick 3851
482 jfenwick 3942 #Check for an override from the config file.
483     #Ideally, this should be automatic
484     #But we need to deal with the case where python is not in its INSTALL
485     #Directory
486     if env['pythonlibpath']!='':
487     python_lib_path=env['pythonlibpath']
488    
489     if env['pythonincpath']!='':
490     python_inc_path=env['pythonincpath']
491    
492    
493 jfenwick 3259 if sysheaderopt == '':
494     conf.env.AppendUnique(CPPPATH = [python_inc_path])
495 jfenwick 2130 else:
496 jfenwick 3259 conf.env.Append(CCFLAGS = [sysheaderopt, python_inc_path])
497 jfenwick 2130
498 jfenwick 3259 conf.env.AppendUnique(LIBPATH = [python_lib_path])
499     conf.env.AppendUnique(LIBS = python_libs)
500     # The wrapper script needs to find the libs
501     conf.env.PrependENVPath(LD_LIBRARY_PATH_KEY, python_lib_path)
502 gross 805
503 ksteube 1705 if not conf.CheckCHeader('Python.h'):
504 jfenwick 3259 print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path))
505     Exit(1)
506 gross 2284 if not conf.CheckFunc('Py_Exit'):
507 jfenwick 3259 print("Cannot find python library method Py_Main (tried %s in directory %s)" % (python_libs, python_lib_path))
508     Exit(1)
509 gross 805
510 jfenwick 3892 ## reuse conf to check for numpy header (optional)
511 caltinay 3896 if env['usepython3']:
512     # FIXME: This is until we can work out how to make the checks in python 3
513     conf.env['numpy_h']=False
514     else:
515     if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']):
516     conf.env.Append(CPPDEFINES = ['HAVE_NUMPY_H'])
517     conf.env['numpy_h']=True
518     else:
519     conf.env['numpy_h']=False
520 caltinay 3784
521 ksteube 1705 # Commit changes to environment
522     env = conf.Finish()
523 ksteube 1312
524 jfenwick 3259 ######## boost (required)
525 ksteube 1312
526 jfenwick 3259 boost_inc_path,boost_lib_path=findLibWithHeader(env, env['boost_libs'], 'boost/python.hpp', env['boost_prefix'], lang='c++')
527     if sysheaderopt == '':
528     env.AppendUnique(CPPPATH = [boost_inc_path])
529 ksteube 1705 else:
530 jfenwick 3259 # This is required because we can't -isystem /usr/include since it breaks
531     # std includes
532     if os.path.normpath(boost_inc_path) == '/usr/include':
533     conf.env.Append(CCFLAGS=[sysheaderopt, os.path.join(boost_inc_path,'boost')])
534     else:
535     env.Append(CCFLAGS=[sysheaderopt, boost_inc_path])
536 ksteube 1312
537 jfenwick 3259 env.AppendUnique(LIBPATH = [boost_lib_path])
538     env.AppendUnique(LIBS = env['boost_libs'])
539     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boost_lib_path)
540 ksteube 1705
541 jfenwick 3259 ######## numpy (required)
542 ksteube 1705
543 caltinay 3975 if not detectModule(env, 'numpy'):
544     print("Cannot import numpy. If it is installed try setting your PYTHONPATH and probably %s"%LD_LIBRARY_PATH_KEY)
545     Exit(1)
546 ksteube 1705
547 caltinay 3597 ######## CppUnit (required for tests)
548    
549     try:
550     cppunit_inc_path,cppunit_lib_path=findLibWithHeader(env, env['cppunit_libs'], 'cppunit/TestFixture.h', env['cppunit_prefix'], lang='c++')
551     env.AppendUnique(CPPPATH = [cppunit_inc_path])
552     env.AppendUnique(LIBPATH = [cppunit_lib_path])
553     env.PrependENVPath(LD_LIBRARY_PATH_KEY, cppunit_lib_path)
554     env['cppunit']=True
555     except:
556     env['cppunit']=False
557    
558 caltinay 3975 ######## sympy (optional)
559    
560     if detectModule(env, 'sympy'):
561     env['sympy'] = True
562     else:
563     print("Cannot import sympy. Symbolic toolbox and nonlinear PDEs will not be available.")
564     env['sympy'] = False
565    
566 jfenwick 3259 ######## netCDF (optional)
567 gross 806
568 jfenwick 3259 netcdf_inc_path=''
569     netcdf_lib_path=''
570     if env['netcdf']:
571     netcdf_inc_path,netcdf_lib_path=findLibWithHeader(env, env['netcdf_libs'], 'netcdf.h', env['netcdf_prefix'], lang='c++')
572     env.AppendUnique(CPPPATH = [netcdf_inc_path])
573     env.AppendUnique(LIBPATH = [netcdf_lib_path])
574     env.AppendUnique(LIBS = env['netcdf_libs'])
575     env.PrependENVPath(LD_LIBRARY_PATH_KEY, netcdf_lib_path)
576     env.Append(CPPDEFINES = ['USE_NETCDF'])
577 gross 806
578 jfenwick 3259 ######## PAPI (optional)
579 gross 805
580 jfenwick 3259 papi_inc_path=''
581     papi_lib_path=''
582     if env['papi']:
583     papi_inc_path,papi_lib_path=findLibWithHeader(env, env['papi_libs'], 'papi.h', env['papi_prefix'], lang='c')
584     env.AppendUnique(CPPPATH = [papi_inc_path])
585     env.AppendUnique(LIBPATH = [papi_lib_path])
586     env.AppendUnique(LIBS = env['papi_libs'])
587     env.PrependENVPath(LD_LIBRARY_PATH_KEY, papi_lib_path)
588     env.Append(CPPDEFINES = ['BLOCKPAPI'])
589 phornby 1246
590 jfenwick 3259 ######## MKL (optional)
591 jfenwick 2787
592 jfenwick 3259 mkl_inc_path=''
593     mkl_lib_path=''
594     if env['mkl']:
595     mkl_inc_path,mkl_lib_path=findLibWithHeader(env, env['mkl_libs'], 'mkl_solver.h', env['mkl_prefix'], lang='c')
596     env.AppendUnique(CPPPATH = [mkl_inc_path])
597     env.AppendUnique(LIBPATH = [mkl_lib_path])
598     env.AppendUnique(LIBS = env['mkl_libs'])
599     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mkl_lib_path)
600     env.Append(CPPDEFINES = ['MKL'])
601 gross 950
602 jfenwick 3259 ######## UMFPACK (optional)
603 ksteube 1705
604 jfenwick 3259 umfpack_inc_path=''
605     umfpack_lib_path=''
606     if env['umfpack']:
607     umfpack_inc_path,umfpack_lib_path=findLibWithHeader(env, env['umfpack_libs'], 'umfpack.h', env['umfpack_prefix'], lang='c')
608     env.AppendUnique(CPPPATH = [umfpack_inc_path])
609     env.AppendUnique(LIBPATH = [umfpack_lib_path])
610     env.AppendUnique(LIBS = env['umfpack_libs'])
611     env.PrependENVPath(LD_LIBRARY_PATH_KEY, umfpack_lib_path)
612     env.Append(CPPDEFINES = ['UMFPACK'])
613 ksteube 1705
614 jfenwick 3259 ######## LAPACK (optional)
615 ksteube 1705
616 jfenwick 3259 if env['lapack']=='mkl' and not env['mkl']:
617     print("mkl_lapack requires MKL!")
618     Exit(1)
619 ksteube 1705
620 jfenwick 3259 env['uselapack'] = env['lapack']!='none'
621     lapack_inc_path=''
622     lapack_lib_path=''
623 jfenwick 2742 if env['uselapack']:
624 jfenwick 3259 header='clapack.h'
625     if env['lapack']=='mkl':
626     env.AppendUnique(CPPDEFINES = ['MKL_LAPACK'])
627     header='mkl_lapack.h'
628     lapack_inc_path,lapack_lib_path=findLibWithHeader(env, env['lapack_libs'], header, env['lapack_prefix'], lang='c')
629     env.AppendUnique(CPPPATH = [lapack_inc_path])
630     env.AppendUnique(LIBPATH = [lapack_lib_path])
631     env.AppendUnique(LIBS = env['lapack_libs'])
632     env.Append(CPPDEFINES = ['USE_LAPACK'])
633 jfenwick 2742
634 jfenwick 3259 ######## Silo (optional)
635 jfenwick 2742
636 jfenwick 3259 silo_inc_path=''
637     silo_lib_path=''
638     if env['silo']:
639     silo_inc_path,silo_lib_path=findLibWithHeader(env, env['silo_libs'], 'silo.h', env['silo_prefix'], lang='c')
640     env.AppendUnique(CPPPATH = [silo_inc_path])
641     env.AppendUnique(LIBPATH = [silo_lib_path])
642     # Note that we do not add the libs since they are only needed for the
643     # weipa library and tools.
644     #env.AppendUnique(LIBS = [env['silo_libs']])
645 ksteube 1459
646 jfenwick 3506 ######## VSL random numbers (optional)
647     if env['vsl_random']:
648     env.Append(CPPDEFINES = ['MKLRANDOM'])
649    
650 jfenwick 3259 ######## VisIt (optional)
651 robwdcock 682
652 jfenwick 3259 visit_inc_path=''
653     visit_lib_path=''
654     if env['visit']:
655     visit_inc_path,visit_lib_path=findLibWithHeader(env, env['visit_libs'], 'VisItControlInterface_V2.h', env['visit_prefix'], lang='c')
656     env.AppendUnique(CPPPATH = [visit_inc_path])
657     env.AppendUnique(LIBPATH = [visit_lib_path])
658 gross 707
659 jfenwick 3259 ######## MPI (optional)
660 jfenwick 2232
661 jfenwick 3618 if env['mpi']=='no':
662     env['mpi']='none'
663    
664 jfenwick 3259 env['usempi'] = env['mpi']!='none'
665     mpi_inc_path=''
666     mpi_lib_path=''
667     if env['usempi']:
668     mpi_inc_path,mpi_lib_path=findLibWithHeader(env, env['mpi_libs'], 'mpi.h', env['mpi_prefix'], lang='c')
669     env.AppendUnique(CPPPATH = [mpi_inc_path])
670     env.AppendUnique(LIBPATH = [mpi_lib_path])
671     env.AppendUnique(LIBS = env['mpi_libs'])
672     env.PrependENVPath(LD_LIBRARY_PATH_KEY, mpi_lib_path)
673     env.Append(CPPDEFINES = ['ESYS_MPI', 'MPI_NO_CPPBIND', 'MPICH_IGNORE_CXX_SEEK'])
674     # NetCDF 4.1 defines MPI_Comm et al. if MPI_INCLUDED is not defined!
675     # On the other hand MPT and OpenMPI don't define the latter so we have to
676     # do that here
677     if env['netcdf'] and env['mpi'] in ['MPT','OPENMPI']:
678     env.Append(CPPDEFINES = ['MPI_INCLUDED'])
679 jfenwick 2232
680 lgao 3508 ######## BOOMERAMG (optional)
681    
682 lgao 3511 if env['mpi'] == 'none': env['boomeramg'] = False
683 lgao 3508
684     boomeramg_inc_path=''
685     boomeramg_lib_path=''
686     if env['boomeramg']:
687     boomeramg_inc_path,boomeramg_lib_path=findLibWithHeader(env, env['boomeramg_libs'], 'HYPRE.h', env['boomeramg_prefix'], lang='c')
688     env.AppendUnique(CPPPATH = [boomeramg_inc_path])
689     env.AppendUnique(LIBPATH = [boomeramg_lib_path])
690     env.AppendUnique(LIBS = env['boomeramg_libs'])
691     env.PrependENVPath(LD_LIBRARY_PATH_KEY, boomeramg_lib_path)
692     env.Append(CPPDEFINES = ['BOOMERAMG'])
693    
694 jfenwick 3259 ######## ParMETIS (optional)
695 jfenwick 2232
696 jfenwick 3259 if not env['usempi']: env['parmetis'] = False
697 jfenwick 2232
698 jfenwick 3259 parmetis_inc_path=''
699     parmetis_lib_path=''
700     if env['parmetis']:
701     parmetis_inc_path,parmetis_lib_path=findLibWithHeader(env, env['parmetis_libs'], 'parmetis.h', env['parmetis_prefix'], lang='c')
702     env.AppendUnique(CPPPATH = [parmetis_inc_path])
703     env.AppendUnique(LIBPATH = [parmetis_lib_path])
704     env.AppendUnique(LIBS = env['parmetis_libs'])
705     env.PrependENVPath(LD_LIBRARY_PATH_KEY, parmetis_lib_path)
706     env.Append(CPPDEFINES = ['USE_PARMETIS'])
707 jfenwick 2387
708 caltinay 3463 ######## gmsh (optional, for tests)
709    
710     try:
711 caltinay 3975 p=Popen(['gmsh', '-info'], stderr=PIPE)
712 caltinay 3585 _,e=p.communicate()
713     if e.split().count("MPI"):
714     env['gmsh']='m'
715     else:
716     env['gmsh']='s'
717 caltinay 3463 except OSError:
718     env['gmsh']=False
719    
720 caltinay 3604 ######## PDFLaTeX (for documentation)
721     if 'PDF' in dir(env) and '.tex' in env.PDF.builder.src_suffixes(env):
722     env['pdflatex']=True
723     else:
724     env['pdflatex']=False
725    
726 jfenwick 3259 ######################## Summarize our environment ###########################
727 ksteube 1705
728 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
729     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
730     env.PrependENVPath('PYTHONPATH', prefix)
731     env['ENV']['ESCRIPT_ROOT'] = prefix
732 ksteube 1705
733 jfenwick 3259 if not env['verbose']:
734     env['CCCOMSTR'] = "Compiling $TARGET"
735     env['CXXCOMSTR'] = "Compiling $TARGET"
736     env['SHCCCOMSTR'] = "Compiling $TARGET"
737     env['SHCXXCOMSTR'] = "Compiling $TARGET"
738     env['ARCOMSTR'] = "Linking $TARGET"
739     env['LINKCOMSTR'] = "Linking $TARGET"
740     env['SHLINKCOMSTR'] = "Linking $TARGET"
741 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
742     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
743     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
744     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
745 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
746 ksteube 1705
747 jfenwick 3259 print("")
748     print("*** Config Summary (see config.log and lib/buildvars for details) ***")
749     print("Escript/Finley revision %s"%global_revision)
750     print(" Install prefix: %s"%env['prefix'])
751     print(" Python: %s"%sysconfig.PREFIX)
752     print(" boost: %s"%env['boost_prefix'])
753     print(" numpy: YES")
754     if env['usempi']:
755     print(" MPI: YES (flavour: %s)"%env['mpi'])
756 ksteube 1312 else:
757 jfenwick 3259 print(" MPI: DISABLED")
758     if env['uselapack']:
759     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
760 ksteube 1705 else:
761 jfenwick 3259 print(" LAPACK: DISABLED")
762     d_list=[]
763     e_list=[]
764 caltinay 3975 for i in 'debug','openmp','boomeramg','mkl','netcdf','papi','parmetis','silo','sympy','umfpack','visit','vsl_random':
765 jfenwick 3259 if env[i]: e_list.append(i)
766     else: d_list.append(i)
767     for i in e_list:
768     print("%16s: YES"%i)
769     for i in d_list:
770     print("%16s: DISABLED"%i)
771 caltinay 3597 if env['cppunit']:
772     print(" CppUnit: FOUND")
773     else:
774     print(" CppUnit: NOT FOUND")
775 caltinay 3585 if env['gmsh']=='m':
776     print(" gmsh: FOUND, MPI-ENABLED")
777     elif env['gmsh']=='s':
778 caltinay 3463 print(" gmsh: FOUND")
779     else:
780     print(" gmsh: NOT FOUND")
781 caltinay 3784 if env['numpy_h']:
782     print(" numpy headers: FOUND")
783     else:
784     print(" numpy headers: NOT FOUND")
785 jfenwick 3851 print(" vsl_random: %s"%env['vsl_random'])
786 jfenwick 3506
787 jfenwick 3259 if ((fatalwarning != '') and (env['werror'])):
788     print(" Treating warnings as errors")
789     else:
790     print(" NOT treating warnings as errors")
791     print("")
792 ksteube 1215
793 jfenwick 3259 ####################### Configure the subdirectories #########################
794 ksteube 1247
795 jfenwick 2235 from grouptest import *
796    
797     TestGroups=[]
798    
799 jfenwick 3259 # keep an environment without warnings-as-errors
800     dodgy_env=env.Clone()
801 jfenwick 2827
802 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
803     # because the scons test files have warnings in them
804     if ((fatalwarning != '') and (env['werror'])):
805     env.Append(CCFLAGS = fatalwarning)
806 jfenwick 2827
807 phornby 2027 Export(
808 jfenwick 3259 ['env',
809     'dodgy_env',
810     'IS_WINDOWS',
811     'TestGroups'
812     ]
813     )
814 ksteube 1705
815 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
816     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
817     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
818     env.SConscript(dirs = ['escript/src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
819     env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
820 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
821 caltinay 3349 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
822     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
823 caltinay 3792 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
824 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
825 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
826     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
827     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
828 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
829 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
830 phornby 1243
831 jfenwick 3892
832 jfenwick 3259 ######################## Populate the buildvars file #########################
833 jfenwick 2235
834 jfenwick 3259 # remove obsolete file
835     if not env['usempi']:
836     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
837     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
838 phornby 1243
839 jfenwick 3259 # Try to extract the boost version from version.hpp
840     boosthpp=open(os.path.join(boost_inc_path, 'boost', 'version.hpp'))
841 jfenwick 2302 boostversion='unknown'
842     try:
843     for line in boosthpp:
844     ver=re.match(r'#define BOOST_VERSION (\d+)',line)
845     if ver:
846     boostversion=ver.group(1)
847 jfenwick 3259 except StopIteration:
848 jfenwick 2302 pass
849 jfenwick 3259 boosthpp.close()
850    
851 jfenwick 3892
852 jfenwick 3259 buildvars=open(os.path.join(env['libinstall'], 'buildvars'), 'w')
853 jfenwick 2302 buildvars.write("svn_revision="+str(global_revision)+"\n")
854 jfenwick 3259 buildvars.write("prefix="+prefix+"\n")
855     buildvars.write("cc="+env['CC']+"\n")
856     buildvars.write("cxx="+env['CXX']+"\n")
857 jfenwick 3851 if env['pythoncmd']=='python':
858     buildvars.write("python="+sys.executable+"\n")
859     buildvars.write("python_version="+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+"\n")
860     else:
861     buildvars.write("python="+env['pythoncmd']+"\n")
862 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)
863 jfenwick 3851 verstring=p.stdout.readline().strip()
864     p.wait()
865 jfenwick 3892 buildvars.write("python_version="+verstring+"\n")
866 jfenwick 3259 buildvars.write("boost_inc_path="+boost_inc_path+"\n")
867     buildvars.write("boost_lib_path="+boost_lib_path+"\n")
868     buildvars.write("boost_version="+boostversion+"\n")
869     buildvars.write("debug=%d\n"%int(env['debug']))
870     buildvars.write("openmp=%d\n"%int(env['openmp']))
871     buildvars.write("mpi=%s\n"%env['mpi'])
872     buildvars.write("mpi_inc_path=%s\n"%mpi_inc_path)
873     buildvars.write("mpi_lib_path=%s\n"%mpi_lib_path)
874     buildvars.write("lapack=%s\n"%env['lapack'])
875 gross 3560 buildvars.write("vsl_random=%d\n"%int(env['vsl_random']))
876 lgao 3508 for i in 'netcdf','parmetis','papi','mkl','umfpack','boomeramg','silo','visit':
877 jfenwick 3259 buildvars.write("%s=%d\n"%(i, int(env[i])))
878     if env[i]:
879     buildvars.write("%s_inc_path=%s\n"%(i, eval(i+'_inc_path')))
880     buildvars.write("%s_lib_path=%s\n"%(i, eval(i+'_lib_path')))
881 jfenwick 2302 buildvars.close()
882    
883 jfenwick 3259 ################### Targets to build and install libraries ###################
884 jfenwick 2302
885 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
886 ksteube 1705 env.Alias('target_init', [target_init])
887 caltinay 3604 # delete buildvars upon cleanup
888     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
889 ksteube 1705
890 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
891     # #include <paso/Common.h>
892     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
893     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
894 ksteube 1705
895 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
896     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
897 ksteube 1705
898 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
899     env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escript_py'])
900 caltinay 2810
901 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
902     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
903    
904 jfenwick 3259 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
905     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
906 caltinay 3096
907 jfenwick 3259 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
908     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
909 caltinay 2910
910 caltinay 3792 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
911     env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
912    
913 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
914     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
915 ksteube 1705
916 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
917     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
918 ksteube 1705
919 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
920 ksteube 1705 build_all_list = []
921     build_all_list += ['build_esysUtils']
922     build_all_list += ['build_paso']
923     build_all_list += ['build_escript']
924 jfenwick 3675 build_all_list += ['build_pasowrap']
925 jfenwick 3259 build_all_list += ['build_dudley']
926 ksteube 1705 build_all_list += ['build_finley']
927 caltinay 3792 build_all_list += ['build_ripley']
928 jfenwick 3259 build_all_list += ['build_weipa']
929     if not IS_WINDOWS: build_all_list += ['build_escriptreader']
930     if env['usempi']: build_all_list += ['build_pythonMPI']
931     build_all_list += ['build_escriptconvert']
932 ksteube 1705 env.Alias('build_all', build_all_list)
933    
934     install_all_list = []
935     install_all_list += ['target_init']
936     install_all_list += ['install_esysUtils']
937     install_all_list += ['install_paso']
938     install_all_list += ['install_escript']
939 jfenwick 3675 install_all_list += ['install_pasowrap']
940 jfenwick 3259 install_all_list += ['install_dudley']
941 ksteube 1705 install_all_list += ['install_finley']
942 caltinay 3792 install_all_list += ['install_ripley']
943 jfenwick 3259 install_all_list += ['install_weipa']
944     if not IS_WINDOWS: install_all_list += ['install_escriptreader']
945 caltinay 3947 install_all_list += ['install_downunder_py']
946 jfenwick 3259 install_all_list += ['install_modellib_py']
947     install_all_list += ['install_pycad_py']
948     if env['usempi']: install_all_list += ['install_pythonMPI']
949     install_all_list += ['install_escriptconvert']
950 ksteube 1705 env.Alias('install_all', install_all_list)
951    
952     # Default target is install
953     env.Default('install_all')
954    
955 jfenwick 3259 ################## Targets to build and run the test suite ###################
956 ksteube 1705
957 caltinay 3597 if not env['cppunit']:
958 jfenwick 3942 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C/C++ unit tests, CppUnit not found!";exit 1')
959 caltinay 3597 env.Alias('run_tests', test_msg)
960     env.Alias('run_tests', ['install_all'])
961     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
962 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
963 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
964 ksteube 1705
965 jfenwick 3259 ##################### Targets to build the documentation #####################
966 artak 2820
967 jfenwick 4167 env.Alias('basedocs', ['examples_tarfile', 'examples_zipfile', 'api_doxygen', 'user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
968     env.Alias('docs', ['basedocs', 'sphinxdoc'])
969 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
970 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
971 ksteube 1705
972 jfenwick 4078
973     # The test scripts are always generated, this target allows us to
974     # generate the testscripts without doing a full build
975     env.Alias('testscripts',[])
976    
977 jfenwick 3259 if not IS_WINDOWS:
978     try:
979     utest=open('utest.sh','w')
980 jfenwick 4078 utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, False))
981 jfenwick 3259 for tests in TestGroups:
982     utest.write(tests.makeString())
983     utest.close()
984 jfenwick 3851 Execute(Chmod('utest.sh', 0o755))
985 jfenwick 3259 print("Generated utest.sh.")
986 jfenwick 4078 # This version contains only python tests - I want this to be usable
987     # From a binary only install if you have the test files
988     utest=open('itest.sh','w')
989     utest.write(GroupTest.makeHeader(env['PLATFORM'], prefix, True))
990     for tests in TestGroups:
991     if tests.exec_cmd=='$PYTHONRUNNER ':
992     utest.write(tests.makeString())
993     utest.close()
994     Execute(Chmod('itest.sh', 0o755))
995     print("Generated itest.sh.")
996 jfenwick 3259 except IOError:
997     print("Error attempting to write unittests file.")
998     Exit(1)
999 jfenwick 2879
1000 caltinay 3604 # delete utest.sh upon cleanup
1001     env.Clean('target_init', 'utest.sh')
1002 jfenwick 4078 env.Clean('target_init', 'itest.sh')
1003 caltinay 3604
1004 jfenwick 3259 # Make sure that the escript wrapper is in place
1005     if not os.path.isfile(os.path.join(env['bininstall'], 'run-escript')):
1006     print("Copying escript wrapper.")
1007 jfenwick 3332 Execute(Copy(os.path.join(env['bininstall'],'run-escript'), 'bin/run-escript'))
1008 jfenwick 2235

  ViewVC Help
Powered by ViewVC 1.1.26