/[escript]/branches/4.0fordebian/SConstruct
ViewVC logotype

Annotation of /branches/4.0fordebian/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4542 - (hide annotations)
Thu Nov 28 01:33:22 2013 UTC (5 years, 4 months ago) by jfenwick
Original Path: trunk/SConstruct
File size: 27919 byte(s)
Moving to new icc and associated modules.



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

  ViewVC Help
Powered by ViewVC 1.1.26