For reasons that are a bit beyond me, `--host` and `PLATFORM_TRIPLET`
seem to be independent, in particular we've had an empty
`PLATFORM_TRIPLET`. This is unfortunate because `PLATFORM_TRIPLET`
is used to generate the SOABI config variable which in turn is used
to decide whether a .so file is a good match for loading. We'd like
for linux Pythons not to try to import emscripten .so files (it
raises `ImportError: some_file.so: invalid ELF header`). Similarly,
we'd like to avoid attempting to load linux .so files in wasm. These
platform tags are our friends.

Anyways, this PR sets `PLATFORM_TRIPLET` and ensures that .so files
built by pywasmcross are tagged with our SOABI tag.

I moved the .so file renaming from pywasmcross to buildpkg just
before running the post script. That is a better place to put it in
case the package wants to look at the .so file after linking it. It
might be surprised that we moved it.

I also improved the error message if we try to `loadWebAssemblyModule`
something that is actually say a Linux .so file and updated get_dynlibs
to filter out .so files that have an incompatible abi tag.
Set PLATFORM_TRIPLET, include platform in so names, only load compatible so files. For reasons that are a bit beyond me, `--host` and `PLATFORM_TRIPLET`
seem to be independent, in particular we've had an empty
`PLATFORM_TRIPLET`. This is unfortunate because `PLATFORM_TRIPLET`
is used to generate the SOABI config variable which in turn is used
to decide whether a .so file is a good match for loading. We'd like
for linux Pythons not to try to import emscripten .so files (it
raises `ImportError: some_file.so: invalid ELF header`). Similarly,
we'd like to avoid attempting to load linux .so files in wasm. These
platform tags are our friends.

Anyways, this PR sets `PLATFORM_TRIPLET` and ensures that .so files
built by pywasmcross are tagged with our SOABI tag.

I moved the .so file renaming from pywasmcross to buildpkg just
before running the post script. That is a better place to put it in
case the package wants to look at the .so file after linking it. It
might be surprised that we moved it.

I also improved the error message if we try to `loadWebAssemblyModule`
something that is actually say a Linux .so file and updated get_dynlibs
to filter out .so files that have an incompatible abi tag.
from pyodide_build import testing

run_in_pyodide = testing.run_in_pyodide(
    module_scope=True,
    packages=["scipy"],
    # xfail_browsers={"chrome": "Times out in chrome"},
    driver_timeout=40,
)


@run_in_pyodide
def test_scipy_linalg():
    import numpy as np
    import scipy.linalg
    from numpy.testing import assert_allclose

    N = 10
    X = np.random.RandomState(42).rand(N, N)

    X_inv = scipy.linalg.inv(X)

    res = X.dot(X_inv)

    assert_allclose(res, np.identity(N), rtol=1e-07, atol=1e-9)


@run_in_pyodide
def test_brentq():
    from scipy.optimize import brentq

    brentq(lambda x: x, -1, 1)


@run_in_pyodide
def test_dlamch():
    from scipy.linalg import lapack

    lapack.dlamch("Epsilon-Machine")


@run_in_pyodide
def test_binom_ppf():
    from scipy.stats import binom

    assert binom.ppf(0.9, 1000, 0.1) == 112


@testing.run_in_pyodide(module_scope=True, packages=["pytest", "scipy-tests"])
def test_scipy_pytest():
    import pytest

    def runtest(module, filter):
        pytest.main(
            [
                "--pyargs",
                f"scipy.{module}",
                "--continue-on-collection-errors",
                "-vv",
                "-k",
                filter,
            ]
        )

    runtest("odr", "explicit")
    runtest("signal.tests.test_ltisys", "TestImpulse2")
    runtest("stats.tests.test_multivariate", "haar")

from pyodide_build import testing

run_in_pyodide = testing.run_in_pyodide(
    module_scope=True,
    packages=["scipy"],
    # xfail_browsers={"chrome": "Times out in chrome"},
    driver_timeout=40,
)


@run_in_pyodide
def test_scipy_linalg():
    import numpy as np
    import scipy.linalg
    from numpy.testing import assert_allclose

    N = 10
    X = np.random.RandomState(42).rand(N, N)

    X_inv = scipy.linalg.inv(X)

    res = X.dot(X_inv)

    assert_allclose(res, np.identity(N), rtol=1e-07, atol=1e-9)


@run_in_pyodide
def test_brentq():
    from scipy.optimize import brentq

    brentq(lambda x: x, -1, 1)


@run_in_pyodide
def test_dlamch():
    from scipy.linalg import lapack

    lapack.dlamch("Epsilon-Machine")


@run_in_pyodide
def test_binom_ppf():
    from scipy.stats import binom

    assert binom.ppf(0.9, 1000, 0.1) == 112


@testing.run_in_pyodide(module_scope=True, packages=["pytest", "scipy-tests"])
def test_scipy_pytest():
    import pytest

    def runtest(module, filter):
        pytest.main(
            [
                "--pyargs",
                f"scipy.{module}",
                "--continue-on-collection-errors",
                "-vv",
                "-k",
                filter,
            ]
        )

    runtest("odr", "explicit")
    runtest("signal.tests.test_ltisys", "TestImpulse2")
    runtest("stats.tests.test_multivariate", "haar")
