Our package build process currently has a significant flaw: we first run `setup.py`, recording all compilation commands, then we rewrite these compilation commands to invoke `emcc` and replay them, and then we pray that the cross compiled executables ended up in the right place to go into the wheel. This is not a good strategy because the build script is allowed to implement arbitrary logic, and if it moves, renames, etc any of the output files then we lose track of them. This has repeatedly caused difficulty for us.

However, we also make no particularly significant use of the two pass approach. We can just do the simpler thing: capture the compiler commands as they occur, modify them as needed, and then run the fixed command.

I also added a patch to fix the numpy feature detection for wasm so that we don't have to include `_npyconfig.h` and `config.h`, numpy can generate them in the way it would for a native build. I opened a numpy PR that would fix the detection for us upstream:
https://github.com/numpy/numpy/pull/21154

This clears the way for us to switch to using pypa/build (as @henryiii has suggested) by removing our dependence on specific setuptools behavior.

This is on top of #2238.
No replay. Our package build process currently has a significant flaw: we first run `setup.py`, recording all compilation commands, then we rewrite these compilation commands to invoke `emcc` and replay them, and then we pray that the cross compiled executables ended up in the right place to go into the wheel. This is not a good strategy because the build script is allowed to implement arbitrary logic, and if it moves, renames, etc any of the output files then we lose track of them. This has repeatedly caused difficulty for us.

However, we also make no particularly significant use of the two pass approach. We can just do the simpler thing: capture the compiler commands as they occur, modify them as needed, and then run the fixed command.

I also added a patch to fix the numpy feature detection for wasm so that we don't have to include `_npyconfig.h` and `config.h`, numpy can generate them in the way it would for a native build. I opened a numpy PR that would fix the detection for us upstream:
https://github.com/numpy/numpy/pull/21154

This clears the way for us to switch to using pypa/build (as @henryiii has suggested) by removing our dependence on specific setuptools behavior.

This is on top of #2238.
exclude: (^.*patches|.*\.cgi$|^packages/micropip/src/micropip/externals|^benchmark/benchmarks$)
default_language_version:
  python: "3.9"
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: "v4.1.0"
    hooks:
      - id: check-added-large-files
      - id: check-case-conflict
      - id: check-merge-conflict
      - id: check-symlinks
      - id: check-yaml
        exclude: .clang-format
      - id: debug-statements
      - id: end-of-file-fixer
      - id: mixed-line-ending
      - id: trailing-whitespace

  - repo: https://github.com/PyCQA/isort
    rev: "5.10.1"
    hooks:
      - id: isort

  - repo: https://github.com/asottile/pyupgrade
    rev: "v2.31.0"
    hooks:
      - id: pyupgrade
        args: ["--py39-plus"]

  - repo: https://github.com/hadialqattan/pycln
    rev: "v1.2.0"
    hooks:
      - id: pycln
        args: [--config=pyproject.toml]
        stages: [manual]

  - repo: https://github.com/psf/black
    rev: "22.1.0"
    hooks:
      - id: black

  - repo: https://gitlab.com/pycqa/flake8
    rev: "4.0.1"
    hooks:
      - id: flake8
        additional_dependencies: [flake8-bugbear]

  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: "v0.931"
    hooks:
      - id: mypy
        args:
          - --show-error-codes
          - --ignore-missing-imports
        files: ^(src/|packages/.*/test|conftest.py|docs/)
        additional_dependencies: &mypy-deps
          - packaging
          - types-docutils
          - types-pyyaml
          - types-setuptools
      - id: mypy
        name: mypy-micropip
        files: ^packages/micropip/src/
        args: &mypy-args
          - --show-error-codes
        additional_dependencies: *mypy-deps
      - id: mypy
        name: mypy-pyodide-build
        files: ^pyodide-build/pyodide_build/
        args: *mypy-args
        additional_dependencies: *mypy-deps

  - repo: https://github.com/pre-commit/mirrors-clang-format
    rev: "v13.0.1"
    hooks:
      - id: clang-format
        types_or: [c++, c, cuda]

  - repo: https://github.com/pre-commit/mirrors-prettier
    rev: "v2.5.1"
    hooks:
      - id: prettier

  - repo: https://github.com/pre-commit/pygrep-hooks
    rev: "v1.9.0"
    hooks:
      - id: python-check-blanket-noqa
      - id: python-check-blanket-type-ignore
      - id: python-no-log-warn
      - id: python-no-eval
        exclude: ^(src/py/_pyodide/_base\.py|src/tests/test_typeconversions\.py)$
      - id: python-use-type-annotations
        exclude: docs/sphinx_pyodide/tests/test_directives\.py
      - id: rst-backticks
      - id: rst-directive-colons
      - id: rst-inline-touching-normal

  - repo: https://github.com/shellcheck-py/shellcheck-py
    rev: "v0.8.0.4"
    hooks:
      - id: shellcheck

  - repo: https://github.com/codespell-project/codespell
    rev: "v2.1.0"
    hooks:
      - id: codespell
        args: ["-L", "te,slowy,aray,ba,nd,classs"]
        exclude: ^benchmark/benchmarks/pystone_benchmarks/pystone\.py$

