diff --git a/src/Core/Toolchains/MSVCToolchain.cs b/src/Core/Toolchains/MSVCToolchain.cs index 4d2436e0..cd3ddded 100644 --- a/src/Core/Toolchains/MSVCToolchain.cs +++ b/src/Core/Toolchains/MSVCToolchain.cs @@ -158,33 +158,17 @@ namespace CppSharp kitsRootKey = match.Groups[0].Value; } - List windowSdks; - GetWindowsSdks(out windowSdks); - - var windowSdk = windowSdks.Find(version => (int) Math.Floor(version.Version) == windowsSdkMajorVer); - - if (windowSdk.Directory == null) - windowSdk = windowSdks.Last(); - - var windowSdkDir = windowSdk.Directory; + List windowsSdks; + GetWindowsSdks(out windowsSdks); // Older Visual Studio versions provide their own Windows SDK. - if (windowSdks.Count == 0) + if (windowsSdks.Count == 0) { includes.Add(Path.Combine(vsDir, @"\VC\PlatformSDK\Include")); } else { - if (windowsSdkMajorVer >= 8) - { - includes.Add(Path.Combine(windowSdkDir, @"include\shared")); - includes.Add(Path.Combine(windowSdkDir, @"include\um")); - includes.Add(Path.Combine(windowSdkDir, @"include\winrt")); - } - else - { - includes.Add(Path.Combine(windowSdkDir, "include")); - } + includes.AddRange(GetIncludeDirsFromWindowsSdks(windowsSdkMajorVer, windowsSdks)); } List windowsKitsSdks; @@ -200,6 +184,36 @@ namespace CppSharp return includes; } + private static IEnumerable GetIncludeDirsFromWindowsSdks( + int windowsSdkMajorVer, List windowsSdks) + { + var includes = new List(); + var majorWindowsSdk = windowsSdks.Find( + version => (int) Math.Floor(version.Version) == windowsSdkMajorVer); + var windowsSdkDirs = majorWindowsSdk.Directory != null ? + new[] { majorWindowsSdk.Directory } : + windowsSdks.Select(w => w.Directory).Reverse(); + foreach (var windowsSdkDir in windowsSdkDirs) + { + if (windowsSdkMajorVer >= 8) + { + var shared = Path.Combine(windowsSdkDir, "include", "shared"); + var um = Path.Combine(windowsSdkDir, "include", "um"); + var winrt = Path.Combine(windowsSdkDir, "include", "winrt"); + if (Directory.Exists(shared) && Directory.Exists(um) && + Directory.Exists(winrt)) + return new[] { shared, um, winrt }; + } + else + { + var include = Path.Combine(windowsSdkDir, "include"); + if (Directory.Exists(include)) + return new[] { include }; + } + } + return new string[0]; + } + private static IEnumerable CollectUniversalCRuntimeIncludeDirs( string vsDir, ToolchainVersion windowsKitSdk, int windowsSdkMajorVer) {