PythonPackage: nested config_settings (#40693)

* PythonPackage: nested config_settings

* flake8
This commit is contained in:
Adam J. Stewart 2023-10-26 08:18:02 -05:00 committed by GitHub
parent 1c8073c21f
commit f57c2501a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,14 +24,30 @@
import spack.spec import spack.spec
import spack.store import spack.store
from spack.directives import build_system, depends_on, extends, maintainers from spack.directives import build_system, depends_on, extends, maintainers
from spack.error import NoHeadersError, NoLibrariesError, SpecError from spack.error import NoHeadersError, NoLibrariesError
from spack.install_test import test_part from spack.install_test import test_part
from spack.util.executable import Executable from spack.util.executable import Executable
from spack.version import Version
from ._checks import BaseBuilder, execute_install_time_tests from ._checks import BaseBuilder, execute_install_time_tests
def _flatten_dict(dictionary):
"""Iterable that yields KEY=VALUE paths through a dictionary.
Args:
dictionary: Possibly nested dictionary of arbitrary keys and values.
Yields:
A single path through the dictionary.
"""
for key, item in dictionary.items():
if isinstance(item, dict):
# Recursive case
for value in _flatten_dict(item):
yield f"{key}={value}"
else:
# Base case
yield f"{key}={item}"
class PythonExtension(spack.package_base.PackageBase): class PythonExtension(spack.package_base.PackageBase):
maintainers("adamjstewart") maintainers("adamjstewart")
@ -454,14 +470,15 @@ def build_directory(self):
def config_settings(self, spec, prefix): def config_settings(self, spec, prefix):
"""Configuration settings to be passed to the PEP 517 build backend. """Configuration settings to be passed to the PEP 517 build backend.
Requires pip 22.1 or newer. Requires pip 22.1 or newer for keys that appear only a single time,
or pip 23.1 or newer if the same key appears multiple times.
Args: Args:
spec (spack.spec.Spec): build spec spec (spack.spec.Spec): build spec
prefix (spack.util.prefix.Prefix): installation prefix prefix (spack.util.prefix.Prefix): installation prefix
Returns: Returns:
dict: dictionary of KEY, VALUE settings dict: Possibly nested dictionary of KEY, VALUE settings
""" """
return {} return {}
@ -525,22 +542,14 @@ def install(self, pkg, spec, prefix):
pip.add_default_arg("-m") pip.add_default_arg("-m")
pip.add_default_arg("pip") pip.add_default_arg("pip")
args = PythonPipBuilder.std_args(pkg) + ["--prefix=" + prefix] args = PythonPipBuilder.std_args(pkg) + [f"--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 setting in _flatten_dict(self.config_settings(spec, prefix)):
args.append(f"--config-settings={setting}")
for option in self.install_options(spec, prefix): for option in self.install_options(spec, prefix):
args.append("--install-option=" + option) args.append(f"--install-option={option}")
for option in self.global_options(spec, prefix): for option in self.global_options(spec, prefix):
args.append("--global-option=" + option) args.append(f"--global-option={option}")
if pkg.stage.archive_file and pkg.stage.archive_file.endswith(".whl"): if pkg.stage.archive_file and pkg.stage.archive_file.endswith(".whl"):
args.append(pkg.stage.archive_file) args.append(pkg.stage.archive_file)