MLBEDSW-4585: Resolve NumPy setup requirement

This commit fixes a potential end user problem where
the user needs NumPy installed in order to run setup.py.
This creates a situation where if the user needs to
manually install NumPy in order to install Vela.
This solution moves the NumPy dependent code into the
setup process and allows it to be installed as a
dependency first.

Signed-off-by: Dwight Lidman <dwight.lidman@arm.com>
Change-Id: I5d7d3d30c3755e8f7c369df8d34738f5c53877dd
diff --git a/setup.py b/setup.py
index 6900a67..d43ef16 100644
--- a/setup.py
+++ b/setup.py
@@ -18,10 +18,24 @@
 import os
 import re
 
-import numpy as np
 from setuptools import Extension
 from setuptools import find_namespace_packages
 from setuptools import setup
+from setuptools.command.build_ext import build_ext
+
+
+class BuildExtension(build_ext):
+    def finalize_options(self):
+        build_ext.finalize_options(self)
+        import builtins
+
+        # tell numpy it's not in setup anymore
+        builtins.__NUMPY_SETUP__ = False
+        import numpy as np
+
+        # add the numpy headers to the mlw_codec extension
+        self.include_dirs.append(np.get_include())
+
 
 # Read the contents of README.md file
 this_directory = os.path.abspath(os.path.dirname(__file__))
@@ -43,7 +57,6 @@
 mlw_module = Extension(
     "ethosu.mlw_codec",
     ["ethosu/mlw_codec/mlw_encode.c", "ethosu/mlw_codec/mlw_decode.c", "ethosu/mlw_codec/mlw_codecmodule.c"],
-    include_dirs=[np.get_include()],
     define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_9_API_VERSION")],
 )
 
@@ -81,5 +94,6 @@
     ],
     entry_points={"console_scripts": ["vela = ethosu.vela.vela:main"]},
     ext_modules=[mlw_module],
-    setup_requires=["setuptools_scm"],
+    cmdclass={"build_ext": BuildExtension},
+    setup_requires=["numpy>=1.16.6", "setuptools_scm"],
 )