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

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4520 - (hide annotations)
Thu Aug 22 06:42:57 2013 UTC (5 years, 7 months ago) by caltinay
Original Path: trunk/SConstruct
File size: 27846 byte(s)
Removing spurious usage of C compiler:
-Changed all scons tests to use C++ compiler
-Renamed paso profiling files (unused)
-Updated most options files (removal of options and updated comments)

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 caltinay 4295 import atexit, sys, os, platform, re
19 jfenwick 3259 from distutils import sysconfig
20 caltinay 4295 from dependencies import *
21 jfenwick 3259 from site_init import *
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 jfenwick 4426 print("We recommend that you copy one of the TEMPLATE files in the scons/")
47 jfenwick 3259 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     ('cxx', 'Path to C++ compiler', 'default'),
64 caltinay 4520 ('cc_flags', 'Base C++ compiler flags', 'default'),
65     ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
66     ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
67 caltinay 2967 ('cxx_extra', 'Extra C++ compiler flags', ''),
68 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
69 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
70     BoolVariable('debug', 'Compile with debug flags', False),
71     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
72     ('omp_flags', 'OpenMP compiler flags', 'default'),
73     ('omp_ldflags', 'OpenMP linker flags', 'default'),
74     # Mandatory libraries
75     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
76 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
77 caltinay 3597 # Mandatory for tests
78     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
79     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
80 jfenwick 3259 # Optional libraries and options
81     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
82     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
83     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
84     BoolVariable('netcdf', 'Enable netCDF file support', False),
85     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
86     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
87     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
88     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
89     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
90     BoolVariable('papi', 'Enable PAPI', False),
91     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
92 ksteube 1705 ('papi_libs', 'PAPI libraries to link with', ['papi']),
93 jfenwick 3259 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
94     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
95     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
96     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
97     BoolVariable('umfpack', 'Enable UMFPACK', False),
98     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
99     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
100 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
101     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
102     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
103 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
104     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
105     ('lapack_libs', 'LAPACK libraries to link with', []),
106     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
107     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
108 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
109 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
110     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
111     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
112 jfenwick 3506 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
113 jfenwick 3259 # Advanced settings
114     #dudley_assemble_flags = -funroll-loops to actually do something
115     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
116     # To enable passing function pointers through python
117     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
118     # An option for specifying the compiler tools (see windows branch)
119     ('tools_names', 'Compiler tools to use', ['default']),
120     ('env_export', 'Environment variables to be passed to tools',[]),
121     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
122     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
123     # finer control over library building, intel aggressive global optimisation
124     # works with dynamic libraries on windows.
125 caltinay 3598 ('build_shared', 'Build dynamic libraries only', False),
126 jfenwick 3259 ('sys_libs', 'Extra libraries to link with', []),
127     ('escript_opts_version', 'Version of options file (do not specify on command line)'),
128 jfenwick 3618 ('SVN_VERSION', 'Do not use from options file', -2),
129 jfenwick 3851 ('pythoncmd', 'which python to compile with','python'),
130 jfenwick 3892 ('usepython3', 'Is this a python3 build? (experimental)', False),
131     ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
132 jfenwick 3942 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
133     ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
134 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
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 3967
147 caltinay 4295 # set the vars for clang
148 jfenwick 3967 def mkclang(env):
149 caltinay 4295 env['CXX']='clang++'
150    
151 jfenwick 3259 if env['tools_names'] != 'default':
152 jfenwick 3967 zz=env['tools_names']
153     if 'clang' in zz:
154     zz.remove('clang')
155     zz.insert(0, mkclang)
156 caltinay 3319 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
157     ENV = {'PATH' : os.environ['PATH']})
158 jfenwick 3078
159 jfenwick 3259 if options_file:
160     opts_valid=False
161     if 'escript_opts_version' in env.Dictionary() and \
162     int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
163     opts_valid=True
164     if opts_valid:
165     print("Using options in %s." % options_file)
166     else:
167     print("\nOptions file %s" % options_file)
168     print("is outdated! Please update the file by examining one of the TEMPLATE")
169     print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
170     Exit(1)
171 jfenwick 3078
172 jfenwick 3259 # Generate help text (scons -h)
173     Help(vars.GenerateHelpText(env))
174 jfenwick 3078
175 jfenwick 3259 # Check for superfluous options
176 caltinay 3268 if len(vars.UnknownVariables())>0:
177     for k in vars.UnknownVariables():
178     print("Unknown option '%s'" % k)
179     Exit(1)
180 jfenwick 3078
181 caltinay 4295 # create dictionary which will be populated with info for buildvars file
182     env['buildvars']={}
183     # create list which will be populated with warnings if there are any
184     env['warnings']=[]
185    
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 caltinay 4295 env['buildvars']['prefix']=prefix
191 jfenwick 3259 env['incinstall'] = os.path.join(prefix, 'include')
192     env['bininstall'] = os.path.join(prefix, 'bin')
193     env['libinstall'] = os.path.join(prefix, 'lib')
194     env['pyinstall'] = os.path.join(prefix, 'esys')
195 jfenwick 2604 if not os.path.isdir(env['bininstall']):
196     os.makedirs(env['bininstall'])
197     if not os.path.isdir(env['libinstall']):
198     os.makedirs(env['libinstall'])
199     if not os.path.isdir(env['pyinstall']):
200     os.makedirs(env['pyinstall'])
201    
202 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
203     env.Append(LIBPATH = [env['libinstall']])
204 jfenwick 2603
205 jfenwick 3259 ################# Fill in compiler options if not set above ##################
206 ksteube 1312
207 jfenwick 3259 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 caltinay 4520 cc_name=os.path.basename(env['CXX'])
225 caltinay 2882
226 caltinay 4520 if cc_name == 'icpc':
227 jfenwick 3259 # 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 caltinay 4520 elif cc_name[:3] == 'g++':
236 jfenwick 3259 # 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 caltinay 4295 env['sysheaderopt']=sysheaderopt
261    
262 jfenwick 3259 # set defaults if not otherwise specified
263     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
264     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
265     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
266     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
267     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
268     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
269     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
270 jfenwick 2130
271 jfenwick 3961 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
272    
273 jfenwick 3892 if env['usepython3']:
274     env.Append(CPPDEFINES=['ESPYTHON3'])
275    
276 jfenwick 3259 # set up the autolazy values
277     if env['forcelazy'] == 'on':
278     env.Append(CPPDEFINES=['FAUTOLAZYON'])
279     elif env['forcelazy'] == 'off':
280     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
281 ksteube 1312
282 jfenwick 3259 # set up the collective resolve values
283     if env['forcecollres'] == 'on':
284     env.Append(CPPDEFINES=['FRESCOLLECTON'])
285     elif env['forcecollres'] == 'off':
286     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
287 jfenwick 2273
288 jfenwick 3259 # allow non-standard C if requested
289 jfenwick 2827 if env['iknowwhatimdoing']:
290 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
291 jfenwick 2827
292 jfenwick 3259 # Disable OpenMP if no flags provided
293     if env['openmp'] and env['omp_flags'] == '':
294 caltinay 4295 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
295 jfenwick 3259 env['openmp'] = False
296 gross 1160
297 jfenwick 3259 if env['openmp']:
298     env.Append(CCFLAGS = env['omp_flags'])
299     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
300     else:
301     env['omp_flags']=''
302     env['omp_ldflags']=''
303 ksteube 1312
304 caltinay 4295 env['buildvars']['openmp']=int(env['openmp'])
305    
306 jfenwick 3259 # add debug/non-debug compiler flags
307 caltinay 4295 env['buildvars']['debug']=int(env['debug'])
308 jfenwick 3259 if env['debug']:
309     env.Append(CCFLAGS = env['cc_debug'])
310 gross 2423 else:
311 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
312 gross 1163
313 jfenwick 3259 # always add cc_flags
314     env.Append(CCFLAGS = env['cc_flags'])
315 phornby 1243
316 jfenwick 3259 # add system libraries
317     env.AppendUnique(LIBS = env['sys_libs'])
318 gross 2363
319 caltinay 4295 # determine svn revision
320 jfenwick 3618 global_revision=ARGUMENTS.get('SVN_VERSION', None)
321     if global_revision:
322     global_revision = re.sub(':.*', '', global_revision)
323     global_revision = re.sub('[^0-9]', '', global_revision)
324     if global_revision == '': global_revision='-2'
325     else:
326     # Get the global Subversion revision number for the getVersion() method
327     try:
328 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
329     global_revision = re.sub(':.*', '', global_revision)
330     global_revision = re.sub('[^0-9]', '', global_revision)
331     if global_revision == '': global_revision='-2'
332 jfenwick 3618 except:
333 jfenwick 3259 global_revision = '-1'
334 caltinay 3271 env['svn_revision']=global_revision
335 caltinay 4295 env['buildvars']['svn_revision']=global_revision
336 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
337 gross 2363
338 jfenwick 3259 if IS_WINDOWS:
339 caltinay 3602 if not env['build_shared']:
340 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
341     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
342 gross 2363
343 caltinay 4295 # VSL random numbers
344     env['buildvars']['vsl_random']=int(env['vsl_random'])
345     if env['vsl_random']:
346     env.Append(CPPDEFINES = ['MKLRANDOM'])
347    
348     env['IS_WINDOWS']=IS_WINDOWS
349    
350 jfenwick 3259 ###################### Copy required environment vars ########################
351 gross 2363
352 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
353     if IS_WINDOWS:
354     LD_LIBRARY_PATH_KEY='PATH'
355     env['ENV']['LD_LIBRARY_PATH']=''
356     else:
357     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
358 robwdcock 682
359 caltinay 4295 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
360    
361 caltinay 3319 # the following env variables are exported for the unit tests
362 phornby 1244
363 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
364     try:
365     env['ENV'][key] = os.environ[key]
366     except KeyError:
367     env['ENV'][key] = 1
368 robwdcock 682
369 jfenwick 3259 env_export=env['env_export']
370 caltinay 3977 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP'])
371 robwdcock 682
372 jfenwick 3259 for key in set(env_export):
373     try:
374     env['ENV'][key] = os.environ[key]
375     except KeyError:
376     pass
377 ksteube 1312
378 jfenwick 3259 try:
379     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
380     except KeyError:
381     pass
382 ksteube 1312
383 jfenwick 3259 # these shouldn't be needed
384     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
385     # try:
386     # env['ENV'][key] = os.environ[key]
387     # except KeyError:
388     # pass
389 ksteube 1312
390 jfenwick 3259 try:
391     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
392     except KeyError:
393     pass
394 ksteube 1312
395 jfenwick 3259 ######################## Add some custom builders ############################
396 ksteube 1312
397 jfenwick 3851 if env['pythoncmd']=='python':
398     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
399     else:
400 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
401 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
402 gross 2423
403 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
404     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
405 gross 2423
406 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
407     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
408 ksteube 1756
409 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
410     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
411 ksteube 817
412 jfenwick 3259 ############################ Dependency checks ###############################
413 phornby 1246
414 caltinay 4295 ######## Compiler
415     env=checkCompiler(env)
416 phornby 1634
417 jfenwick 3259 ######## Python headers & library (required)
418 caltinay 4295 env=checkPython(env)
419 gross 806
420 caltinay 4295 ######## boost & boost-python (required)
421     env=checkBoost(env)
422 jfenwick 3892
423 caltinay 4295 ######## numpy (required) and numpy headers (optional)
424     env=checkNumpy(env)
425 jfenwick 3892
426 caltinay 3597 ######## CppUnit (required for tests)
427 caltinay 4295 env=checkCppUnit(env)
428 caltinay 3597
429 caltinay 4295 ######## optional python modules (sympy, pyproj)
430     env=checkOptionalModules(env)
431 caltinay 3597
432 caltinay 4295 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
433     env=checkOptionalLibraries(env)
434 caltinay 3975
435 caltinay 3604 ######## PDFLaTeX (for documentation)
436 caltinay 4295 env=checkPDFLatex(env)
437 caltinay 3604
438 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
439     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
440     env.PrependENVPath('PYTHONPATH', prefix)
441     env['ENV']['ESCRIPT_ROOT'] = prefix
442 ksteube 1705
443 jfenwick 3259 if not env['verbose']:
444     env['CXXCOMSTR'] = "Compiling $TARGET"
445     env['SHCXXCOMSTR'] = "Compiling $TARGET"
446     env['ARCOMSTR'] = "Linking $TARGET"
447     env['LINKCOMSTR'] = "Linking $TARGET"
448     env['SHLINKCOMSTR'] = "Linking $TARGET"
449 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
450     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
451     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
452     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
453 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
454 ksteube 1705
455 jfenwick 3259 ####################### Configure the subdirectories #########################
456 ksteube 1247
457 caltinay 4295 # remove obsolete files
458     if not env['usempi']:
459     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
460     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
461    
462 jfenwick 2235 from grouptest import *
463     TestGroups=[]
464    
465 jfenwick 3259 # keep an environment without warnings-as-errors
466     dodgy_env=env.Clone()
467 jfenwick 2827
468 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
469     # because the scons test files have warnings in them
470     if ((fatalwarning != '') and (env['werror'])):
471     env.Append(CCFLAGS = fatalwarning)
472 jfenwick 2827
473 phornby 2027 Export(
474 jfenwick 3259 ['env',
475     'dodgy_env',
476     'IS_WINDOWS',
477     'TestGroups'
478     ]
479     )
480 ksteube 1705
481 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
482     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
483     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
484 jfenwick 4508 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
485    
486     #This will pull in the escriptcore/py_src and escriptcore/test
487     env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
488     #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
489 caltinay 3349 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
490 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
491 caltinay 3349 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
492     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
493 caltinay 3792 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
494 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
495 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
496     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
497     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
498 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
499 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
500 phornby 1243
501 jfenwick 3892
502 jfenwick 3259 ######################## Populate the buildvars file #########################
503 jfenwick 2235
504 caltinay 4295 write_buildvars(env)
505 phornby 1243
506 jfenwick 3259 ################### Targets to build and install libraries ###################
507 jfenwick 2302
508 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
509 ksteube 1705 env.Alias('target_init', [target_init])
510 caltinay 3604 # delete buildvars upon cleanup
511     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
512 ksteube 1705
513 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
514     # #include <paso/Common.h>
515     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
516     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
517 ksteube 1705
518 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
519     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
520 ksteube 1705
521 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
522 jfenwick 4508 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
523 caltinay 2810
524 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
525     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
526    
527 jfenwick 3259 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
528     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
529 caltinay 3096
530 jfenwick 3259 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
531     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
532 caltinay 2910
533 caltinay 3792 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
534     env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
535    
536 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
537     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
538 ksteube 1705
539 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
540     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
541 ksteube 1705
542 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
543 ksteube 1705 build_all_list = []
544     build_all_list += ['build_esysUtils']
545     build_all_list += ['build_paso']
546     build_all_list += ['build_escript']
547 jfenwick 3675 build_all_list += ['build_pasowrap']
548 jfenwick 3259 build_all_list += ['build_dudley']
549 ksteube 1705 build_all_list += ['build_finley']
550 caltinay 3792 build_all_list += ['build_ripley']
551 jfenwick 3259 build_all_list += ['build_weipa']
552     if not IS_WINDOWS: build_all_list += ['build_escriptreader']
553     if env['usempi']: build_all_list += ['build_pythonMPI']
554     build_all_list += ['build_escriptconvert']
555 ksteube 1705 env.Alias('build_all', build_all_list)
556    
557     install_all_list = []
558     install_all_list += ['target_init']
559     install_all_list += ['install_esysUtils']
560     install_all_list += ['install_paso']
561     install_all_list += ['install_escript']
562 jfenwick 3675 install_all_list += ['install_pasowrap']
563 jfenwick 3259 install_all_list += ['install_dudley']
564 ksteube 1705 install_all_list += ['install_finley']
565 caltinay 3792 install_all_list += ['install_ripley']
566 jfenwick 3259 install_all_list += ['install_weipa']
567     if not IS_WINDOWS: install_all_list += ['install_escriptreader']
568 caltinay 3947 install_all_list += ['install_downunder_py']
569 jfenwick 3259 install_all_list += ['install_modellib_py']
570     install_all_list += ['install_pycad_py']
571     if env['usempi']: install_all_list += ['install_pythonMPI']
572     install_all_list += ['install_escriptconvert']
573 ksteube 1705 env.Alias('install_all', install_all_list)
574    
575     # Default target is install
576     env.Default('install_all')
577    
578 jfenwick 3259 ################## Targets to build and run the test suite ###################
579 ksteube 1705
580 caltinay 3597 if not env['cppunit']:
581 caltinay 4520 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
582 caltinay 3597 env.Alias('run_tests', test_msg)
583 caltinay 4249 env.Alias('build_tests', '')
584 caltinay 3597 env.Alias('run_tests', ['install_all'])
585     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
586 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
587 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
588 ksteube 1705
589 jfenwick 3259 ##################### Targets to build the documentation #####################
590 artak 2820
591 jfenwick 4244 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
592     env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
593 jfenwick 4167 env.Alias('docs', ['basedocs', 'sphinxdoc'])
594 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
595 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
596 ksteube 1705
597 jfenwick 4078 # The test scripts are always generated, this target allows us to
598     # generate the testscripts without doing a full build
599     env.Alias('testscripts',[])
600    
601 jfenwick 3259 if not IS_WINDOWS:
602 caltinay 4295 generateTestScripts(env, TestGroups)
603 jfenwick 2879
604 caltinay 3604
605 jfenwick 2235
606 caltinay 4295 ######################## Summarize our environment ###########################
607     def print_summary():
608     print("")
609 caltinay 4299 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
610 caltinay 4295 print("Escript/Finley revision %s"%global_revision)
611     print(" Install prefix: %s"%env['prefix'])
612     print(" Python: %s"%sysconfig.PREFIX)
613     print(" boost: %s"%env['boost_prefix'])
614 caltinay 4299 if env['numpy_h']:
615     print(" numpy: YES (with headers)")
616     else:
617     print(" numpy: YES (without headers)")
618 caltinay 4295 if env['usempi']:
619     print(" MPI: YES (flavour: %s)"%env['mpi'])
620     else:
621     print(" MPI: DISABLED")
622     if env['uselapack']:
623     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
624     else:
625     print(" LAPACK: DISABLED")
626     d_list=[]
627     e_list=[]
628 caltinay 4300 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
629 caltinay 4295 if env[i]: e_list.append(i)
630     else: d_list.append(i)
631     for i in e_list:
632     print("%16s: YES"%i)
633     for i in d_list:
634     print("%16s: DISABLED"%i)
635     if env['cppunit']:
636     print(" CppUnit: FOUND")
637     else:
638     print(" CppUnit: NOT FOUND")
639     if env['gmsh']=='m':
640     print(" gmsh: FOUND, MPI-ENABLED")
641     elif env['gmsh']=='s':
642     print(" gmsh: FOUND")
643     else:
644     print(" gmsh: NOT FOUND")
645 caltinay 4299
646 caltinay 4295 if ((fatalwarning != '') and (env['werror'])):
647     print(" Treating warnings as errors")
648     else:
649     print(" NOT treating warnings as errors")
650     print("")
651     for w in env['warnings']:
652     print("WARNING: %s"%w)
653    
654     atexit.register(print_summary)
655    

  ViewVC Help
Powered by ViewVC 1.1.26