void CompileMSVC(IEnumerable <string> files)
        {
            List <ToolchainVersion> vsSdks;

            MSVCToolchain.GetVisualStudioSdks(out vsSdks);

            if (vsSdks.Count == 0)
            {
                throw new Exception("Visual Studio SDK was not found on your system.");
            }

            ToolchainVersion vsSdk;

            if (Options.Compilation.VsVersion == VisualStudioVersion.Latest)
            {
                vsSdk = vsSdks.LastOrDefault();
            }
            else
            {
                var exactVersion = vsSdks.Where(vs => (int)vs.Version == (int)Options.Compilation.VsVersion)
                                   .Cast <ToolchainVersion?>().SingleOrDefault();
                if (!exactVersion.HasValue)
                {
                    throw new Exception($"Visual Studio SDK version {Options.Compilation.VsVersion} was not found on your system.");
                }

                vsSdk = exactVersion.Value;
            }

            var clBin = String.Empty;

            if ((int)vsSdk.Version == (int)VisualStudioVersion.VS2017)
            {
                var clFiles = System.IO.Directory.EnumerateFiles(Path.Combine(vsSdk.Directory, @"..\..\VC\Tools\MSVC"), "cl.exe", SearchOption.AllDirectories);
                clBin = clFiles.Where(s => s.Contains(@"x86\cl.exe")).First();
            }
            else
            {
                clBin = Path.GetFullPath(Path.Combine(vsSdk.Directory, "..", "..", "VC", "bin", "cl.exe"));
            }

            Diagnostics.Debug($"VS path {vsSdk.Directory}");

            var monoPath = ManagedToolchain.FindMonoPath();
            var output   = Path.Combine(Options.OutputDir, Options.LibraryName ??
                                        Path.GetFileNameWithoutExtension(Project.Assemblies[0]));

            var args = new List <string> {
                "/nologo",
                $"-D{DLLExportDefine}",
                $"-I\"{monoPath}\\include\\mono-2.0\"",
                string.Join(" ", files.Select(file => "\"" + Path.GetFullPath(file) + "\"")),
                $"\"{GetSgenLibPath(monoPath)}\"",
                Options.Compilation.CompileSharedLibrary ? "/LD" : string.Empty,
                $"/Fe{output}"
            };

            var invocation = string.Join(" ", args);

            var vsVersion = (VisualStudioVersion)(int)vsSdk.Version;
            var includes  = MSVCToolchain.GetSystemIncludes(vsVersion);

            var winSdks = new List <ToolchainVersion>();

            MSVCToolchain.GetWindowsKitsSdks(out winSdks);

            var libParentPath = Directory.GetParent(Directory.EnumerateDirectories(Path.Combine(winSdks.Last().Directory, "lib"), "um", SearchOption.AllDirectories).First());
            var libPaths      = libParentPath.EnumerateDirectories();

            Dictionary <string, string> envVars = null;

            if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("INCLUDE")))
            {
                envVars            = new Dictionary <string, string>();
                envVars["INCLUDE"] = string.Join(";", includes);

                var clLib = Path.GetFullPath(
                    Path.Combine(vsSdk.Directory, "..", "..", "VC", "lib"));
                envVars["LIB"] = clLib + ";" + string.Join(";", libPaths.Select(path => Path.Combine(path.FullName, "x86")));
            }

            Invoke(clBin, invocation, envVars);
        }
示例#2
0
        bool CompileMSVC(IEnumerable <string> files)
        {
            var vsSdks = MSVCToolchain.GetVisualStudioSdks();

            // Skip TestAgent VS instances as they do not provide native toolchains.
            vsSdks = vsSdks.Where(sdk => !sdk.Directory.Contains("TestAgent")).ToList();

            if (vsSdks.Count == 0)
            {
                throw new Exception("Visual Studio SDK was not found on your system.");
            }

            ToolchainVersion vsSdk;

            if (Options.Compilation.VsVersion == VisualStudioVersion.Latest)
            {
                vsSdk = vsSdks.LastOrDefault();
            }
            else
            {
                var exactVersion = vsSdks.Where(vs => (int)vs.Version == (int)Options.Compilation.VsVersion)
                                   .Cast <ToolchainVersion?>().SingleOrDefault();
                if (!exactVersion.HasValue)
                {
                    throw new Exception($"Visual Studio SDK version {Options.Compilation.VsVersion} was not found on your system.");
                }

                vsSdk = exactVersion.Value;
            }

            var clBin = string.Empty;
            var clLib = string.Empty;

            const string clArch = "x86";

            var isVS2017OrGreater = (int)vsSdk.Version >= (int)VisualStudioVersion.VS2017;

            if (isVS2017OrGreater)
            {
                var clBaseDir = Directory.EnumerateDirectories(Path.Combine(vsSdk.Directory, @"..\..\VC\Tools\MSVC")).Last();
                clBin = Path.Combine(clBaseDir, $"bin\\Hostx86\\{clArch}\\cl.exe");
                clLib = Path.Combine(clBaseDir, $"lib\\{clArch}");
            }
            else
            {
                clBin = Path.GetFullPath(Path.Combine(vsSdk.Directory, "..", "..", "VC", "bin", "cl.exe"));
                clLib = Path.GetFullPath(Path.Combine(vsSdk.Directory, "..", "..", "VC", "lib"));
            }

            Diagnostics.Debug($"VS path {vsSdk.Directory}");

            var outputPath = Path.Combine(Options.OutputDir, Options.LibraryName ??
                                          Path.GetFileNameWithoutExtension(Project.Assemblies[0]));

            var args = new List <string> {
                "/nologo",
                $"-D{DLLExportDefine}",
                $"-I\"{MonoSdkPath}\\include\\mono-2.0\"",
                string.Join(" ", files.Select(file => "\"" + Path.GetFullPath(file) + "\"")),
                $"\"{GetSgenLibPath(MonoSdkPath)}\"",
                Options.Compilation.CompileSharedLibrary ? "/LD" : string.Empty,
                $"/Fe{outputPath}"
            };

            var invocation = string.Join(" ", args);

            var vsVersion = (VisualStudioVersion)(int)vsSdk.Version;
            var includes  = MSVCToolchain.GetSystemIncludes(vsVersion);

            var winSdks = MSVCToolchain.GetWindowsKitsSdks();

            var libParentPath = Directory.GetParent(Directory.EnumerateDirectories(
                                                        Path.Combine(winSdks.Last().Directory, "lib"), "um", SearchOption.AllDirectories).First());
            var libPaths = libParentPath.EnumerateDirectories();

            Dictionary <string, string> envVars = null;

            if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("INCLUDE")))
            {
                envVars            = new Dictionary <string, string>();
                envVars["INCLUDE"] = string.Join(";", includes);
                envVars["LIB"]     = Path.GetFullPath(clLib) + ";" +
                                     string.Join(";", libPaths.Select(path => Path.Combine(path.FullName, clArch)));
            }

            var output = Invoke(clBin, invocation, envVars);

            return(output.ExitCode == 0);
        }