15 |
EnsureSConsVersion(0,96,91) |
EnsureSConsVersion(0,96,91) |
16 |
EnsurePythonVersion(2,3) |
EnsurePythonVersion(2,3) |
17 |
|
|
18 |
import sys, os, re, socket |
import sys, os, re, socket, platform, stat |
19 |
|
|
20 |
# Add our extensions |
# Add our extensions |
21 |
if os.path.isdir('scons'): sys.path.append('scons') |
if os.path.isdir('scons'): sys.path.append('scons') |
72 |
('ld_extra', 'Extra linker flags', ''), |
('ld_extra', 'Extra linker flags', ''), |
73 |
('sys_libs', 'System libraries to link with', []), |
('sys_libs', 'System libraries to link with', []), |
74 |
('ar_flags', 'Static library archiver flags to use', ''), |
('ar_flags', 'Static library archiver flags to use', ''), |
75 |
BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'yes'), |
BoolOption('useopenmp', 'Compile parallel version using OpenMP', 'no'), |
76 |
BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'), |
BoolOption('usepedantic', 'Compile with -pedantic if using gcc', 'no'), |
77 |
BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'), |
BoolOption('usewarnings','Compile with warnings as errors if using gcc','yes'), |
78 |
('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'), |
189 |
#the long long warning occurs on the Mac |
#the long long warning occurs on the Mac |
190 |
cc_optim = "-O3" |
cc_optim = "-O3" |
191 |
cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK" |
cc_debug = "-g -O0 -DDOASSERT -DDOPROF -DBOUNDS_CHECK" |
192 |
omp_optim = "" |
omp_optim = "-fopenmp" |
193 |
omp_debug = "" |
omp_debug = "-fopenmp" |
194 |
omp_libs = [] |
omp_libs = ['gomp'] |
195 |
pedantic = "-pedantic-errors -Wno-long-long" |
pedantic = "-pedantic-errors -Wno-long-long" |
196 |
fatalwarning = "-Werror" |
fatalwarning = "-Werror" |
197 |
sysheaderopt = "-isystem " |
sysheaderopt = "-isystem " |
333 |
|
|
334 |
# Test that the compiler is working |
# Test that the compiler is working |
335 |
if not conf.CheckFunc('printf'): |
if not conf.CheckFunc('printf'): |
336 |
print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC']) |
print "Cannot run C compiler '%s' (or libc is missing)" % (env['CC']) |
337 |
sys.exit(1) |
sys.exit(1) |
338 |
|
|
339 |
if conf.CheckFunc('gethostname'): |
if conf.CheckFunc('gethostname'): |
340 |
conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME']) |
conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME']) |
351 |
conf.env.AppendUnique(LIBS = [env['python_libs']]) |
conf.env.AppendUnique(LIBS = [env['python_libs']]) |
352 |
|
|
353 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['python_lib_path']) # The wrapper script needs to find these libs |
354 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
355 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
356 |
|
|
357 |
if not conf.CheckCHeader('Python.h'): |
if not conf.CheckCHeader('Python.h'): |
358 |
print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path']) |
print "Cannot find python include files (tried 'Python.h' in directory %s)" % (env['python_path']) |
359 |
sys.exit(1) |
sys.exit(1) |
360 |
if not conf.CheckFunc('Py_Main'): |
if not conf.CheckFunc('Py_Exit'): |
361 |
print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path']) |
print "Cannot find python library method Py_Main (tried lib %s in directory %s)" % (env['python_libs'], env['python_lib_path']) |
362 |
sys.exit(1) |
sys.exit(1) |
363 |
|
|
364 |
############ boost (required) ################################## |
############ boost (required) ################################## |
365 |
|
|
366 |
if not sysheaderopt =="": |
if not sysheaderopt =="": |
367 |
conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path']+'boost') |
# This is required because we can't -isystem /usr/system because it breaks std includes |
368 |
|
if os.path.normpath(env['boost_path']) =="/usr/include": |
369 |
|
conf.env.Append(CCFLAGS=sysheaderopt+os.path.join(env['boost_path'],'boost')) |
370 |
|
else: |
371 |
|
conf.env.Append(CCFLAGS=sysheaderopt+env['boost_path']) |
372 |
else: |
else: |
373 |
conf.env.AppendUnique(CPPPATH = [env['boost_path']]) |
conf.env.AppendUnique(CPPPATH = [env['boost_path']]) |
374 |
|
|
376 |
conf.env.AppendUnique(LIBS = [env['boost_libs']]) |
conf.env.AppendUnique(LIBS = [env['boost_libs']]) |
377 |
|
|
378 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['boost_lib_path']) # The wrapper script needs to find these libs |
379 |
|
#ensure that our path entries remain at the front |
380 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
381 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
382 |
|
|
383 |
if not conf.CheckCXXHeader('boost/python.hpp'): |
if not conf.CheckCXXHeader('boost/python.hpp'): |
384 |
print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path']) |
print "Cannot find boost include files (tried boost/python.hpp in directory %s)" % (env['boost_path']) |
385 |
sys.exit(1) |
sys.exit(1) |
386 |
|
|
387 |
if not conf.CheckFunc('PyObject_SetAttr'): |
if not conf.CheckFunc('PyObject_SetAttr'): |
388 |
print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path']) |
print "Cannot find boost library method PyObject_SetAttr (tried method PyObject_SetAttr in library %s in directory %s)" % (env['boost_libs'], env['boost_lib_path']) |
389 |
sys.exit(1) |
sys.exit(1) |
413 |
conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']]) |
conf.env.AppendUnique(LIBPATH = [env['netCDF_lib_path']]) |
414 |
conf.env.AppendUnique(LIBS = [env['netCDF_libs']]) |
conf.env.AppendUnique(LIBS = [env['netCDF_libs']]) |
415 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['netCDF_lib_path']) # The wrapper script needs to find these libs |
416 |
|
#ensure that our path entries remain at the front |
417 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
418 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
419 |
|
|
420 |
if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0 |
if env['usenetcdf'] and not conf.CheckCHeader('netcdf.h'): env['usenetcdf'] = 0 |
421 |
if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0 |
if env['usenetcdf'] and not conf.CheckFunc('nc_open'): env['usenetcdf'] = 0 |
437 |
conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']]) |
conf.env.AppendUnique(LIBPATH = [env['papi_lib_path']]) |
438 |
conf.env.AppendUnique(LIBS = [env['papi_libs']]) |
conf.env.AppendUnique(LIBS = [env['papi_libs']]) |
439 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['papi_lib_path']) # The wrapper script needs to find these libs |
440 |
|
#ensure that our path entries remain at the front |
441 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
442 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
443 |
|
|
444 |
if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0 |
if env['usepapi'] and not conf.CheckCHeader('papi.h'): env['usepapi'] = 0 |
445 |
if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0 |
if env['usepapi'] and not conf.CheckFunc('PAPI_start_counters'): env['usepapi'] = 0 |
461 |
conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']]) |
conf.env.AppendUnique(LIBPATH = [env['mkl_lib_path']]) |
462 |
conf.env.AppendUnique(LIBS = [env['mkl_libs']]) |
conf.env.AppendUnique(LIBS = [env['mkl_libs']]) |
463 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mkl_lib_path']) # The wrapper script needs to find these libs |
464 |
|
#ensure that our path entries remain at the front |
465 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
466 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
467 |
|
|
468 |
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 |
469 |
if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0 |
if env['usemkl'] and not conf.CheckFunc('pardiso_'): env['usemkl'] = 0 |
494 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['umf_lib_path']) # The wrapper script needs to find these libs |
495 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['amd_lib_path']) # The wrapper script needs to find these libs |
496 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['blas_lib_path']) # The wrapper script needs to find these libs |
497 |
|
#ensure that our path entries remain at the front |
498 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
499 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
500 |
|
|
|
if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0 |
|
501 |
if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0 |
if env['useumfpack'] and not conf.CheckFunc('umfpack_di_symbolic'): env['useumfpack'] = 0 |
502 |
if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73? |
if env['useumfpack'] and not conf.CheckCHeader('umfpack.h'): env['useumfpack'] = 0 |
503 |
|
# if env['useumfpack'] and not conf.CheckFunc('daxpy'): env['useumfpack'] = 0 # this does not work on shake73? |
504 |
|
|
505 |
# Add UMFPACK to environment env if it was found |
# Add UMFPACK to environment env if it was found |
506 |
if env['useumfpack']: |
if env['useumfpack']: |
567 |
conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']]) |
conf.env.AppendUnique(LIBPATH = [env_mpi['mpi_lib_path']]) |
568 |
conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']]) |
conf.env.AppendUnique(LIBS = [env_mpi['mpi_libs']]) |
569 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['mpi_lib_path']) # The wrapper script needs to find these libs |
570 |
|
#ensure that our path entries remain at the front |
571 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
572 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
573 |
|
|
574 |
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 |
575 |
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 |
conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']]) |
conf.env.AppendUnique(LIBPATH = [env_mpi['parmetis_lib_path']]) |
596 |
conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']]) |
conf.env.AppendUnique(LIBS = [env_mpi['parmetis_libs']]) |
597 |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path']) # The wrapper script needs to find these libs |
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['parmetis_lib_path']) # The wrapper script needs to find these libs |
598 |
|
#ensure that our path entries remain at the front |
599 |
|
conf.env.PrependENVPath('PYTHONPATH', prefix) |
600 |
|
conf.env.PrependENVPath('LD_LIBRARY_PATH', env['libinstall']) |
601 |
|
|
602 |
if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0 |
if env_mpi['useparmetis'] and not conf.CheckCHeader('parmetis.h'): env_mpi['useparmetis'] = 0 |
603 |
if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0 |
if env_mpi['useparmetis'] and not conf.CheckFunc('ParMETIS_V3_PartGeomKway'): env_mpi['useparmetis'] = 0 |
656 |
Execute(Delete(env['libinstall'] + "/Compiled.with.debug")) |
Execute(Delete(env['libinstall'] + "/Compiled.with.debug")) |
657 |
Execute(Delete(env['libinstall'] + "/Compiled.with.mpi")) |
Execute(Delete(env['libinstall'] + "/Compiled.with.mpi")) |
658 |
Execute(Delete(env['libinstall'] + "/Compiled.with.openmp")) |
Execute(Delete(env['libinstall'] + "/Compiled.with.openmp")) |
659 |
|
Execute(Delete(env['libinstall'] + "pyversion")) |
660 |
if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI")) |
if not env['usempi']: Execute(Delete(env['libinstall'] + "/pythonMPI")) |
661 |
|
|
662 |
|
|
705 |
|
|
706 |
env.Alias('remember_options', remember_list) |
env.Alias('remember_options', remember_list) |
707 |
|
|
708 |
|
|
709 |
|
############### Record python interpreter version ############## |
710 |
|
|
711 |
|
if not IS_WINDOWS_PLATFORM: |
712 |
|
versionstring="Python "+str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]) |
713 |
|
os.system("echo "+versionstring+" > "+env['libinstall']+"/pyversion") |
714 |
|
|
715 |
############ Targets to build and install libraries ############ |
############ Targets to build and install libraries ############ |
716 |
|
|
717 |
target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET')) |
target_init = env.Command(env['pyinstall']+'/__init__.py', None, Touch('$TARGET')) |
737 |
build_all_list += ['build_escript'] |
build_all_list += ['build_escript'] |
738 |
build_all_list += ['build_finley'] |
build_all_list += ['build_finley'] |
739 |
if env['usempi']: build_all_list += ['target_pythonMPI_exe'] |
if env['usempi']: build_all_list += ['target_pythonMPI_exe'] |
740 |
if not IS_WINDOWS_PLATFORM: build_all_list += ['target_finley_wrapper'] |
if not IS_WINDOWS_PLATFORM: build_all_list += ['target_escript_wrapper'] |
741 |
if env['usesilo']: build_all_list += ['target_escript2silo'] |
if env['usesilo']: build_all_list += ['target_escript2silo'] |
742 |
env.Alias('build_all', build_all_list) |
env.Alias('build_all', build_all_list) |
743 |
|
|
751 |
install_all_list += ['target_install_modellib_py'] |
install_all_list += ['target_install_modellib_py'] |
752 |
install_all_list += ['target_install_pycad_py'] |
install_all_list += ['target_install_pycad_py'] |
753 |
if env['usempi']: install_all_list += ['target_install_pythonMPI_exe'] |
if env['usempi']: install_all_list += ['target_install_pythonMPI_exe'] |
754 |
if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_finley_wrapper'] |
if not IS_WINDOWS_PLATFORM: install_all_list += ['target_install_escript_wrapper'] |
755 |
if env['usesilo']: install_all_list += ['target_install_escript2silo'] |
if env['usesilo']: install_all_list += ['target_install_escript2silo'] |
756 |
install_all_list += ['remember_options'] |
install_all_list += ['remember_options'] |
757 |
env.Alias('install_all', install_all_list) |
env.Alias('install_all', install_all_list) |
765 |
env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a']) |
env.Alias('install_cppunittest', ['build_cppunittest', 'target_install_cppunittest_a']) |
766 |
env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a']) |
env.Alias('run_tests', ['install_all', 'target_install_cppunittest_a']) |
767 |
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']) |
768 |
|
env.Alias('build_full',['install_all','build_tests','build_py_tests']) |
769 |
|
|
770 |
############ Targets to build the documentation ################ |
############ Targets to build the documentation ################ |
771 |
|
|
774 |
if not IS_WINDOWS_PLATFORM: |
if not IS_WINDOWS_PLATFORM: |
775 |
try: |
try: |
776 |
utest=open("utest.sh","w") |
utest=open("utest.sh","w") |
777 |
utest.write(GroupTest.makeHeader()) |
build_platform=os.name #Sometimes Mac python says it is posix |
778 |
|
if (build_platform=='posix') and platform.system()=="Darwin": |
779 |
|
build_platform='darwin' |
780 |
|
utest.write(GroupTest.makeHeader(build_platform)) |
781 |
for tests in TestGroups: |
for tests in TestGroups: |
782 |
utest.write(tests.makeString()) |
utest.write(tests.makeString()) |
783 |
utest.close() |
utest.close() |
784 |
|
os.chmod("utest.sh",stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH) |
785 |
print "utest.sh written" |
print "utest.sh written" |
786 |
except IOError: |
except IOError: |
787 |
print "Error attempting to write unittests file." |
print "Error attempting to write unittests file." |