Update 2 Sept 2023:
-C=--build-option=--plat {your-platform-tag}
no longer works, so I added my preferred replacement to the end of the list.
==========
OK, after some research and reading of code, I can present a bit of information and a few solutions that might meet other people's needs, summarized here:
Firstly, pyproject.toml
is not mutually exclusive from setup.py
. setuptools
will complain about deprecation if you create a distribution package via python3 setup.py ...
and no pyproject.toml
file is present.
However, setup.py
is still around and available, but it's a mistake to duplicate project configuration values (name
, version
, etc). So, put as much as your package will allow inside your pyproject.toml
file, and use setup.py
for things like overriding the Distribution
class, or overriding the bdist_wheel
module, etc.
As far as creating platform wheels, there are a few approaches that work, with pros and cons:
- Override the
bdist_wheel
command class in setup.py
as described here and set self.root_is_pure
to False in the finalize_options
override. This forces the python tag (e.g. cp39
) to be set, along with the platform tag.
- Override the
Distribution
class in setup.py
as described here and override has_ext_modules()
to simply return True. This also forces the python and platform tags to be set.
- Add an unused minimal extension module to your packaging definition, as described here and here. This lengthens the build process and adds a useless "dummy" shared library to be dragged along wherever your wheel goes.
- This solution appears to not work anymore! Add the argument
-C=--build-option=--plat {your-platform-tag}
to the build invocation (for my case that's python -m build -w -n
, for example). This leaves the Python tag untouched but you have to supply your own tag; there's no way to say "use whatever the native platform is". You can discover the exact platform tag with the command wheel.bdist_wheel.get_platform(pathlib.Path('.'))
after importing the pathlib
and wheel.bdist_wheel
packages, but that can be cumbersome because wheel
isn't a standard library package.
- Simply rename your wheel from
mypkg-py3-none-any.whl
to mypkg-py3-none-macosx_13_0_x86_64.whl
- it appears that the platform tag is only encoded into the filename, and not any of the package metadata that's generated during the distribution-package process.
- Use the
wheel
package utility to update the tags, to turn the pure wheel into a platform wheel. python -m wheel tags --platform-tag macosx_13_0_x86_64 mypkg-py3-none-any.whl
will emit a new platform wheel with the tags you want.
In the end I chose the final options because it required the least amount of work- no setup.py
files need to be introduced solely to accomplish this, and the build logs make it clear that a platform wheel (not a pure wheel) is being created.