Add support for `prepare_metadata_for_build_editable` hook (#3870)

## Summary

See:
https://peps.python.org/pep-0660/#prepare-metadata-for-build-editable
This commit is contained in:
Charlie Marsh 2024-05-27 19:21:45 -04:00 committed by GitHub
parent 22dbc79994
commit 89cfecea77
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 12 additions and 11 deletions

View File

@ -677,23 +677,23 @@ impl SourceBuild {
fs::create_dir(&metadata_directory)?; fs::create_dir(&metadata_directory)?;
// Write the hook output to a file so that we can read it back reliably. // Write the hook output to a file so that we can read it back reliably.
let outfile = self let outfile = self.temp_dir.path().join(format!(
.temp_dir "prepare_metadata_for_build_{}.txt",
.path() self.build_kind
.join("prepare_metadata_for_build_wheel.txt"); ));
debug!( debug!(
"Calling `{}.prepare_metadata_for_build_wheel()`", "Calling `{}.prepare_metadata_for_build_{}()`",
pep517_backend.backend pep517_backend.backend, self.build_kind,
); );
let script = formatdoc! { let script = formatdoc! {
r#" r#"
{} {}
import json import json
prepare_metadata_for_build_wheel = getattr(backend, "prepare_metadata_for_build_wheel", None) prepare_metadata_for_build = getattr(backend, "prepare_metadata_for_build_{}", None)
if prepare_metadata_for_build_wheel: if prepare_metadata_for_build:
dirname = prepare_metadata_for_build_wheel("{}", {}) dirname = prepare_metadata_for_build("{}", {})
else: else:
dirname = None dirname = None
@ -701,13 +701,14 @@ impl SourceBuild {
fp.write(dirname or "") fp.write(dirname or "")
"#, "#,
pep517_backend.backend_import(), pep517_backend.backend_import(),
self.build_kind,
escape_path_for_python(&metadata_directory), escape_path_for_python(&metadata_directory),
self.config_settings.escape_for_python(), self.config_settings.escape_for_python(),
outfile.escape_for_python(), outfile.escape_for_python(),
}; };
let span = info_span!( let span = info_span!(
"run_python_script", "run_python_script",
script="prepare_metadata_for_build_wheel", script=format!("prepare_metadata_for_build_{}", self.build_kind),
python_version = %self.venv.interpreter().python_version() python_version = %self.venv.interpreter().python_version()
); );
let output = self let output = self
@ -723,7 +724,7 @@ impl SourceBuild {
.await?; .await?;
if !output.status.success() { if !output.status.success() {
return Err(Error::from_command_output( return Err(Error::from_command_output(
"Build backend failed to determine metadata through `prepare_metadata_for_build_wheel`".to_string(), format!("Build backend failed to determine metadata through `prepare_metadata_for_build_{}`", self.build_kind),
&output, &output,
&self.version_id, &self.version_id,
)); ));