/[escript]/branches/diaplayground/SConstruct
ViewVC logotype

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3947 - (hide annotations)
Wed Aug 22 23:19:10 2012 UTC (6 years, 8 months ago) by caltinay
Original Path: trunk/SConstruct
File size: 40016 byte(s)
Compiling and installing downunder module now. Adjusted import statements
accordingly. Added a gravity test run.

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

  ViewVC Help
Powered by ViewVC 1.1.26