private static void WriteMasterSettingsSection()

in Sharpmake.Generators/FastBuild/MasterBff.cs [564:709]


        private static void WriteMasterSettingsSection(FileGenerator masterBffGenerator, MasterBffInfo masterBffInfo)
        {
            string cachePath = FileGeneratorUtilities.RemoveLineTag;
            string cachePluginDLL = FileGeneratorUtilities.RemoveLineTag;
            string workerConnectionLimit = FileGeneratorUtilities.RemoveLineTag;
            if (FastBuildSettings.CachePath != null)
            {
                cachePath = ".CachePath = '" + FastBuildSettings.CachePath + "'";

                if (FastBuildSettings.CachePluginDLLFilePath != null)
                    cachePluginDLL = ".CachePluginDLL = '" + FastBuildSettings.CachePluginDLLFilePath + "'";
            }
            if (FastBuildSettings.FastBuildWorkerConnectionLimit >= 0)
            {
                workerConnectionLimit = ".WorkerConnectionLimit = " + FastBuildSettings.FastBuildWorkerConnectionLimit.ToString();
            }

            string additionalGlobalSettings = FileGeneratorUtilities.RemoveLineTag;
            if (FastBuildSettings.AdditionalGlobalSettings.Any())
            {
                additionalGlobalSettings = string.Join(Environment.NewLine, FastBuildSettings.AdditionalGlobalSettings.Select(setting => "    " + setting));
            }

            string fastBuildPATH = FileGeneratorUtilities.RemoveLineTag;
            if (FastBuildSettings.SetPathToResourceCompilerInEnvironment)
            {
                // !FIX FOR LINK : fatal error LNK1158: cannot run rc.exe!
                //
                // link.exe on win64 executes rc.exe by itself on some occasions
                // if it doesn't find it, link errors can occur
                //
                // link.exe will first search rc.exe next to it, and if it fails
                // it will look for it in the folders listed by the PATH
                // environment variable, so we'll try to replicate that process
                // in sharpmake:
                //
                //       1) Get the linker path
                //       2) Look for rc.exe near it
                //       3) If found, exit
                //       4) If not, add a PATH environment variable pointing to the rc.exe folder

                List<Platform> microsoftPlatforms = PlatformRegistry.GetAvailablePlatforms<IMicrosoftPlatformBff>().ToList();
                var resourceCompilerPaths = new Strings();
                foreach (CompilerSettings setting in masterBffInfo.CompilerSettings.Values)
                {
                    if (!microsoftPlatforms.Any(x => setting.PlatformFlags.HasFlag(x)))
                        continue;

                    string defaultResourceCompilerPath = Path.GetDirectoryName(setting.DevEnv.GetWindowsResourceCompiler(Platform.win64));
                    foreach (var configurationPair in setting.Configurations)
                    {
                        var configuration = configurationPair.Value;

                        // check if the configuration has a linker
                        if (configuration.LinkerPath != FileGeneratorUtilities.RemoveLineTag)
                        {
                            // if so, try to find a rc.exe near it
                            if (!File.Exists(Path.Combine(configuration.LinkerPath, "rc.exe")))
                            {
                                // if not found, get the folder of the custom
                                // rc.exe or the default one to add it to PATH
                                if (configuration.ResourceCompiler != FileGeneratorUtilities.RemoveLineTag)
                                    resourceCompilerPaths.Add(Path.GetDirectoryName(configuration.ResourceCompiler));
                                else
                                    resourceCompilerPaths.Add(defaultResourceCompilerPath);
                            }
                        }
                    }
                }

                if (resourceCompilerPaths.Count == 1)
                    fastBuildPATH = Util.GetCapitalizedPath(resourceCompilerPaths.First());
                else if (resourceCompilerPaths.Count > 1)
                    throw new Error("Multiple conflicting resource compilers found in PATH! Please verify your ResourceCompiler settings.");
            }

            var allDevEnv = masterBffInfo.CompilerSettings.Values.Select(s => s.DevEnv).Distinct().ToList();

            string envRemoveGuards = FileGeneratorUtilities.RemoveLineTag;
            string fastBuildEnvironments = string.Empty;

            switch (Util.GetExecutingPlatform())
            {
                case Platform.win64:
                    fastBuildEnvironments += Bff.Template.ConfigurationFile.WinEnvironment;
                    break;
                case Platform.mac:
                    fastBuildEnvironments += Bff.Template.ConfigurationFile.OsxEnvironment;
                    break;
                case Platform.linux:
                    fastBuildEnvironments += Bff.Template.ConfigurationFile.LinuxEnvironment;
                    break;
                default:
                    throw new NotImplementedException($"Environment variables bff config not implemented for platform {Util.GetExecutingPlatform()}");
            }

            string envAdditionalVariables = FileGeneratorUtilities.RemoveLineTag;
            if (FastBuildSettings.AdditionalGlobalEnvironmentVariables.Any())
            {
                envAdditionalVariables = string.Join(Environment.NewLine, FastBuildSettings.AdditionalGlobalEnvironmentVariables.Select(keyValue => $"        \"{keyValue.Key}={keyValue.Value}\""));
            }

            using (masterBffGenerator.Declare("fastBuildProjectName", "Master"))
            {
                masterBffGenerator.Write(Bff.Template.ConfigurationFile.HeaderFile);
            }

            string concurrencyGroupList = FileGeneratorUtilities.RemoveLineTag;
            if (FastBuildSettings.ConcurrencyGroups.Count > 0)
            {
                masterBffGenerator.WriteLine("//------------------------------");
                masterBffGenerator.WriteLine("// Concurrency groups definition");
                masterBffGenerator.WriteLine("//------------------------------");
                List<string> groupSectionList = new List<string>();

                foreach (var group in FastBuildSettings.ConcurrencyGroups)
                {
                    string groupSectionName = $".ConcurrencyGroup{group.Key}";
                    groupSectionList.Add(groupSectionName); 

                    using (masterBffGenerator.Declare("fastBuildConcurrencyGroupName", group.Key))
                    using (masterBffGenerator.Declare("fastBuildConcurrencyGroupSectionName", groupSectionName))
                    using (masterBffGenerator.Declare("fastBuildConcurrencyLimit", group.Value.ConcurrencyLimit.HasValue ? group.Value.ConcurrencyLimit.ToString() : FileGeneratorUtilities.RemoveLineTag))
                    using (masterBffGenerator.Declare("fastBuildConcurrencyPerJobMiB", group.Value.ConcurrencyPerJobMiB.HasValue ? group.Value.ConcurrencyPerJobMiB : FileGeneratorUtilities.RemoveLineTag))
                    {
                        masterBffGenerator.Write(Bff.Template.ConfigurationFile.ConcurrencyGroup);
                    }
                }
                concurrencyGroupList = UtilityMethods.FBuildFormatList(groupSectionList, 4, UtilityMethods.FBuildFormatListOptions.UseCommaBetweenElements);
            }

            using (masterBffGenerator.Declare("CachePath", cachePath))
            using (masterBffGenerator.Declare("CachePluginDLL", cachePluginDLL))
            using (masterBffGenerator.Declare("WorkerConnectionLimit", workerConnectionLimit))
            using (masterBffGenerator.Declare("fastBuildSystemRoot", FastBuildSettings.SystemRoot))
            using (masterBffGenerator.Declare("fastBuildPATH", fastBuildPATH))
            using (masterBffGenerator.Declare("fastBuildAllowDBMigration", FastBuildSettings.FastBuildAllowDBMigration ? "true" : FileGeneratorUtilities.RemoveLineTag))
            using (masterBffGenerator.Declare("AdditionalGlobalSettings", additionalGlobalSettings))
            using (masterBffGenerator.Declare("fastBuildEnvironments", fastBuildEnvironments))
            using (masterBffGenerator.Declare("envRemoveGuards", envRemoveGuards))
            using (masterBffGenerator.Declare("envAdditionalVariables", envAdditionalVariables))
            using (masterBffGenerator.Declare("fastbuildConcurrencyGroupList", concurrencyGroupList))
            {
                masterBffGenerator.Write(Bff.Template.ConfigurationFile.GlobalSettings);
            }
        }