diff --git a/cc3200/bootmgr/bootloader.mk b/cc3200/bootmgr/bootloader.mk
index da02a02d075633e830941de0abab83a471f48eff..ae242289220a5aaa947e170471a798fcdecab503 100644
--- a/cc3200/bootmgr/bootloader.mk
+++ b/cc3200/bootmgr/bootloader.mk
@@ -128,6 +128,6 @@ $(BUILD)/bootloader.bin: $(BUILD)/bootmgr.bin
 $(HEADER_BUILD)/qstrdefs.generated.h: | $(HEADER_BUILD)
 	touch $@
 
-# Create an empty "py-version.h" needed by py/mkrules.mk
-$(HEADER_BUILD)/py-version.h: | $(HEADER_BUILD)
+# Create an empty "mpversion.h" needed by py/mkrules.mk
+$(HEADER_BUILD)/mpversion.h: | $(HEADER_BUILD)
 	touch $@
diff --git a/cc3200/mods/modpyb.c b/cc3200/mods/modpyb.c
index 7078889fa5b1a8a0da182ab2359efd7c0ff51be1..a261c8b0d8397b3e3d087e4bdf14dd5e6e0479b4 100644
--- a/cc3200/mods/modpyb.c
+++ b/cc3200/mods/modpyb.c
@@ -65,7 +65,7 @@
 #include "utils.h"
 #include "gccollect.h"
 #include "mperror.h"
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 
 
 #ifdef DEBUG
diff --git a/cc3200/mods/moduos.c b/cc3200/mods/moduos.c
index 3261df746f279776d4d3c97a9385abc9a9b34c3c..72f848cfef93534ef25298ee7cc2e5bdd6762368 100644
--- a/cc3200/mods/moduos.c
+++ b/cc3200/mods/moduos.c
@@ -33,7 +33,7 @@
 #include "py/obj.h"
 #include "py/objtuple.h"
 #include "py/objstr.h"
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 #include "ff.h"
 #include "diskio.h"
 #include "sflash_diskio.h"
