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

Annotation of /branches/mvexpr/SConstruct

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26