diff --git a/cmake/multipython/wheelname.py b/cmake/multipython/wheelname.py new file mode 100644 index 0000000000000000000000000000000000000000..20ff3d21df972e39dcaccbcf4a2a0af83c8600cb --- /dev/null +++ b/cmake/multipython/wheelname.py @@ -0,0 +1,81 @@ +""" +Determine the wheel name via setuptools + +Usage: +$ python3 wheelname.py <package-name> <version-string> +""" + +from setuptools import Extension, Distribution +import platform + +HEADER = "wheelname.py" + +def wheel_tags(**kwargs): + """ set up a dummy distribution from arguments + and return a resulting wheel name + """ + + dst = Distribution(attrs=kwargs) + # finalize bdist_wheel command + bdist_wheel_cmd = dst.get_command_obj('bdist_wheel') + bdist_wheel_cmd.ensure_finalized() + + distname = bdist_wheel_cmd.wheel_dist_name # eg. 'testdist-1.2.3' + tags = bdist_wheel_cmd.get_tag() # eg. (cp311, cp311, linux_x86_64) + + return (distname, *tags) + + +def wheel_tag_mac_x64(distname, py_tag, abi_tag, platform_tag): + """ Ad-hoc fix for the platform tag for conda under MacOS-x64. + + Python binaries under conda platform are compiled with an old MacOS (10.9) + in order to be compatible with later MacOS versions. + Therefore, under MacOS, conda's `pip` considers binaries compiled and linked + with higher MacOS versions as _invalid_. + A quick and dirty fix is changing the platform tag to 'macosx_10_9_x86_64'. + + NOTE: Use `python3 -m pip debug -vvv` to obtain valid wheel names + under a Python platform. + """ + + if platform.system().lower() == 'darwin' and platform.machine() == 'x86_64': + # platform tag compatible with MacOS-x64 conda Python platform + platform_tag = "macosx_10_9_x86_64" + + return (distname, py_tag, abi_tag, platform_tag) + + +def wheel_name(*tags): + # eg. 'testdist-1.2.3-cp311-cp311-linux_x86_64' + return '-'.join(*tags) + + +def get_wheel_names(pkg_name:str, version_str:str): + # get the name of the pure-Python wheel + pure_tags = wheel_tags(name=pkg_name, version=version_str) + pure_whl = wheel_name(pure_tags) + + # get tags for the platform-dependent wheel + plt_tags = wheel_tags(name=pkg_name, version=version_str, + ext_modules=[Extension("dummylib", ["dummy.c"])]) + # fix platform tag to be compatible with conda under MacOS-x64 + platform_tags = wheel_tag_mac_x64(*plt_tags) + platform_whl = wheel_name(platform_tags) + + # NOTE: CMake list separator is semicolon + return ';'.join((pure_whl, platform_whl)) + +#---------------------------------------- + +if __name__ == "__main__": + import sys + + args = sys.argv + if len(args) <= 2: + print("Usage: python3 wheelname.py <package-name> <version-string>") + raise ValueError(HEADER + ": package name and version string must be non-empty.") + + pkg_name = args[1].strip() + version_str = args[2].strip() + print(get_wheel_names(pkg_name, version_str))