1 |
|
|
2 |
######################################################## |
######################################################## |
3 |
# |
# |
4 |
# Copyright (c) 2003-2008 by University of Queensland |
# Copyright (c) 2003-2009 by University of Queensland |
5 |
# Earth Systems Science Computational Center (ESSCC) |
# Earth Systems Science Computational Center (ESSCC) |
6 |
# http://www.uq.edu.au/esscc |
# http://www.uq.edu.au/esscc |
7 |
# |
# |
16 |
EnsurePythonVersion(2,3) |
EnsurePythonVersion(2,3) |
17 |
|
|
18 |
import sys, os, re, socket, platform, stat |
import sys, os, re, socket, platform, stat |
19 |
|
# For copy() |
20 |
|
import shutil |
21 |
|
|
22 |
# Add our extensions |
# Add our extensions |
23 |
if os.path.isdir('scons'): sys.path.append('scons') |
if os.path.isdir('scons'): sys.path.append('scons') |
35 |
|
|
36 |
prefix = ARGUMENTS.get('prefix', Dir('#.').abspath) |
prefix = ARGUMENTS.get('prefix', Dir('#.').abspath) |
37 |
|
|
38 |
|
#Holds names of variables from the calling environment which need to be passed |
39 |
|
#to tools |
40 |
|
env_export=[] |
41 |
|
|
42 |
#Determine where to read options from use: |
#Determine where to read options from use: |
43 |
#1. command line |
#1. command line |
44 |
#2. scons/<hostname>_options.py |
#2. scons/<hostname>_options.py |
45 |
#3. name as part of a cluster |
#3. name as part of a cluster |
46 |
options_file=ARGUMENTS.get('options_file', None) |
options_file=ARGUMENTS.get('options_file', None) |
47 |
|
effective_hostname=socket.gethostname().split('.')[0] |
48 |
if not options_file: |
if not options_file: |
49 |
hostname = re.sub("[^0-9a-zA-Z]", "_", socket.gethostname().split('.')[0]) |
mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname) |
50 |
options_file = os.path.join("scons",hostname+"_options.py") |
options_file = os.path.join("scons",mangledhostname+"_options.py") |
51 |
#If there is no options file with that name see if there is a substitute |
#If there is no options file with that name see if there is a substitute |
52 |
if not os.path.isfile(options_file): |
if not os.path.isfile(options_file): |
53 |
tmp = scons_extensions.effectiveName(hostname) |
effective_hostname = scons_extensions.effectiveName(effective_hostname) |
54 |
options_file = os.path.join("scons",tmp+"_options.py") |
mangledhostname = re.sub("[^0-9a-zA-Z]", "_", effective_hostname) |
55 |
|
options_file = os.path.join("scons",mangledhostname+"_options.py") |
56 |
|
|
57 |
if not os.path.isfile(options_file): |
if not os.path.isfile(options_file): |
58 |
print "Options file not found (expected '%s')" % options_file |
print "Options file not found (expected '%s')" % options_file |
102 |
BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'), |
BoolVariable('usepedantic', 'Compile with -pedantic if using gcc', 'no'), |
103 |
BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'), |
BoolVariable('usewarnings','Compile with warnings as errors if using gcc','yes'), |
104 |
('forcelazy','for testing use only - set the default value for autolazy','leave_alone'), |
('forcelazy','for testing use only - set the default value for autolazy','leave_alone'), |
105 |
|
('forcecollres','for testing use only - set the default value for force resolving collective ops','leave_alone'), |
106 |
# Python |
# Python |
107 |
('python_path', 'Path to Python includes', '/usr/include/'+python_version), |
('python_path', 'Path to Python includes', '/usr/include/'+python_version), |
108 |
('python_lib_path', 'Path to Python libs', usr_lib), |
('python_lib_path', 'Path to Python libs', usr_lib), |
124 |
('mpi_path', 'Path to MPI includes', '/usr/include'), |
('mpi_path', 'Path to MPI includes', '/usr/include'), |
125 |
('mpi_run', 'mpirun name' , 'mpiexec -np 1'), |
('mpi_run', 'mpirun name' , 'mpiexec -np 1'), |
126 |
('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib), |
('mpi_lib_path', 'Path to MPI libs (needs to be added to the LD_LIBRARY_PATH)', usr_lib), |
127 |
('mpi_libs', 'MPI libraries to link with (needs to be shared!)', ['mpich' , 'pthread', 'rt']), |
('mpi_libs', 'MPI libraries to link with (needs to be shared!)', []), |
128 |
('mpi_flavour','Type of MPI execution environment','none'), |
('mpi_flavour','Type of MPI execution environment','none'), |
129 |
# ParMETIS |
# ParMETIS |
130 |
BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'), |
BoolVariable('useparmetis', 'Compile parallel version using ParMETIS', 'yes'), |
161 |
('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'), |
('blas_path', 'Path to BLAS includes', '/usr/include/suitesparse'), |
162 |
('blas_lib_path', 'Path to BLAS libs', usr_lib), |
('blas_lib_path', 'Path to BLAS libs', usr_lib), |
163 |
('blas_libs', 'BLAS libraries to link with', ['blas']), |
('blas_libs', 'BLAS libraries to link with', ['blas']), |
164 |
|
#Lapack options |
165 |
|
BoolVariable('uselapack','switch on/off use of Lapack','no'), |
166 |
|
('lapack_path', 'Path to Lapack includes','/usr/include'), |
167 |
|
('lapack_lib_path', 'Path to Lapack libs', usr_lib), |
168 |
|
('lapack_libs', 'Lapack libraries to link with', []), |
169 |
|
('lapack_type', '{clapack,mkl}','clapack'), |
170 |
# An option for specifying the compiler tools set (see windows branch). |
# An option for specifying the compiler tools set (see windows branch). |
171 |
('tools_names', 'allow control over the tools in the env setup', ['intelc']), |
('tools_names', 'allow control over the tools in the env setup', ['intelc']), |
172 |
# finer control over library building, intel aggressive global optimisation |
# finer control over library building, intel aggressive global optimisation |
173 |
# works with dynamic libraries on windows. |
# works with dynamic libraries on windows. |
174 |
('share_esysUtils', 'control static or dynamic esysUtils lib', False), |
('share_esysUtils', 'control static or dynamic esysUtils lib', False), |
175 |
('share_paso', 'control static or dynamic paso lib', False) |
('share_paso', 'control static or dynamic paso lib', False), |
176 |
|
('env_export','Environment variables to be passed to children',[]) |
177 |
) |
) |
178 |
|
|
179 |
|
|
180 |
|
|
181 |
############ Specify which compilers to use #################### |
############ Specify which compilers to use #################### |
182 |
|
|
183 |
# intelc uses regular expressions improperly and emits a warning about |
# intelc uses regular expressions improperly and emits a warning about |
188 |
env = Environment(tools = ['default'] + env['tools_names'], |
env = Environment(tools = ['default'] + env['tools_names'], |
189 |
options = opts) |
options = opts) |
190 |
else: |
else: |
191 |
if socket.gethostname().split('.')[0] == 'service0': |
if effective_hostname == 'service0': |
192 |
env = Environment(tools = ['default', 'intelc'], options = opts) |
env = Environment(tools = ['default', 'intelc'], options = opts) |
193 |
elif os.uname()[4]=='ia64': |
elif os.uname()[4]=='ia64': |
194 |
env = Environment(tools = ['default', 'intelc'], options = opts) |
env = Environment(tools = ['default', 'intelc'], options = opts) |
198 |
env = Environment(tools = ['default'], options = opts) |
env = Environment(tools = ['default'], options = opts) |
199 |
Help(opts.GenerateHelpText(env)) |
Help(opts.GenerateHelpText(env)) |
200 |
|
|
201 |
|
|
202 |
|
############ Make sure target directories exist ################ |
203 |
|
|
204 |
|
if not os.path.isdir(env['bininstall']): |
205 |
|
os.makedirs(env['bininstall']) |
206 |
|
if not os.path.isdir(env['libinstall']): |
207 |
|
os.makedirs(env['libinstall']) |
208 |
|
if not os.path.isdir(env['pyinstall']): |
209 |
|
os.makedirs(env['pyinstall']) |
210 |
|
|
211 |
|
########## Copy required environment vars ###################### |
212 |
|
|
213 |
|
for i in env['env_export']: |
214 |
|
env.Append(ENV = {i:os.environ[i]}) |
215 |
|
|
216 |
############ Fill in compiler options if not set above ######### |
############ Fill in compiler options if not set above ######### |
217 |
|
|
218 |
# Backwards compatibility: allow dodebug=yes and useMPI=yes |
# Backwards compatibility: allow dodebug=yes and useMPI=yes |
243 |
cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK" |
cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK" |
244 |
omp_optim = "-fopenmp" |
omp_optim = "-fopenmp" |
245 |
omp_debug = "-fopenmp" |
omp_debug = "-fopenmp" |
246 |
omp_libs = ['gomp'] |
omp_libs = [] |
247 |
pedantic = "-pedantic-errors -Wno-long-long" |
pedantic = "-pedantic-errors -Wno-long-long" |
248 |
fatalwarning = "-Werror" |
fatalwarning = "-Werror" |
249 |
sysheaderopt = "-isystem " |
sysheaderopt = "-isystem " |
276 |
#set up the autolazy values |
#set up the autolazy values |
277 |
if env['forcelazy'] != "leave_alone": |
if env['forcelazy'] != "leave_alone": |
278 |
if env['forcelazy'] == 'on': |
if env['forcelazy'] == 'on': |
279 |
env.Append(CPPDEFINES='FAUTOLAZYON') |
env.Append(CPPDEFINES=['FAUTOLAZYON']) |
280 |
else: |
else: |
281 |
if env['forcelazy'] == 'off': |
if env['forcelazy'] == 'off': |
282 |
env.Append(CPPDEFINES='FAUTOLAZYOFF') |
env.Append(CPPDEFINES=['FAUTOLAZYOFF']) |
283 |
|
|
284 |
|
#set up the colective resolve values |
285 |
|
if env['forcecollres'] != "leave_alone": |
286 |
|
print env['forcecollres'] |
287 |
|
if env['forcecollres'] == 'on': |
288 |
|
env.Append(CPPDEFINES=['FRESCOLLECTON']) |
289 |
|
else: |
290 |
|
if env['forcecollres'] == 'off': |
291 |
|
env.Append(CPPDEFINES=['FRESCOLLECTOFF']) |
292 |
|
|
293 |
|
|
294 |
# OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty |
# OpenMP is disabled if useopenmp=no or both variables omp_optim and omp_debug are empty |
295 |
if not env["useopenmp"]: |
if not env["useopenmp"]: |
549 |
if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0 |
if env['usemkl'] and not conf.CheckCHeader('mkl_solver.h'): env['usemkl'] = 0 |
550 |
if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0 |
if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0 |
551 |
|
|
552 |
|
|
553 |
# Add MKL to environment env if it was found |
# Add MKL to environment env if it was found |
554 |
if env['usemkl']: |
if env['usemkl']: |
555 |
env = conf.Finish() |
env = conf.Finish() |
604 |
|
|
605 |
# Add the path to Silo to environment env if it was found. |
# Add the path to Silo to environment env if it was found. |
606 |
# Note that we do not add the libs since they are only needed for the |
# Note that we do not add the libs since they are only needed for the |
607 |
# escriptreader library and tools. |
# escriptexport library and tools. |
608 |
if env['usesilo']: |
if env['usesilo']: |
609 |
env.AppendUnique(CPPPATH = [env['silo_path']]) |
env.AppendUnique(CPPPATH = [env['silo_path']]) |
610 |
env.AppendUnique(LIBPATH = [env['silo_lib_path']]) |
env.AppendUnique(LIBPATH = [env['silo_lib_path']]) |
611 |
env.Append(CPPDEFINES = ['HAVE_SILO']) |
env.Append(CPPDEFINES = ['USE_SILO']) |
612 |
|
|
613 |
|
########### Lapack (optional) ################################## |
614 |
|
|
615 |
|
|
616 |
|
if env['uselapack']: |
617 |
|
env.AppendUnique(CPPDEFINES='USE_LAPACK') |
618 |
|
env.AppendUnique(CPPPATH = [env['lapack_path']]) |
619 |
|
env.AppendUnique(LIBPATH =[env['lapack_lib_path']]) |
620 |
|
|
621 |
|
env.Append(LIBPATH = '/usr/lib/atlas') |
622 |
|
env.Append(LIBS = [env['lapack_libs']]) |
623 |
|
if env['lapack_type']=='mkl': |
624 |
|
if not env['usemkl']: |
625 |
|
env['uselapack']=0 |
626 |
|
print "mkl_lapack requires mkl" |
627 |
|
else: |
628 |
|
env.AppendUnique(CPPDEFINES='MKL_LAPACK') |
629 |
|
|
630 |
|
|
631 |
|
|
632 |
############ Add the compiler flags ############################ |
############ Add the compiler flags ############################ |
633 |
|
|
752 |
else: print " Not using ParMETIS (requires MPI)" |
else: print " Not using ParMETIS (requires MPI)" |
753 |
if env['usepapi']: print " Using PAPI" |
if env['usepapi']: print " Using PAPI" |
754 |
else: print " Not using PAPI" |
else: print " Not using PAPI" |
755 |
|
if env['uselapack']: print " Using Lapack" |
756 |
|
else: print " Not using Lapack" |
757 |
if env['usedebug']: print " Compiling for debug" |
if env['usedebug']: print " Compiling for debug" |
758 |
else: print " Not compiling for debug" |
else: print " Not compiling for debug" |
759 |
print " Installing in", prefix |
print " Installing in", prefix |
787 |
) |
) |
788 |
|
|
789 |
env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0) |
env.SConscript(dirs = ['tools/CppUnitTest/src'], build_dir='build/$PLATFORM/tools/CppUnitTest', duplicate=0) |
790 |
env.SConscript(dirs = ['tools/libescriptreader/src'], build_dir='build/$PLATFORM/tools/libescriptreader', duplicate=0) |
env.SConscript(dirs = ['tools/escriptconvert'], build_dir='build/$PLATFORM/tools/escriptconvert', duplicate=0) |
791 |
env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0) |
env.SConscript(dirs = ['paso/src'], build_dir='build/$PLATFORM/paso', duplicate=0) |
792 |
|
env.SConscript(dirs = ['dataexporter/src'], build_dir='build/$PLATFORM/dataexporter', duplicate=0) |
793 |
env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0) |
env.SConscript(dirs = ['escript/src'], build_dir='build/$PLATFORM/escript', duplicate=0) |
794 |
env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0) |
env.SConscript(dirs = ['esysUtils/src'], build_dir='build/$PLATFORM/esysUtils', duplicate=0) |
795 |
env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0) |
env.SConscript(dirs = ['finley/src'], build_dir='build/$PLATFORM/finley', duplicate=0) |
821 |
############### Record python interpreter version ############## |
############### Record python interpreter version ############## |
822 |
|
|
823 |
if not IS_WINDOWS_PLATFORM: |
if not IS_WINDOWS_PLATFORM: |
824 |
|
|
825 |
versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]) |
versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]) |
826 |
|
if sys.version_info[4] >0 : versionstring+="rc%s"%sys.version_info[4] |
827 |
os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion")) |
os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion")) |
828 |
|
|
829 |
############## Populate the buildvars file ##################### |
############## Populate the buildvars file ##################### |
860 |
out+="n" |
out+="n" |
861 |
buildvars.write(out+"\n") |
buildvars.write(out+"\n") |
862 |
buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n') |
buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n') |
863 |
|
out="lapack=" |
864 |
|
if env['uselapack']: |
865 |
|
out+="y" |
866 |
|
else: |
867 |
|
out+="n" |
868 |
|
out+="\nsilo=" |
869 |
|
if env['usesilo']: |
870 |
|
out+="y" |
871 |
|
else: |
872 |
|
out+="n" |
873 |
|
buildvars.write(out+"\n") |
874 |
buildvars.close() |
buildvars.close() |
875 |
|
|
876 |
|
|
886 |
env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a']) |
env.Alias('build_paso', ['target_install_paso_headers', 'target_paso_a']) |
887 |
env.Alias('install_paso', ['build_paso', 'target_install_paso_a']) |
env.Alias('install_paso', ['build_paso', 'target_install_paso_a']) |
888 |
|
|
889 |
|
env.Alias('build_dataexporter', ['target_install_escriptexport_headers', 'target_escriptexport_so', 'target_escriptexportcpp_so']) |
890 |
|
env.Alias('install_dataexporter', ['build_dataexporter', 'target_install_escriptexport_so', 'target_install_escriptexportcpp_so', 'target_install_dataexporter_py']) |
891 |
|
|
892 |
env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so']) |
env.Alias('build_escript', ['target_install_escript_headers', 'target_escript_so', 'target_escriptcpp_so']) |
893 |
env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py']) |
env.Alias('install_escript', ['build_escript', 'target_install_escript_so', 'target_install_escriptcpp_so', 'target_install_escript_py']) |
894 |
|
|
899 |
build_all_list = [] |
build_all_list = [] |
900 |
build_all_list += ['build_esysUtils'] |
build_all_list += ['build_esysUtils'] |
901 |
build_all_list += ['build_paso'] |
build_all_list += ['build_paso'] |
902 |
|
build_all_list += ['build_dataexporter'] |
903 |
build_all_list += ['build_escript'] |
build_all_list += ['build_escript'] |
904 |
build_all_list += ['build_finley'] |
build_all_list += ['build_finley'] |
905 |
if env['usempi']: build_all_list += ['target_pythonMPI_exe'] |
if env['usempi']: build_all_list += ['target_pythonMPI_exe'] |
906 |
#if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper'] |
#if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper'] |
907 |
if env['usesilo']: build_all_list += ['target_escript2silo'] |
if env['usesilo']: build_all_list += ['target_escriptconvert'] |
908 |
env.Alias('build_all', build_all_list) |
env.Alias('build_all', build_all_list) |
909 |
|
|
910 |
install_all_list = [] |
install_all_list = [] |
911 |
install_all_list += ['target_init'] |
install_all_list += ['target_init'] |
912 |
install_all_list += ['install_esysUtils'] |
install_all_list += ['install_esysUtils'] |
913 |
install_all_list += ['install_paso'] |
install_all_list += ['install_paso'] |
914 |
|
install_all_list += ['install_dataexporter'] |
915 |
install_all_list += ['install_escript'] |
install_all_list += ['install_escript'] |
916 |
install_all_list += ['install_finley'] |
install_all_list += ['install_finley'] |
917 |
install_all_list += ['target_install_pyvisi_py'] |
install_all_list += ['target_install_pyvisi_py'] |
919 |
install_all_list += ['target_install_pycad_py'] |
install_all_list += ['target_install_pycad_py'] |
920 |
if env['usempi']: install_all_list += ['target_install_pythonMPI_exe'] |
if env['usempi']: install_all_list += ['target_install_pythonMPI_exe'] |
921 |
#if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper'] |
#if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper'] |
922 |
if env['usesilo']: install_all_list += ['target_install_escript2silo'] |
if env['usesilo']: install_all_list += ['target_install_escriptconvert'] |
923 |
install_all_list += ['remember_options'] |
install_all_list += ['remember_options'] |
924 |
env.Alias('install_all', install_all_list) |
env.Alias('install_all', install_all_list) |
925 |
|
|
934 |
env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests']) |
env.Alias('all_tests', ['install_all', 'target_install_cppunittest_a', 'run_tests', 'py_tests']) |
935 |
env.Alias('build_full',['install_all','build_tests','build_py_tests']) |
env.Alias('build_full',['install_all','build_tests','build_py_tests']) |
936 |
|
|
937 |
|
|
938 |
############ Targets to build the documentation ################ |
############ Targets to build the documentation ################ |
939 |
|
|
940 |
env.Alias('api_epydoc','install_all') |
env.Alias('api_epydoc','install_all') |
957 |
print "Error attempting to write unittests file." |
print "Error attempting to write unittests file." |
958 |
sys.exit(1) |
sys.exit(1) |
959 |
|
|
960 |
|
#Make sure that the escript wrapper is in place |
961 |
|
if not os.path.isfile(os.path.join(env['bininstall'],'escript')): |
962 |
|
print "Copying escript wrapper" |
963 |
|
shutil.copy("bin/escript",os.path.join(env['bininstall'],'escript')) |
964 |
|
|
965 |
|
############ Targets to build PasoTests suite ################ |
966 |
|
|
967 |
|
env.Alias('build_PasoTests','build/'+build_platform+'/paso/profiling/PasoTests') |