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