/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5123 - (hide annotations)
Thu Aug 28 07:02:11 2014 UTC (4 years, 10 months ago) by sshaw
File size: 29227 byte(s)
Adding speckley (high-order) domain family, doesn't yet support MPI, Reduced functionspaces, or PDEs using A, B and/or C


1 jfenwick 3982 ##############################################################################
2 jgs 214 #
3 jfenwick 4657 # Copyright (c) 2003-2014 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 jfenwick 4657 # Development 2012-2013 by School of Earth Sciences
12     # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13 jfenwick 3982 #
14     ##############################################################################
15 jgs 455
16 jfenwick 3259 EnsureSConsVersion(0,98,1)
17     EnsurePythonVersion(2,5)
18 ksteube 1811
19 caltinay 4295 import atexit, sys, os, platform, re
20 jfenwick 3259 from distutils import sysconfig
21 caltinay 4295 from dependencies import *
22 jfenwick 3259 from site_init import *
23 jgs 214
24 jfenwick 3259 # Version number to check for in options file. Increment when new features are
25     # added or existing options changed.
26 caltinay 3597 REQUIRED_OPTS_VERSION=201
27 ksteube 1705
28     # MS Windows support, many thanks to PH
29 jfenwick 3259 IS_WINDOWS = (os.name == 'nt')
30 gross 806
31 jfenwick 4640 IS_OSX = (os.uname()[0] == 'Darwin')
32    
33 jfenwick 3259 ########################## Determine options file ############################
34     # 1. command line
35     # 2. scons/<hostname>_options.py
36     # 3. name as part of a cluster
37 jfenwick 2391 options_file=ARGUMENTS.get('options_file', None)
38     if not options_file:
39 jfenwick 3259 ext_dir = os.path.join(os.getcwd(), 'scons')
40     hostname = platform.node().split('.')[0]
41     for name in hostname, effectiveName(hostname):
42     mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
43     options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
44     if os.path.isfile(options_file): break
45 jfenwick 2391
46 ksteube 1866 if not os.path.isfile(options_file):
47 jfenwick 3259 print("\nWARNING:\nOptions file %s" % options_file)
48     print("not found! Default options will be used which is most likely suboptimal.")
49 jduplessis 4889 print("We recommend that you copy the most relavent options file in the scons/os/")
50 jfenwick 3259 print("subdirectory and customize it to your needs.\n")
51     options_file = None
52 ksteube 1217
53 jfenwick 3259 ############################### Build options ################################
54 gross 1149
55 jfenwick 3259 default_prefix='/usr'
56 jfenwick 3618 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57 jfenwick 3259 lapack_flavours=('none', 'clapack', 'mkl')
58 jfenwick 2430
59 jfenwick 3259 vars = Variables(options_file, ARGUMENTS)
60     vars.AddVariables(
61     PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
62     PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
63 caltinay 3349 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
64 jfenwick 3259 BoolVariable('verbose', 'Output full compile/link lines', False),
65     # Compiler/Linker options
66     ('cxx', 'Path to C++ compiler', 'default'),
67 caltinay 4520 ('cc_flags', 'Base C++ compiler flags', 'default'),
68     ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
69     ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
70 caltinay 2967 ('cxx_extra', 'Extra C++ compiler flags', ''),
71 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
72 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
73     BoolVariable('debug', 'Compile with debug flags', False),
74     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
75     ('omp_flags', 'OpenMP compiler flags', 'default'),
76     ('omp_ldflags', 'OpenMP linker flags', 'default'),
77     # Mandatory libraries
78     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
79 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
80 caltinay 3597 # Mandatory for tests
81     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
82     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
83 jfenwick 3259 # Optional libraries and options
84     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
85     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
86     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
87     BoolVariable('netcdf', 'Enable netCDF file support', False),
88     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
89     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
90     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
91     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
92     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
93     BoolVariable('papi', 'Enable PAPI', False),
94     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
95 ksteube 1705 ('papi_libs', 'PAPI libraries to link with', ['papi']),
96 jfenwick 3259 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
97     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
98     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
99     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
100     BoolVariable('umfpack', 'Enable UMFPACK', False),
101     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
102     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
103 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
104     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
105     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
106 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
107     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
108     ('lapack_libs', 'LAPACK libraries to link with', []),
109     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
110     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
111 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
112 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
113     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
114     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
115 jfenwick 3506 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
116 jfenwick 3259 # Advanced settings
117     #dudley_assemble_flags = -funroll-loops to actually do something
118     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
119     # To enable passing function pointers through python
120     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
121     # An option for specifying the compiler tools (see windows branch)
122     ('tools_names', 'Compiler tools to use', ['default']),
123     ('env_export', 'Environment variables to be passed to tools',[]),
124     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
125     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
126     # finer control over library building, intel aggressive global optimisation
127     # works with dynamic libraries on windows.
128 caltinay 3598 ('build_shared', 'Build dynamic libraries only', False),
129 jfenwick 3259 ('sys_libs', 'Extra libraries to link with', []),
130     ('escript_opts_version', 'Version of options file (do not specify on command line)'),
131 jfenwick 3618 ('SVN_VERSION', 'Do not use from options file', -2),
132 jfenwick 3851 ('pythoncmd', 'which python to compile with','python'),
133 jfenwick 3892 ('usepython3', 'Is this a python3 build? (experimental)', False),
134     ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
135 jfenwick 3942 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
136     ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
137 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
138 sshaw 4738 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
139     ('compression_libs', 'Compression libraries to link with', ['boost_iostreams'])
140 robwdcock 682 )
141 phornby 1232
142 jfenwick 3259 ##################### Create environment and help text #######################
143 jfenwick 3078
144 jfenwick 3259 # Intel's compiler uses regular expressions improperly and emits a warning
145     # about failing to find the compilers. This warning can be safely ignored.
146 jfenwick 3078
147 caltinay 3319 # PATH is needed so the compiler, linker and tools are found if they are not
148     # in default locations.
149     env = Environment(tools = ['default'], options = vars,
150     ENV = {'PATH': os.environ['PATH']})
151 jfenwick 3967
152 caltinay 4295 # set the vars for clang
153 jfenwick 3967 def mkclang(env):
154 caltinay 4295 env['CXX']='clang++'
155    
156 caltinay 5045 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 caltinay 4295 # create dictionary which will be populated with info for buildvars file
187     env['buildvars']={}
188     # create list which will be populated with warnings if there are any
189     env['warnings']=[]
190    
191 jfenwick 3259 #################### Make sure install directories exist #####################
192 ksteube 1705
193 caltinay 4046 env['BUILD_DIR']=Dir(env['build_dir']).abspath
194 jfenwick 3259 prefix=Dir(env['prefix']).abspath
195 caltinay 4295 env['buildvars']['prefix']=prefix
196 jfenwick 3259 env['incinstall'] = os.path.join(prefix, 'include')
197     env['bininstall'] = os.path.join(prefix, 'bin')
198     env['libinstall'] = os.path.join(prefix, 'lib')
199     env['pyinstall'] = os.path.join(prefix, 'esys')
200 jfenwick 2604 if not os.path.isdir(env['bininstall']):
201     os.makedirs(env['bininstall'])
202     if not os.path.isdir(env['libinstall']):
203     os.makedirs(env['libinstall'])
204     if not os.path.isdir(env['pyinstall']):
205     os.makedirs(env['pyinstall'])
206    
207 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
208     env.Append(LIBPATH = [env['libinstall']])
209 jfenwick 2603
210 jfenwick 3259 ################# Fill in compiler options if not set above ##################
211 ksteube 1312
212 jfenwick 3259 if env['cxx'] != 'default': env['CXX']=env['cxx']
213 gross 1024
214 jfenwick 3259 # version >=9 of intel C++ compiler requires use of icpc to link in C++
215     # runtimes (icc does not)
216     if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
217     env['LINK'] = env['CXX']
218 phornby 1243
219 jfenwick 3259 # default compiler/linker options
220     cc_flags = ''
221     cc_optim = ''
222     cc_debug = ''
223     omp_flags = ''
224     omp_ldflags = ''
225     fatalwarning = '' # switch to turn warnings into errors
226     sysheaderopt = '' # how to indicate that a header is a system header
227 jfenwick 2130
228 jfenwick 3259 # env['CC'] might be a full path
229 caltinay 4520 cc_name=os.path.basename(env['CXX'])
230 caltinay 2882
231 caltinay 4520 if cc_name == 'icpc':
232 jfenwick 3259 # Intel compiler
233 caltinay 4090 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
234 jfenwick 4542 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
235 caltinay 4775 cc_flags = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
236 caltinay 4877 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
237 jfenwick 3259 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
238 caltinay 4090 omp_flags = "-openmp"
239     omp_ldflags = "-openmp -openmp_report=1"
240 jfenwick 3259 fatalwarning = "-Werror"
241 caltinay 4520 elif cc_name[:3] == 'g++':
242 jfenwick 3259 # GNU C on any system
243 caltinay 4173 # note that -ffast-math is not used because it breaks isnan(),
244     # see mantis #691
245 caltinay 4775 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
246 jfenwick 3259 cc_optim = "-O3"
247 sshaw 4820 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
248 jfenwick 3259 omp_flags = "-fopenmp"
249     omp_ldflags = "-fopenmp"
250     fatalwarning = "-Werror"
251     sysheaderopt = "-isystem"
252     elif cc_name == 'cl':
253     # Microsoft Visual C on Windows
254     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
255     cc_optim = "/O2 /Op /W3"
256     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
257     fatalwarning = "/WX"
258     elif cc_name == 'icl':
259     # Intel C on Windows
260     cc_flags = '/EHsc /GR /MD'
261     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
262     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
263     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
264     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
265 phornby 1243
266 caltinay 4295 env['sysheaderopt']=sysheaderopt
267    
268 jfenwick 3259 # set defaults if not otherwise specified
269     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
270     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
271     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
272     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
273     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
274     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
275     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
276 jfenwick 2130
277 jfenwick 3961 if env['BADPYTHONMACROS']: env.Append(CXXFLAGS = ' -DBADPYTHONMACROS')
278    
279 jfenwick 3892 if env['usepython3']:
280     env.Append(CPPDEFINES=['ESPYTHON3'])
281    
282 jfenwick 3259 # set up the autolazy values
283     if env['forcelazy'] == 'on':
284     env.Append(CPPDEFINES=['FAUTOLAZYON'])
285     elif env['forcelazy'] == 'off':
286     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
287 ksteube 1312
288 jfenwick 3259 # set up the collective resolve values
289     if env['forcecollres'] == 'on':
290     env.Append(CPPDEFINES=['FRESCOLLECTON'])
291     elif env['forcecollres'] == 'off':
292     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
293 jfenwick 2273
294 jfenwick 3259 # allow non-standard C if requested
295 jfenwick 2827 if env['iknowwhatimdoing']:
296 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
297 jfenwick 2827
298 jfenwick 3259 # Disable OpenMP if no flags provided
299     if env['openmp'] and env['omp_flags'] == '':
300 caltinay 4295 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
301 jfenwick 3259 env['openmp'] = False
302 gross 1160
303 jfenwick 3259 if env['openmp']:
304     env.Append(CCFLAGS = env['omp_flags'])
305     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
306     else:
307     env['omp_flags']=''
308     env['omp_ldflags']=''
309 ksteube 1312
310 caltinay 4295 env['buildvars']['openmp']=int(env['openmp'])
311    
312 jfenwick 3259 # add debug/non-debug compiler flags
313 caltinay 4295 env['buildvars']['debug']=int(env['debug'])
314 jfenwick 3259 if env['debug']:
315     env.Append(CCFLAGS = env['cc_debug'])
316 gross 2423 else:
317 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
318 gross 1163
319 jfenwick 3259 # always add cc_flags
320     env.Append(CCFLAGS = env['cc_flags'])
321 phornby 1243
322 jfenwick 3259 # add system libraries
323     env.AppendUnique(LIBS = env['sys_libs'])
324 gross 2363
325 caltinay 4295 # determine svn revision
326 jfenwick 3618 global_revision=ARGUMENTS.get('SVN_VERSION', None)
327     if global_revision:
328     global_revision = re.sub(':.*', '', global_revision)
329     global_revision = re.sub('[^0-9]', '', global_revision)
330     if global_revision == '': global_revision='-2'
331     else:
332     # Get the global Subversion revision number for the getVersion() method
333     try:
334 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
335     global_revision = re.sub(':.*', '', global_revision)
336     global_revision = re.sub('[^0-9]', '', global_revision)
337     if global_revision == '': global_revision='-2'
338 jfenwick 3618 except:
339 jfenwick 3259 global_revision = '-1'
340 caltinay 3271 env['svn_revision']=global_revision
341 caltinay 4295 env['buildvars']['svn_revision']=global_revision
342 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
343 gross 2363
344 jfenwick 3259 if IS_WINDOWS:
345 caltinay 3602 if not env['build_shared']:
346 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
347     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
348 gross 2363
349 caltinay 4295 # VSL random numbers
350     env['buildvars']['vsl_random']=int(env['vsl_random'])
351     if env['vsl_random']:
352     env.Append(CPPDEFINES = ['MKLRANDOM'])
353    
354     env['IS_WINDOWS']=IS_WINDOWS
355    
356 jfenwick 3259 ###################### Copy required environment vars ########################
357 gross 2363
358 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
359     if IS_WINDOWS:
360     LD_LIBRARY_PATH_KEY='PATH'
361     env['ENV']['LD_LIBRARY_PATH']=''
362     else:
363     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
364 robwdcock 682
365 caltinay 4295 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
366    
367 caltinay 3319 # the following env variables are exported for the unit tests
368 phornby 1244
369 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
370     try:
371     env['ENV'][key] = os.environ[key]
372     except KeyError:
373 caltinay 5045 env['ENV'][key] = '1'
374 robwdcock 682
375 jfenwick 3259 env_export=env['env_export']
376 caltinay 4917 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
377 robwdcock 682
378 jfenwick 3259 for key in set(env_export):
379     try:
380     env['ENV'][key] = os.environ[key]
381     except KeyError:
382     pass
383 ksteube 1312
384 jfenwick 3259 try:
385     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
386     except KeyError:
387     pass
388 ksteube 1312
389 jfenwick 4640 if IS_OSX:
390     try:
391     env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
392     except KeyError:
393     pass
394    
395    
396 jfenwick 3259 # these shouldn't be needed
397     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
398     # try:
399     # env['ENV'][key] = os.environ[key]
400     # except KeyError:
401     # pass
402 ksteube 1312
403 jfenwick 3259 try:
404     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
405     except KeyError:
406     pass
407 ksteube 1312
408 jfenwick 3259 ######################## Add some custom builders ############################
409 ksteube 1312
410 jfenwick 3851 if env['pythoncmd']=='python':
411     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
412     else:
413 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
414 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
415 gross 2423
416 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
417     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
418 gross 2423
419 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
420     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
421 ksteube 1756
422 sshaw 5017 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
423     env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
424    
425 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
426     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
427 ksteube 817
428 jfenwick 3259 ############################ Dependency checks ###############################
429 phornby 1246
430 caltinay 4295 ######## Compiler
431     env=checkCompiler(env)
432 phornby 1634
433 jfenwick 3259 ######## Python headers & library (required)
434 caltinay 4295 env=checkPython(env)
435 gross 806
436 caltinay 4295 ######## boost & boost-python (required)
437     env=checkBoost(env)
438 jfenwick 3892
439 caltinay 4295 ######## numpy (required) and numpy headers (optional)
440     env=checkNumpy(env)
441 jfenwick 3892
442 caltinay 3597 ######## CppUnit (required for tests)
443 caltinay 4295 env=checkCppUnit(env)
444 caltinay 3597
445 caltinay 4295 ######## optional python modules (sympy, pyproj)
446     env=checkOptionalModules(env)
447 caltinay 3597
448 caltinay 4295 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
449     env=checkOptionalLibraries(env)
450 caltinay 3975
451 caltinay 3604 ######## PDFLaTeX (for documentation)
452 caltinay 4295 env=checkPDFLatex(env)
453 caltinay 3604
454 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
455     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
456     env.PrependENVPath('PYTHONPATH', prefix)
457     env['ENV']['ESCRIPT_ROOT'] = prefix
458 ksteube 1705
459 jfenwick 3259 if not env['verbose']:
460     env['CXXCOMSTR'] = "Compiling $TARGET"
461     env['SHCXXCOMSTR'] = "Compiling $TARGET"
462     env['ARCOMSTR'] = "Linking $TARGET"
463     env['LINKCOMSTR'] = "Linking $TARGET"
464     env['SHLINKCOMSTR'] = "Linking $TARGET"
465 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
466     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
467     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
468     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
469 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
470 ksteube 1705
471 jfenwick 3259 ####################### Configure the subdirectories #########################
472 ksteube 1247
473 caltinay 4295 # remove obsolete files
474     if not env['usempi']:
475     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
476     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
477    
478 jfenwick 2235 from grouptest import *
479     TestGroups=[]
480    
481 jfenwick 3259 # keep an environment without warnings-as-errors
482     dodgy_env=env.Clone()
483 jfenwick 2827
484 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
485     # because the scons test files have warnings in them
486     if ((fatalwarning != '') and (env['werror'])):
487     env.Append(CCFLAGS = fatalwarning)
488 jfenwick 2827
489 phornby 2027 Export(
490 jfenwick 3259 ['env',
491     'dodgy_env',
492     'IS_WINDOWS',
493     'TestGroups'
494     ]
495     )
496 ksteube 1705
497 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
498     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
499     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
500 jfenwick 4508 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
501    
502     #This will pull in the escriptcore/py_src and escriptcore/test
503     env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
504     #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
505 caltinay 3349 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
506 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
507 caltinay 3349 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
508     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
509 caltinay 3792 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
510 sshaw 5123 env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
511 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
512 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
513     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
514     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
515 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
516 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
517 phornby 1243
518 jfenwick 3892
519 jfenwick 3259 ######################## Populate the buildvars file #########################
520 jfenwick 2235
521 caltinay 4295 write_buildvars(env)
522 phornby 1243
523 jfenwick 3259 ################### Targets to build and install libraries ###################
524 jfenwick 2302
525 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
526 ksteube 1705 env.Alias('target_init', [target_init])
527 caltinay 3604 # delete buildvars upon cleanup
528     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
529 ksteube 1705
530 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
531     # #include <paso/Common.h>
532     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
533     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
534 ksteube 1705
535 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
536     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
537 ksteube 1705
538 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
539 jfenwick 4508 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
540 caltinay 2810
541 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
542     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
543    
544 jfenwick 3259 env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
545     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
546 caltinay 3096
547 jfenwick 3259 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
548     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
549 caltinay 2910
550 caltinay 3792 env.Alias('build_ripley', ['install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
551     env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
552    
553 sshaw 5123 env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
554     env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
555    
556 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
557     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
558 ksteube 1705
559 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
560     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
561 ksteube 1705
562 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
563 ksteube 1705 build_all_list = []
564     build_all_list += ['build_esysUtils']
565     build_all_list += ['build_paso']
566     build_all_list += ['build_escript']
567 jfenwick 3675 build_all_list += ['build_pasowrap']
568 jfenwick 3259 build_all_list += ['build_dudley']
569 ksteube 1705 build_all_list += ['build_finley']
570 caltinay 3792 build_all_list += ['build_ripley']
571 sshaw 5123 build_all_list += ['build_speckley']
572 jfenwick 3259 build_all_list += ['build_weipa']
573     if not IS_WINDOWS: build_all_list += ['build_escriptreader']
574     if env['usempi']: build_all_list += ['build_pythonMPI']
575     build_all_list += ['build_escriptconvert']
576 ksteube 1705 env.Alias('build_all', build_all_list)
577    
578     install_all_list = []
579     install_all_list += ['target_init']
580     install_all_list += ['install_esysUtils']
581     install_all_list += ['install_paso']
582     install_all_list += ['install_escript']
583 jfenwick 3675 install_all_list += ['install_pasowrap']
584 jfenwick 3259 install_all_list += ['install_dudley']
585 ksteube 1705 install_all_list += ['install_finley']
586 caltinay 3792 install_all_list += ['install_ripley']
587 sshaw 5123 install_all_list += ['install_speckley']
588 jfenwick 3259 install_all_list += ['install_weipa']
589     if not IS_WINDOWS: install_all_list += ['install_escriptreader']
590 caltinay 3947 install_all_list += ['install_downunder_py']
591 jfenwick 3259 install_all_list += ['install_modellib_py']
592     install_all_list += ['install_pycad_py']
593     if env['usempi']: install_all_list += ['install_pythonMPI']
594     install_all_list += ['install_escriptconvert']
595 ksteube 1705 env.Alias('install_all', install_all_list)
596    
597     # Default target is install
598     env.Default('install_all')
599    
600 jfenwick 3259 ################## Targets to build and run the test suite ###################
601 ksteube 1705
602 caltinay 3597 if not env['cppunit']:
603 caltinay 4520 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
604 caltinay 3597 env.Alias('run_tests', test_msg)
605 caltinay 4249 env.Alias('build_tests', '')
606 caltinay 3597 env.Alias('run_tests', ['install_all'])
607     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
608 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
609 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
610 ksteube 1705
611 jfenwick 3259 ##################### Targets to build the documentation #####################
612 artak 2820
613 jfenwick 4244 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
614     env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
615 jfenwick 4167 env.Alias('docs', ['basedocs', 'sphinxdoc'])
616 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
617 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
618 ksteube 1705
619 jfenwick 4078 # The test scripts are always generated, this target allows us to
620     # generate the testscripts without doing a full build
621     env.Alias('testscripts',[])
622    
623 jfenwick 3259 if not IS_WINDOWS:
624 caltinay 4295 generateTestScripts(env, TestGroups)
625 jfenwick 2879
626 caltinay 3604
627 jfenwick 2235
628 caltinay 4295 ######################## Summarize our environment ###########################
629     def print_summary():
630     print("")
631 caltinay 4299 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
632 caltinay 4295 print("Escript/Finley revision %s"%global_revision)
633     print(" Install prefix: %s"%env['prefix'])
634     print(" Python: %s"%sysconfig.PREFIX)
635     print(" boost: %s"%env['boost_prefix'])
636 caltinay 4299 if env['numpy_h']:
637     print(" numpy: YES (with headers)")
638     else:
639     print(" numpy: YES (without headers)")
640 caltinay 4295 if env['usempi']:
641     print(" MPI: YES (flavour: %s)"%env['mpi'])
642     else:
643     print(" MPI: DISABLED")
644     if env['uselapack']:
645     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
646     else:
647     print(" LAPACK: DISABLED")
648     d_list=[]
649     e_list=[]
650 caltinay 4300 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
651 caltinay 4295 if env[i]: e_list.append(i)
652     else: d_list.append(i)
653     for i in e_list:
654     print("%16s: YES"%i)
655     for i in d_list:
656     print("%16s: DISABLED"%i)
657     if env['cppunit']:
658     print(" CppUnit: FOUND")
659     else:
660     print(" CppUnit: NOT FOUND")
661     if env['gmsh']=='m':
662     print(" gmsh: FOUND, MPI-ENABLED")
663     elif env['gmsh']=='s':
664     print(" gmsh: FOUND")
665     else:
666     print(" gmsh: NOT FOUND")
667 sshaw 4738 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
668 caltinay 4299
669 caltinay 4295 if ((fatalwarning != '') and (env['werror'])):
670     print(" Treating warnings as errors")
671     else:
672     print(" NOT treating warnings as errors")
673     print("")
674     for w in env['warnings']:
675     print("WARNING: %s"%w)
676 sshaw 4726 if len(GetBuildFailures()):
677     print("\nERROR: build stopped due to errors\n")
678     else:
679     print("\nSUCCESS: build complete\n")
680 caltinay 4295
681     atexit.register(print_summary)
682    

  ViewVC Help
Powered by ViewVC 1.1.26