/[escript]/trunk/SConstruct
ViewVC logotype

Annotation of /trunk/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5271 - (hide annotations)
Tue Nov 18 00:46:29 2014 UTC (4 years, 5 months ago) by caltinay
File size: 31929 byte(s)
Re-enabled process binding params for OpenMPI. Not sure if this is a good default though...

1 jfenwick 3982 ##############################################################################
2 jgs 214 #
3 jfenwick 4657 # Copyright (c) 2003-2014 by University of Queensland
4 jfenwick 3982 # http://www.uq.edu.au
5 ksteube 1811 #
6     # Primary Business: Queensland, Australia
7     # Licensed under the Open Software License version 3.0
8     # http://www.opensource.org/licenses/osl-3.0.php
9     #
10 jfenwick 3982 # Development until 2012 by Earth Systems Science Computational Center (ESSCC)
11 jfenwick 4657 # Development 2012-2013 by School of Earth Sciences
12     # Development from 2014 by Centre for Geoscience Computing (GeoComp)
13 jfenwick 3982 #
14     ##############################################################################
15 jgs 455
16 jfenwick 3259 EnsureSConsVersion(0,98,1)
17     EnsurePythonVersion(2,5)
18 ksteube 1811
19 caltinay 4295 import atexit, sys, os, platform, re
20 jfenwick 3259 from distutils import sysconfig
21 caltinay 4295 from dependencies import *
22 jfenwick 3259 from site_init import *
23 jgs 214
24 jfenwick 3259 # Version number to check for in options file. Increment when new features are
25     # added or existing options changed.
26 caltinay 5148 REQUIRED_OPTS_VERSION=202
27 ksteube 1705
28     # MS Windows support, many thanks to PH
29 jfenwick 3259 IS_WINDOWS = (os.name == 'nt')
30 gross 806
31 jfenwick 4640 IS_OSX = (os.uname()[0] == 'Darwin')
32    
33 jfenwick 3259 ########################## Determine options file ############################
34     # 1. command line
35     # 2. scons/<hostname>_options.py
36     # 3. name as part of a cluster
37 jfenwick 2391 options_file=ARGUMENTS.get('options_file', None)
38     if not options_file:
39 jfenwick 3259 ext_dir = os.path.join(os.getcwd(), 'scons')
40     hostname = platform.node().split('.')[0]
41     for name in hostname, effectiveName(hostname):
42     mangledhostname = re.sub('[^0-9a-zA-Z]', '_', hostname)
43     options_file = os.path.join(ext_dir, mangledhostname+'_options.py')
44     if os.path.isfile(options_file): break
45 jfenwick 2391
46 ksteube 1866 if not os.path.isfile(options_file):
47 jfenwick 3259 print("\nWARNING:\nOptions file %s" % options_file)
48     print("not found! Default options will be used which is most likely suboptimal.")
49 jduplessis 4889 print("We recommend that you copy the most relavent options file in the scons/os/")
50 jfenwick 3259 print("subdirectory and customize it to your needs.\n")
51     options_file = None
52 ksteube 1217
53 jfenwick 3259 ############################### Build options ################################
54 gross 1149
55 jfenwick 3259 default_prefix='/usr'
56 jfenwick 3618 mpi_flavours=('no', 'none', 'MPT', 'MPICH', 'MPICH2', 'OPENMPI', 'INTELMPI')
57 jfenwick 3259 lapack_flavours=('none', 'clapack', 'mkl')
58 jfenwick 2430
59 jfenwick 3259 vars = Variables(options_file, ARGUMENTS)
60     vars.AddVariables(
61     PathVariable('options_file', 'Path to options file', options_file, PathVariable.PathIsFile),
62     PathVariable('prefix', 'Installation prefix', Dir('#.').abspath, PathVariable.PathIsDirCreate),
63 caltinay 3349 PathVariable('build_dir', 'Top-level build directory', Dir('#/build').abspath, PathVariable.PathIsDirCreate),
64 jfenwick 3259 BoolVariable('verbose', 'Output full compile/link lines', False),
65     # Compiler/Linker options
66     ('cxx', 'Path to C++ compiler', 'default'),
67 caltinay 4520 ('cc_flags', 'Base C++ compiler flags', 'default'),
68     ('cc_optim', 'Additional C++ flags for a non-debug build', 'default'),
69     ('cc_debug', 'Additional C++ flags for a debug build', 'default'),
70 caltinay 2967 ('cxx_extra', 'Extra C++ compiler flags', ''),
71 ksteube 1771 ('ld_extra', 'Extra linker flags', ''),
72 caltinay 5148 ('nvcc', 'Path to CUDA compiler', 'default'),
73     ('nvccflags', 'Base CUDA compiler flags', 'default'),
74 jfenwick 3259 BoolVariable('werror','Treat compiler warnings as errors', True),
75     BoolVariable('debug', 'Compile with debug flags', False),
76     BoolVariable('openmp', 'Compile parallel version using OpenMP', False),
77     ('omp_flags', 'OpenMP compiler flags', 'default'),
78     ('omp_ldflags', 'OpenMP linker flags', 'default'),
79     # Mandatory libraries
80     ('boost_prefix', 'Prefix/Paths of boost installation', default_prefix),
81 jfenwick 3338 ('boost_libs', 'Boost libraries to link with', ['boost_python-mt']),
82 caltinay 3597 # Mandatory for tests
83     ('cppunit_prefix', 'Prefix/Paths of CppUnit installation', default_prefix),
84     ('cppunit_libs', 'CppUnit libraries to link with', ['cppunit']),
85 jfenwick 3259 # Optional libraries and options
86     EnumVariable('mpi', 'Compile parallel version using MPI flavour', 'none', allowed_values=mpi_flavours),
87     ('mpi_prefix', 'Prefix/Paths of MPI installation', default_prefix),
88     ('mpi_libs', 'MPI shared libraries to link with', ['mpi']),
89 caltinay 5250 BoolVariable('cuda', 'Enable GPU code with CUDA (requires thrust)', False),
90     ('thrust_prefix', 'Prefix/Paths to NVidia thrust installation', default_prefix),
91 jfenwick 3259 BoolVariable('netcdf', 'Enable netCDF file support', False),
92     ('netcdf_prefix', 'Prefix/Paths of netCDF installation', default_prefix),
93     ('netcdf_libs', 'netCDF libraries to link with', ['netcdf_c++', 'netcdf']),
94     BoolVariable('parmetis', 'Enable ParMETIS (requires MPI)', False),
95     ('parmetis_prefix', 'Prefix/Paths of ParMETIS installation', default_prefix),
96     ('parmetis_libs', 'ParMETIS libraries to link with', ['parmetis', 'metis']),
97     BoolVariable('mkl', 'Enable the Math Kernel Library', False),
98     ('mkl_prefix', 'Prefix/Paths to MKL installation', default_prefix),
99     ('mkl_libs', 'MKL libraries to link with', ['mkl_solver','mkl_em64t','guide','pthread']),
100     BoolVariable('umfpack', 'Enable UMFPACK', False),
101     ('umfpack_prefix', 'Prefix/Paths to UMFPACK installation', default_prefix),
102     ('umfpack_libs', 'UMFPACK libraries to link with', ['umfpack']),
103 lgao 3508 BoolVariable('boomeramg', 'Enable BoomerAMG', False),
104     ('boomeramg_prefix', 'Prefix/Paths to BoomerAMG installation', default_prefix),
105     ('boomeramg_libs', 'BoomerAMG libraries to link with', ['boomeramg']),
106 jfenwick 3259 EnumVariable('lapack', 'Set LAPACK flavour', 'none', allowed_values=lapack_flavours),
107     ('lapack_prefix', 'Prefix/Paths to LAPACK installation', default_prefix),
108     ('lapack_libs', 'LAPACK libraries to link with', []),
109     BoolVariable('silo', 'Enable the Silo file format in weipa', False),
110     ('silo_prefix', 'Prefix/Paths to Silo installation', default_prefix),
111 caltinay 2184 ('silo_libs', 'Silo libraries to link with', ['siloh5', 'hdf5']),
112 jfenwick 3259 BoolVariable('visit', 'Enable the VisIt simulation interface', False),
113     ('visit_prefix', 'Prefix/Paths to VisIt installation', default_prefix),
114     ('visit_libs', 'VisIt libraries to link with', ['simV2']),
115 caltinay 5184 ListVariable('domains', 'Which domains to build', 'all',\
116     ['dudley','finley','ripley','speckley']),
117 jfenwick 3259 # Advanced settings
118 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 jfenwick 3961 BoolVariable('BADPYTHONMACROS','Extra \#include to get around a python bug.', True),
141 sshaw 4738 BoolVariable('compressed_files','Enables reading from compressed binary files', True),
142 caltinay 5250 ('compression_libs', 'Compression libraries to link with', ['boost_iostreams']),
143     BoolVariable('papi', 'Enable PAPI', False),
144     ('papi_prefix', 'Prefix/Paths to PAPI installation', default_prefix),
145     ('papi_libs', 'PAPI libraries to link with', ['papi']),
146     BoolVariable('papi_instrument_solver', 'Use PAPI to instrument each iteration of the solver', False)
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 caltinay 5250 # 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 caltinay 5250 #max-vartrack-size: avoid vartrack limit being exceeded with escriptcpp.cpp
260     cc_debug = "-g3 -O0 -D_GLIBCXX_DEBUG -DDOASSERT -DDOPROF -DBOUNDS_CHECK --param=max-vartrack-size=100000000"
261 jfenwick 3259 omp_flags = "-fopenmp"
262     omp_ldflags = "-fopenmp"
263     fatalwarning = "-Werror"
264     sysheaderopt = "-isystem"
265     elif cc_name == 'cl':
266     # Microsoft Visual C on Windows
267     cc_flags = "/EHsc /MD /GR /wd4068 /D_USE_MATH_DEFINES /DDLL_NETCDF"
268     cc_optim = "/O2 /Op /W3"
269     cc_debug = "/Od /RTCcsu /ZI /DBOUNDS_CHECK"
270     fatalwarning = "/WX"
271     elif cc_name == 'icl':
272     # Intel C on Windows
273     cc_flags = '/EHsc /GR /MD'
274     cc_optim = '/fast /Oi /W3 /Qssp /Qinline-factor- /Qinline-min-size=0 /Qunroll'
275     cc_debug = '/Od /RTCcsu /Zi /Y- /debug:all /Qtrapuv'
276     omp_flags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
277     omp_ldflags = '/Qvec-report0 /Qopenmp /Qopenmp-report0 /Qparallel'
278 phornby 1243
279 caltinay 4295 env['sysheaderopt']=sysheaderopt
280    
281 jfenwick 3259 # set defaults if not otherwise specified
282     if env['cc_flags'] == 'default': env['cc_flags'] = cc_flags
283     if env['cc_optim'] == 'default': env['cc_optim'] = cc_optim
284     if env['cc_debug'] == 'default': env['cc_debug'] = cc_debug
285     if env['omp_flags'] == 'default': env['omp_flags'] = omp_flags
286     if env['omp_ldflags'] == 'default': env['omp_ldflags'] = omp_ldflags
287     if env['cxx_extra'] != '': env.Append(CXXFLAGS = env['cxx_extra'])
288     if env['ld_extra'] != '': env.Append(LINKFLAGS = env['ld_extra'])
289 jfenwick 2130
290 caltinay 5148 if env['nvccflags'] != 'default':
291     env['NVCCFLAGS'] = env['nvccflags']
292     env['SHNVCCFLAGS'] = env['nvccflags'] + ' -shared'
293    
294 caltinay 5183 if env['BADPYTHONMACROS']:
295     env.Append(CPPDEFINES = ['BADPYTHONMACROS'])
296 jfenwick 3961
297 caltinay 5183 if env['longindices']:
298     env.Append(CPPDEFINES = ['ESYS_INDEXTYPE_LONG'])
299    
300 jfenwick 3892 if env['usepython3']:
301     env.Append(CPPDEFINES=['ESPYTHON3'])
302    
303 jfenwick 3259 # set up the autolazy values
304     if env['forcelazy'] == 'on':
305     env.Append(CPPDEFINES=['FAUTOLAZYON'])
306     elif env['forcelazy'] == 'off':
307     env.Append(CPPDEFINES=['FAUTOLAZYOFF'])
308 ksteube 1312
309 jfenwick 3259 # set up the collective resolve values
310     if env['forcecollres'] == 'on':
311     env.Append(CPPDEFINES=['FRESCOLLECTON'])
312     elif env['forcecollres'] == 'off':
313     env.Append(CPPDEFINES=['FRESCOLLECTOFF'])
314 jfenwick 2273
315 jfenwick 3259 # allow non-standard C if requested
316 jfenwick 2827 if env['iknowwhatimdoing']:
317 jfenwick 3259 env.Append(CPPDEFINES=['IKNOWWHATIMDOING'])
318 jfenwick 2827
319 jfenwick 3259 # Disable OpenMP if no flags provided
320     if env['openmp'] and env['omp_flags'] == '':
321 caltinay 4295 env['warnings'].append("OpenMP requested but no flags provided - disabling OpenMP!")
322 jfenwick 3259 env['openmp'] = False
323 gross 1160
324 jfenwick 3259 if env['openmp']:
325     env.Append(CCFLAGS = env['omp_flags'])
326     if env['omp_ldflags'] != '': env.Append(LINKFLAGS = env['omp_ldflags'])
327     else:
328     env['omp_flags']=''
329     env['omp_ldflags']=''
330 ksteube 1312
331 caltinay 4295 env['buildvars']['openmp']=int(env['openmp'])
332    
333 jfenwick 3259 # add debug/non-debug compiler flags
334 caltinay 4295 env['buildvars']['debug']=int(env['debug'])
335 jfenwick 3259 if env['debug']:
336     env.Append(CCFLAGS = env['cc_debug'])
337 gross 2423 else:
338 jfenwick 3259 env.Append(CCFLAGS = env['cc_optim'])
339 gross 1163
340 jfenwick 3259 # always add cc_flags
341     env.Append(CCFLAGS = env['cc_flags'])
342 phornby 1243
343 jfenwick 3259 # add system libraries
344     env.AppendUnique(LIBS = env['sys_libs'])
345 gross 2363
346 caltinay 5266 # set defaults for launchers if not otherwise specified
347     if env['prelaunch'] == 'default':
348     if env['mpi'] == 'INTELMPI' and env['openmp']:
349     env['prelaunch'] = "export I_MPI_PIN_DOMAIN=omp"
350     elif env['mpi'] == 'OPENMPI':
351     # transform comma-separated list to '-x a -x b -x c ...'
352     env['prelaunch'] = "EE=$(echo %e|sed -e 's/,/ -x /g')"
353     elif env['mpi'] == 'MPT':
354     env['prelaunch'] = "export MPI_NUM_MEMORY_REGIONS=0"
355     elif env['mpi'] == 'MPICH2':
356     env['prelaunch'] = "mpdboot -n %n -r ssh -f %f"
357     else:
358     env['prelaunch'] = ""
359    
360     if env['launcher'] == 'default':
361     if env['mpi'] == 'INTELMPI':
362     env['launcher'] = "mpirun -hostfile %f -n %N -ppn %p %b"
363     elif env['mpi'] == 'OPENMPI':
364 caltinay 5271 env['launcher'] = "mpirun --gmca mpi_warn_on_fork 0 -x ${EE} --host %h -bynode -bind-to-core -np %N %b"
365 caltinay 5266 elif env['mpi'] == 'MPT':
366     env['launcher'] = "mpirun %h -np %p %b"
367     elif env['mpi'] == 'MPICH':
368     env['launcher'] = "mpirun -machinefile %f -np %N %b"
369     elif env['mpi'] == 'MPICH2':
370     env['launcher'] = "mpiexec -genvlist %e -np %N %b"
371     else:
372     env['launcher'] = "%b"
373    
374     if env['postlaunch'] == 'default':
375     if env['mpi'] == 'MPICH2':
376     env['postlaunch'] = "mpdallexit"
377     else:
378     env['postlaunch'] = ""
379    
380 caltinay 4295 # determine svn revision
381 jfenwick 3618 global_revision=ARGUMENTS.get('SVN_VERSION', None)
382     if global_revision:
383     global_revision = re.sub(':.*', '', global_revision)
384     global_revision = re.sub('[^0-9]', '', global_revision)
385     if global_revision == '': global_revision='-2'
386     else:
387     # Get the global Subversion revision number for the getVersion() method
388     try:
389 jfenwick 3259 global_revision = os.popen('svnversion -n .').read()
390     global_revision = re.sub(':.*', '', global_revision)
391     global_revision = re.sub('[^0-9]', '', global_revision)
392     if global_revision == '': global_revision='-2'
393 jfenwick 3618 except:
394 jfenwick 3259 global_revision = '-1'
395 caltinay 3271 env['svn_revision']=global_revision
396 caltinay 4295 env['buildvars']['svn_revision']=global_revision
397 jfenwick 3259 env.Append(CPPDEFINES=['SVN_VERSION='+global_revision])
398 gross 2363
399 jfenwick 3259 if IS_WINDOWS:
400 caltinay 3602 if not env['build_shared']:
401 jfenwick 3259 env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB'])
402     env.Append(CPPDEFINES = ['PASO_STATIC_LIB'])
403 gross 2363
404 caltinay 4295 env['IS_WINDOWS']=IS_WINDOWS
405    
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 jfenwick 3259 try:
435     env.PrependENVPath(LD_LIBRARY_PATH_KEY, os.environ[LD_LIBRARY_PATH_KEY])
436     except KeyError:
437     pass
438 ksteube 1312
439 jfenwick 4640 if IS_OSX:
440     try:
441     env.PrependENVPath('DYLD_LIBRARY_PATH', os.environ['DYLD_LIBRARY_PATH'])
442     except KeyError:
443     pass
444    
445    
446 jfenwick 3259 # these shouldn't be needed
447     #for key in 'C_INCLUDE_PATH','CPLUS_INCLUDE_PATH','LIBRARY_PATH':
448     # try:
449     # env['ENV'][key] = os.environ[key]
450     # except KeyError:
451     # pass
452 ksteube 1312
453 jfenwick 3259 try:
454     env['ENV']['PYTHONPATH'] = os.environ['PYTHONPATH']
455     except KeyError:
456     pass
457 ksteube 1312
458 jfenwick 3259 ######################## Add some custom builders ############################
459 ksteube 1312
460 jfenwick 3851 if env['pythoncmd']=='python':
461     py_builder = Builder(action = build_py, suffix = '.pyc', src_suffix = '.py', single_source=True)
462     else:
463 jfenwick 3892 py_builder = Builder(action = env['pythoncmd']+" scripts/py_comp.py $SOURCE $TARGET", suffix = '.pyc', src_suffix = '.py', single_source=True)
464 jfenwick 3259 env.Append(BUILDERS = {'PyCompile' : py_builder});
465 gross 2423
466 jfenwick 3259 runUnitTest_builder = Builder(action = runUnitTest, suffix = '.passed', src_suffix=env['PROGSUFFIX'], single_source=True)
467     env.Append(BUILDERS = {'RunUnitTest' : runUnitTest_builder});
468 gross 2423
469 jfenwick 3259 runPyUnitTest_builder = Builder(action = runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True)
470     env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder});
471 ksteube 1756
472 sshaw 5017 runPyExample_builder = Builder(action = runPyExample, suffix = '.passed', src_suffic='.py', single_source=True)
473     env.Append(BUILDERS = {'RunPyExample' : runPyExample_builder});
474    
475 jfenwick 3259 epstopdfbuilder = Builder(action = eps2pdf, suffix='.pdf', src_suffix='.eps', single_source=True)
476     env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder});
477 ksteube 817
478 jfenwick 3259 ############################ Dependency checks ###############################
479 phornby 1246
480 caltinay 4295 ######## Compiler
481     env=checkCompiler(env)
482 phornby 1634
483 jfenwick 3259 ######## Python headers & library (required)
484 caltinay 4295 env=checkPython(env)
485 gross 806
486 caltinay 4295 ######## boost & boost-python (required)
487     env=checkBoost(env)
488 jfenwick 3892
489 caltinay 5148 ######## NVCC version (optional)
490     if env['cuda']:
491     env=checkCudaVersion(env)
492    
493 caltinay 4295 ######## numpy (required) and numpy headers (optional)
494     env=checkNumpy(env)
495 jfenwick 3892
496 caltinay 3597 ######## CppUnit (required for tests)
497 caltinay 4295 env=checkCppUnit(env)
498 caltinay 3597
499 caltinay 4295 ######## optional python modules (sympy, pyproj)
500     env=checkOptionalModules(env)
501 caltinay 3597
502 caltinay 4295 ######## optional dependencies (netCDF, PAPI, MKL, UMFPACK, Lapack, Silo, ...)
503     env=checkOptionalLibraries(env)
504 caltinay 3975
505 caltinay 3604 ######## PDFLaTeX (for documentation)
506 caltinay 4295 env=checkPDFLatex(env)
507 caltinay 3604
508 jfenwick 3259 # keep some of our install paths first in the list for the unit tests
509     env.PrependENVPath(LD_LIBRARY_PATH_KEY, env['libinstall'])
510     env.PrependENVPath('PYTHONPATH', prefix)
511     env['ENV']['ESCRIPT_ROOT'] = prefix
512 ksteube 1705
513 jfenwick 3259 if not env['verbose']:
514     env['CXXCOMSTR'] = "Compiling $TARGET"
515     env['SHCXXCOMSTR'] = "Compiling $TARGET"
516     env['ARCOMSTR'] = "Linking $TARGET"
517     env['LINKCOMSTR'] = "Linking $TARGET"
518     env['SHLINKCOMSTR'] = "Linking $TARGET"
519 caltinay 3271 env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
520     env['BIBTEXCOMSTR'] = "Generating bibliography $TARGET"
521     env['MAKEINDEXCOMSTR'] = "Generating index $TARGET"
522     env['PDFLATEXCOMSTR'] = "Building $TARGET from LaTeX input $SOURCES"
523 jfenwick 3259 #Progress(['Checking -\r', 'Checking \\\r', 'Checking |\r', 'Checking /\r'], interval=17)
524 ksteube 1705
525 jfenwick 3259 ####################### Configure the subdirectories #########################
526 ksteube 1247
527 caltinay 4295 # remove obsolete files
528     if not env['usempi']:
529     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPI')))
530     Execute(Delete(os.path.join(env['libinstall'], 'pythonMPIredirect')))
531    
532 jfenwick 2235 from grouptest import *
533     TestGroups=[]
534    
535 jfenwick 3259 # keep an environment without warnings-as-errors
536     dodgy_env=env.Clone()
537 jfenwick 2827
538 jfenwick 3259 # now add warnings-as-errors flags. This needs to be done after configuration
539     # because the scons test files have warnings in them
540     if ((fatalwarning != '') and (env['werror'])):
541     env.Append(CCFLAGS = fatalwarning)
542 jfenwick 2827
543 phornby 2027 Export(
544 jfenwick 3259 ['env',
545     'dodgy_env',
546     'IS_WINDOWS',
547     'TestGroups'
548     ]
549     )
550 ksteube 1705
551 caltinay 5184 #do not auto build
552 caltinay 3349 env.SConscript(dirs = ['tools/escriptconvert'], variant_dir='$BUILD_DIR/$PLATFORM/tools/escriptconvert', duplicate=0)
553     env.SConscript(dirs = ['paso/src'], variant_dir='$BUILD_DIR/$PLATFORM/paso', duplicate=0)
554     env.SConscript(dirs = ['weipa/src'], variant_dir='$BUILD_DIR/$PLATFORM/weipa', duplicate=0)
555 jfenwick 4508 env.SConscript(dirs = ['escript/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/escript', duplicate=0)
556    
557 caltinay 5148 env.SConscript(dirs = ['cusplibrary'])
558    
559 jfenwick 4508 #This will pull in the escriptcore/py_src and escriptcore/test
560     env.SConscript(dirs = ['escriptcore/src'], variant_dir='$BUILD_DIR/$PLATFORM/escriptcore', duplicate=0)
561 caltinay 3349 env.SConscript(dirs = ['esysUtils/src'], variant_dir='$BUILD_DIR/$PLATFORM/esysUtils', duplicate=0)
562 jfenwick 3675 env.SConscript(dirs = ['pasowrap/src'], variant_dir='$BUILD_DIR/$PLATFORM/pasowrap', duplicate=0)
563 caltinay 5184 if 'dudley' in env['domains']:
564     env.SConscript(dirs = ['dudley/src'], variant_dir='$BUILD_DIR/$PLATFORM/dudley', duplicate=0)
565     if 'finley' in env['domains']:
566     env.SConscript(dirs = ['finley/src'], variant_dir='$BUILD_DIR/$PLATFORM/finley', duplicate=0)
567     if 'ripley' in env['domains']:
568     env.SConscript(dirs = ['ripley/src'], variant_dir='$BUILD_DIR/$PLATFORM/ripley', duplicate=0)
569     if 'speckley' in env['domains']:
570     env.SConscript(dirs = ['speckley/src'], variant_dir='$BUILD_DIR/$PLATFORM/speckley', duplicate=0)
571 caltinay 3947 env.SConscript(dirs = ['downunder/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/downunder', duplicate=0)
572 caltinay 3349 env.SConscript(dirs = ['modellib/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/modellib', duplicate=0)
573     env.SConscript(dirs = ['pycad/py_src'], variant_dir='$BUILD_DIR/$PLATFORM/pycad', duplicate=0)
574     env.SConscript(dirs = ['pythonMPI/src'], variant_dir='$BUILD_DIR/$PLATFORM/pythonMPI', duplicate=0)
575 caltinay 3947 env.SConscript(dirs = ['doc'], variant_dir='$BUILD_DIR/$PLATFORM/doc', duplicate=0)
576 caltinay 3349 env.SConscript(dirs = ['paso/profiling'], variant_dir='$BUILD_DIR/$PLATFORM/paso/profiling', duplicate=0)
577 phornby 1243
578 jfenwick 3892
579 jfenwick 3259 ######################## Populate the buildvars file #########################
580 jfenwick 2235
581 caltinay 4295 write_buildvars(env)
582 phornby 1243
583 caltinay 5266 write_launcher(env)
584    
585 jfenwick 3259 ################### Targets to build and install libraries ###################
586 jfenwick 2302
587 caltinay 3604 target_init = env.Command(os.path.join(env['pyinstall'],'__init__.py'), None, Touch('$TARGET'))
588 ksteube 1705 env.Alias('target_init', [target_init])
589 caltinay 3604 # delete buildvars upon cleanup
590     env.Clean('target_init', os.path.join(env['libinstall'], 'buildvars'))
591 ksteube 1705
592 jfenwick 3259 # The headers have to be installed prior to build in order to satisfy
593     # #include <paso/Common.h>
594     env.Alias('build_esysUtils', ['install_esysUtils_headers', 'build_esysUtils_lib'])
595     env.Alias('install_esysUtils', ['build_esysUtils', 'install_esysUtils_lib'])
596 ksteube 1705
597 jfenwick 3259 env.Alias('build_paso', ['install_paso_headers', 'build_paso_lib'])
598     env.Alias('install_paso', ['build_paso', 'install_paso_lib'])
599 ksteube 1705
600 jfenwick 3259 env.Alias('build_escript', ['install_escript_headers', 'build_escript_lib', 'build_escriptcpp_lib'])
601 jfenwick 4508 env.Alias('install_escript', ['build_escript', 'install_escript_lib', 'install_escriptcpp_lib', 'install_escriptcore_py', 'install_escript_py'])
602 caltinay 2810
603 jfenwick 3675 env.Alias('build_pasowrap', ['install_pasowrap_headers', 'build_pasowrap_lib', 'build_pasowrapcpp_lib'])
604     env.Alias('install_pasowrap', ['build_pasowrap', 'install_pasowrap_lib', 'install_pasowrapcpp_lib', 'install_pasowrap_py'])
605    
606 caltinay 5184 if 'dudley' in env['domains']:
607     env.Alias('build_dudley', ['install_dudley_headers', 'build_dudley_lib', 'build_dudleycpp_lib'])
608     env.Alias('install_dudley', ['build_dudley', 'install_dudley_lib', 'install_dudleycpp_lib', 'install_dudley_py'])
609 caltinay 3096
610 caltinay 5184 if 'finley' in env['domains']:
611     env.Alias('build_finley', ['install_finley_headers', 'build_finley_lib', 'build_finleycpp_lib'])
612     env.Alias('install_finley', ['build_finley', 'install_finley_lib', 'install_finleycpp_lib', 'install_finley_py'])
613 caltinay 2910
614 caltinay 5184 if 'ripley' in env['domains']:
615     env.Alias('build_ripley', ['install_cusp_headers', 'install_ripley_headers', 'build_ripley_lib', 'build_ripleycpp_lib'])
616     env.Alias('install_ripley', ['build_ripley', 'install_ripley_lib', 'install_ripleycpp_lib', 'install_ripley_py'])
617 caltinay 3792
618 caltinay 5184 if 'speckley' in env['domains']:
619     env.Alias('build_speckley', ['install_speckley_headers', 'build_speckley_lib', 'build_speckleycpp_lib'])
620     env.Alias('install_speckley', ['build_speckley', 'install_speckley_lib', 'install_speckleycpp_lib', 'install_speckley_py'])
621 sshaw 5123
622 jfenwick 3259 env.Alias('build_weipa', ['install_weipa_headers', 'build_weipa_lib', 'build_weipacpp_lib'])
623     env.Alias('install_weipa', ['build_weipa', 'install_weipa_lib', 'install_weipacpp_lib', 'install_weipa_py'])
624 ksteube 1705
625 jfenwick 3259 env.Alias('build_escriptreader', ['install_weipa_headers', 'build_escriptreader_lib'])
626     env.Alias('install_escriptreader', ['build_escriptreader', 'install_escriptreader_lib'])
627 ksteube 1705
628 jfenwick 3259 # Now gather all the above into some easy targets: build_all and install_all
629 ksteube 1705 build_all_list = []
630     build_all_list += ['build_esysUtils']
631     build_all_list += ['build_paso']
632     build_all_list += ['build_escript']
633 jfenwick 3675 build_all_list += ['build_pasowrap']
634 caltinay 5184 if 'dudley' in env['domains']: build_all_list += ['build_dudley']
635     if 'finley' in env['domains']: build_all_list += ['build_finley']
636     if 'ripley' in env['domains']: build_all_list += ['build_ripley']
637     if 'speckley' in env['domains']: build_all_list += ['build_speckley']
638 jfenwick 3259 build_all_list += ['build_weipa']
639 caltinay 5184 if not IS_WINDOWS and 'finley' in env['domains']:
640     build_all_list += ['build_escriptreader']
641 jfenwick 3259 if env['usempi']: build_all_list += ['build_pythonMPI']
642 ksteube 1705 env.Alias('build_all', build_all_list)
643    
644     install_all_list = []
645     install_all_list += ['target_init']
646     install_all_list += ['install_esysUtils']
647     install_all_list += ['install_paso']
648     install_all_list += ['install_escript']
649 jfenwick 3675 install_all_list += ['install_pasowrap']
650 caltinay 5184 if 'dudley' in env['domains']: install_all_list += ['install_dudley']
651     if 'finley' in env['domains']: install_all_list += ['install_finley']
652     if 'ripley' in env['domains']: install_all_list += ['install_ripley']
653     if 'speckley' in env['domains']: install_all_list += ['install_speckley']
654 jfenwick 3259 install_all_list += ['install_weipa']
655 caltinay 5184 if not IS_WINDOWS and 'finley' in env['domains']:
656     install_all_list += ['install_escriptreader']
657 caltinay 3947 install_all_list += ['install_downunder_py']
658 jfenwick 3259 install_all_list += ['install_modellib_py']
659     install_all_list += ['install_pycad_py']
660     if env['usempi']: install_all_list += ['install_pythonMPI']
661 ksteube 1705 env.Alias('install_all', install_all_list)
662    
663     # Default target is install
664     env.Default('install_all')
665    
666 jfenwick 3259 ################## Targets to build and run the test suite ###################
667 ksteube 1705
668 caltinay 3597 if not env['cppunit']:
669 caltinay 4520 test_msg = env.Command('.dummy.', None, '@echo "Cannot run C++ unit tests, CppUnit not found!";exit 1')
670 caltinay 3597 env.Alias('run_tests', test_msg)
671 caltinay 4249 env.Alias('build_tests', '')
672 caltinay 3597 env.Alias('run_tests', ['install_all'])
673     env.Alias('all_tests', ['install_all', 'run_tests', 'py_tests'])
674 jfenwick 2286 env.Alias('build_full',['install_all','build_tests','build_py_tests'])
675 caltinay 3349 env.Alias('build_PasoTests','$BUILD_DIR/$PLATFORM/paso/profiling/PasoTests')
676 ksteube 1705
677 jfenwick 3259 ##################### Targets to build the documentation #####################
678 artak 2820
679 jfenwick 4244 env.Alias('pdfdocs',['user_pdf', 'install_pdf', 'cookbook_pdf', 'inversion_pdf'])
680     env.Alias('basedocs', ['pdfdocs','examples_tarfile', 'examples_zipfile', 'api_doxygen'])
681 jfenwick 4167 env.Alias('docs', ['basedocs', 'sphinxdoc'])
682 jfenwick 3259 env.Alias('release_prep', ['docs', 'install_all'])
683 jfenwick 4167 env.Alias('release_prep_old', ['basedocs', 'api_epydoc', 'install_all'])
684 ksteube 1705
685 jfenwick 4078 # The test scripts are always generated, this target allows us to
686     # generate the testscripts without doing a full build
687     env.Alias('testscripts',[])
688    
689 jfenwick 3259 if not IS_WINDOWS:
690 caltinay 4295 generateTestScripts(env, TestGroups)
691 jfenwick 2879
692 caltinay 3604
693 caltinay 4295 ######################## Summarize our environment ###########################
694     def print_summary():
695     print("")
696 caltinay 4299 print("*** Config Summary (see config.log and <prefix>/lib/buildvars for details) ***")
697 caltinay 4295 print("Escript/Finley revision %s"%global_revision)
698     print(" Install prefix: %s"%env['prefix'])
699     print(" Python: %s"%sysconfig.PREFIX)
700     print(" boost: %s"%env['boost_prefix'])
701 caltinay 4299 if env['numpy_h']:
702     print(" numpy: YES (with headers)")
703     else:
704     print(" numpy: YES (without headers)")
705 caltinay 4295 if env['usempi']:
706     print(" MPI: YES (flavour: %s)"%env['mpi'])
707     else:
708 caltinay 5250 print(" MPI: NO")
709 caltinay 4295 if env['uselapack']:
710     print(" LAPACK: YES (flavour: %s)"%env['lapack'])
711     else:
712 caltinay 5250 print(" LAPACK: NO")
713 caltinay 5148 if env['cuda']:
714     print(" CUDA: YES (nvcc: %s)"%env['nvcc_version'])
715     else:
716 caltinay 5250 print(" CUDA: NO")
717 caltinay 4295 d_list=[]
718     e_list=[]
719 caltinay 5250 for i in 'debug','openmp','boomeramg','gdal','mkl','netcdf','papi','parmetis','pyproj','scipy','silo','sympy','umfpack','visit':
720 caltinay 4295 if env[i]: e_list.append(i)
721     else: d_list.append(i)
722     for i in e_list:
723     print("%16s: YES"%i)
724     for i in d_list:
725 caltinay 5250 print("%16s: NO"%i)
726 caltinay 4295 if env['cppunit']:
727 caltinay 5250 print(" CppUnit: YES")
728 caltinay 4295 else:
729 caltinay 5250 print(" CppUnit: NO")
730 caltinay 4295 if env['gmsh']=='m':
731 caltinay 5250 print(" gmsh: YES, MPI-ENABLED")
732 caltinay 4295 elif env['gmsh']=='s':
733 caltinay 5250 print(" gmsh: YES")
734 caltinay 4295 else:
735 caltinay 5250 print(" gmsh: NO")
736 sshaw 4738 print( " gzip: " + ("YES" if env['compressed_files'] else "NO"))
737 caltinay 4299
738 caltinay 4295 if ((fatalwarning != '') and (env['werror'])):
739     print(" Treating warnings as errors")
740     else:
741     print(" NOT treating warnings as errors")
742     print("")
743     for w in env['warnings']:
744     print("WARNING: %s"%w)
745 sshaw 4726 if len(GetBuildFailures()):
746     print("\nERROR: build stopped due to errors\n")
747     else:
748     print("\nSUCCESS: build complete\n")
749 caltinay 4295
750     atexit.register(print_summary)
751    

  ViewVC Help
Powered by ViewVC 1.1.26