bdist_wheel + pep517 ではまる

setup.py bdist_wheel

なら成功するが、

pip wheel .

だと失敗するという現象に悩まされる。 cmake でビルドしている extension の pyd が含まれないのである。

原因は、 setup.py の下記の記述。

class build_ext_cmake(build_ext):
def run(self):
for ext in self.extensions:
self.build_cmake(ext)
def build_cmake(self, ext):
# these dirs will be created in build_py, so if you don't have
# any python sources to bundle, the dirs will be missing
build_temp = pathlib.Path(self.build_temp)
build_temp.mkdir(parents=True, exist_ok=True)
ext_path = pathlib.Path(self.get_ext_fullpath(ext.name)) # <- これ
ext_path.parent.mkdir(parents=True, exist_ok=True)

直した。

ext_path = pathlib.Path(self.get_ext_fullpath(ext.name)).absolute()

たぶん、 get_ext_fullpath が相対パスを返していて、変なところに pyd が出力されていた。 pip の時だけフォルダの構成や pwd が変わっている様子。

pip wheel . -v

として、ログと睨めっこしていたら気付いた。 pip が subprocess とか使うので、デバッガがアタッチできなくて、なかなかわからなかった。