diff --git a/cc3200/telnet/telnet.c b/cc3200/telnet/telnet.c
index 440bf9b2cb3779f87e2b8b27116e687caf81f560..a910437df42937e557699f3be41974b4791b2ab8 100644
--- a/cc3200/telnet/telnet.c
+++ b/cc3200/telnet/telnet.c
@@ -35,7 +35,7 @@
 #include "debug.h"
 #include "mpexception.h"
 #include "serverstask.h"
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 
 /******************************************************************************
  DEFINE PRIVATE CONSTANTS
diff --git a/py/makeversionhdr.py b/py/makeversionhdr.py
new file mode 100644
index 0000000000000000000000000000000000000000..e37496d40a51940da2165d9fea747ec9debf5069
--- /dev/null
+++ b/py/makeversionhdr.py
@@ -0,0 +1,64 @@
+# This script works with Python 2 and 3
+
+from __future__ import print_function
+
+import sys
+import os
+import datetime
+import subprocess
+
+def make_version_header(filename):
+    # Note: git describe doesn't work if no tag is available
+    try:
+        git_tag = subprocess.check_output(["git", "describe", "--dirty", "--always"], universal_newlines=True).strip()
+    except subprocess.CalledProcessError:
+        git_tag = ""
+    try:
+        git_hash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"], stderr=subprocess.STDOUT, universal_newlines=True).strip()
+    except subprocess.CalledProcessError:
+        git_hash = "unknown"
+
+    try:
+        # Check if there are any modified files.
+        subprocess.check_call(["git", "diff", "--no-ext-diff", "--quiet", "--exit-code"], stderr=subprocess.STDOUT)
+        # Check if there are any staged files.
+        subprocess.check_call(["git", "diff-index", "--cached", "--quiet", "HEAD", "--"], stderr=subprocess.STDOUT)
+    except subprocess.CalledProcessError:
+        git_hash += "-dirty"
+
+    # Try to extract MicroPython version from git tag
+    if git_tag.startswith("v"):
+        ver = git_tag[1:].split("-")[0].split(".")
+        if len(ver) == 2:
+            ver.append("0")
+    else:
+        ver = ["0", "0", "1"]
+
+    # Generate the file with the git and version info
+    file_data = """\
+// This file was generated by py/makeversionhdr.py
+#define MICROPY_GIT_TAG "%s"
+#define MICROPY_GIT_HASH "%s"
+#define MICROPY_BUILD_DATE "%s"
+#define MICROPY_VERSION_MAJOR (%s)
+#define MICROPY_VERSION_MINOR (%s)
+#define MICROPY_VERSION_MICRO (%s)
+#define MICROPY_VERSION_STRING "%s.%s.%s"
+""" % (git_tag, git_hash, datetime.date.today().strftime("%Y-%m-%d"),
+    ver[0], ver[1], ver[2], ver[0], ver[1], ver[2])
+
+    # Check if the file contents changed from last time
+    write_file = True
+    if os.path.isfile(filename):
+        with open(filename, 'r') as f:
+            existing_data = f.read()
+        if existing_data == file_data:
+            write_file = False
+
+    # Only write the file if we need to
+    if write_file:
+        print("Generating %s" % filename)
+        with open(filename, 'w') as f:
+            f.write(file_data)
+
+make_version_header(sys.argv[1])
diff --git a/py/mkrules.mk b/py/mkrules.mk
index 902b20fd52494ef3591bb5042c4ffb1fe0c986a2..fab29b2b227793996514e4ba76d2e7409521aaac 100644
--- a/py/mkrules.mk
+++ b/py/mkrules.mk
@@ -58,7 +58,7 @@ $(BUILD)/%.pp: %.c
 # 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.
-$(OBJ): | $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/py-version.h
+$(OBJ): | $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/mpversion.h
 
 # $(sort $(var)) removes duplicates
 #
diff --git a/py/modsys.c b/py/modsys.c
index aad0fb8d7f45b1a3dd05dac1cc79c6053e90441c..73ee320e917faaee2cddaa2718ab36e23d863569 100644
--- a/py/modsys.c
+++ b/py/modsys.c
@@ -35,7 +35,7 @@
 
 #if MICROPY_PY_SYS
 
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 
 /// \module sys - system specific functions
 
diff --git a/py/py-version.sh b/py/py-version.sh
deleted file mode 100755
index e86b41ac396077ee308ecf9d07d90f8f88f18c11..0000000000000000000000000000000000000000
--- a/py/py-version.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-
-# Note: git describe doesn't work if no tag is available
-git_tag="$(git describe --dirty --always)"
-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
-
-# Try to extract MicroPython version
-if echo ${git_tag} | grep -q '^v[0-9]'; then
-    ver=$(echo ${git_tag} | cut -b 2- | cut -d - -f 1)
-    ver_major=$(echo ${ver} | cut -d . -f 1)
-    ver_minor=$(echo ${ver} | cut -d . -f 2)
-    ver_micro=$(echo ${ver} | cut -d . -f 3)
-    if [ -z ${ver_micro} ]; then
-        ver_micro="0"
-    fi
-else
-    ver_major="0"
-    ver_minor="0"
-    ver_micro="1"
-fi
-
-cat <<EOF
-// This file was generated by py/py-version.sh
-#define MICROPY_GIT_TAG "${git_tag}"
-#define MICROPY_GIT_HASH "${git_hash}"
-#define MICROPY_BUILD_DATE "$(date '+%Y-%m-%d')"
-#define MICROPY_VERSION_MAJOR (${ver_major})
-#define MICROPY_VERSION_MINOR (${ver_minor})
-#define MICROPY_VERSION_MICRO (${ver_micro})
-#define MICROPY_VERSION_STRING "${ver_major}.${ver_minor}.${ver_micro}"
-EOF
diff --git a/py/py.mk b/py/py.mk
index 8960fa4b427e0bb6f3efb1dc3f031173bea44afd..e984b585a5a0c6c04739182e15088445d25628ea 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -126,9 +126,8 @@ PY_O = $(addprefix $(PY_BUILD)/, $(PY_O_BASENAME))
 FORCE:
 .PHONY: FORCE
 
-$(HEADER_BUILD)/py-version.h: FORCE | $(HEADER_BUILD)
-	$(Q)$(PY_SRC)/py-version.sh > $@.tmp
-	$(Q)if [ -f "$@" ] && cmp -s $@ $@.tmp; then rm $@.tmp; else echo "Generating $@"; mv $@.tmp $@; fi
+$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
+	$(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
 
 # qstr data
 
diff --git a/stmhal/moduos.c b/stmhal/moduos.c
index 881afa1499e31fb3713d0e1c4a9d01c779c1a3c7..9d6856b3e1f408116034c3fb55891f72c6d39111 100644
--- a/stmhal/moduos.c
+++ b/stmhal/moduos.c
@@ -31,7 +31,7 @@
 #include "py/obj.h"
 #include "py/objtuple.h"
 #include "py/objstr.h"
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 #include "lib/fatfs/ff.h"
 #include "lib/fatfs/diskio.h"
 #include "rng.h"
diff --git a/stmhal/pyexec.c b/stmhal/pyexec.c
index 44a93162295294fec4f7dfe09b846df4e7f7d4de..eef2a1024bf603336ded529c022887ca43d066f4 100644
--- a/stmhal/pyexec.c
+++ b/stmhal/pyexec.c
@@ -38,7 +38,7 @@
 #endif
 #include "readline.h"
 #include "pyexec.h"
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 
 pyexec_mode_kind_t pyexec_mode_kind = PYEXEC_MODE_FRIENDLY_REPL;
 STATIC bool repl_display_debugging_info = 0;
diff --git a/unix/main.c b/unix/main.c
index 4729b63f64c98e8f3869ccf95eb17675ef1fb898..4a71bfac6f9a797d42b593a9a0c38c1aeced712e 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -43,7 +43,7 @@
 #include "py/repl.h"
 #include "py/gc.h"
 #include "py/stackctrl.h"
-#include "genhdr/py-version.h"
+#include "genhdr/mpversion.h"
 #include "input.h"
 
 // Command line options, with their defaults
diff --git a/windows/msvc/genhdr.targets b/windows/msvc/genhdr.targets
index 5d88394161d92d6bde19e59e24ae03955c574849..90054c0b60a4b98219c470b0714e570f780ee580 100644
--- a/windows/msvc/genhdr.targets
+++ b/windows/msvc/genhdr.targets
@@ -3,21 +3,21 @@
 
   <Import Project="env.props" Condition="$(PyEnvIncluded)!=True"/>
 
-  <Target Name="GenerateHeaders" DependsOnTargets="MakeQstrData;MakeVersionHeader">
+  <!--Generate qstrdefs.h and mpversion.h similar to what is done in py/py.mk-->
+  <Target Name="GenerateHeaders" DependsOnTargets="MakeQstrData;MakeVersionHdr">
   </Target>
 
   <PropertyGroup>
     <DestDir>$(PyBuildDir)genhdr\</DestDir>
+    <PySrcDir>$(PyBaseDir)py\</PySrcDir>
   </PropertyGroup>
 
   <Target Name="MakeDestDir">
     <MakeDir Directories="$(DestDir)"/>
   </Target>
 
-  <!--see py/py.mk under #qstr data-->
   <Target Name="MakeQstrData" DependsOnTargets="MakeDestDir">
     <PropertyGroup>
-      <PySrcDir>$(PyBaseDir)py\</PySrcDir>
       <PreProc>$(DestDir)qstrdefs.preprocessed.h</PreProc>
       <QstrDefs>$(PyBaseDir)unix\qstrdefsport.h</QstrDefs>
       <DestFile>$(DestDir)qstrdefs.generated.h</DestFile>
@@ -31,49 +31,12 @@
     <MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="CopyFileIfDifferent" Properties="SourceFile=$(TmpFile);DestFile=$(DestFile)"/>
   </Target>
 
-  <!--see py/py-version.sh-->
-  <Target Name="GetGitState">
-    <Exec Command="git describe --dirty --always" ConsoleToMSBuild="true" IgnoreExitCode="true">
-      <Output TaskParameter="ConsoleOutput" PropertyName="GitTag" />
-    </Exec>
-    <Exec Command="git rev-parse --short HEAD 2>NUL || echo unknown" ConsoleToMSBuild="true" IgnoreExitCode="true">
-      <Output TaskParameter="ConsoleOutput" PropertyName="GitHash" />
-    </Exec>
-    <Exec Command="git diff --no-ext-diff --quiet --exit-code 2>NUL || echo 0" ConsoleToMSBuild="true" IgnoreExitCode="true">
-      <Output TaskParameter="ConsoleOutput" PropertyName="GitFilesAreClean" />
-    </Exec>
-    <Exec Command="git diff-index --cached --quiet HEAD -- 2>NUL || echo 0" ConsoleToMSBuild="true" IgnoreExitCode="true" Condition="'$(GitFilesAreClean)'==''">
-      <Output TaskParameter="ConsoleOutput" PropertyName="GitFilesAreClean" />
-    </Exec>
-  </Target>
-
-  <Target Name="MakeVersionHeader" DependsOnTargets="MakeDestDir;GetGitState">
-    <PropertyGroup Condition="'$(GitFilesAreClean)'=='0'">
-      <GitHash>$(GitHash)-dirty</GitHash>
-    </PropertyGroup>
+  <Target Name="MakeVersionHdr" DependsOnTargets="MakeDestDir">
     <PropertyGroup>
-      <DestFile>$(DestDir)py-version.h</DestFile>
+      <DestFile>$(DestDir)mpversion.h</DestFile>
       <TmpFile>$(DestFile).tmp</TmpFile>
     </PropertyGroup>
-    <PropertyGroup>
-      <Ver>$([System.Text.RegularExpressions.Regex]::Match($(GitTag), `^v[0-9\.]{5}`))</Ver>
-      <Ver Condition="'$(Ver)'==''">v0.0.1</Ver>
-      <Ver>$(Ver.Remove(0, 1))</Ver>
-      <VerMajor>$(Ver.Split(`.`)[0])</VerMajor>
-      <VerMinor>$(Ver.Split(`.`)[1])</VerMinor>
-      <VerMicro>$(Ver.Split(`.`)[2])</VerMicro>
-    </PropertyGroup>
-    <ItemGroup>
-      <Lines Include="// This file was generated by $([System.IO.Path]::GetFileName(`$(MsBuildThisFile)`))"/>
-      <Lines Include="#define MICROPY_GIT_TAG &quot;$(GitTag)&quot;"/>
-      <Lines Include="#define MICROPY_GIT_HASH &quot;$(GitHash)&quot;"/>
-      <Lines Include="#define MICROPY_BUILD_DATE &quot;$([System.DateTime]::Now.ToString(`yyyy-MM-dd`))&quot;"/>
-      <Lines Include="#define MICROPY_VERSION_MAJOR ($(VerMajor))"/>
-      <Lines Include="#define MICROPY_VERSION_MINOR ($(VerMinor))"/>
-      <Lines Include="#define MICROPY_VERSION_MICRO ($(VerMicro))"/>
-      <Lines Include="#define MICROPY_VERSION_STRING &quot;$(Ver)&quot;"/>
-    </ItemGroup>
-    <WriteLinesToFile Lines="@(Lines)" File="$(TmpFile)" Overwrite="true"/>
+    <Exec Command="python $(PySrcDir)makeversionhdr.py $(TmpFile)"/>
     <MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="CopyFileIfDifferent" Properties="SourceFile=$(TmpFile);DestFile=$(DestFile)"/>
   </Target>