98 |
('mpi_run', 'mpirun name' , 'mpiexec -np 1'), |
('mpi_run', 'mpirun name' , 'mpiexec -np 1'), |
99 |
('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), |
100 |
('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!)', ['mpich' , 'pthread', 'rt']), |
101 |
|
('mpi_flavour','Type of MPI execution environment','none'), |
102 |
# ParMETIS |
# ParMETIS |
103 |
BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'), |
BoolOption('useparmetis', 'Compile parallel version using ParMETIS', 'yes'), |
104 |
('parmetis_path', 'Path to ParMETIS includes', '/usr/include'), |
('parmetis_path', 'Path to ParMETIS includes', '/usr/include'), |
243 |
try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS'] |
try: env['ENV']['OMP_NUM_THREADS'] = os.environ['OMP_NUM_THREADS'] |
244 |
except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1 |
except KeyError: env['ENV']['OMP_NUM_THREADS'] = 1 |
245 |
|
|
246 |
|
try: env['ENV']['ESCRIPT_NUM_THREADS'] = os.environ['ESCRIPT_NUM_THREADS'] |
247 |
|
except KeyError: pass |
248 |
|
|
249 |
|
try: env['ENV']['ESCRIPT_NUM_PROCS'] = os.environ['ESCRIPT_NUM_PROCS'] |
250 |
|
except KeyError: pass |
251 |
|
|
252 |
|
try: env['ENV']['ESCRIPT_NUM_NODES'] = os.environ['ESCRIPT_NUM_NODES'] |
253 |
|
except KeyError: pass |
254 |
|
|
255 |
|
try: env['ENV']['ESCRIPT_HOSTFILE'] = os.environ['ESCRIPT_HOSTFILE'] |
256 |
|
except KeyError: pass |
257 |
|
|
258 |
try: env['ENV']['PATH'] = os.environ['PATH'] |
try: env['ENV']['PATH'] = os.environ['PATH'] |
259 |
except KeyError: pass |
except KeyError: pass |
260 |
|
|
309 |
|
|
310 |
# MS Windows |
# MS Windows |
311 |
if IS_WINDOWS_PLATFORM: |
if IS_WINDOWS_PLATFORM: |
312 |
env.PrependENVPath('PATH', [env['boost_lib_path']]) |
env.AppendENVPath('PATH', [env['boost_lib_path']]) |
313 |
env.PrependENVPath('PATH', [env['libinstall']]) |
env.AppendENVPath('PATH', [env['libinstall']]) |
314 |
if not env['share_esysUtils'] : |
if not env['share_esysUtils'] : |
315 |
env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB']) |
env.Append(CPPDEFINES = ['ESYSUTILS_STATIC_LIB']) |
316 |
if not env['share_paso'] : |
if not env['share_paso'] : |
317 |
env.Append(CPPDEFINES = ['PASO_STATIC_LIB']) |
env.Append(CPPDEFINES = ['PASO_STATIC_LIB']) |
318 |
|
|
319 |
if env['usenetcdf']: |
if env['usenetcdf']: |
320 |
env.PrependENVPath('PATH', [env['netCDF_lib_path']]) |
env.AppendENVPath('PATH', [env['netCDF_lib_path']]) |
321 |
|
|
322 |
env.Append(ARFLAGS = env['ar_flags']) |
env.Append(ARFLAGS = env['ar_flags']) |
323 |
|
|
479 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
480 |
|
|
481 |
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 |
482 |
if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0 |
if env['usemkl'] and not conf.CheckFunc('pardiso'): env['usemkl'] = 0 |
483 |
|
|
484 |
# Add MKL to environment env if it was found |
# Add MKL to environment env if it was found |
485 |
if env['usemkl']: |
if env['usemkl']: |
555 |
env.Append(CCFLAGS = env['cc_flags']) |
env.Append(CCFLAGS = env['cc_flags']) |
556 |
env.Append(LIBS = [env['omp_libs']]) |
env.Append(LIBS = [env['omp_libs']]) |
557 |
|
|
|
|
|
558 |
############ Add some custom builders ########################## |
############ Add some custom builders ########################## |
559 |
|
|
560 |
py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True) |
py_builder = Builder(action = scons_extensions.build_py, suffix = '.pyc', src_suffix = '.py', single_source=True) |
566 |
runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True) |
runPyUnitTest_builder = Builder(action = scons_extensions.runPyUnitTest, suffix = '.passed', src_suffic='.py', single_source=True) |
567 |
env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder}); |
env.Append(BUILDERS = {'RunPyUnitTest' : runPyUnitTest_builder}); |
568 |
|
|
569 |
|
epstopdfbuilder = Builder(action = scons_extensions.eps2pdf, suffix=".pdf", src_suffix=".eps", single_source=True) |
570 |
|
env.Append(BUILDERS = {'EpsToPDF' : epstopdfbuilder}); |
571 |
|
|
572 |
############ MPI (optional) #################################### |
############ MPI (optional) #################################### |
573 |
|
if not env['usempi']: env['mpi_flavour']='none' |
574 |
|
|
575 |
# Create a modified environment for MPI programs (identical to env if usempi=no) |
# Create a modified environment for MPI programs (identical to env if usempi=no) |
576 |
env_mpi = clone_env(env) |
env_mpi = clone_env(env) |
579 |
conf = Configure(clone_env(env_mpi)) |
conf = Configure(clone_env(env_mpi)) |
580 |
|
|
581 |
if env_mpi['usempi']: |
if env_mpi['usempi']: |
582 |
|
VALID_MPIs=[ "MPT", "MPICH", "MPICH2", "OPENMPI", "INTELMPI" ] |
583 |
|
if not env_mpi['mpi_flavour'] in VALID_MPIs: |
584 |
|
raise ValueError,"MPI is enabled but mpi_flavour = %s is not a valid key from %s."%( env_mpi['mpi_flavour'],VALID_MPIs) |
585 |
conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']]) |
conf.env.AppendUnique(CPPPATH = [env_mpi['mpi_path']]) |
586 |
conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']]) |
conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']]) |
587 |
conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']]) |
conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']]) |
591 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
592 |
|
|
593 |
if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0 |
if env_mpi['usempi'] and not conf.CheckCHeader('mpi.h'): env_mpi['usempi'] = 0 |
594 |
if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0 |
# if env_mpi['usempi'] and not conf.CheckFunc('MPI_Init'): env_mpi['usempi'] = 0 |
595 |
|
|
596 |
# Add MPI to environment env_mpi if it was found |
# Add MPI to environment env_mpi if it was found |
597 |
if env_mpi['usempi']: |
if env_mpi['usempi']: |
602 |
|
|
603 |
env['usempi'] = env_mpi['usempi'] |
env['usempi'] = env_mpi['usempi'] |
604 |
|
|
605 |
|
|
606 |
############ ParMETIS (optional) ############################### |
############ ParMETIS (optional) ############################### |
607 |
|
|
608 |
# Start a new configure environment that reflects what we've already found |
# Start a new configure environment that reflects what we've already found |
658 |
else: print " Not using Silo" |
else: print " Not using Silo" |
659 |
if env['useopenmp']: print " Using OpenMP" |
if env['useopenmp']: print " Using OpenMP" |
660 |
else: print " Not using OpenMP" |
else: print " Not using OpenMP" |
661 |
if env['usempi']: print " Using MPI" |
if env['usempi']: print " Using MPI (flavour = %s)"%env['mpi_flavour'] |
662 |
else: print " Not using MPI" |
else: print " Not using MPI" |
663 |
if env['useparmetis']: print " Using ParMETIS" |
if env['useparmetis']: print " Using ParMETIS" |
664 |
else: print " Not using ParMETIS (requires MPI)" |
else: print " Not using ParMETIS (requires MPI)" |
673 |
|
|
674 |
############ Delete option-dependent files ##################### |
############ Delete option-dependent files ##################### |
675 |
|
|
676 |
Execute(Delete(env['libinstall'] + "/Compiled.with.debug")) |
Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.debug"))) |
677 |
Execute(Delete(env['libinstall'] + "/Compiled.with.mpi")) |
Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.mpi"))) |
678 |
Execute(Delete(env['libinstall'] + "/Compiled.with.openmp")) |
Execute(Delete(os.path.join(env['libinstall'],"Compiled.with.openmp"))) |
679 |
Execute(Delete(env['libinstall'] + "pyversion")) |
Execute(Delete(os.path.join(env['libinstall'],"pyversion"))) |
680 |
if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI")) |
Execute(Delete(os.path.join(env['libinstall'],"buildvars"))) |
681 |
|
if not env['usempi']: Execute(Delete(os.path.join(env['libinstall'],"pythonMPI"))) |
682 |
|
|
683 |
|
|
684 |
############ Build the subdirectories ########################## |
############ Build the subdirectories ########################## |
716 |
remember_list = [] |
remember_list = [] |
717 |
|
|
718 |
if env['usedebug']: |
if env['usedebug']: |
719 |
remember_list += env.Command(env['libinstall'] + "/Compiled.with.debug", None, Touch('$TARGET')) |
remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.debug"), None, Touch('$TARGET')) |
720 |
|
|
721 |
if env['usempi']: |
if env['usempi']: |
722 |
remember_list += env.Command(env['libinstall'] + "/Compiled.with.mpi", None, Touch('$TARGET')) |
remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.mpi"), None, Touch('$TARGET')) |
723 |
|
|
724 |
if env['omp_optim'] != '': |
if env['useopenmp']: |
725 |
remember_list += env.Command(env['libinstall'] + "/Compiled.with.openmp", None, Touch('$TARGET')) |
remember_list += env.Command(os.path.join(env['libinstall'],"Compiled.with.openmp"), None, Touch('$TARGET')) |
726 |
|
|
727 |
env.Alias('remember_options', remember_list) |
env.Alias('remember_options', remember_list) |
728 |
|
|
731 |
|
|
732 |
if not IS_WINDOWS_PLATFORM: |
if not IS_WINDOWS_PLATFORM: |
733 |
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]) |
734 |
os.system("echo "+versionstring+" > "+env['libinstall']+"/pyversion") |
os.system("echo "+versionstring+" > "+os.path.join(env['libinstall'],"pyversion")) |
735 |
|
|
736 |
|
############## Populate the buildvars file ##################### |
737 |
|
|
738 |
|
buildvars=open(os.path.join(env['libinstall'],'buildvars'),'w') |
739 |
|
buildvars.write('python='+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])+'\n') |
740 |
|
|
741 |
|
# Find the boost version by extracting it from version.hpp |
742 |
|
boosthpp=open(os.path.join(env['boost_path'],'boost','version.hpp')) |
743 |
|
boostversion='unknown' |
744 |
|
try: |
745 |
|
for line in boosthpp: |
746 |
|
ver=re.match(r'#define BOOST_VERSION (\d+)',line) |
747 |
|
if ver: |
748 |
|
boostversion=ver.group(1) |
749 |
|
except StopIteration: |
750 |
|
pass |
751 |
|
buildvars.write("boost="+boostversion+"\n") |
752 |
|
buildvars.write("svn_revision="+str(global_revision)+"\n") |
753 |
|
out="usedebug=" |
754 |
|
if env['usedebug']: |
755 |
|
out+="y" |
756 |
|
else: |
757 |
|
out+="n" |
758 |
|
out+="\nusempi=" |
759 |
|
if env['usempi']: |
760 |
|
out+="y" |
761 |
|
else: |
762 |
|
out+="n" |
763 |
|
out+="\nuseopenmp=" |
764 |
|
if env['useopenmp']: |
765 |
|
out+="y" |
766 |
|
else: |
767 |
|
out+="n" |
768 |
|
buildvars.write(out+"\n") |
769 |
|
buildvars.write("mpi_flavour="+env['mpi_flavour']+'\n') |
770 |
|
|
771 |
|
buildvars.close() |
772 |
|
|
773 |
|
|
774 |
############ Targets to build and install libraries ############ |
############ Targets to build and install libraries ############ |
775 |
|
|
828 |
|
|
829 |
############ Targets to build the documentation ################ |
############ Targets to build the documentation ################ |
830 |
|
|
831 |
env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html']) |
env.Alias('docs', ['examples_tarfile', 'examples_zipfile', 'api_epydoc', 'api_doxygen', 'guide_pdf', 'guide_html','install_pdf']) |
832 |
|
|
833 |
if not IS_WINDOWS_PLATFORM: |
if not IS_WINDOWS_PLATFORM: |
834 |
try: |
try: |