/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5184 - (hide annotations)
Wed Oct 1 04:19:22 2014 UTC (4 years, 7 months ago) by caltinay
File size: 30839 byte(s)
New scons option 'domains' to build only specified domains.
Defaults to all. Implements #257

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

  ViewVC Help
Powered by ViewVC 1.1.26