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"
                        }
                    });
                }
            }
        }