public virtual void SelectLinkerOptions()

in Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs [1363:1455]


        public virtual void SelectLinkerOptions(IGenerationContext context)
        {
            var options = context.Options;
            var cmdLineOptions = context.CommandLineOptions;
            var conf = context.Configuration;
            var platform = context.Configuration.Platform;

            switch (conf.Output)
            {
                case Project.Configuration.OutputType.Dll:
                case Project.Configuration.OutputType.AppleApp:
                case Project.Configuration.OutputType.Exe:
                case Project.Configuration.OutputType.AppleFramework:
                    if (context.Options["GenerateMapFile"] == "true")
                    {
                        string mapFileArg = context.CommandLineOptions["GenerateMapFile"];
                        string mapOption = $"{platform.GetLinkerOptionPrefix()}-Map=";
                        if (!mapFileArg.StartsWith(mapOption, StringComparison.Ordinal))
                            throw new Error("Map file argument was supposed to start with -Wl,-Map= but it changed! Please update this module!");
                        cmdLineOptions["GenerateMapFile"] = (IsLinkerInvokedViaCompiler ? "-Wl,-map," : "-map ") + cmdLineOptions["GenerateMapFile"].Substring(mapOption.Length);
                    }
                    break;
                default:
                    break;
            }

            // TODO: implement me
            cmdLineOptions["UseThinArchives"] = "";

            context.SelectOption(
                Options.Option(Options.XCode.Linker.StripLinkedProduct.Disable, () => options["StripLinkedProduct"] = "NO"),
                Options.Option(Options.XCode.Linker.StripLinkedProduct.Enable, () => options["StripLinkedProduct"] = "YES")
            );

            context.SelectOption(
                Options.Option(Options.XCode.Linker.StripStyle.AllSymbols, () => options["StripStyle"] = "all"),
                Options.Option(Options.XCode.Linker.StripStyle.NonGlobalSymbols, () => options["StripStyle"] = "non-global"),
                Options.Option(Options.XCode.Linker.StripStyle.DebuggingSymbolsOnly, () => options["StripStyle"] = "debugging")
            );

            context.SelectOption(
                Options.Option(Options.XCode.Linker.StripSwiftSymbols.Disable, () => options["StripSwiftSymbols"] = "NO"),
                Options.Option(Options.XCode.Linker.StripSwiftSymbols.Enable, () => options["StripSwiftSymbols"] = "YES")
            );

            options["AdditionalStripFlags"] = XCodeUtil.ResolveProjectVariable(context.Project, Options.StringOption.Get<Options.XCode.Linker.AdditionalStripFlags>(conf));

            context.SelectOption(
                Options.Option(Options.XCode.Linker.PerformSingleObjectPrelink.Disable, () => options["GenerateMasterObjectFile"] = "NO"),
                Options.Option(Options.XCode.Linker.PerformSingleObjectPrelink.Enable, () => options["GenerateMasterObjectFile"] = "YES")
            );

            options["PreLinkedLibraries"] = FileGeneratorUtilities.RemoveLineTag;

            var prelinkedLibrary = Options.XCode.Linker.PrelinkLibraries.Get<Options.XCode.Linker.PrelinkLibraries>(conf);
            if (!string.IsNullOrEmpty(prelinkedLibrary))
            {
                // xcode for some reason does not use arrays for this setting but space separated values
                options["PreLinkedLibraries"] = prelinkedLibrary;
            }

            var dylibInstallName = XCodeUtil.ResolveProjectVariable(context.Project, Options.StringOption.Get<Options.XCode.Linker.DyLibInstallName>(conf));
            if (!string.IsNullOrEmpty(dylibInstallName))
            {
                cmdLineOptions["DyLibInstallName"] = $"-install_name \"{dylibInstallName}\"";
            }

            OrderableStrings systemFrameworks = new OrderableStrings(conf.XcodeSystemFrameworks);
            systemFrameworks.AddRange(conf.XcodeDependenciesSystemFrameworks);
            cmdLineOptions["SystemFrameworks"] = systemFrameworks.Any() ? "-framework " + systemFrameworks.JoinStrings(" -framework ") : FileGeneratorUtilities.RemoveLineTag;

            OrderableStrings developerFrameworks = new OrderableStrings(conf.XcodeDeveloperFrameworks);
            developerFrameworks.AddRange(conf.XcodeDependenciesDeveloperFrameworks);
            cmdLineOptions["DeveloperFrameworks"] = developerFrameworks.Any() ? "-framework " + developerFrameworks.JoinStrings(" -framework ") : FileGeneratorUtilities.RemoveLineTag;

            OrderableStrings userFrameworks = new OrderableStrings(conf.XcodeUserFrameworks);
            userFrameworks.AddRange(conf.XcodeDependenciesUserFrameworks);
            cmdLineOptions["UserFrameworks"] = userFrameworks.Any() ? "-framework " + userFrameworks.JoinStrings(" -framework ") : FileGeneratorUtilities.RemoveLineTag;

            OrderableStrings embeddedFrameworks = new OrderableStrings(conf.XcodeEmbeddedFrameworks);
            embeddedFrameworks.AddRange(conf.XcodeDependenciesEmbeddedFrameworks);
            cmdLineOptions["EmbeddedFrameworks"] = embeddedFrameworks.Any() ? "-framework " + embeddedFrameworks.JoinStrings(" -framework ") : FileGeneratorUtilities.RemoveLineTag;

            OrderableStrings systemFrameworkPaths = new OrderableStrings(conf.XcodeSystemFrameworkPaths);
            systemFrameworkPaths.AddRange(conf.XcodeDependenciesSystemFrameworkPaths);
            cmdLineOptions["CompilerSystemFrameworkPaths"] = systemFrameworkPaths.Any() ? "-iframework " + systemFrameworkPaths.JoinStrings(" -iframework ") : FileGeneratorUtilities.RemoveLineTag;
            cmdLineOptions["LinkerSystemFrameworkPaths"] = systemFrameworkPaths.Any() ? "-F " + systemFrameworkPaths.JoinStrings(" -F ") : FileGeneratorUtilities.RemoveLineTag;

            OrderableStrings frameworkPaths = new OrderableStrings(conf.XcodeFrameworkPaths);
            frameworkPaths.AddRange(conf.XcodeDependenciesFrameworkPaths);
            cmdLineOptions["CompilerFrameworkPaths"] = frameworkPaths.Any() ? "-F " + frameworkPaths.JoinStrings(" -F ") : FileGeneratorUtilities.RemoveLineTag;
            cmdLineOptions["LinkerFrameworkPaths"] = frameworkPaths.Any() ? "-F " + frameworkPaths.JoinStrings(" -F ") : FileGeneratorUtilities.RemoveLineTag;
        }