/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4173 - (hide annotations)
Wed Jan 30 03:05:01 2013 UTC (6 years, 4 months ago) by caltinay
File size: 41369 byte(s)
Do not use -ffast-math by default (see mantis 691).

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

  ViewVC Help
Powered by ViewVC 1.1.26