Add the git version to the banner
diff --git a/py/py-version.sh b/py/py-version.sh
new file mode 100755
index 0000000..f574b57
--- /dev/null
+++ b/py/py-version.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+git_hash="$(git rev-parse --short HEAD 2> /dev/null || echo unknown)"
+git_files_are_clean=1
+# Check if there are any modified files.
+git diff --no-ext-diff --quiet --exit-code 2> /dev/null || git_files_are_clean=0
+# Check if there are any staged files.
+git diff-index --cached --quiet HEAD -- 2> /dev/null || git_files_are_clean=0
+if [ "${git_files_are_clean}" != "1" ]; then
+    git_hash="${git_hash}-dirty"
+fi
+cat <<EOF
+// This file was generated by py/py-version.sh
+#define MICROPY_GIT_HASH "${git_hash}"
+#define MICROPY_BUILD_DATE "$(date '+%Y-%m-%d')"
+EOF
diff --git a/py/py.mk b/py/py.mk
index 0590292..6a331fe 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -90,6 +90,14 @@
 # prepend the build destination prefix to the py object files
 PY_O = $(addprefix $(PY_BUILD)/, $(PY_O_BASENAME))
 
+# Anything that depends on FORCE will be considered out-of-date
+FORCE:
+.PHONY: FORCE
+
+$(PY_BUILD)/py-version.h: FORCE
+	$(Q)$(PY_SRC)/py-version.sh > $@.tmp
+	$(Q)if [ -f "$@" ] && cmp -s $@ $@.tmp; then rm $@.tmp; else echo "Generating $@"; mv $@.tmp $@; fi
+
 # qstr data
 
 # Adding an order only dependency on $(PY_BUILD) causes $(PY_BUILD) to get
@@ -104,7 +112,7 @@
 # the right .o's to get recompiled if the generated.h file changes. Adding
 # an order-only dependendency to all of the .o's will cause the generated .h
 # to get built before we try to compile any of them.
-$(PY_O): | $(PY_BUILD)/qstrdefs.generated.h
+$(PY_O): | $(PY_BUILD)/qstrdefs.generated.h $(PY_BUILD)/py-version.h
 
 # emitters