exclude: (^.*patches|.*\.cgi$|^packages/micropip/src/micropip/externals|^benchmark/benchmarks$)
default_language_version:
  python: "3.9"
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: "v4.1.0"
    hooks:
      - id: check-added-large-files
      - id: check-case-conflict
      - id: check-merge-conflict
      - id: check-symlinks
      - id: check-yaml
        exclude: .clang-format
      - id: debug-statements
      - id: end-of-file-fixer
      - id: mixed-line-ending
      - id: trailing-whitespace

  - repo: https://github.com/PyCQA/isort
    rev: "5.10.1"
    hooks:
      - id: isort

  - repo: https://github.com/asottile/pyupgrade
    rev: "v2.31.0"
    hooks:
      - id: pyupgrade
        args: ["--py39-plus"]

  - repo: https://github.com/hadialqattan/pycln
    rev: "v1.2.0"
    hooks:
      - id: pycln
        args: [--config=pyproject.toml]
        stages: [manual]

  - repo: https://github.com/psf/black
    rev: "22.1.0"
    hooks:
      - id: black

  - repo: https://gitlab.com/pycqa/flake8
    rev: "4.0.1"
    hooks:
      - id: flake8
        additional_dependencies: [flake8-bugbear]

  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: "v0.931"
    hooks:
      - id: mypy
        args:
          - --show-error-codes
          - --ignore-missing-imports
        files: ^(src/|packages/.*/test|conftest.py|docs/)
        additional_dependencies: &mypy-deps
          - packaging
          - types-docutils
          - types-pyyaml
          - types-setuptools
      - id: mypy
        name: mypy-micropip
        files: ^packages/micropip/src/
        args: &mypy-args
          - --show-error-codes
        additional_dependencies: *mypy-deps
      - id: mypy
        name: mypy-pyodide-build
        files: ^pyodide-build/pyodide_build/
        args: *mypy-args
        additional_dependencies: *mypy-deps

  - repo: https://github.com/pre-commit/mirrors-clang-format
    rev: "v13.0.1"
    hooks:
      - id: clang-format
        types_or: [c++, c, cuda]

  - repo: https://github.com/pre-commit/mirrors-prettier
    rev: "v2.5.1"
    hooks:
      - id: prettier

  - repo: https://github.com/pre-commit/pygrep-hooks
    rev: "v1.9.0"
    hooks:
      - id: python-check-blanket-noqa
      - id: python-check-blanket-type-ignore
      - id: python-no-log-warn
      - id: python-no-eval
        exclude: ^(src/py/_pyodide/_base\.py|src/tests/test_typeconversions\.py)$
      - id: python-use-type-annotations
        exclude: docs/sphinx_pyodide/tests/test_directives\.py
      - id: rst-backticks
      - id: rst-directive-colons
      - id: rst-inline-touching-normal

  - repo: https://github.com/shellcheck-py/shellcheck-py
    rev: "v0.8.0.4"
    hooks:
      - id: shellcheck

  - repo: https://github.com/codespell-project/codespell
    rev: "v2.1.0"
    hooks:
      - id: codespell
        args: ["-L", "te,slowy,aray,ba,nd,classs"]
        exclude: ^benchmark/benchmarks/pystone_benchmarks/pystone\.py$
