msvc compatibility
diff --git a/build/ninja/msvc.py b/build/ninja/msvc.py
index 8526132..9f9d13a 100644
--- a/build/ninja/msvc.py
+++ b/build/ninja/msvc.py
@@ -31,8 +31,8 @@
     self.linkcmd = '$toolchain$link $libpaths $configlibpaths $linkflags $linkarchflags $linkconfigflags /DEBUG /NOLOGO /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /MANIFEST /MANIFESTUAC:\"level=\'asInvoker\' uiAccess=\'false\'\" /TLBID:1 /PDB:$pdbpath /OUT:$out $in $libs $archlibs $oslibs'
     self.dllcmd = self.linkcmd + ' /DLL'
 
-    self.cflags = ['/D', '"' + project.upper() + '_COMPILE=1"', '/D', '"_UNICODE"',  '/D', '"UNICODE"', '/Zi', '/Oi', '/Oy-', '/GS-', '/Gy-', '/Qpar-', '/fp:fast', '/fp:except-', '/Zc:forScope', '/Zc:wchar_t', '/GR-', '/openmp-']
-    self.cwarnflags = ['/W4', '/WX']
+    self.cflags = ['/D', '"' + project.upper() + '_COMPILE=1"', '/D', '"_UNICODE"',  '/D', '"UNICODE"', '/std:c17', '/Zi', '/Oi', '/Oy-', '/GS-', '/Gy-', '/Qpar-', '/fp:fast', '/fp:except-', '/Zc:forScope', '/Zc:wchar_t', '/GR-', '/openmp-']
+    self.cwarnflags = ['/W4', '/WX', '/wd4201'] #Ignore nameless union/struct which is allowed in C11
     self.cmoreflags = []
     self.arflags = ['/ignore:4221'] #Ignore empty object file warning]
     self.linkflags = ['/DEBUG']
@@ -138,10 +138,11 @@
           tools_list.sort(key=StrictVersion)
           self.toolchain = os.path.join(tools_basepath, tools_list[-1])
           self.toolchain_version = major_version + ".0"
+          break
 
       if self.toolchain == '':
         toolchain = ''
