public static IEnumerable <CMakeKitInfo> ScanVSKits() { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { yield break; } var hostArches = new string[] { "x86", "x64" }; var targetArches = new string[] { "x86", "x64", "arm", "arm64" }; foreach (var vsInstance in VsInstances.GetAllWithLegacy()) { foreach (var hostArch in hostArches) { foreach (var targetArch in targetArches) { var vsArch = KitHostTargetArch(hostArch, targetArch); if (!ArchTestForVSInstance(vsInstance, vsArch)) { continue; } yield return(new CMakeKitInfo { Name = $"{VsDisplayName(vsInstance)} - {KitHostTargetArch(hostArch, targetArch)}", VSInstanceId = vsInstance.InstanceId, VSArch = KitHostTargetArch(hostArch, targetArch), PreferredGenerator = FindVSGenerator(vsInstance, hostArch, targetArch) }); } } } }
public static IEnumerable <CMakeKitInfo> ScanClangClKits() { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { yield break; } var vsIntances = VsInstances.GetAllWithLegacy(); var clangClRegex = new Regex(@"^clang-cl.*$", RegexOptions.CultureInvariant); var searchPaths = PathUtils.GetSearchPaths() .Concat(vsIntances.Select(x => Path.Combine(x.InstallationPath, "VC", "Tools", "Llvm", "bin"))) .Concat(new string[] { "%LLVM_ROOT%\\bin", "%ProgramW6432%\\LLVM\\bin", "%ProgramFiles%\\LLVM\\bin", "%ProgramFiles(x86)%\\LLVM\\bin" }.Select(PathUtils.NormalizePath)) .Distinct(); var clangCls = PathUtils.FindFiles(clangClRegex, searchPaths); foreach (var clangClFile in clangCls) { var version = ClangVersionInfo.GetFrom(clangClFile); if (version == null) { continue; } foreach (var vsInstance in vsIntances) { var vsArch = "x64"; if (version.Target != null && version.Target.IndexOf("i686-pc") != -1) { vsArch = "x86"; } yield return(new CMakeKitInfo() { Name = $"Clang {version.Version} for MSVC with {VsDisplayName(vsInstance)} ({vsArch})", Compilers = new Dictionary <string, string>() { { "C", clangClFile }, { "CXX", clangClFile } }, VSInstanceId = vsInstance.InstanceId, VSArch = vsArch, PreferredGenerator = FindNinja() ?? new CMakeGeneratorInfo() { Name = "NMake Makefiles" } }); } } }
internal static Dictionary <string, string> VarsForVSInstance(string instanceId, string vsArch) { VsSetupInstance vsInstance = null; if (string.IsNullOrWhiteSpace(instanceId)) { vsInstance = VsInstances.GetAllWithLegacy().FirstOrDefault(); } vsInstance = vsInstance ?? VsInstances.GetAllWithLegacy().FirstOrDefault(x => x.InstanceId == instanceId); return(VarsForVSInstance(vsInstance, vsArch)); }
private static string FindCMake() { var methods = new Func <string>[] { () => PathUtils.Which("cmake"), () => RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? PathUtils.GuessPath(new string[] { "%ProgramW6432%\\CMake\\bin\\cmake.exe", "%ProgramFiles%\\CMake\\bin\\cmake.exe", "%ProgramFiles(x86)%\\CMake\\bin\\cmake.exe" }) : null, () => PathUtils.GuessPath(VsInstances.GetAll().Select(x => Path.Combine(x.InstallationPath, "Common7", "IDE", "CommonExtensions", "Microsoft", "CMake", "CMake", "bin", "cmake.exe"))) }; var result = methods.Select(x => { try { return(x()); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception) { return(null); } #pragma warning restore CA1031 // Do not catch general exception types }).FirstOrDefault(x => x != null); if (result != null) { try { result = Path.GetFullPath(result); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception) { result = null; } #pragma warning restore CA1031 // Do not catch general exception types } return(result); }
public static Task ScanKitsAsync() { VsInstances.GetAll(); //Init on main thread return(Task.Run(ScanKits)); }