ENH: implement support for build-details.json (PEP 739) (continued) - #829
ENH: implement support for build-details.json (PEP 739) (continued)#829mgorny wants to merge 2 commits into
Conversation
|
I closed gh-779. Copying over the main comment from that PR discussion: Good point. Yes, there isn't any reason that So for now in this PR we can distinguish three cases, with the user passing:
I focused on (3) first and have a TODO in here already to add (1); I should add (2) as well. |
dnicolodi
left a comment
There was a problem hiding this comment.
I had a quick look at this. Found some possible improvements.
| return mesonpy._tags.Tag('py3', 'none', None) | ||
| return mesonpy._tags.Tag(None, self._stable_abi, None) | ||
| return mesonpy._tags.Tag('py3', 'none', None, self._build_details) | ||
| return mesonpy._tags.Tag(None, self._stable_abi, None, self._build_details) |
There was a problem hiding this comment.
I think a mesonpy._tags.Tag.from_build_details() API would work better. This would avoid to have to pass the build details object to a bunch of functions that do close to nothing when the Python interpreter description is available from build-details.json.
BTW: build-details.json is really a ugly name.
There was a problem hiding this comment.
I don't understand this point. The JSON file does not provide a "ready" wheel tag, and we still need all of the "postprocessing" these functions do.
There was a problem hiding this comment.
I have been looking at this a bit more, and I still don't like how we need to handle the case where build_details are available vs when we need to introspect the interpreter. One practical thing, is that it is not clear at a first glance that all the information used in deriving the tag really comes from build_details and not from the current platform. Mixing the two is obviously wrong.
Therefore, I propose to turn this around: have a mesonpy._tags.BuildDetails dictionary populated with introspection data when the required info does not come from a build-details.json file, pass that around, and remove all conditional handling.
There was a problem hiding this comment.
Working on that. Also, uh, I just discovered a direct mesonpy._tags.get_abi_tag() in build_editable() that didn't account for build-details.json. I suppose it's not really critical since it only determines the build directory, but still.
There was a problem hiding this comment.
I just discovered a direct
mesonpy._tags.get_abi_tag()inbuild_editable()that didn't account forbuild-details.json. I suppose it's not really critical since it only determines the build directory, but still.
cross-built editable wheels are not a thing: they wheel is installed in the same environment where the build is running without ever been exposed as a build artifact. Thus that does not need to be changed.
There was a problem hiding this comment.
Okay, done that. I've split the macosx/ios logic into two functions: one that performs tasks specific to getting current platform, and another that performs postprocessing using the data from BuildDetails (which may be the current platform or build-details.json). This also implies that passing BuildDetails to the functions is required.
I have left build_editable()'s build-dir use current system, given that implementing build-details.json support there would involve quite a bit of duplication, and it doesn't seem a major issue to solve anyway.
|
I'm going to rebase it now, and make changes later when I find more time. |
f22d77f to
7758d1c
Compare
|
Updated and rebased now. |
3e48d47 to
bba067e
Compare
|
I tied up some loose ends. I think this is ready to be merged now. @rgommers, do you want to take a look? It would be nice to have an integration test for this, but I don't know how hard it is to get a suitable environment setup on GitHub Actions. |
|
Actually, I think it was in Draft because we wanted to make an integration test, but we were blocked on |
|
Sounds great! Indeed, that integration test would be nice. IIRC conda-forge/python-feedstock#858 should have solved the one issue in conda-forge that was blocking for a cross-compile test. |
3fe11bd to
5ced90e
Compare
thesamesam
left a comment
There was a problem hiding this comment.
This looks reasonable to me but I don't touch the meson-python side of things often at all.
2b989fd to
aee6205
Compare
| # passing the with the `-Dpython.build_config=` option to `meson | ||
| # setup`. Extract the value passed to this option and use the details | ||
| # in the `build-details.json` file to compute the wheel tag. | ||
| self._build_details: mesonpy._tags.BuildDetails | None = None |
There was a problem hiding this comment.
This annotation is now wrong: self._build_details cannot be None. Also, now that we use this attribute to always store information on the interpreter we can consider to name it in a less confusing way (now, at a first look it could seem that this attribute contains information about the build of the Meson project). Maybe self._info is not too bad of a name.
There was a problem hiding this comment.
It is None temporarily. Unless you want me to undo the optimization and set the default value unconditionally, then override if python_build_config arg is provided.
There was a problem hiding this comment.
I don't mind renaming it, though info sounds a bit unclear. Maybe tag_info? Should I also rename the classes and the argument elsewhere?
| # Python built with older macOS SDK on macOS 11, reports an | ||
| # nonexistent macOS 10.16 version instead of the real version. | ||
| # | ||
| # The packaging module introduced a workaround | ||
| # https://github.com/pypa/packaging/commit/67c4a2820c549070bbfc4bfbf5e2a250075048da | ||
| # | ||
| # This results in packaging versions up to 21.3 generating | ||
| # platform tags like "macosx_10_16_x86_64" and later versions | ||
| # generating "macosx_11_0_x86_64". Using the latter would be more | ||
| # correct but prevents the resulting wheel from being installed on | ||
| # systems using packaging 21.3 or earlier (pip 22.3 or earlier). | ||
| # | ||
| # Fortunately packaging versions carrying the workaround still | ||
| # accepts "macosx_10_16_x86_64" as a compatible platform tag. We | ||
| # can therefore ignore the issue and generate the slightly | ||
| # incorrect tag. |
There was a problem hiding this comment.
What about the code this comments refers to?
There was a problem hiding this comment.
My understanding is that this comment is saying that we don't need any code to handle that case. It was followed by empty line, then another comment. I've figured out it's better to move it where we get the platform, since it applied to what the system gives us.
| pass | ||
|
|
||
| return f'ios_{version[0]}_{version[1]}_{multiarch}' | ||
| return f'{platform_os}_{version.replace('.', '_')}_{multiarch.replace('-', '_')}' |
There was a problem hiding this comment.
Also, why join the version with . to replace it with _ here? Overall, I liked how this was written before much more, among other things because it was symmetric to what is done for macos.
There was a problem hiding this comment.
I've written it under the assumption that we should have the same input whether it's taken from the platform or from build-details.json. Since the latter uses dots, I've used the same here. Ofc, it practically doesn't matter, so I can go with underscores, but the conversion will still be necessary for build-details.json.
|
When I'm done addressing feedback, I'm going to add more tests for the tag logic. |
Signed-off-by: Michał Górny <mgorny@quansight.com>
This a continuation of #779. For a start, I just did a dumb rebase to rerun the tests.