public static IEnumerable <CMakeKitInfo> ScanClangKits() { var clangRegex = new Regex(@"^clang(-\d+(\.\d+(\.\d+)?)?)?(\.exe)?$", RegexOptions.CultureInvariant); foreach (var clangFile in PathUtils.FindFilesInEnvironment(clangRegex)) { var clangxxFile = clangFile.Replace("clang", "clang++"); var version = ClangVersionInfo.GetFrom(clangFile); if (version == null) { continue; } if (version.Target.IndexOf("msvc") != -1) { // Clang targeting MSVC can't be used without MSVC Enviroment // These instances will be handled by using clang-cl.exe continue; } var kitInfo = new CMakeKitInfo() { Name = $"Clang {version.Version} ({version.Target})", Compilers = new Dictionary <string, string>() { { "C", clangFile } } }; if (File.Exists(clangxxFile)) { kitInfo.Compilers["CXX"] = clangxxFile; } yield return(kitInfo); } }
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" } }); } } }