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