/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5250 - (hide annotations)
Mon Nov 10 04:05:11 2014 UTC (4 years, 7 months ago) by caltinay
File size: 30394 byte(s)
Updated wheezy template options file and made our rodents import from there.
Had to rename scons/os -> scons/templates to avoid import conflicts.
Removed obsolete option vsl_random and added new options.
Other templates are yet to be updated.

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 5148 REQUIRED_OPTS_VERSION=202
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 caltinay 5148 ('nvcc', 'Path to CUDA compiler', 'default'),
73     ('nvccflags', 'Base CUDA compiler flags', 'default'),
74 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
75     BoolVariable('debug', 'Compile with debug flags', False),
76     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
77     ('omp_flags', 'OpenMP compiler flags', 'default'),
78     ('omp_ldflags', 'OpenMP linker flags', 'default'),
79     # Mandatory libraries
80     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82 caltinay 3597 # Mandatory for tests
83     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85 jfenwick 3259 # Optional libraries and options
86     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
88     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
89 caltinay 5250 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
90     ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
91 jfenwick 3259 BoolVariable('netcdf', 'Enable netCDF file support', False),
92     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
93     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
94     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
95     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
96     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
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 caltinay 5184 ListVariable('domains', 'Which domains to build', 'all',\
116     ['dudley','finley','ripley','speckley']),
117 jfenwick 3259 # Advanced settings
118     #dudley_assemble_flags = -funroll-loops to actually do something
119     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
120     # To enable passing function pointers through python
121     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
122     # An option for specifying the compiler tools (see windows branch)
123     ('tools_names', 'Compiler tools to use', ['default']),
124     ('env_export', 'Environment variables to be passed to tools',[]),
125     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
126     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
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 caltinay 5250 BoolVariable('longindices', 'use long indices (for very large matrices)', False),
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 caltinay 5250 ('compression_libs', 'Compression libraries to link with', ['boost_iostreams']),
140     BoolVariable('papi', 'Enable PAPI', False),
141     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
142     ('papi_libs', 'PAPI libraries to link with', ['papi']),
143     BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False)
144 robwdcock 682 )
145 phornby 1232
146 jfenwick 3259 ##################### Create environment and help text #######################
147 jfenwick 3078
148 jfenwick 3259 # Intel's compiler uses regular expressions improperly and emits a warning
149     # about failing to find the compilers. This warning can be safely ignored.
150 jfenwick 3078
151 caltinay 3319 # PATH is needed so the compiler, linker and tools are found if they are not
152     # in default locations.
153     env = Environment(tools = ['default'], options = vars,
154     ENV = {'PATH': os.environ['PATH']})
155 jfenwick 3967
156 caltinay 4295 # set the vars for clang
157 jfenwick 3967 def mkclang(env):
158 caltinay 4295 env['CXX']='clang++'
159    
160 caltinay 5045 if env['tools_names'] != ['default']:
161 jfenwick 3967 zz=env['tools_names']
162     if 'clang' in zz:
163     zz.remove('clang')
164     zz.insert(0, mkclang)
165 caltinay 3319 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
166     ENV = {'PATH' : os.environ['PATH']})
167 jfenwick 3078
168 jfenwick 3259 if options_file:
169     opts_valid=False
170     if 'escript_opts_version' in env.Dictionary() and \
171     int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
172     opts_valid=True
173     if opts_valid:
174     print("Using options in %s." % options_file)
175     else:
176     print("\nOptions file %s" % options_file)
177     print("is outdated! Please update the file by examining one of the TEMPLATE")
178     print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
179     Exit(1)
180 jfenwick 3078
181 jfenwick 3259 # Generate help text (scons -h)
182     Help(vars.GenerateHelpText(env))
183 jfenwick 3078
184 jfenwick 3259 # Check for superfluous options
185 caltinay 3268 if len(vars.UnknownVariables())>0:
186     for k in vars.UnknownVariables():
187     print("Unknown option '%s'" % k)
188     Exit(1)
189 jfenwick 3078
190 caltinay 5148 if env['cuda']:
191     if env['nvcc'] != 'default':
192     env['NVCC'] = env['nvcc']
193     env.Tool('nvcc')
194    
195 caltinay 4295 # create dictionary which will be populated with info for buildvars file
196     env['buildvars']={}
197     # create list which will be populated with warnings if there are any
198     env['warnings']=[]
199    
200 jfenwick 3259 #################### Make sure install directories exist #####################
201 ksteube 1705
202 caltinay 4046 env['BUILD_DIR']=Dir(env['build_dir']).abspath
203 jfenwick 3259 prefix=Dir(env['prefix']).abspath
204 caltinay 4295 env['buildvars']['prefix']=prefix
205 jfenwick 3259 env['incinstall'] = os.path.join(prefix, 'include')
206     env['bininstall'] = os.path.join(prefix, 'bin')
207     env['libinstall'] = os.path.join(prefix, 'lib')
208     env['pyinstall'] = os.path.join(prefix, 'esys')
209 jfenwick 2604 if not os.path.isdir(env['bininstall']):
210     os.makedirs(env['bininstall'])
211     if not os.path.isdir(env['libinstall']):
212     os.makedirs(env['libinstall'])
213     if not os.path.isdir(env['pyinstall']):
214     os.makedirs(env['pyinstall'])
215    
216 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
217     env.Append(LIBPATH = [env['libinstall']])
218 jfenwick 2603
219 jfenwick 3259 ################# Fill in compiler options if not set above ##################
220 ksteube 1312
221 jfenwick 3259 if env['cxx'] != 'default': env['CXX']=env['cxx']
222 gross 1024
223 jfenwick 3259 # version >=9 of intel C++ compiler requires use of icpc to link in C++
224     # runtimes (icc does not)
225     if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
226     env['LINK'] = env['CXX']
227 phornby 1243
228 jfenwick 3259 # default compiler/linker options
229     cc_flags = ''
230     cc_optim = ''
231     cc_debug = ''
232     omp_flags = ''
233     omp_ldflags = ''
234     fatalwarning = '' # switch to turn warnings into errors
235     sysheaderopt = '' # how to indicate that a header is a system header
236 jfenwick 2130
237 jfenwick 3259 # env['CC'] might be a full path
238 caltinay 4520 cc_name=os.path.basename(env['CXX'])
239 caltinay 2882
240 caltinay 4520 if cc_name == 'icpc':
241 jfenwick 3259 # Intel compiler
242 caltinay 4090 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
243 jfenwick 4542 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
244 caltinay 4775 cc_flags = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
245 caltinay 4877 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
246 jfenwick 3259 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
247 caltinay 4090 omp_flags = "-openmp"
248     omp_ldflags = "-openmp -openmp_report=1"
249 jfenwick 3259 fatalwarning = "-Werror"
250 caltinay 4520 elif cc_name[:3] == 'g++':
251 caltinay 5250 # GNU C++ on any system
252 caltinay 4173 # note that -ffast-math is not used because it breaks isnan(),
253     # see mantis #691
254 caltinay 4775 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
255 jfenwick 3259 cc_optim = "-O3"
256 caltinay 5250 #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
257     cc_debug = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
258 jfenwick 3259 omp_flags = "-fopenmp"
259     omp_ldflags = "-fopenmp"
260     fatalwarning = "-Werror"
261     sysheaderopt = "-isystem"
262     elif cc_name == 'cl':
263     # Microsoft Visual C on Windows
264     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
265     cc_optim = "/O2 /Op /W3"
266     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
267     fatalwarning = "/WX"
268     elif cc_name == 'icl':
269     # Intel C on Windows
270     cc_flags = '/EHsc /GR /MD'
271     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
272     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
273     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
274     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
275 phornby 1243
276 caltinay 4295 env['sysheaderopt']=sysheaderopt
277    
278 jfenwick 3259 # set defaults if not otherwise specified
279     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
280     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
281     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
282     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
283     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
284     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
285     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
286 jfenwick 2130
287 caltinay 5148 if env['nvccflags'] != 'default':
288     env['NVCCFLAGS'] = env['nvccflags']
289     env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
290    
291 caltinay 5183 if env['BADPYTHONMACROS']:
292     env.Append(CPPDEFINES = ['BADPYTHONMACROS'])
293 jfenwick 3961
294 caltinay 5183 if env['longindices']:
295     env.Append(CPPDEFINES = ['ESYS_INDEXTYPE_LONG'])
296    
297 jfenwick 3892 if env['usepython3']:
298     env.Append(CPPDEFINES=['ESPYTHON3'])
299    
300 jfenwick 3259 # set up the autolazy values
301     if env['forcelazy'] == 'on':
302     env.Append(CPPDEFINES=['FAUTOLAZYON'])
303     elif env['forcelazy'] == 'off':
304     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
305 ksteube 1312
306 jfenwick 3259 # set up the collective resolve values
307     if env['forcecollres'] == 'on':
308     env.Append(CPPDEFINES=['FRESCOLLECTON'])
309     elif env['forcecollres'] == 'off':
310     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
311 jfenwick 2273
312 jfenwick 3259 # allow non-standard C if requested
313 jfenwick 2827 if env['iknowwhatimdoing']:
314 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
315 jfenwick 2827
316 jfenwick 3259 # Disable OpenMP if no flags provided
317     if env['openmp'] and env['omp_flags'] == '':
318 caltinay 4295 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
319 jfenwick 3259 env['openmp'] = False
320 gross 1160
321 jfenwick 3259 if env['openmp']:
322     env.Append(CCFLAGS = env['omp_flags'])
323     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
324     else:
325     env['omp_flags']=''
326     env['omp_ldflags']=''
327 ksteube 1312
328 caltinay 4295 env['buildvars']['openmp']=int(env['openmp'])
329    
330 jfenwick 3259 # add debug/non-debug compiler flags
331 caltinay 4295 env['buildvars']['debug']=int(env['debug'])
332 jfenwick 3259 if env['debug']:
333     env.Append(CCFLAGS = env['cc_debug'])
334 gross 2423 else:
335 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
336 gross 1163
337 jfenwick 3259 # always add cc_flags
338     env.Append(CCFLAGS = env['cc_flags'])
339 phornby 1243
340 jfenwick 3259 # add system libraries
341     env.AppendUnique(LIBS = env['sys_libs'])
342 gross 2363
343 caltinay 4295 # determine svn revision
344 jfenwick 3618 global_revision=ARGUMENTS.get('SVN_VERSION', None)
345     if global_revision:
346     global_revision = re.sub(':.*', '', global_revision)
347     global_revision = re.sub('[^0-9]', '', global_revision)
348     if global_revision == '': global_revision='-2'
349     else:
350     # Get the global Subversion revision number for the getVersion() method
351     try:
352 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
353     global_revision = re.sub(':.*', '', global_revision)
354     global_revision = re.sub('[^0-9]', '', global_revision)
355     if global_revision == '': global_revision='-2'
356 jfenwick 3618 except:
357 jfenwick 3259 global_revision = '-1'
358 caltinay 3271 env['svn_revision']=global_revision
359 caltinay 4295 env['buildvars']['svn_revision']=global_revision
360 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
361 gross 2363
362 jfenwick 3259 if IS_WINDOWS:
363 caltinay 3602 if not env['build_shared']:
364 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
365     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
366 gross 2363
367 caltinay 4295 env['IS_WINDOWS']=IS_WINDOWS
368    
369 jfenwick 3259 ###################### Copy required environment vars ########################
370 gross 2363
371 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
372     if IS_WINDOWS:
373     LD_LIBRARY_PATH_KEY='PATH'
374     env['ENV']['LD_LIBRARY_PATH']=''
375     else:
376     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
377 robwdcock 682
378 caltinay 4295 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
379    
380 caltinay 3319 # the following env variables are exported for the unit tests
381 phornby 1244
382 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
383     try:
384     env['ENV'][key] = os.environ[key]
385     except KeyError:
386 caltinay 5045 env['ENV'][key] = '1'
387 robwdcock 682
388 jfenwick 3259 env_export=env['env_export']
389 caltinay 4917 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
390 robwdcock 682
391 jfenwick 3259 for key in set(env_export):
392     try:
393     env['ENV'][key] = os.environ[key]
394     except KeyError:
395     pass
396 ksteube 1312
397 jfenwick 3259 try:
398     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
399     except KeyError:
400     pass
401 ksteube 1312
402 jfenwick 4640 if IS_OSX:
403     try:
404     env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
405     except KeyError:
406     pass
407    
408    
409 jfenwick 3259 # these shouldn't be needed
410     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
411     # try:
412     # env['ENV'][key] = os.environ[key]
413     # except KeyError:
414     # pass
415 ksteube 1312
416 jfenwick 3259 try:
417     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
418     except KeyError:
419     pass
420 ksteube 1312
421 jfenwick 3259 ######################## Add some custom builders ############################
422 ksteube 1312
423 jfenwick 3851 if env['pythoncmd']=='python':
424     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
425     else:
426 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
427 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
428 gross 2423
429 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
430     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
431 gross 2423
432 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
433     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
434 ksteube 1756
435 sshaw 5017 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
436     env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
437    
438 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
439     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
440 ksteube 817
441 jfenwick 3259 ############################ Dependency checks ###############################
442 phornby 1246
443 caltinay 4295 ######## Compiler
444     env=checkCompiler(env)
445 phornby 1634
446 jfenwick 3259 ######## Python headers & library (required)
447 caltinay 4295 env=checkPython(env)
448 gross 806
449 caltinay 4295 ######## boost & boost-python (required)
450     env=checkBoost(env)
451 jfenwick 3892
452 caltinay 5148 ######## NVCC version (optional)
453     if env['cuda']:
454     env=checkCudaVersion(env)
455    
456 caltinay 4295 ######## numpy (required) and numpy headers (optional)
457     env=checkNumpy(env)
458 jfenwick 3892
459 caltinay 3597 ######## CppUnit (required for tests)
460 caltinay 4295 env=checkCppUnit(env)
461 caltinay 3597
462 caltinay 4295 ######## optional python modules (sympy, pyproj)
463     env=checkOptionalModules(env)
464 caltinay 3597
465 caltinay 4295 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
466     env=checkOptionalLibraries(env)
467 caltinay 3975
468 caltinay 3604 ######## PDFLaTeX (for documentation)
469 caltinay 4295 env=checkPDFLatex(env)
470 caltinay 3604
471 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
472     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
473     env.PrependENVPath('PYTHONPATH', prefix)
474     env['ENV']['ESCRIPT_ROOT'] = prefix
475 ksteube 1705
476 jfenwick 3259 if not env['verbose']:
477     env['CXXCOMSTR'] = "Compiling $TARGET"
478     env['SHCXXCOMSTR'] = "Compiling $TARGET"
479     env['ARCOMSTR'] = "Linking $TARGET"
480     env['LINKCOMSTR'] = "Linking $TARGET"
481     env['SHLINKCOMSTR'] = "Linking $TARGET"
482 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
483     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
484     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
485     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
486 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
487 ksteube 1705
488 jfenwick 3259 ####################### Configure the subdirectories #########################
489 ksteube 1247
490 caltinay 4295 # remove obsolete files
491     if not env['usempi']:
492     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
493     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
494    
495 jfenwick 2235 from grouptest import *
496     TestGroups=[]
497    
498 jfenwick 3259 # keep an environment without warnings-as-errors
499     dodgy_env=env.Clone()
500 jfenwick 2827
501 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
502     # because the scons test files have warnings in them
503     if ((fatalwarning != '') and (env['werror'])):
504     env.Append(CCFLAGS = fatalwarning)
505 jfenwick 2827
506 phornby 2027 Export(
507 jfenwick 3259 ['env',
508     'dodgy_env',
509     'IS_WINDOWS',
510     'TestGroups'
511     ]
512     )
513 ksteube 1705
514 caltinay 5184 #do not auto build
515 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
516     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
517     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
518 jfenwick 4508 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
519    
520 caltinay 5148 env.SConscript(dirs = ['cusplibrary'])
521    
522 jfenwick 4508 #This will pull in the escriptcore/py_src and escriptcore/test
523     env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
524 caltinay 3349 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
525 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
526 caltinay 5184 if 'dudley' in env['domains']:
527     env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
528     if 'finley' in env['domains']:
529     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
530     if 'ripley' in env['domains']:
531     env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
532     if 'speckley' in env['domains']:
533     env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
534 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
535 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
536     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
537     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
538 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
539 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
540 phornby 1243
541 jfenwick 3892
542 jfenwick 3259 ######################## Populate the buildvars file #########################
543 jfenwick 2235
544 caltinay 4295 write_buildvars(env)
545 phornby 1243
546 jfenwick 3259 ################### Targets to build and install libraries ###################
547 jfenwick 2302
548 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
549 ksteube 1705 env.Alias('target_init', [target_init])
550 caltinay 3604 # delete buildvars upon cleanup
551     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
552 ksteube 1705
553 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
554     # #include <paso/Common.h>
555     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
556     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
557 ksteube 1705
558 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
559     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
560 ksteube 1705
561 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
562 jfenwick 4508 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
563 caltinay 2810
564 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
565     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
566    
567 caltinay 5184 if 'dudley' in env['domains']:
568     env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
569     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
570 caltinay 3096
571 caltinay 5184 if 'finley' in env['domains']:
572     env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
573     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
574 caltinay 2910
575 caltinay 5184 if 'ripley' in env['domains']:
576     env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
577     env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
578 caltinay 3792
579 caltinay 5184 if 'speckley' in env['domains']:
580     env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
581     env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
582 sshaw 5123
583 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
584     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
585 ksteube 1705
586 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
587     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
588 ksteube 1705
589 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
590 ksteube 1705 build_all_list = []
591     build_all_list += ['build_esysUtils']
592     build_all_list += ['build_paso']
593     build_all_list += ['build_escript']
594 jfenwick 3675 build_all_list += ['build_pasowrap']
595 caltinay 5184 if 'dudley' in env['domains']: build_all_list += ['build_dudley']
596     if 'finley' in env['domains']: build_all_list += ['build_finley']
597     if 'ripley' in env['domains']: build_all_list += ['build_ripley']
598     if 'speckley' in env['domains']: build_all_list += ['build_speckley']
599 jfenwick 3259 build_all_list += ['build_weipa']
600 caltinay 5184 if not IS_WINDOWS and 'finley' in env['domains']:
601     build_all_list += ['build_escriptreader']
602 jfenwick 3259 if env['usempi']: build_all_list += ['build_pythonMPI']
603 ksteube 1705 env.Alias('build_all', build_all_list)
604    
605     install_all_list = []
606     install_all_list += ['target_init']
607     install_all_list += ['install_esysUtils']
608     install_all_list += ['install_paso']
609     install_all_list += ['install_escript']
610 jfenwick 3675 install_all_list += ['install_pasowrap']
611 caltinay 5184 if 'dudley' in env['domains']: install_all_list += ['install_dudley']
612     if 'finley' in env['domains']: install_all_list += ['install_finley']
613     if 'ripley' in env['domains']: install_all_list += ['install_ripley']
614     if 'speckley' in env['domains']: install_all_list += ['install_speckley']
615 jfenwick 3259 install_all_list += ['install_weipa']
616 caltinay 5184 if not IS_WINDOWS and 'finley' in env['domains']:
617     install_all_list += ['install_escriptreader']
618 caltinay 3947 install_all_list += ['install_downunder_py']
619 jfenwick 3259 install_all_list += ['install_modellib_py']
620     install_all_list += ['install_pycad_py']
621     if env['usempi']: install_all_list += ['install_pythonMPI']
622 ksteube 1705 env.Alias('install_all', install_all_list)
623    
624     # Default target is install
625     env.Default('install_all')
626    
627 jfenwick 3259 ################## Targets to build and run the test suite ###################
628 ksteube 1705
629 caltinay 3597 if not env['cppunit']:
630 caltinay 4520 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
631 caltinay 3597 env.Alias('run_tests', test_msg)
632 caltinay 4249 env.Alias('build_tests', '')
633 caltinay 3597 env.Alias('run_tests', ['install_all'])
634     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
635 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
636 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
637 ksteube 1705
638 jfenwick 3259 ##################### Targets to build the documentation #####################
639 artak 2820
640 jfenwick 4244 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
641     env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
642 jfenwick 4167 env.Alias('docs', ['basedocs', 'sphinxdoc'])
643 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
644 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
645 ksteube 1705
646 jfenwick 4078 # The test scripts are always generated, this target allows us to
647     # generate the testscripts without doing a full build
648     env.Alias('testscripts',[])
649    
650 jfenwick 3259 if not IS_WINDOWS:
651 caltinay 4295 generateTestScripts(env, TestGroups)
652 jfenwick 2879
653 caltinay 3604
654 caltinay 4295 ######################## Summarize our environment ###########################
655     def print_summary():
656     print("")
657 caltinay 4299 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
658 caltinay 4295 print("Escript/Finley revision %s"%global_revision)
659     print(" Install prefix: %s"%env['prefix'])
660     print(" Python: %s"%sysconfig.PREFIX)
661     print(" boost: %s"%env['boost_prefix'])
662 caltinay 4299 if env['numpy_h']:
663     print(" numpy: YES (with headers)")
664     else:
665     print(" numpy: YES (without headers)")
666 caltinay 4295 if env['usempi']:
667     print(" MPI: YES (flavour: %s)"%env['mpi'])
668     else:
669 caltinay 5250 print(" MPI: NO")
670 caltinay 4295 if env['uselapack']:
671     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
672     else:
673 caltinay 5250 print(" LAPACK: NO")
674 caltinay 5148 if env['cuda']:
675     print(" CUDA: YES (nvcc: %s)"%env['nvcc_version'])
676     else:
677 caltinay 5250 print(" CUDA: NO")
678 caltinay 4295 d_list=[]
679     e_list=[]
680 caltinay 5250 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit':
681 caltinay 4295 if env[i]: e_list.append(i)
682     else: d_list.append(i)
683     for i in e_list:
684     print("%16s: YES"%i)
685     for i in d_list:
686 caltinay 5250 print("%16s: NO"%i)
687 caltinay 4295 if env['cppunit']:
688 caltinay 5250 print(" CppUnit: YES")
689 caltinay 4295 else:
690 caltinay 5250 print(" CppUnit: NO")
691 caltinay 4295 if env['gmsh']=='m':
692 caltinay 5250 print(" gmsh: YES, MPI-ENABLED")
693 caltinay 4295 elif env['gmsh']=='s':
694 caltinay 5250 print(" gmsh: YES")
695 caltinay 4295 else:
696 caltinay 5250 print(" gmsh: NO")
697 sshaw 4738 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
698 caltinay 4299
699 caltinay 4295 if ((fatalwarning != '') and (env['werror'])):
700     print(" Treating warnings as errors")
701     else:
702     print(" NOT treating warnings as errors")
703     print("")
704     for w in env['warnings']:
705     print("WARNING: %s"%w)
706 sshaw 4726 if len(GetBuildFailures()):
707     print("\nERROR: build stopped due to errors\n")
708     else:
709     print("\nSUCCESS: build complete\n")
710 caltinay 4295
711     atexit.register(print_summary)
712    

  ViewVC Help
Powered by ViewVC 1.1.26