private FileGenerator InitProjectSchemeGenerator()

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 = $"&quot;{activeConfiguration.Target.Name}&quot;";
            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;
        }