ENH Add support in micropip for installing binary wheels. This PR is on top of #2589.

We use `packaging.tags.sys_tags` to get the list of supported tags
then use `packaging.utils.parse_wheel_filename` to get the set of
tags the current wheel implement then check if one of the wheel's
tags is a supported tag. This is a fully accurate check method and
could also catch things like abi3 wheels that are compatible with
multiple Python versions.

This allows micropip to be used to install binary emscripten wheels.
In order to manage the ABI issues, I also changed the wheel platform
tag to `emscripten_2_0_27_wasm32` so we can tell which version of
emscripten the wheel was built with.

The normal way that the platform tag is generated is by substituting
in the `uname` OS name and version info. Emscripten has dummy
information in `uname` instead of any actual version, so I patched
`uname` to report the Emscripten version. See upstream issue:
https://github.com/emscripten-core/emscripten/issues/16977

### Checklists

- [x] Add a [CHANGELOG](https://github.com/pyodide/pyodide/blob/main/docs/project/changelog.md) entry
- [x] Add / update tests

From 809cac60435af4dbc392e59c8ad79763bd3616d5 Mon Sep 17 00:00:00 2001
From: Hood Chatham <roberthoodchatham@gmail.com>
Date: Mon, 2 May 2022 17:31:07 -0700
Subject: [PATCH] Add one more trampoline in cfunction_vectorcall_O

Christian already added this upstream in 3.11a7 so we can remove
this when we update to 3.11
---
 Objects/methodobject.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 978d62cd67..26919a15e9 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -519,7 +519,7 @@ cfunction_vectorcall_O(
     if (meth == NULL) {
         return NULL;
     }
-    PyObject *result = meth(PyCFunction_GET_SELF(func), args[0]);
+    PyObject *result = method_call_trampoline(meth, PyCFunction_GET_SELF(func), args[0], NULL);
     _Py_LeaveRecursiveCall(tstate);
     return result;
 }
-- 
2.25.1


From 809cac60435af4dbc392e59c8ad79763bd3616d5 Mon Sep 17 00:00:00 2001
From: Hood Chatham <roberthoodchatham@gmail.com>
Date: Mon, 2 May 2022 17:31:07 -0700
Subject: [PATCH] Add one more trampoline in cfunction_vectorcall_O

Christian already added this upstream in 3.11a7 so we can remove
this when we update to 3.11
---
 Objects/methodobject.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 978d62cd67..26919a15e9 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -519,7 +519,7 @@ cfunction_vectorcall_O(
     if (meth == NULL) {
         return NULL;
     }
-    PyObject *result = meth(PyCFunction_GET_SELF(func), args[0]);
+    PyObject *result = method_call_trampoline(meth, PyCFunction_GET_SELF(func), args[0], NULL);
     _Py_LeaveRecursiveCall(tstate);
     return result;
 }
-- 
2.25.1