-        versions = ['16.0', '15.0', '14.0', '13.0', '12.0', '11.0', '10.0']
+        versions = ['17.0', '16.0', '15.0']
         keys = [
           'HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7',
           'HKCU\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7',
@@ -161,12 +162,11 @@
             except:
               continue
             if not toolchain == '':
-              if version == '15.0' or version == '16.0':
-                tools_basepath = os.path.join(toolchain, 'VC', 'Tools', 'MSVC')
-                tools_list = [item for item in os.listdir(tools_basepath) if os.path.isdir(os.path.join(tools_basepath, item))]
-                from distutils.version import StrictVersion
-                tools_list.sort(key=StrictVersion)
-                toolchain = os.path.join(tools_basepath, tools_list[-1])
+              tools_basepath = os.path.join(toolchain, 'VC', 'Tools', 'MSVC')
+              tools_list = [item for item in os.listdir(tools_basepath) if os.path.isdir(os.path.join(tools_basepath, item))]
+              from distutils.version import StrictVersion
+              tools_list.sort(key=StrictVersion)
+              toolchain = os.path.join(tools_basepath, tools_list[-1])
               self.toolchain = toolchain
               self.toolchain_version = version
               break
@@ -239,13 +239,10 @@
     return []
 
   def make_arch_toolchain_path(self, arch):
-    if self.toolchain_version == '15.0' or self.toolchain_version == '16.0':
-      if arch == 'x86-64':
-        return os.path.join(self.toolchain, 'bin', 'HostX64', 'x64\\')
-      elif arch == 'x86':
-        return os.path.join(self.toolchain, 'bin', 'HostX64', 'x86\\')
     if arch == 'x86-64':
-      return os.path.join(self.toolchain, 'bin', 'amd64\\')
+      return os.path.join(self.toolchain, 'bin', 'HostX64', 'x64\\')
+    elif arch == 'x86':
+      return os.path.join(self.toolchain, 'bin', 'HostX64', 'x86\\')
     return os.path.join(self.toolchain, 'bin\\')
 
   def make_carchflags(self, arch, targettype):
@@ -323,20 +320,14 @@
       libpaths += [os.path.join(libpath, self.libpath, config, arch) for libpath in extralibpaths]
     if self.sdkpath != '':
       if arch == 'x86':
-        if self.toolchain_version == '15.0' or self.toolchain_version == '16.0':
-          libpaths += [os.path.join(self.toolchain, 'lib', 'x86')]
-        else:
-          libpaths += [os.path.join(self.toolchain, 'lib')]
+        libpaths += [os.path.join(self.toolchain, 'lib', 'x86')]
         if self.sdkversion == 'v8.1':
           libpaths += [os.path.join( self.sdkpath, 'lib', 'winv6.3', 'um', 'x86')]
         if self.sdkversion == 'v10.0':
           libpaths += [os.path.join(self.sdkpath, 'lib', self.sdkversionpath, 'um', 'x86')]
           libpaths += [os.path.join(self.sdkpath, 'lib', self.sdkversionpath, 'ucrt', 'x86')]
       else:
-        if self.toolchain_version == '15.0' or self.toolchain_version == '16.0':
-          libpaths += [os.path.join( self.toolchain, 'lib', 'x64')]
-        else:
-          libpaths += [os.path.join( self.toolchain, 'lib', 'amd64')]
+        libpaths += [os.path.join( self.toolchain, 'lib', 'x64')]
         if self.sdkversion == 'v8.1':
           libpaths += [os.path.join( self.sdkpath, 'lib', 'winv6.3', 'um', 'x64')]
         if self.sdkversion == 'v10.0':
diff --git a/build/ninja/version.py b/build/ninja/version.py
index 1bf086a..78be895 100644
--- a/build/ninja/version.py
+++ b/build/ninja/version.py
@@ -15,7 +15,7 @@
   if sys.platform.startswith('win'):
     gitcmd = 'git.exe'
   try:
-    git_version = subprocess.check_output( [ gitcmd, 'describe', '--long' ], stderr = subprocess.STDOUT ).strip()
+    git_version = subprocess.check_output( [ gitcmd, 'describe', '--tags', '--long' ], stderr = subprocess.STDOUT ).strip()
     tokens = git_version.decode().split( '-' )
     version_numbers = tokens[0].split( '.' )
   except Exception:
diff --git a/build/ninja/vslocate.py b/build/ninja/vslocate.py
index d3c7016..afa171a 100644
--- a/build/ninja/vslocate.py
+++ b/build/ninja/vslocate.py
@@ -115,7 +115,7 @@
     enum_setup_instances = ctypes.POINTER(IEnumSetupInstances)()
     result = enum_instances(configuration, ctypes.byref(enum_setup_instances))
     if result != 0:
-    	#print("Failed to enum setup instances: " + str(result))
+        #print("Failed to enum setup instances: " + str(result))
         return installations
 
 
diff --git a/rpmalloc/rpmalloc.c b/rpmalloc/rpmalloc.c
index aa3b3e6..f061cb4 100644
--- a/rpmalloc/rpmalloc.c
+++ b/rpmalloc/rpmalloc.c
@@ -110,6 +110,7 @@
 
 /// Platform and arch specifics
 #if defined(_MSC_VER) && !defined(__clang__)
+#  pragma warning (disable: 5105)
 #  ifndef FORCEINLINE
 #    define FORCEINLINE inline __forceinline
 #  endif
diff --git a/test/main.c b/test/main.c
index 46b1612..a01e09c 100644
--- a/test/main.c
+++ b/test/main.c
@@ -2,6 +2,11 @@
 #if defined(_WIN32) && !defined(_CRT_SECURE_NO_WARNINGS)
 #  define _CRT_SECURE_NO_WARNINGS
 #endif
+#ifdef _MSC_VER
+#  if !defined(__clang__)
+#    pragma warning (disable: 5105)
+#  endif
+#endif
 #if defined(__clang__)
 #pragma clang diagnostic ignored "-Wnonportable-system-include-path"
 #endif
diff --git a/test/thread.c b/test/thread.c
index ff4758b..9d047e9 100644
--- a/test/thread.c
+++ b/test/thread.c
@@ -3,6 +3,9 @@
 #include <errno.h>
 
 #ifdef _MSC_VER
+#  if !defined(__clang__)
+#    pragma warning (disable: 5105)
+#  endif
 #  define ATTRIBUTE_NORETURN
 #else
 #  define ATTRIBUTE_NORETURN __attribute__((noreturn))