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

Annotation of /branches/diaplayground/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5053 - (hide annotations)
Fri Jun 20 00:36:10 2014 UTC (4 years, 9 months ago) by caltinay
File size: 29275 byte(s)
nvcc options and cusp install.

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

  ViewVC Help
Powered by ViewVC 1.1.26