Exemple #1
0
        public static bool IsDefaultToolsetForDevEnv(this Options.Vc.General.PlatformToolset platformToolset, DevEnv visualVersion)
        {
            switch (platformToolset)
            {
            case Options.Vc.General.PlatformToolset.v100:
                return(visualVersion == DevEnv.vs2010);

            case Options.Vc.General.PlatformToolset.v110:
                return(visualVersion == DevEnv.vs2012);

            case Options.Vc.General.PlatformToolset.v120:
                return(visualVersion == DevEnv.vs2013);

            case Options.Vc.General.PlatformToolset.v140:
                return(visualVersion == DevEnv.vs2015);

            case Options.Vc.General.PlatformToolset.v141:
                return(visualVersion == DevEnv.vs2017);

            case Options.Vc.General.PlatformToolset.v142:
                return(visualVersion == DevEnv.vs2019);

            case Options.Vc.General.PlatformToolset.v110_xp:
            case Options.Vc.General.PlatformToolset.v120_xp:
            case Options.Vc.General.PlatformToolset.v140_xp:
            case Options.Vc.General.PlatformToolset.v141_xp:
            case Options.Vc.General.PlatformToolset.LLVM_vs2012:
            case Options.Vc.General.PlatformToolset.LLVM_vs2014:
            case Options.Vc.General.PlatformToolset.LLVM:
            case Options.Vc.General.PlatformToolset.Default:
                return(false);

            default:
                throw new ArgumentOutOfRangeException(nameof(platformToolset), platformToolset, null);
            }
        }
        public virtual IEnumerable <string> GetPlatformLibraryPaths(Project.Configuration configuration)
        {
            var dirs   = new List <string>();
            var dotnet = Util.IsDotNet(configuration) ? configuration.Target.GetFragment <DotNetFramework>() : default(DotNetFramework?);

            var platformToolset = Options.GetObject <Options.Vc.General.PlatformToolset>(configuration);

            if (platformToolset.IsLLVMToolchain())
            {
                Options.Vc.General.PlatformToolset overridenPlatformToolset = Options.Vc.General.PlatformToolset.Default;
                if (Options.WithArgOption <Options.Vc.General.PlatformToolset> .Get <Options.Clang.Compiler.LLVMVcPlatformToolset>(configuration, ref overridenPlatformToolset))
                {
                    platformToolset = overridenPlatformToolset;
                }
            }

            var devEnv = platformToolset.GetDefaultDevEnvForToolset() ?? configuration.Target.GetFragment <DevEnv>();

            string platformDirsStr = devEnv.GetWindowsLibraryPath(configuration.Target.GetPlatform(), dotnet);

            dirs.AddRange(EnumerateSemiColonSeparatedString(platformDirsStr));

            return(dirs);
        }
