/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3961 - (hide annotations)
Tue Sep 11 07:21:41 2012 UTC (7 years, 1 month ago) by jfenwick
File size: 40175 byte(s)
Options file for mole.
Work around for python compile errors

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

  ViewVC Help
Powered by ViewVC 1.1.26