PythonPackage: add --config-settings support (#31823)
This commit is contained in:
@@ -215,7 +215,7 @@ Note that ``py-wheel`` is already listed as a build dependency in the
|
|||||||
need to specify a specific version requirement or change the
|
need to specify a specific version requirement or change the
|
||||||
dependency type.
|
dependency type.
|
||||||
|
|
||||||
See `PEP 517 <https://www.python.org/dev/peps/pep-0517/>`_ and
|
See `PEP 517 <https://www.python.org/dev/peps/pep-0517/>`__ and
|
||||||
`PEP 518 <https://www.python.org/dev/peps/pep-0518/>`_ for more
|
`PEP 518 <https://www.python.org/dev/peps/pep-0518/>`_ for more
|
||||||
information on the design of ``pyproject.toml``.
|
information on the design of ``pyproject.toml``.
|
||||||
|
|
||||||
@@ -412,6 +412,34 @@ packages. However, the installation instructions for a package may
|
|||||||
suggest passing certain flags to the ``setup.py`` call. The
|
suggest passing certain flags to the ``setup.py`` call. The
|
||||||
``PythonPackage`` class has two techniques for doing this.
|
``PythonPackage`` class has two techniques for doing this.
|
||||||
|
|
||||||
|
"""""""""""""""
|
||||||
|
Config settings
|
||||||
|
"""""""""""""""
|
||||||
|
|
||||||
|
These settings are passed to
|
||||||
|
`PEP 517 <https://peps.python.org/pep-0517/>`__ build backends.
|
||||||
|
For example, ``py-scipy`` package allows you to specify the name of
|
||||||
|
the BLAS/LAPACK library you want pkg-config to search for:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
depends_on('py-pip@22.1:', type='build')
|
||||||
|
|
||||||
|
def config_settings(self, spec, prefix):
|
||||||
|
return {
|
||||||
|
'blas': spec['blas'].libs.names[0],
|
||||||
|
'lapack': spec['lapack'].libs.names[0],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This flag only works for packages that define a ``build-backend``
|
||||||
|
in ``pyproject.toml``. Also, it is only supported by pip 22.1+,
|
||||||
|
which requires Python 3.7+. For packages that still support Python
|
||||||
|
3.6 and older, ``install_options`` should be used instead.
|
||||||
|
|
||||||
|
|
||||||
""""""""""""""
|
""""""""""""""
|
||||||
Global options
|
Global options
|
||||||
""""""""""""""
|
""""""""""""""
|
||||||
@@ -431,6 +459,16 @@ has an optional dependency on ``libyaml`` that can be enabled like so:
|
|||||||
return options
|
return options
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Direct invocation of ``setup.py`` is
|
||||||
|
`deprecated <https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html>`_.
|
||||||
|
This flag forces pip to use a deprecated installation procedure.
|
||||||
|
It should only be used in packages that don't define a
|
||||||
|
``build-backend`` in ``pyproject.toml`` or packages that still
|
||||||
|
support Python 3.6 and older.
|
||||||
|
|
||||||
|
|
||||||
"""""""""""""""
|
"""""""""""""""
|
||||||
Install options
|
Install options
|
||||||
"""""""""""""""
|
"""""""""""""""
|
||||||
@@ -451,6 +489,16 @@ allows you to specify the directories to search for ``libyaml``:
|
|||||||
return options
|
return options
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Direct invocation of ``setup.py`` is
|
||||||
|
`deprecated <https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html>`_.
|
||||||
|
This flag forces pip to use a deprecated installation procedure.
|
||||||
|
It should only be used in packages that don't define a
|
||||||
|
``build-backend`` in ``pyproject.toml`` or packages that still
|
||||||
|
support Python 3.6 and older.
|
||||||
|
|
||||||
|
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
Testing
|
Testing
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
|
|||||||
@@ -22,8 +22,9 @@
|
|||||||
from llnl.util.lang import classproperty, match_predicate
|
from llnl.util.lang import classproperty, match_predicate
|
||||||
|
|
||||||
from spack.directives import depends_on, extends
|
from spack.directives import depends_on, extends
|
||||||
from spack.error import NoHeadersError, NoLibrariesError
|
from spack.error import NoHeadersError, NoLibrariesError, SpecError
|
||||||
from spack.package_base import PackageBase, run_after
|
from spack.package_base import PackageBase, run_after
|
||||||
|
from spack.version import Version
|
||||||
|
|
||||||
|
|
||||||
class PythonPackage(PackageBase):
|
class PythonPackage(PackageBase):
|
||||||
@@ -155,13 +156,43 @@ def build_directory(self):
|
|||||||
"""
|
"""
|
||||||
return self.stage.source_path
|
return self.stage.source_path
|
||||||
|
|
||||||
|
def config_settings(self, spec, prefix):
|
||||||
|
"""Configuration settings to be passed to the PEP 517 build backend.
|
||||||
|
|
||||||
|
Requires pip 22.1+, which requires Python 3.7+.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
spec (spack.spec.Spec): build spec
|
||||||
|
prefix (spack.util.prefix.Prefix): installation prefix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: dictionary of KEY, VALUE settings
|
||||||
|
"""
|
||||||
|
return {}
|
||||||
|
|
||||||
def install_options(self, spec, prefix):
|
def install_options(self, spec, prefix):
|
||||||
"""Extra arguments to be supplied to the setup.py install command."""
|
"""Extra arguments to be supplied to the setup.py install command.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
spec (spack.spec.Spec): build spec
|
||||||
|
prefix (spack.util.prefix.Prefix): installation prefix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: list of options
|
||||||
|
"""
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def global_options(self, spec, prefix):
|
def global_options(self, spec, prefix):
|
||||||
"""Extra global options to be supplied to the setup.py call before the install
|
"""Extra global options to be supplied to the setup.py call before the install
|
||||||
or bdist_wheel command."""
|
or bdist_wheel command.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
spec (spack.spec.Spec): build spec
|
||||||
|
prefix (spack.util.prefix.Prefix): installation prefix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: list of options
|
||||||
|
"""
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
@@ -169,6 +200,14 @@ def install(self, spec, prefix):
|
|||||||
|
|
||||||
args = PythonPackage._std_args(self) + ["--prefix=" + prefix]
|
args = PythonPackage._std_args(self) + ["--prefix=" + prefix]
|
||||||
|
|
||||||
|
for key, value in self.config_settings(spec, prefix).items():
|
||||||
|
if spec["py-pip"].version < Version("22.1"):
|
||||||
|
raise SpecError(
|
||||||
|
"'{}' package uses 'config_settings' which is only supported by "
|
||||||
|
"pip 22.1+. Add the following line to the package to fix this:\n\n"
|
||||||
|
' depends_on("py-pip@22.1:", type="build")'.format(spec.name)
|
||||||
|
)
|
||||||
|
args.append("--config-settings={}={}".format(key, value))
|
||||||
for option in self.install_options(spec, prefix):
|
for option in self.install_options(spec, prefix):
|
||||||
args.append("--install-option=" + option)
|
args.append("--install-option=" + option)
|
||||||
for option in self.global_options(spec, prefix):
|
for option in self.global_options(spec, prefix):
|
||||||
|
|||||||
Reference in New Issue
Block a user