Exemple #3
0
            public CompilerSettings GetMasterCompilerSettings(
                IDictionary <string, CompilerSettings> masterCompilerSettings,
                string compilerName,
                DevEnv devEnv,
                string projectRootPath,
                Options.Vc.General.PlatformToolset platformToolset,
                bool useCCompiler
                )
            {
                CompilerSettings compilerSettings;

                if (masterCompilerSettings.ContainsKey(compilerName))
                {
                    compilerSettings = masterCompilerSettings[compilerName];
                }
                else
                {
                    DevEnv?compilerDevEnv      = null;
                    string platformToolSetPath = null;
                    string pathToCompiler      = null;
                    string compilerExeName     = null;
                    var    compilerFamily      = Sharpmake.CompilerFamily.Auto;
                    var    fastBuildSettings   = PlatformRegistry.Get <IFastBuildCompilerSettings>(Platform.win64);

                    switch (platformToolset)
                    {
                    case Options.Vc.General.PlatformToolset.Default:
                        compilerDevEnv = devEnv;
                        break;

                    case Options.Vc.General.PlatformToolset.v100:
                        compilerDevEnv = DevEnv.vs2010;
                        break;

                    case Options.Vc.General.PlatformToolset.v110:
                    case Options.Vc.General.PlatformToolset.v110_xp:
                        compilerDevEnv = DevEnv.vs2012;
                        break;

                    case Options.Vc.General.PlatformToolset.v120:
                    case Options.Vc.General.PlatformToolset.v120_xp:
                        compilerDevEnv = DevEnv.vs2013;
                        break;

                    case Options.Vc.General.PlatformToolset.v140:
                    case Options.Vc.General.PlatformToolset.v140_xp:
                        compilerDevEnv = DevEnv.vs2015;
                        break;

                    case Options.Vc.General.PlatformToolset.v141:
                    case Options.Vc.General.PlatformToolset.v141_xp:
                        compilerDevEnv = DevEnv.vs2017;
                        break;

                    case Options.Vc.General.PlatformToolset.v142:
                        compilerDevEnv = DevEnv.vs2019;
                        break;

                    case Options.Vc.General.PlatformToolset.LLVM_vs2012:
                    case Options.Vc.General.PlatformToolset.LLVM_vs2014:
                    case Options.Vc.General.PlatformToolset.LLVM:

                        platformToolSetPath = ClangForWindows.Settings.LLVMInstallDir;
                        pathToCompiler      = Path.Combine(platformToolSetPath, "bin");
                        compilerExeName     = "clang-cl.exe";

                        var compilerFamilyKey = new FastBuildWindowsCompilerFamilyKey(devEnv, platformToolset);
                        if (!fastBuildSettings.CompilerFamily.TryGetValue(compilerFamilyKey, out compilerFamily))
                        {
                            compilerFamily = Sharpmake.CompilerFamily.ClangCl;
                        }

                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    if (compilerDevEnv.HasValue)
                    {
                        platformToolSetPath = Path.Combine(compilerDevEnv.Value.GetVisualStudioDir(), "VC");
                        pathToCompiler      = compilerDevEnv.Value.GetVisualStudioBinPath(Platform.win64);
                        compilerExeName     = "cl.exe";

                        var compilerFamilyKey = new FastBuildWindowsCompilerFamilyKey(devEnv, platformToolset);
                        if (!fastBuildSettings.CompilerFamily.TryGetValue(compilerFamilyKey, out compilerFamily))
                        {
                            compilerFamily = Sharpmake.CompilerFamily.MSVC;
                        }
                    }

                    Strings extraFiles = new Strings();
                    {
                        Strings userExtraFiles;
                        if (fastBuildSettings.ExtraFiles.TryGetValue(devEnv, out userExtraFiles))
                        {
                            extraFiles.AddRange(userExtraFiles);
                        }
                    }

                    if (compilerDevEnv.HasValue)
                    {
                        extraFiles.Add(
                            @"$ExecutableRootPath$\c1.dll",
                            @"$ExecutableRootPath$\c1xx.dll",
                            @"$ExecutableRootPath$\c2.dll",
                            @"$ExecutableRootPath$\mspdbcore.dll",
                            @"$ExecutableRootPath$\mspdbsrv.exe",
                            @"$ExecutableRootPath$\1033\clui.dll"
                            );

                        switch (devEnv)
                        {
                        case DevEnv.vs2012:
                        {
                            extraFiles.Add(
                                @"$ExecutableRootPath$\c1ast.dll",
                                @"$ExecutableRootPath$\c1xxast.dll",
                                @"$ExecutableRootPath$\mspft110.dll",
                                @"$ExecutableRootPath$\msobj110.dll",
                                @"$ExecutableRootPath$\mspdb110.dll",
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC110.CRT\msvcp110.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC110.CRT\msvcr110.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC110.CRT\vccorlib110.dll")
                                );
                        }
                        break;

                        case DevEnv.vs2013:
                        {
                            extraFiles.Add(
                                @"$ExecutableRootPath$\c1ast.dll",
                                @"$ExecutableRootPath$\c1xxast.dll",
                                @"$ExecutableRootPath$\mspft120.dll",
                                @"$ExecutableRootPath$\msobj120.dll",
                                @"$ExecutableRootPath$\mspdb120.dll",
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC120.CRT\msvcp120.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC120.CRT\msvcr120.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC120.CRT\vccorlib120.dll")
                                );
                        }
                        break;

                        case DevEnv.vs2015:
                        case DevEnv.vs2017:
                        case DevEnv.vs2019:
                        {
                            string systemDllPath = FastBuildSettings.SystemDllRoot;
                            if (systemDllPath == null)
                            {
                                var    windowsTargetPlatformVersion = KitsRootPaths.GetWindowsTargetPlatformVersionForDevEnv(devEnv);
                                string redistDirectory;
                                if (windowsTargetPlatformVersion <= Options.Vc.General.WindowsTargetPlatformVersion.v10_0_17134_0)
                                {
                                    redistDirectory = @"Redist\ucrt\DLLs\x64\";
                                }
                                else
                                {
                                    redistDirectory = $@"Redist\{windowsTargetPlatformVersion.ToVersionString()}\ucrt\DLLs\x64\";
                                }

                                systemDllPath = Path.Combine(KitsRootPaths.GetRoot(KitsRootEnum.KitsRoot10), redistDirectory);
                            }

                            if (!Path.IsPathRooted(systemDllPath))
                            {
                                systemDllPath = Util.SimplifyPath(Path.Combine(projectRootPath, systemDllPath));
                            }

                            extraFiles.Add(
                                @"$ExecutableRootPath$\msobj140.dll",
                                @"$ExecutableRootPath$\mspft140.dll",
                                @"$ExecutableRootPath$\mspdb140.dll"
                                );

                            if (devEnv == DevEnv.vs2015)
                            {
                                extraFiles.Add(
                                    @"$ExecutableRootPath$\vcvars64.bat",
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\concrt140.dll"),
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\msvcp140.dll"),
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\vccorlib140.dll"),
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\vcruntime140.dll"),
                                    Path.Combine(systemDllPath, "ucrtbase.dll")
                                    );
                            }
                            else
                            {
                                extraFiles.Add(
                                    @"$ExecutableRootPath$\mspdbcore.dll",
                                    @"$ExecutableRootPath$\msvcdis140.dll",
                                    @"$ExecutableRootPath$\msvcp140.dll",
                                    @"$ExecutableRootPath$\pgodb140.dll",
                                    @"$ExecutableRootPath$\vcruntime140.dll",
                                    Path.Combine(platformToolSetPath, @"Auxiliary\Build\vcvars64.bat")
                                    );
                            }

                            if (devEnv == DevEnv.vs2019)
                            {
                                Version toolsVersion = devEnv.GetVisualStudioVCToolsVersion();

                                if (toolsVersion >= new Version("14.22.27905"))
                                {
                                    extraFiles.Add(@"$ExecutableRootPath$\tbbmalloc.dll");
                                }

                                if (toolsVersion >= new Version("14.25.28610"))
                                {
                                    extraFiles.Add(@"$ExecutableRootPath$\vcruntime140_1.dll");
                                }
                            }

                            try
                            {
                                foreach (string p in Util.DirectoryGetFiles(systemDllPath, "api-ms-win-*.dll"))
                                {
                                    extraFiles.Add(p);
                                }
                            }
                            catch { }
                        }
                        break;

                        default:
                            throw new NotImplementedException("This devEnv (" + devEnv + ") is not supported!");
                        }
                    }

                    string executable = Path.Combine("$ExecutableRootPath$", compilerExeName);

                    compilerSettings = new CompilerSettings(compilerName, compilerFamily, Platform.win64, extraFiles, executable, pathToCompiler, devEnv, new Dictionary <string, CompilerSettings.Configuration>());
                    masterCompilerSettings.Add(compilerName, compilerSettings);
                }

                return(compilerSettings);
            }
Exemple #4
0
            public override void SetupSdkOptions(IGenerationContext context)
            {
                var conf   = context.Configuration;
                var devEnv = context.DevelopmentEnvironment;

                // We need to override the executable path for vs2015 because WindowsKit UAP.props does not
                // correctly set the WindowsSDK_ExecutablePath to the bin folder of its current version.
                if (devEnv == DevEnv.vs2015 && !KitsRootPaths.UsesDefaultKitRoot(devEnv))
                {
                    context.Options["ExecutablePath"] = devEnv.GetWindowsExecutablePath(conf.Platform);
                }

                Options.Vc.General.PlatformToolset platformToolset = Options.GetObject <Options.Vc.General.PlatformToolset>(conf);
                if (Options.Vc.General.PlatformToolset.LLVM == platformToolset)
                {
                    Options.Vc.General.PlatformToolset overridenPlatformToolset = Options.Vc.General.PlatformToolset.Default;
                    if (Options.WithArgOption <Options.Vc.General.PlatformToolset> .Get <Options.Clang.Compiler.LLVMVcPlatformToolset>(conf, ref overridenPlatformToolset))
                    {
                        platformToolset = overridenPlatformToolset;
                    }

                    devEnv = platformToolset.GetDefaultDevEnvForToolset() ?? devEnv;

                    context.Options["ExecutablePath"] = ClangForWindows.GetWindowsClangExecutablePath() + ";" + devEnv.GetWindowsExecutablePath(conf.Platform);
                    if (Options.GetObject <Options.Vc.LLVM.UseClangCl>(conf) == Options.Vc.LLVM.UseClangCl.Enable)
                    {
                        context.Options["IncludePath"] = ClangForWindows.GetWindowsClangIncludePath() + ";" + devEnv.GetWindowsIncludePath();
                        context.Options["LibraryPath"] = ClangForWindows.GetWindowsClangLibraryPath() + ";" + devEnv.GetWindowsLibraryPath(conf.Platform, Util.IsDotNet(conf) ? conf.Target.GetFragment <DotNetFramework>() : default(DotNetFramework?));
                    }
                }

                var systemIncludes = new OrderableStrings(conf.DependenciesIncludeSystemPaths);

                systemIncludes.AddRange(conf.IncludeSystemPaths);
                if (systemIncludes.Count > 0)
                {
                    systemIncludes.Sort();
                    string systemIncludesString = Util.PathGetRelative(context.ProjectDirectory, systemIncludes).JoinStrings(";");

                    // this option is mandatory when using /external:I with msvc, so if the user has selected it
                    // we consider that the vcxproj supports ExternalIncludePath
                    if (Options.HasOption <Options.Vc.General.ExternalWarningLevel>(conf))
                    {
                        if (context.Options["ExternalIncludePath"] == FileGeneratorUtilities.RemoveLineTag)
                        {
                            context.Options["ExternalIncludePath"] = systemIncludesString;
                        }
                        else
                        {
                            context.Options["ExternalIncludePath"] += ";" + systemIncludesString;
                        }
                    }
                    else
                    {
                        if (context.Options["IncludePath"] == FileGeneratorUtilities.RemoveLineTag)
                        {
                            context.Options["IncludePath"] = "$(VC_IncludePath);$(WindowsSDK_IncludePath);" + systemIncludesString;
                        }
                        else
                        {
                            context.Options["IncludePath"] += ";" + systemIncludesString;
                        }
                    }
                }
            }
Exemple #5
0
            public CompilerSettings GetMasterCompilerSettings(
                IDictionary <string, CompilerSettings> masterCompilerSettings,
                string compilerName,
                DevEnv devEnv,
                string projectRootPath,
                Options.Vc.General.PlatformToolset platformToolset,
                bool useCCompiler
                )
            {
                CompilerSettings compilerSettings;

                if (masterCompilerSettings.ContainsKey(compilerName))
                {
                    compilerSettings = masterCompilerSettings[compilerName];
                }
                else
                {
                    DevEnv?compilerDevEnv      = null;
                    string platformToolSetPath = null;
                    string pathToCompiler      = null;
                    string compilerExeName     = null;

                    switch (platformToolset)
                    {
                    case Options.Vc.General.PlatformToolset.Default:
                        compilerDevEnv = devEnv;
                        break;

                    case Options.Vc.General.PlatformToolset.v100:
                        compilerDevEnv = DevEnv.vs2010;
                        break;

                    case Options.Vc.General.PlatformToolset.v110:
                    case Options.Vc.General.PlatformToolset.v110_xp:
                        compilerDevEnv = DevEnv.vs2012;
                        break;

                    case Options.Vc.General.PlatformToolset.v120:
                    case Options.Vc.General.PlatformToolset.v120_xp:
                        compilerDevEnv = DevEnv.vs2013;
                        break;

                    case Options.Vc.General.PlatformToolset.v140:
                    case Options.Vc.General.PlatformToolset.v140_xp:
                        compilerDevEnv = DevEnv.vs2015;
                        break;

                    case Options.Vc.General.PlatformToolset.v141:
                    case Options.Vc.General.PlatformToolset.v141_xp:
                        compilerDevEnv = DevEnv.vs2017;
                        break;

                    case Options.Vc.General.PlatformToolset.LLVM_vs2012:
                    case Options.Vc.General.PlatformToolset.LLVM_vs2014:
                    case Options.Vc.General.PlatformToolset.LLVM:

                        platformToolSetPath = ClangForWindows.Settings.LLVMInstallDir;
                        pathToCompiler      = Path.Combine(platformToolSetPath, "bin");
                        compilerExeName     = "clang-cl.exe";

                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    if (compilerDevEnv.HasValue)
                    {
                        platformToolSetPath = Path.Combine(compilerDevEnv.Value.GetVisualStudioDir(), "VC");
                        pathToCompiler      = compilerDevEnv.Value.GetVisualStudioBinPath(Platform.win64);
                        compilerExeName     = "cl.exe";
                    }

                    Strings extraFiles = new Strings();
                    if (compilerDevEnv.HasValue)
                    {
                        extraFiles.Add(
                            @"$ExecutableRootPath$\c1.dll",
                            @"$ExecutableRootPath$\c1xx.dll",
                            @"$ExecutableRootPath$\c2.dll",
                            @"$ExecutableRootPath$\mspdbcore.dll",
                            @"$ExecutableRootPath$\mspdbsrv.exe",
                            @"$ExecutableRootPath$\1033\clui.dll"
                            );

                        switch (devEnv)
                        {
                        case DevEnv.vs2012:
                        {
                            extraFiles.Add(
                                @"$ExecutableRootPath$\c1ast.dll",
                                @"$ExecutableRootPath$\c1xxast.dll",
                                @"$ExecutableRootPath$\mspft110.dll",
                                @"$ExecutableRootPath$\msobj110.dll",
                                @"$ExecutableRootPath$\mspdb110.dll",
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC110.CRT\msvcp110.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC110.CRT\msvcr110.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC110.CRT\vccorlib110.dll")
                                );
                        }
                        break;

                        case DevEnv.vs2013:
                        {
                            extraFiles.Add(
                                @"$ExecutableRootPath$\c1ast.dll",
                                @"$ExecutableRootPath$\c1xxast.dll",
                                @"$ExecutableRootPath$\mspft120.dll",
                                @"$ExecutableRootPath$\msobj120.dll",
                                @"$ExecutableRootPath$\mspdb120.dll",
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC120.CRT\msvcp120.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC120.CRT\msvcr120.dll"),
                                Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC120.CRT\vccorlib120.dll")
                                );
                        }
                        break;

                        case DevEnv.vs2015:
                        case DevEnv.vs2017:
                        {
                            string systemDllPath = FastBuildSettings.SystemDllRoot;
                            if (systemDllPath == null)
                            {
                                systemDllPath = KitsRootPaths.GetRoot(KitsRootEnum.KitsRoot10) + @"Redist\ucrt\DLLs\x64\";
                            }

                            if (!Path.IsPathRooted(systemDllPath))
                            {
                                systemDllPath = Util.SimplifyPath(Path.Combine(projectRootPath, systemDllPath));
                            }

                            extraFiles.Add(
                                @"$ExecutableRootPath$\msobj140.dll",
                                @"$ExecutableRootPath$\mspft140.dll",
                                @"$ExecutableRootPath$\mspdb140.dll"
                                );

                            if (devEnv == DevEnv.vs2015)
                            {
                                extraFiles.Add(
                                    @"$ExecutableRootPath$\vcvars64.bat",
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\concrt140.dll"),
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\msvcp140.dll"),
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\vccorlib140.dll"),
                                    Path.Combine(platformToolSetPath, @"redist\x64\Microsoft.VC140.CRT\vcruntime140.dll"),
                                    Path.Combine(systemDllPath, "ucrtbase.dll")
                                    );
                            }
                            else
                            {
                                extraFiles.Add(
                                    @"$ExecutableRootPath$\mspdbcore.dll",
                                    @"$ExecutableRootPath$\msvcdis140.dll",
                                    @"$ExecutableRootPath$\msvcp140.dll",
                                    @"$ExecutableRootPath$\pgodb140.dll",
                                    @"$ExecutableRootPath$\vcruntime140.dll",
                                    Path.Combine(platformToolSetPath, @"Auxiliary\Build\vcvars64.bat")
                                    );
                            }

                            try
                            {
                                foreach (string p in Util.DirectoryGetFiles(systemDllPath, "api-ms-win-*.dll"))
                                {
                                    extraFiles.Add(p);
                                }
                            }
                            catch { }
                        }
                        break;

                        default:
                            throw new NotImplementedException("This devEnv (" + devEnv + ") is not supported!");
                        }
                    }

                    string executable = Path.Combine("$ExecutableRootPath$", compilerExeName);

                    compilerSettings = new CompilerSettings(compilerName, Platform.win64, extraFiles, executable, pathToCompiler, devEnv, new Dictionary <string, CompilerSettings.Configuration>());
                    masterCompilerSettings.Add(compilerName, compilerSettings);
                }

                return(compilerSettings);
            }
Exemple #6
0
 public FastBuildWindowsCompilerFamilyKey(DevEnv devEnv, Options.Vc.General.PlatformToolset platformToolset)
 {
     DevelopmentEnvironment = devEnv;
     PlatformToolset        = platformToolset;
 }