PageRenderTime 31ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/config/BuildSystem/config/packages/petsc4py.py

https://bitbucket.org/tferma/petsc
Python | 116 lines | 113 code | 3 blank | 0 comment | 4 complexity | c8c060827089965cd4a046634c22df12 MD5 | raw file
  1. import config.package
  2. class Configure(config.package.Package):
  3. def __init__(self, framework):
  4. config.package.Package.__init__(self, framework)
  5. self.gitcommit = '026d6fa' # maint/3.7 from may-21-2026
  6. self.download = ['git://https://bitbucket.org/petsc/petsc4py','https://bitbucket.org/petsc/petsc4py/get/'+self.gitcommit+'.tar.gz']
  7. self.functions = []
  8. self.includes = []
  9. self.skippackagewithoptions = 1
  10. self.downloaddirname = 'petsc-petsc4py'
  11. return
  12. def setupDependencies(self, framework):
  13. config.package.Package.setupDependencies(self, framework)
  14. self.numpy = framework.require('config.packages.Numpy',self)
  15. self.setCompilers = framework.require('config.setCompilers',self)
  16. self.sharedLibraries = framework.require('PETSc.options.sharedLibraries', self)
  17. self.installdir = framework.require('PETSc.options.installDir',self)
  18. return
  19. def Install(self):
  20. import os
  21. pp = os.path.join(self.installDir,'lib','python*','site-packages')
  22. if self.setCompilers.isDarwin(self.log):
  23. apple = 'You may need to\n (csh/tcsh) setenv MACOSX_DEPLOYMENT_TARGET 10.X\n (sh/bash) MACOSX_DEPLOYMENT_TARGET=10.X; export MACOSX_DEPLOYMENT_TARGET\nbefore running make on PETSc'
  24. else:
  25. apple = ''
  26. self.logClearRemoveDirectory()
  27. self.logResetRemoveDirectory()
  28. archflags = ""
  29. if self.setCompilers.isDarwin(self.log):
  30. if self.types.sizes['known-sizeof-void-p'] == 4:
  31. archflags = "ARCHFLAGS=\'-arch i386\' "
  32. else:
  33. archflags = "ARCHFLAGS=\'-arch x86_64\' "
  34. # if installing prefix location then need to set new value for PETSC_DIR/PETSC_ARCH
  35. if self.argDB['prefix']:
  36. newdir = 'PETSC_DIR='+os.path.abspath(os.path.expanduser(self.argDB['prefix']))+' '+'PETSC_ARCH= MPICC=${PCC} '
  37. else:
  38. newdir = 'MPICC=${PCC} '
  39. # if installing as Superuser than want to return to regular user for clean and build
  40. if self.installSudo:
  41. newuser = self.installSudo+' -u $${SUDO_USER} '
  42. else:
  43. newuser = ''
  44. self.addMakeRule('petsc4pybuild','', \
  45. ['@echo "*** Building petsc4py ***"',\
  46. '@${RM} -f ${PETSC_ARCH}/lib/petsc/conf/petsc4py.errorflg',\
  47. '@(cd '+self.packageDir+' && \\\n\
  48. '+newuser+newdir+'python setup.py clean --all && \\\n\
  49. '+newuser+newdir+archflags+'python setup.py build ) > ${PETSC_ARCH}/lib/petsc/conf/petsc4py.log 2>&1 || \\\n\
  50. (echo "**************************ERROR*************************************" && \\\n\
  51. echo "Error building petsc4py. Check ${PETSC_ARCH}/lib/petsc/conf/petsc4py.log" && \\\n\
  52. echo "********************************************************************" && \\\n\
  53. touch ${PETSC_ARCH}/lib/petsc/conf/petsc4py.errorflg && \\\n\
  54. exit 1)'])
  55. self.addMakeRule('petsc4pyinstall','', \
  56. ['@echo "*** Installing petsc4py ***"',\
  57. '@(MPICC=${PCC} && export MPICC && cd '+self.packageDir+' && \\\n\
  58. '+newdir+archflags+'python setup.py install --install-lib='+os.path.join(self.installDir,'lib')+') >> ${PETSC_ARCH}/lib/petsc/conf/petsc4py.log 2>&1 || \\\n\
  59. (echo "**************************ERROR*************************************" && \\\n\
  60. echo "Error building petsc4py. Check ${PETSC_ARCH}/lib/petsc/conf/petsc4py.log" && \\\n\
  61. echo "********************************************************************" && \\\n\
  62. exit 1)',\
  63. '@echo "====================================="',\
  64. '@echo "To use petsc4py, add '+os.path.join(self.installdir.dir,'lib')+' to PYTHONPATH"',\
  65. '@echo "====================================="'])
  66. if self.argDB['prefix']:
  67. self.addMakeRule('petsc4py-build','')
  68. # the build must be done at install time because PETSc shared libraries must be in final location before building petsc4py
  69. self.addMakeRule('petsc4py-install','petsc4pybuild petsc4pyinstall')
  70. else:
  71. self.addMakeRule('petsc4py-build','petsc4pybuild petsc4pyinstall')
  72. self.addMakeRule('petsc4py-install','')
  73. return self.installDir
  74. def configureLibrary(self):
  75. if not self.sharedLibraries.useShared and not self.setCompilers.isCygwin(self.log):
  76. raise RuntimeError('petsc4py requires PETSc be built with shared libraries; rerun with --with-shared-libraries')
  77. self.checkDownload()
  78. if self.setCompilers.isDarwin(self.log):
  79. # The name of the Python library on Apple is Python which does not end in the expected .dylib
  80. # Thus see if the python library in the standard locations points to the Python version
  81. import sys
  82. import os
  83. prefix = sys.exec_prefix
  84. if os.path.isfile(os.path.join(prefix,'Python')):
  85. for i in ['/usr/lib/libpython.dylib','/usr/lib/libpython'+sys.version[:3]+'.dylib','/opt/local/lib/libpython.dylib','/opt/local/lib/libpython'+sys.version[:3]+'.dylib']:
  86. if os.path.realpath(i) == os.path.join(prefix,'Python'):
  87. self.addDefine('PYTHON_LIB','"'+os.path.join(i)+'"')
  88. return
  89. if os.path.isfile(os.path.join(prefix,'lib','libpython.dylib')):
  90. self.addDefine('PYTHON_LIB','"'+os.path.join(prefix,'lib','libpython.dylib')+'"')
  91. return
  92. if os.path.isfile(os.path.join(prefix,'lib','libpython'+sys.version[:3]+'.dylib')):
  93. self.addDefine('PYTHON_LIB','"'+os.path.join(prefix,'lib','libpython'+sys.version[:3]+'.dylib')+'"')
  94. return
  95. raise RuntimeError('Unable to find Python dynamic library at prefix '+prefix)
  96. def alternateConfigureLibrary(self):
  97. self.addMakeRule('petsc4py-build','')
  98. self.addMakeRule('petsc4py-install','')
  99. def gitPreReqCheck(self):
  100. ''' petsc4py git download requires Cython'''
  101. flg = True
  102. try:
  103. import Cython
  104. except:
  105. flg = False
  106. return flg