internal static bool ArchTestForVSInstance(VsSetupInstance inst, string vsArch) { try { return(VarsForVSInstance(inst, vsArch).Count != 0); } catch (Exception) { return(false); } }
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 CMakeGeneratorInfo FindVSGenerator(VsSetupInstance inst, string hostArch, string targetArch) { var installationVersion = new Version(inst.InstallationVersion); if (VSGenerators.TryGetValue(installationVersion.Major, out var generatorName)) { return(new CMakeGeneratorInfo() { Name = generatorName, Platform = targetArch == "x86" ? "win32" : targetArch, Toolset = $"host={hostArch}" }); } return(FindNinja() ?? new CMakeGeneratorInfo() { Name = "NMake Makefiles" }); }
internal static bool GetActiveFileForVSInstance(VsSetupInstance inst, string vsArch, out string commonDir, out string devbat, out string activeArgs) { commonDir = Path.Combine(inst.InstallationPath, "Common7", "Tools"); var installationVersion = new Version(inst.InstallationVersion); var devbatDir = installationVersion.Major < 15 ? Path.Combine(inst.InstallationPath, "VC") : Path.Combine(inst.InstallationPath, "VC", "Auxiliary", "Build"); activeArgs = installationVersion.Major < 15 ? vsArch.Replace("x64", "amd64") : vsArch; var vcvarsScript = "vcvarsall.bat"; if (vsArch.IndexOf("arm") != -1) { vcvarsScript = $"vcvars{vsArch.Replace("x64", "amd64")}.bat"; activeArgs = ""; } devbat = Path.Combine(devbatDir, vcvarsScript); if (!File.Exists(devbat)) { switch (vsArch) { case "x86": vcvarsScript = "vcvars32.bat"; break; case "x64": vcvarsScript = "vcvars64.bat"; break; default: return(false); } activeArgs = ""; devbat = Path.Combine(devbatDir, vcvarsScript); } return(File.Exists(devbat)); }
private static string VsDisplayName(VsSetupInstance inst) { return(inst.DisplayName); }
internal static Dictionary <string, string> VarsForVSInstance(VsSetupInstance inst, string vsArch) { var result = new Dictionary <string, string>(); if (inst == null) { return(result); } var installationVersion = new Version(inst.InstallationVersion); if (GetActiveFileForVSInstance(inst, vsArch, out var commonDir, out var devbat, out var activeArgs)) { var tempDirectory = Path.GetTempPath(); Directory.CreateDirectory(tempDirectory); var envFileName = $"{Guid.NewGuid()}.env"; var batFileName = $"{Guid.NewGuid()}.bat"; var envFilePath = Path.Combine(tempDirectory, envFileName); var batFilePath = Path.Combine(tempDirectory, batFileName); using (var batFile = File.CreateText(batFilePath)) { batFile.WriteLine("@echo off"); batFile.WriteLine("cd /d \"%~dp0\""); batFile.WriteLine($"set \"VS{installationVersion.Major}0COMNTOOLS={commonDir}\""); batFile.WriteLine($"call \"{devbat}\" {activeArgs} || exit"); batFile.WriteLine("cd /d \"%~dp0\""); foreach (var envVarName in MSVCEnvironmentVariables) { batFile.WriteLine($"echo {envVarName}=%{envVarName}%>> {envFileName}"); } } using (var process = Process.Start(new ProcessStartInfo() { FileName = batFilePath, CreateNoWindow = true })) { process.WaitForExit(); if (process.ExitCode == 0 && File.Exists(envFilePath)) { var lines = File.ReadAllLines(envFilePath); foreach (var line in lines) { var pSeparator = line.IndexOf('='); if (pSeparator < 0) { continue; } result[line.Substring(0, pSeparator).Trim()] = line.Substring(pSeparator + 1).Trim(); } } } File.Delete(envFilePath); File.Delete(batFilePath); } if (!result.ContainsKey("INCLUDE")) { result.Clear(); } if (!result.TryGetValue("VCINSTALLDIR", out var vcInstallDir)) { result.Clear(); } if (!Directory.Exists(vcInstallDir)) { result.Clear(); } if (result.Count != 0) { if (result.TryGetValue("VISUALSTUDIOVERSION", out var vsVersion)) { result[$"VS{vsVersion.Replace(".", "")}COMNTOOLS"] = commonDir; } result["CC"] = "cl.exe"; result["CXX"] = "cl.exe"; } return(result); }