Add setup_extension_environment() method.
- lets packages do some setup before their extensions run install()
This commit is contained in:
parent
82946d2914
commit
bcccf02020
3 changed files with 52 additions and 7 deletions
|
@ -783,6 +783,12 @@ def do_install(self, **kwargs):
|
||||||
self.stage.chdir_to_source()
|
self.stage.chdir_to_source()
|
||||||
build_env.setup_package(self)
|
build_env.setup_package(self)
|
||||||
|
|
||||||
|
# Allow extendees to further set up the environment.
|
||||||
|
for ext_name in self.extendees:
|
||||||
|
ext_spec = self.spec[ext_name]
|
||||||
|
ext_spec.package.setup_extension_environment(
|
||||||
|
self.module, ext_spec, self.spec)
|
||||||
|
|
||||||
if fake_install:
|
if fake_install:
|
||||||
self.do_fake_install()
|
self.do_fake_install()
|
||||||
else:
|
else:
|
||||||
|
@ -854,6 +860,30 @@ def module(self):
|
||||||
fromlist=[self.__class__.__name__])
|
fromlist=[self.__class__.__name__])
|
||||||
|
|
||||||
|
|
||||||
|
def setup_extension_environment(self, module, spec, ext_spec):
|
||||||
|
"""Called before the install() method of extensions.
|
||||||
|
|
||||||
|
Default implementation does nothing, but this can be
|
||||||
|
overridden by an extendable package to set up the install
|
||||||
|
environment for its extensions. This is useful if there are
|
||||||
|
some common steps to installing all extensions for a
|
||||||
|
certain package.
|
||||||
|
|
||||||
|
Some examples:
|
||||||
|
|
||||||
|
1. Installing python modules generally requires PYTHONPATH to
|
||||||
|
point to the lib/pythonX.Y/site-packages directory in the
|
||||||
|
module's install prefix. This could set that variable.
|
||||||
|
|
||||||
|
2. Extensions often need to invoke the 'python' interpreter
|
||||||
|
from the Python installation being extended. This routine can
|
||||||
|
put a 'python' Execuable object in the module scope for the
|
||||||
|
extension package to simplify extension installs.
|
||||||
|
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
"""Package implementations override this with their own build configuration."""
|
"""Package implementations override this with their own build configuration."""
|
||||||
raise InstallError("Package %s provides no install method!" % self.name)
|
raise InstallError("Package %s provides no install method!" % self.name)
|
||||||
|
|
|
@ -10,10 +10,4 @@ class PySetuptools(Package):
|
||||||
extends('python')
|
extends('python')
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
site_packages_dir = "%s/lib/python2.7/site-packages" % prefix
|
|
||||||
mkdirp(site_packages_dir)
|
|
||||||
|
|
||||||
env['PYTHONPATH'] = site_packages_dir
|
|
||||||
|
|
||||||
python = which('python')
|
|
||||||
python('setup.py', 'install', '--prefix=%s' % prefix)
|
python('setup.py', 'install', '--prefix=%s' % prefix)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from spack import *
|
from spack import *
|
||||||
|
import os
|
||||||
|
|
||||||
class Python(Package):
|
class Python(Package):
|
||||||
"""The Python programming language."""
|
"""The Python programming language."""
|
||||||
|
@ -26,3 +26,24 @@ def install(self, spec, prefix):
|
||||||
"--enable-shared")
|
"--enable-shared")
|
||||||
make()
|
make()
|
||||||
make("install")
|
make("install")
|
||||||
|
|
||||||
|
|
||||||
|
def setup_extension_environment(self, module, spec, ext_spec):
|
||||||
|
"""Called before python modules' install() methods.
|
||||||
|
|
||||||
|
In most cases, extensions will only need to have one line::
|
||||||
|
|
||||||
|
python('setup.py', 'install', '--prefix=%s' % prefix)
|
||||||
|
"""
|
||||||
|
# Python extension builds can have a global python executable function
|
||||||
|
module.python = Executable(join_path(spec.prefix.bin, 'python'))
|
||||||
|
|
||||||
|
# Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs.
|
||||||
|
module.python_lib_dir = join_path(ext_spec.prefix.lib, 'python%d.%d' % self.version[:2])
|
||||||
|
module.site_packages_dir = join_path(module.python_lib_dir, 'site-packages')
|
||||||
|
|
||||||
|
# Add site packages directory to the PYTHONPATH
|
||||||
|
os.environ['PYTHONPATH'] = module.site_packages_dir
|
||||||
|
|
||||||
|
# Make the site packages directory if it does not exist already.
|
||||||
|
mkdirp(module.site_packages_dir)
|
||||||
|
|
Loading…
Reference in a new issue