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.
package:
  name: numpy
  version: 1.21.4

source:
  url: https://files.pythonhosted.org/packages/fb/48/b0708ebd7718a8933f0d3937513ef8ef2f4f04529f1f66ca86d873043921/numpy-1.21.4.zip
  sha256: e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0

  patches:
    - patches/disable-maybe-uninitialized.patch
    - patches/dont-include-execinfo.patch
    - patches/fix-longdouble.patch
    - patches/fix-static-init-of-nditer-pywrap.patch
    - patches/init-alloc-cache.patch
    - patches/use-local-blas-lapack.patch
    - patches/make-int-return-values.patch
    - patches/fix-ieee754.patch
    - patches/disable-optimization.patch
    - patches/not-build-lapack-lite-as-64-bit.patch
    - patches/fix-invalid-asm-instruction.patch
    - patches/fix-comparator-function-signatures.patch
    - patches/fix-random_float_fill-return-type.patch

build:
  skip_host: False
  # set linker and C flags to error on anything to do with function declarations being wrong.
  # In webassembly, any conflicts mean that a randomly selected 50% of calls to the function
  # will fail. Better to fail at compile or link time.
  cflags: |
    -include math.h
    -I config
    -Werror=implicit-function-declaration
    -Werror=mismatched-parameter-types
    -Werror=mismatched-return-types
  ldflags: |
    -Wl,--fatal-warnings
  prereplay: |
    export SRC_DIR=$(pwd)
    cd ../.. # Need to move out of source directory to import numpy
    cp -r config $SRC_DIR
    python$PYMAJOR.$PYMINOR -c '\
        from numpy.core.setup_common import C_API_VERSION as API, C_ABI_VERSION as ABI;\
        print(f"#define NPY_API_VERSION 0x{API:08x}\n#define NPY_ABI_VERSION 0x{ABI:08x}")' \
    >> $SRC_DIR/config/_numpyconfig.h
  post: |
    # copy the correct numpy config into the build artifacts. Otherwise scipy will try to build with the config
    # from the build computer and bad things will happen
    export NUMPY_INSTALL_PATH=$HOSTINSTALLDIR/lib/python$PYMAJOR.$PYMINOR/site-packages/numpy/
    cp $SRC_DIR/config/* $NUMPY_INSTALL_PATH
    mkdir -p $NUMPY_LIB
    find $SRC_DIR -name '*.a' | sed "s:.*:cp \0 $NUMPY_LIB:g" | bash
test:
  imports:
    - numpy

package:
  name: numpy
  version: 1.21.4

source:
  url: https://files.pythonhosted.org/packages/fb/48/b0708ebd7718a8933f0d3937513ef8ef2f4f04529f1f66ca86d873043921/numpy-1.21.4.zip
  sha256: e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0

  patches:
    - patches/disable-maybe-uninitialized.patch
    - patches/dont-include-execinfo.patch
    - patches/fix-longdouble.patch
    - patches/fix-static-init-of-nditer-pywrap.patch
    - patches/init-alloc-cache.patch
    - patches/use-local-blas-lapack.patch
    - patches/make-int-return-values.patch
    - patches/fix-ieee754.patch
    - patches/disable-optimization.patch
    - patches/not-build-lapack-lite-as-64-bit.patch
    - patches/fix-invalid-asm-instruction.patch
    - patches/fix-comparator-function-signatures.patch
    - patches/fix-random_float_fill-return-type.patch
    - patches/fix-math-feature-detection-for-wasm.patch

build:
  cflags: |
    -Wno-return-type
  post: |
    python -m pip install --prefix $HOSTINSTALLDIR numpy==$PKG_VERSION
    # copy the correct numpy config into the build artifacts. Otherwise scipy will try to build with the config
    # from the build computer and bad things will happen
    export NUMPY_LIB_PATH=$HOSTINSTALLDIR/lib/python$PYMAJOR.$PYMINOR/site-packages/numpy/core/include/numpy/
    cp build/numpy-$PKG_VERSION/build/src.emscripten_wasm32-$PYMAJOR.$PYMINOR/numpy/core/include/numpy/*config.h $NUMPY_LIB_PATH
    # static libraries for other packages to link
    mkdir -p $NUMPY_LIB
    find $SRC_DIR -name '*.a' | sed "s:.*:cp \0 $NUMPY_LIB:g" | bash
test:
  imports:
    - numpy
