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