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

Annotation of /branches/inv2jf/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5183 - (hide annotations)
Tue Sep 30 05:55:37 2014 UTC (4 years, 6 months ago) by caltinay
Original Path: trunk/SConstruct
File size: 30171 byte(s)
More long-index work. Added scons option 'longindices'.
Parts will not compile yet if set to true.

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     BoolVariable('netcdf', 'Enable netCDF file support', False),
90     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
91     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
92     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
93     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
94     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
95     BoolVariable('papi', 'Enable PAPI', False),
96     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
97 ksteube 1705 ('papi_libs', 'PAPI libraries to link with', ['papi']),
98 jfenwick 3259 BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False),
99     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
100     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
101     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
102     BoolVariable('umfpack', 'Enable UMFPACK', False),
103     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
104     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
105 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
106     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
107     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
108 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
109     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
110     ('lapack_libs', 'LAPACK libraries to link with', []),
111     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
112     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
113 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
114 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
115     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
116     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
117 jfenwick 3506 BoolVariable('vsl_random', 'Use VSL from intel for random data', False),
118 caltinay 5148 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
119     ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
120 jfenwick 3259 # Advanced settings
121     #dudley_assemble_flags = -funroll-loops to actually do something
122     ('dudley_assemble_flags', 'compiler flags for some dudley optimisations', ''),
123     # To enable passing function pointers through python
124     BoolVariable('iknowwhatimdoing', 'Allow non-standard C', False),
125     # An option for specifying the compiler tools (see windows branch)
126     ('tools_names', 'Compiler tools to use', ['default']),
127     ('env_export', 'Environment variables to be passed to tools',[]),
128     EnumVariable('forcelazy', 'For testing use only - set the default value for autolazy', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
129     EnumVariable('forcecollres', 'For testing use only - set the default value for force resolving collective ops', 'leave_alone', allowed_values=('leave_alone', 'on', 'off')),
130     # finer control over library building, intel aggressive global optimisation
131     # works with dynamic libraries on windows.
132 caltinay 3598 ('build_shared', 'Build dynamic libraries only', False),
133 jfenwick 3259 ('sys_libs', 'Extra libraries to link with', []),
134     ('escript_opts_version', 'Version of options file (do not specify on command line)'),
135 jfenwick 3618 ('SVN_VERSION', 'Do not use from options file', -2),
136 jfenwick 3851 ('pythoncmd', 'which python to compile with','python'),
137 jfenwick 3892 ('usepython3', 'Is this a python3 build? (experimental)', False),
138 caltinay 5183 ('longindices', 'use long indices (for very large matrices)', False),
139 jfenwick 3892 ('pythonlibname', 'Name of the python library to link. (This is found automatically for python2.X.)', ''),
140 jfenwick 3942 ('pythonlibpath', 'Path to the python library. (You should not need to set this unless your python has moved)',''),
141     ('pythonincpath','Path to python include files. (You should not need to set this unless your python has moved',''),
142 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
143 sshaw 4738 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
144     ('compression_libs', 'Compression libraries to link with', ['boost_iostreams'])
145 robwdcock 682 )
146 phornby 1232
147 jfenwick 3259 ##################### Create environment and help text #######################
148 jfenwick 3078
149 jfenwick 3259 # Intel's compiler uses regular expressions improperly and emits a warning
150     # about failing to find the compilers. This warning can be safely ignored.
151 jfenwick 3078
152 caltinay 3319 # PATH is needed so the compiler, linker and tools are found if they are not
153     # in default locations.
154     env = Environment(tools = ['default'], options = vars,
155     ENV = {'PATH': os.environ['PATH']})
156 jfenwick 3967
157 caltinay 4295 # set the vars for clang
158 jfenwick 3967 def mkclang(env):
159 caltinay 4295 env['CXX']='clang++'
160    
161 caltinay 5045 if env['tools_names'] != ['default']:
162 jfenwick 3967 zz=env['tools_names']
163     if 'clang' in zz:
164     zz.remove('clang')
165     zz.insert(0, mkclang)
166 caltinay 3319 env = Environment(tools = ['default'] + env['tools_names'], options = vars,
167     ENV = {'PATH' : os.environ['PATH']})
168 jfenwick 3078
169 jfenwick 3259 if options_file:
170     opts_valid=False
171     if 'escript_opts_version' in env.Dictionary() and \
172     int(env['escript_opts_version']) >= REQUIRED_OPTS_VERSION:
173     opts_valid=True
174     if opts_valid:
175     print("Using options in %s." % options_file)
176     else:
177     print("\nOptions file %s" % options_file)
178     print("is outdated! Please update the file by examining one of the TEMPLATE")
179     print("files in the scons/ subdirectory and setting escript_opts_version to %d.\n"%REQUIRED_OPTS_VERSION)
180     Exit(1)
181 jfenwick 3078
182 jfenwick 3259 # Generate help text (scons -h)
183     Help(vars.GenerateHelpText(env))
184 jfenwick 3078
185 jfenwick 3259 # Check for superfluous options
186 caltinay 3268 if len(vars.UnknownVariables())>0:
187     for k in vars.UnknownVariables():
188     print("Unknown option '%s'" % k)
189     Exit(1)
190 jfenwick 3078
191 caltinay 5148 if env['cuda']:
192     if env['nvcc'] != 'default':
193     env['NVCC'] = env['nvcc']
194     env.Tool('nvcc')
195    
196 caltinay 4295 # create dictionary which will be populated with info for buildvars file
197     env['buildvars']={}
198     # create list which will be populated with warnings if there are any
199     env['warnings']=[]
200    
201 jfenwick 3259 #################### Make sure install directories exist #####################
202 ksteube 1705
203 caltinay 4046 env['BUILD_DIR']=Dir(env['build_dir']).abspath
204 jfenwick 3259 prefix=Dir(env['prefix']).abspath
205 caltinay 4295 env['buildvars']['prefix']=prefix
206 jfenwick 3259 env['incinstall'] = os.path.join(prefix, 'include')
207     env['bininstall'] = os.path.join(prefix, 'bin')
208     env['libinstall'] = os.path.join(prefix, 'lib')
209     env['pyinstall'] = os.path.join(prefix, 'esys')
210 jfenwick 2604 if not os.path.isdir(env['bininstall']):
211     os.makedirs(env['bininstall'])
212     if not os.path.isdir(env['libinstall']):
213     os.makedirs(env['libinstall'])
214     if not os.path.isdir(env['pyinstall']):
215     os.makedirs(env['pyinstall'])
216    
217 jfenwick 3259 env.Append(CPPPATH = [env['incinstall']])
218     env.Append(LIBPATH = [env['libinstall']])
219 jfenwick 2603
220 jfenwick 3259 ################# Fill in compiler options if not set above ##################
221 ksteube 1312
222 jfenwick 3259 if env['cxx'] != 'default': env['CXX']=env['cxx']
223 gross 1024
224 jfenwick 3259 # version >=9 of intel C++ compiler requires use of icpc to link in C++
225     # runtimes (icc does not)
226     if not IS_WINDOWS and os.uname()[4]=='ia64' and env['CXX']=='icpc':
227     env['LINK'] = env['CXX']
228 phornby 1243
229 jfenwick 3259 # default compiler/linker options
230     cc_flags = ''
231     cc_optim = ''
232     cc_debug = ''
233     omp_flags = ''
234     omp_ldflags = ''
235     fatalwarning = '' # switch to turn warnings into errors
236     sysheaderopt = '' # how to indicate that a header is a system header
237 jfenwick 2130
238 jfenwick 3259 # env['CC'] might be a full path
239 caltinay 4520 cc_name=os.path.basename(env['CXX'])
240 caltinay 2882
241 caltinay 4520 if cc_name == 'icpc':
242 jfenwick 3259 # Intel compiler
243 caltinay 4090 # #1875: offsetof applied to non-POD types is nonstandard (in boost)
244 jfenwick 4542 # removed -std=c99 because icpc doesn't like it and we aren't using c anymore
245 caltinay 4775 cc_flags = "-fPIC -w2 -wd1875 -Wno-unknown-pragmas"
246 caltinay 4877 cc_optim = "-O3 -ftz -fno-alias -inline-level=2 -ipo -xHost"
247 jfenwick 3259 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK"
248 caltinay 4090 omp_flags = "-openmp"
249     omp_ldflags = "-openmp -openmp_report=1"
250 jfenwick 3259 fatalwarning = "-Werror"
251 caltinay 4520 elif cc_name[:3] == 'g++':
252 jfenwick 3259 # GNU C on any system
253 caltinay 4173 # note that -ffast-math is not used because it breaks isnan(),
254     # see mantis #691
255 caltinay 4775 cc_flags = "-pedantic -Wall -fPIC -Wno-unknown-pragmas -Wno-sign-compare -Wno-system-headers -Wno-long-long -Wno-strict-aliasing -finline-functions"
256 jfenwick 3259 cc_optim = "-O3"
257 sshaw 4820 cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=90000000" #avoids vartrack limit being exceeded with escriptcpp.cpp
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 # VSL random numbers
368     env['buildvars']['vsl_random']=int(env['vsl_random'])
369     if env['vsl_random']:
370     env.Append(CPPDEFINES = ['MKLRANDOM'])
371    
372     env['IS_WINDOWS']=IS_WINDOWS
373    
374 jfenwick 3259 ###################### Copy required environment vars ########################
375 gross 2363
376 jfenwick 3259 # Windows doesn't use LD_LIBRARY_PATH but PATH instead
377     if IS_WINDOWS:
378     LD_LIBRARY_PATH_KEY='PATH'
379     env['ENV']['LD_LIBRARY_PATH']=''
380     else:
381     LD_LIBRARY_PATH_KEY='LD_LIBRARY_PATH'
382 robwdcock 682
383 caltinay 4295 env['LD_LIBRARY_PATH_KEY']=LD_LIBRARY_PATH_KEY
384    
385 caltinay 3319 # the following env variables are exported for the unit tests
386 phornby 1244
387 jfenwick 3259 for key in 'OMP_NUM_THREADS', 'ESCRIPT_NUM_PROCS', 'ESCRIPT_NUM_NODES':
388     try:
389     env['ENV'][key] = os.environ[key]
390     except KeyError:
391 caltinay 5045 env['ENV'][key] = '1'
392 robwdcock 682
393 jfenwick 3259 env_export=env['env_export']
394 caltinay 4917 env_export.extend(['ESCRIPT_NUM_THREADS','ESCRIPT_HOSTFILE','DISPLAY','XAUTHORITY','PATH','HOME','KMP_MONITOR_STACKSIZE','TMPDIR','TEMP','TMP','LD_PRELOAD'])
395 robwdcock 682
396 jfenwick 3259 for key in set(env_export):
397     try:
398     env['ENV'][key] = os.environ[key]
399     except KeyError:
400     pass
401 ksteube 1312
402 jfenwick 3259 try:
403     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
404     except KeyError:
405     pass
406 ksteube 1312
407 jfenwick 4640 if IS_OSX:
408     try:
409     env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
410     except KeyError:
411     pass
412    
413    
414 jfenwick 3259 # these shouldn't be needed
415     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
416     # try:
417     # env['ENV'][key] = os.environ[key]
418     # except KeyError:
419     # pass
420 ksteube 1312
421 jfenwick 3259 try:
422     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
423     except KeyError:
424     pass
425 ksteube 1312
426 jfenwick 3259 ######################## Add some custom builders ############################
427 ksteube 1312
428 jfenwick 3851 if env['pythoncmd']=='python':
429     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
430     else:
431 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
432 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
433 gross 2423
434 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
435     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
436 gross 2423
437 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
438     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
439 ksteube 1756
440 sshaw 5017 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
441     env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
442    
443 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
444     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
445 ksteube 817
446 jfenwick 3259 ############################ Dependency checks ###############################
447 phornby 1246
448 caltinay 4295 ######## Compiler
449     env=checkCompiler(env)
450 phornby 1634
451 jfenwick 3259 ######## Python headers & library (required)
452 caltinay 4295 env=checkPython(env)
453 gross 806
454 caltinay 4295 ######## boost & boost-python (required)
455     env=checkBoost(env)
456 jfenwick 3892
457 caltinay 5148 ######## NVCC version (optional)
458     if env['cuda']:
459     env=checkCudaVersion(env)
460    
461 caltinay 4295 ######## numpy (required) and numpy headers (optional)
462     env=checkNumpy(env)
463 jfenwick 3892
464 caltinay 3597 ######## CppUnit (required for tests)
465 caltinay 4295 env=checkCppUnit(env)
466 caltinay 3597
467 caltinay 4295 ######## optional python modules (sympy, pyproj)
468     env=checkOptionalModules(env)
469 caltinay 3597
470 caltinay 4295 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
471     env=checkOptionalLibraries(env)
472 caltinay 3975
473 caltinay 3604 ######## PDFLaTeX (for documentation)
474 caltinay 4295 env=checkPDFLatex(env)
475 caltinay 3604
476 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
477     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
478     env.PrependENVPath('PYTHONPATH', prefix)
479     env['ENV']['ESCRIPT_ROOT'] = prefix
480 ksteube 1705
481 jfenwick 3259 if not env['verbose']:
482     env['CXXCOMSTR'] = "Compiling $TARGET"
483     env['SHCXXCOMSTR'] = "Compiling $TARGET"
484     env['ARCOMSTR'] = "Linking $TARGET"
485     env['LINKCOMSTR'] = "Linking $TARGET"
486     env['SHLINKCOMSTR'] = "Linking $TARGET"
487 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
488     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
489     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
490     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
491 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
492 ksteube 1705
493 jfenwick 3259 ####################### Configure the subdirectories #########################
494 ksteube 1247
495 caltinay 4295 # remove obsolete files
496     if not env['usempi']:
497     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
498     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
499    
500 jfenwick 2235 from grouptest import *
501     TestGroups=[]
502    
503 jfenwick 3259 # keep an environment without warnings-as-errors
504     dodgy_env=env.Clone()
505 jfenwick 2827
506 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
507     # because the scons test files have warnings in them
508     if ((fatalwarning != '') and (env['werror'])):
509     env.Append(CCFLAGS = fatalwarning)
510 jfenwick 2827
511 phornby 2027 Export(
512 jfenwick 3259 ['env',
513     'dodgy_env',
514     'IS_WINDOWS',
515     'TestGroups'
516     ]
517     )
518 ksteube 1705
519 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
520     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
521     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
522 jfenwick 4508 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
523    
524 caltinay 5148 env.SConscript(dirs = ['cusplibrary'])
525    
526 jfenwick 4508 #This will pull in the escriptcore/py_src and escriptcore/test
527     env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
528     #env.SConscript(dirs = ['escript/test'], variant_dir='$BUILD_DIR/$PLATFORM/escript/test', duplicate=0)
529 caltinay 3349 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
530 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
531 caltinay 3349 env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
532     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
533 caltinay 3792 env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
534 sshaw 5123 env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
535 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
536 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
537     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
538     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
539 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
540 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
541 phornby 1243
542 jfenwick 3892
543 jfenwick 3259 ######################## Populate the buildvars file #########################
544 jfenwick 2235
545 caltinay 4295 write_buildvars(env)
546 phornby 1243
547 jfenwick 3259 ################### Targets to build and install libraries ###################
548 jfenwick 2302
549 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
550 ksteube 1705 env.Alias('target_init', [target_init])
551 caltinay 3604 # delete buildvars upon cleanup
552     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
553 ksteube 1705
554 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
555     # #include <paso/Common.h>
556     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
557     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
558 ksteube 1705
559 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
560     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
561 ksteube 1705
562 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
563 jfenwick 4508 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
564 caltinay 2810
565 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
566     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
567    
568 jfenwick 3259 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 jfenwick 3259 env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
572     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
573 caltinay 2910
574 caltinay 5148 env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
575 caltinay 3792 env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
576    
577 sshaw 5123 env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
578     env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
579    
580 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
581     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
582 ksteube 1705
583 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
584     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
585 ksteube 1705
586 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
587 ksteube 1705 build_all_list = []
588     build_all_list += ['build_esysUtils']
589     build_all_list += ['build_paso']
590     build_all_list += ['build_escript']
591 jfenwick 3675 build_all_list += ['build_pasowrap']
592 jfenwick 3259 build_all_list += ['build_dudley']
593 ksteube 1705 build_all_list += ['build_finley']
594 caltinay 3792 build_all_list += ['build_ripley']
595 sshaw 5123 build_all_list += ['build_speckley']
596 jfenwick 3259 build_all_list += ['build_weipa']
597     if not IS_WINDOWS: build_all_list += ['build_escriptreader']
598     if env['usempi']: build_all_list += ['build_pythonMPI']
599     build_all_list += ['build_escriptconvert']
600 ksteube 1705 env.Alias('build_all', build_all_list)
601    
602     install_all_list = []
603     install_all_list += ['target_init']
604     install_all_list += ['install_esysUtils']
605     install_all_list += ['install_paso']
606     install_all_list += ['install_escript']
607 jfenwick 3675 install_all_list += ['install_pasowrap']
608 jfenwick 3259 install_all_list += ['install_dudley']
609 ksteube 1705 install_all_list += ['install_finley']
610 caltinay 3792 install_all_list += ['install_ripley']
611 sshaw 5123 install_all_list += ['install_speckley']
612 jfenwick 3259 install_all_list += ['install_weipa']
613     if not IS_WINDOWS: install_all_list += ['install_escriptreader']
614 caltinay 3947 install_all_list += ['install_downunder_py']
615 jfenwick 3259 install_all_list += ['install_modellib_py']
616     install_all_list += ['install_pycad_py']
617     if env['usempi']: install_all_list += ['install_pythonMPI']
618     install_all_list += ['install_escriptconvert']
619 ksteube 1705 env.Alias('install_all', install_all_list)
620    
621     # Default target is install
622     env.Default('install_all')
623    
624 jfenwick 3259 ################## Targets to build and run the test suite ###################
625 ksteube 1705
626 caltinay 3597 if not env['cppunit']:
627 caltinay 4520 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
628 caltinay 3597 env.Alias('run_tests', test_msg)
629 caltinay 4249 env.Alias('build_tests', '')
630 caltinay 3597 env.Alias('run_tests', ['install_all'])
631     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
632 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
633 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
634 ksteube 1705
635 jfenwick 3259 ##################### Targets to build the documentation #####################
636 artak 2820
637 jfenwick 4244 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
638     env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
639 jfenwick 4167 env.Alias('docs', ['basedocs', 'sphinxdoc'])
640 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
641 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
642 ksteube 1705
643 jfenwick 4078 # The test scripts are always generated, this target allows us to
644     # generate the testscripts without doing a full build
645     env.Alias('testscripts',[])
646    
647 jfenwick 3259 if not IS_WINDOWS:
648 caltinay 4295 generateTestScripts(env, TestGroups)
649 jfenwick 2879
650 caltinay 3604
651 jfenwick 2235
652 caltinay 4295 ######################## Summarize our environment ###########################
653     def print_summary():
654     print("")
655 caltinay 4299 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
656 caltinay 4295 print("Escript/Finley revision %s"%global_revision)
657     print(" Install prefix: %s"%env['prefix'])
658     print(" Python: %s"%sysconfig.PREFIX)
659     print(" boost: %s"%env['boost_prefix'])
660 caltinay 4299 if env['numpy_h']:
661     print(" numpy: YES (with headers)")
662     else:
663     print(" numpy: YES (without headers)")
664 caltinay 4295 if env['usempi']:
665     print(" MPI: YES (flavour: %s)"%env['mpi'])
666     else:
667     print(" MPI: DISABLED")
668     if env['uselapack']:
669     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
670     else:
671     print(" LAPACK: DISABLED")
672 caltinay 5148 if env['cuda']:
673     print(" CUDA: YES (nvcc: %s)"%env['nvcc_version'])
674     else:
675     print(" CUDA: DISABLED")
676 caltinay 4295 d_list=[]
677     e_list=[]
678 caltinay 4300 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit','vsl_random':
679 caltinay 4295 if env[i]: e_list.append(i)
680     else: d_list.append(i)
681     for i in e_list:
682     print("%16s: YES"%i)
683     for i in d_list:
684     print("%16s: DISABLED"%i)
685     if env['cppunit']:
686     print(" CppUnit: FOUND")
687     else:
688     print(" CppUnit: NOT FOUND")
689     if env['gmsh']=='m':
690     print(" gmsh: FOUND, MPI-ENABLED")
691     elif env['gmsh']=='s':
692     print(" gmsh: FOUND")
693     else:
694     print(" gmsh: NOT FOUND")
695 sshaw 4738 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
696 caltinay 4299
697 caltinay 4295 if ((fatalwarning != '') and (env['werror'])):
698     print(" Treating warnings as errors")
699     else:
700     print(" NOT treating warnings as errors")
701     print("")
702     for w in env['warnings']:
703     print("WARNING: %s"%w)
704 sshaw 4726 if len(GetBuildFailures()):
705     print("\nERROR: build stopped due to errors\n")
706     else:
707     print("\nSUCCESS: build complete\n")
708 caltinay 4295
709     atexit.register(print_summary)
710    

  ViewVC Help
Powered by ViewVC 1.1.26