/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26