in Sharpmake.Generators/Apple/XCodeProj.cs [281:404]
private FileGenerator InitProjectSchemeGenerator(
List<Project.Configuration> configurations,
string projectFile
)
{
// Setup resolvers
var fileGenerator = new FileGenerator();
var defaultConfiguration = configurations.Where(conf => conf.UseAsDefaultForXCode == true).FirstOrDefault();
Project.Configuration activeConfiguration = defaultConfiguration != null ? defaultConfiguration : configurations[0];
// Build testable elements
var testableTargets = _nativeOrLegacyTargets.Values.Where(target => target.OutputFile.OutputType == Project.Configuration.OutputType.IosTestBundle);
var testableElements = new StringBuilder();
foreach (var target in testableTargets)
{
using (fileGenerator.Declare("projectFile", projectFile))
using (fileGenerator.Declare("item", target))
{
testableElements.Append(fileGenerator.Resolver.Resolve(Template.SchemeTestableReference));
}
}
// Build commandLineArguments
var debugArguments = Options.GetObject<Options.XCode.Scheme.DebugArguments>(activeConfiguration);
var commandLineArguments = new StringBuilder();
if (debugArguments != null)
{
commandLineArguments.Append(Template.CommandLineArgumentsBegin);
foreach(var argument in debugArguments)
{
using (fileGenerator.Declare("argument", argument))
commandLineArguments.Append(fileGenerator.Resolver.Resolve(Template.CommandLineArgument));
}
commandLineArguments.Append(Template.CommandLineArgumentsEnd);
}
else
{
commandLineArguments.Append(RemoveLineTag);
}
// Write the scheme file
var defaultTarget = _nativeOrLegacyTargets.Values.Where(target => target.OutputFile.OutputType != Project.Configuration.OutputType.IosTestBundle).FirstOrDefault();
var options = new Options.ExplicitOptions();
Options.SelectOption(activeConfiguration,
Options.Option(Options.XCode.Compiler.EnableGpuFrameCaptureMode.AutomaticallyEnable, () => options["EnableGpuFrameCaptureMode"] = RemoveLineTag),
Options.Option(Options.XCode.Compiler.EnableGpuFrameCaptureMode.MetalOnly, () => options["EnableGpuFrameCaptureMode"] = "1"),
Options.Option(Options.XCode.Compiler.EnableGpuFrameCaptureMode.OpenGLOnly, () => options["EnableGpuFrameCaptureMode"] = "2"),
Options.Option(Options.XCode.Compiler.EnableGpuFrameCaptureMode.Disable, () => options["EnableGpuFrameCaptureMode"] = "3")
);
// An empty line means ON, "1" means OFF
// https://gitlab.kitware.com/cmake/cmake/-/issues/23857
Options.SelectOption(activeConfiguration,
Options.Option(Options.XCode.Scheme.MetalAPIValidation.Enable, () => options["MetalAPIValidation"] = RemoveLineTag),
Options.Option(Options.XCode.Scheme.MetalAPIValidation.Disable, () => options["MetalAPIValidation"] = "1")
);
options["CustomDirectory"] = Options.PathOption.Get<Options.XCode.Scheme.CustomWorkingDirectory>(activeConfiguration);
var useCustomDirectory = options["CustomDirectory"] != RemoveLineTag ? "YES" : "NO";
options["CustomLLDBInitFile"] = Options.PathOption.Get<Options.XCode.Scheme.CustomLLDBInitFile>(activeConfiguration);
string targetName = $""{activeConfiguration.Target.Name}"";
string buildImplicitDependencies = activeConfiguration.IsFastBuild ? "NO" : "YES";
bool useBuildableProductRunnableSection = true;
string runnableFilePath = string.Empty;
if (activeConfiguration.IsFastBuild && activeConfiguration.Output == Project.Configuration.OutputType.AppleApp && !activeConfiguration.XcodeUseNativeProjectForFastBuildApp)
{
useBuildableProductRunnableSection = false;
var customRunnablePath = Options.GetObject<Options.XCode.Scheme.CustomRunnablePath>(activeConfiguration);
if (customRunnablePath != null)
runnableFilePath = customRunnablePath.Path;
else
runnableFilePath = Path.Combine(activeConfiguration.TargetPath, activeConfiguration.TargetFileFullNameWithExtension);
}
var environmentVariables = Options.GetObject<Options.XCode.Scheme.EnvironmentVariables>(activeConfiguration);
var environmentVariablesBuilder = new StringBuilder();
if (environmentVariables != null)
{
environmentVariablesBuilder.Append(Template.EnvironmentVariablesBegin);
foreach (var variable in environmentVariables.Variables)
{
using (fileGenerator.Declare("name", variable.Key))
using (fileGenerator.Declare("value", variable.Value))
{
environmentVariablesBuilder.Append(fileGenerator.Resolver.Resolve(Template.EnvironmentVariable));
}
}
environmentVariablesBuilder.Append(Template.EnvironmentVariablesEnd);
}
else
{
environmentVariablesBuilder.Append(RemoveLineTag);
}
using (fileGenerator.Declare("projectFile", projectFile))
using (fileGenerator.Declare("item", defaultTarget))
using (fileGenerator.Declare("options", options))
using (fileGenerator.Declare("testableElements", testableElements))
using (fileGenerator.Declare("DefaultTarget", targetName))
using (fileGenerator.Declare("UseCustomDir", useCustomDirectory))
using (fileGenerator.Declare("commandLineArguments", commandLineArguments))
using (fileGenerator.Declare("environmentVariables", environmentVariablesBuilder))
using (fileGenerator.Declare("buildImplicitDependencies", buildImplicitDependencies))
using (fileGenerator.Declare("runnableFilePath", runnableFilePath))
using (fileGenerator.Declare("project", activeConfiguration.Project))
using (fileGenerator.Declare("target", activeConfiguration.Target))
using (fileGenerator.Declare("conf", activeConfiguration))
{
fileGenerator.Write(Template.SchemeFileTemplatePart1);
if (useBuildableProductRunnableSection)
fileGenerator.Write(Template.SchemeRunnableNativeProject);
else
fileGenerator.Write(Template.SchemeRunnableMakeFileProject);
fileGenerator.Write(Template.SchemeFileTemplatePart2);
}
// Remove all line that contain RemoveLineTag
fileGenerator.RemoveTaggedLines();
return fileGenerator;
}