コード例 #1
0
        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)
                        });
                    }
                }
            }
        }
コード例 #2
0
        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"
                        }
                    });
                }
            }
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 public static Task ScanKitsAsync()
 {
     VsInstances.GetAll(); //Init on main thread
     return(Task.Run(ScanKits));
 }