Skip to content

Commit

Permalink
fix: avoid providing prepare-metadata methods if rebuild is True (#904)
Browse files Browse the repository at this point in the history
Reported in rapidfuzz/RapidFuzz#397.

This avoids declaring the optional hooks if there's a good chance it
can't be computed reliably. Having an override with `failed` can't be
computed without trying to build.

---------

Signed-off-by: Henry Schreiner <[email protected]>
  • Loading branch information
henryiii authored Sep 20, 2024
1 parent e903ec9 commit 01a79df
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 18 deletions.
4 changes: 4 additions & 0 deletions docs/overrides.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,10 @@ wheel.cmake = false

:::

If this override is present in your pyproject.toml file, scikit-build-core will not
provide the `prepare_metadata_*` hooks, as it can't know without building if the build
will fail.

## Any matching condition

If you use `if.any` instead of `if`, then the override is true if any one of the
Expand Down
60 changes: 42 additions & 18 deletions src/scikit_build_core/build/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import sys

from .._compat import tomllib

__all__ = [
"build_editable",
"build_sdist",
Expand Down Expand Up @@ -66,29 +68,51 @@ def build_editable(
raise SystemExit(1) from None


def prepare_metadata_for_build_wheel(
metadata_directory: str,
config_settings: dict[str, list[str] | str] | None = None,
) -> str:
"""Prepare metadata for building a wheel. Does not build the wheel. Returns the dist-info directory."""
from .wheel import _build_wheel_impl
def _has_safe_metadata() -> bool:
try:
with open("pyproject.toml", "rb") as f: # noqa: PTH123
pyproject = tomllib.load(f)
except FileNotFoundError:
return True

return _build_wheel_impl(
None, config_settings, metadata_directory, editable=False
).wheel_filename # actually returns the dist-info directory
overrides = pyproject.get("tool", {}).get("scikit-build", {}).get("overrides", [])
for override in overrides:
if_override = override.get("if", {})
if "failed" in if_override or "failed" in if_override.get("any", {}):
return False

return True

def prepare_metadata_for_build_editable(
metadata_directory: str,
config_settings: dict[str, list[str] | str] | None = None,
) -> str:
"""Prepare metadata for building a wheel. Does not build the wheel. Returns the dist-info directory."""

from .wheel import _build_wheel_impl
if _has_safe_metadata():

return _build_wheel_impl(
None, config_settings, metadata_directory, editable=True
).wheel_filename # actually returns the dist-info directory
def prepare_metadata_for_build_wheel(
metadata_directory: str,
config_settings: dict[str, list[str] | str] | None = None,
) -> str:
"""Prepare metadata for building a wheel. Does not build the wheel. Returns the dist-info directory."""
from .wheel import _build_wheel_impl

return _build_wheel_impl(
None, config_settings, metadata_directory, editable=False
).wheel_filename # actually returns the dist-info directory

def prepare_metadata_for_build_editable(
metadata_directory: str,
config_settings: dict[str, list[str] | str] | None = None,
) -> str:
"""Prepare metadata for building a wheel. Does not build the wheel. Returns the dist-info directory."""

from .wheel import _build_wheel_impl

return _build_wheel_impl(
None, config_settings, metadata_directory, editable=True
).wheel_filename # actually returns the dist-info directory

__all__ += [
"prepare_metadata_for_build_wheel",
"prepare_metadata_for_build_editable",
]


def build_sdist(
Expand Down

0 comments on commit 01a79df

Please sign in to comment.