FindLibraryInLibrarySearchPaths( XcodeBuilder.Target target, C.ICommonLinkerSettings settings, string libname) { foreach (var searchPath in settings.LibraryPaths) { var realSearchpath = searchPath.Parse(); // some lib paths might not exist yet if (!System.IO.Directory.Exists(realSearchpath)) { continue; } var results = SearchForLibraryPath(realSearchpath, libname); if (null != results) { return(CreateLinkableReferences( target, results.Item1, results.Item2, XcodeBuilder.FileReference.ESourceTree.Absolute)); } } return(null); }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.StringArray commandLine) { var module = (settings as Bam.Core.Settings).Module; switch (settings.OutputType) { case C.ELinkerOutput.Executable: commandLine.Add(System.String.Format("-OUT:{0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToString())); break; case C.ELinkerOutput.DynamicLibrary: commandLine.Add("-DLL"); commandLine.Add(System.String.Format("-OUT:{0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToString())); break; } foreach (var path in settings.LibraryPaths) { commandLine.Add(System.String.Format("-LIBPATH:{0}", path.ParseAndQuoteIfNecessary())); } foreach (var path in settings.Libraries) { commandLine.Add(path); } if (settings.DebugSymbols) { commandLine.Add("-DEBUG"); if (null != module.GeneratedPaths[C.ConsoleApplication.PDBKey]) { commandLine.Add(System.String.Format("-PDB:{0}", module.GeneratedPaths[C.ConsoleApplication.PDBKey].Parse())); } } }
Defaults( this C.ICommonLinkerSettings settings, Bam.Core.Module module) { settings.Bits = (module as CModule).BitDepth; settings.OutputType = ELinkerOutput.Executable; settings.LibraryPaths = new Bam.Core.TokenizedStringArray(); settings.Libraries = new Bam.Core.StringArray(); settings.DebugSymbols = (module.BuildEnvironment.Configuration == Bam.Core.EConfiguration.Debug || module.BuildEnvironment.Configuration == Bam.Core.EConfiguration.Profile); }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.StringArray commandLine) { var module = (settings as Bam.Core.Settings).Module; switch (settings.Bits) { case C.EBit.SixtyFour: commandLine.Add("-m64"); break; case C.EBit.ThirtyTwo: commandLine.Add("-m32"); break; default: throw new Bam.Core.Exception("Unknown machine bit size, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: commandLine.Add(System.String.Format("-o {0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToStringQuoteIfNecessary())); break; case C.ELinkerOutput.DynamicLibrary: { commandLine.Add("-shared"); commandLine.Add(System.String.Format("-o {0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToStringQuoteIfNecessary())); // ensure that the NEEDED flag is set to the expected symlink for the shared object if (module.Macros.Contains("SOName")) { var soName = module.Macros["SOName"].ToString(); commandLine.Add(System.String.Format("-Wl,-soname,{0}", soName)); } } break; } foreach (var path in settings.LibraryPaths.ToEnumerableWithoutDuplicates()) { commandLine.Add(System.String.Format("-L{0}", path.ToStringQuoteIfNecessary())); } foreach (var path in settings.Libraries) { commandLine.Add(path); } if (settings.DebugSymbols) { commandLine.Add("-g"); } }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.StringArray commandLine) { var module = (settings as Bam.Core.Settings).Module; switch (settings.Bits) { case C.EBit.SixtyFour: commandLine.Add("-arch x86_64"); break; case C.EBit.ThirtyTwo: commandLine.Add("-arch i386"); break; default: throw new Bam.Core.Exception("Unknown bit depth, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: commandLine.Add(System.String.Format("-o {0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToStringQuoteIfNecessary())); break; case C.ELinkerOutput.DynamicLibrary: { commandLine.Add("-dynamiclib"); commandLine.Add(System.String.Format("-o {0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToStringQuoteIfNecessary())); var fullVersionNumber = module.CreateTokenizedString("$(MajorVersion).$(MinorVersion)#valid(.$(PatchVersion))"); fullVersionNumber.Parse(); var versionString = fullVersionNumber.ToString(); commandLine.Add(System.String.Format("-current_version {0}", versionString)); // TODO: offer an option of setting the compatibility version differently commandLine.Add(System.String.Format("-compatibility_version {0}", versionString)); } break; } foreach (var path in settings.LibraryPaths.ToEnumerableWithoutDuplicates()) { commandLine.Add(System.String.Format("-L{0}", path.ToStringQuoteIfNecessary())); } foreach (var path in settings.Libraries) { commandLine.Add(path); } if (settings.DebugSymbols) { commandLine.Add("-g"); } }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.Module module, VSSolutionBuilder.VSSettingsGroup vsSettingsGroup, string condition) { switch (settings.Bits) { case C.EBit.ThirtyTwo: vsSettingsGroup.AddSetting("TargetMachine", "MachineX86", condition); break; case C.EBit.SixtyFour: vsSettingsGroup.AddSetting("TargetMachine", "MachineX64", condition); break; default: throw new Bam.Core.Exception("Unknown machine bit depth, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: { var outPath = module.GeneratedPaths[C.ConsoleApplication.Key].Parse(); vsSettingsGroup.AddSetting("OutputFile", System.String.Format("$(OutDir)\\{0}", System.IO.Path.GetFileName(outPath)), condition); } break; case C.ELinkerOutput.DynamicLibrary: { var outPath = module.GeneratedPaths[C.DynamicLibrary.Key].Parse(); vsSettingsGroup.AddSetting("OutputFile", System.String.Format("$(OutDir)\\{0}", System.IO.Path.GetFileName(outPath)), condition); var importPath = module.GeneratedPaths[C.DynamicLibrary.ImportLibraryKey].ToString(); vsSettingsGroup.AddSetting("ImportLibrary", System.String.Format("$(OutDir)\\{0}", System.IO.Path.GetFileName(importPath)), condition); } break; } vsSettingsGroup.AddSetting("AdditionalLibraryDirectories", settings.LibraryPaths, condition); vsSettingsGroup.AddSetting("AdditionalDependencies", settings.Libraries, condition); if (settings.DebugSymbols) { vsSettingsGroup.AddSetting("GenerateDebugInformation", true, condition); if (null != module.GeneratedPaths[C.ConsoleApplication.PDBKey]) { vsSettingsGroup.AddSetting("ProgramDatabaseFile", module.GeneratedPaths[C.ConsoleApplication.PDBKey], condition, isPath: true); } } }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.StringArray commandLine) { var module = (settings as Bam.Core.Settings).Module; switch (settings.Bits) { case C.EBit.ThirtyTwo: commandLine.Add("-MACHINE:X86"); break; case C.EBit.SixtyFour: commandLine.Add("-MACHINE:X64"); break; default: throw new Bam.Core.Exception("Unknown machine bit depth, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: commandLine.Add(System.String.Format("-OUT:{0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToStringQuoteIfNecessary())); break; case C.ELinkerOutput.DynamicLibrary: commandLine.Add("-DLL"); commandLine.Add(System.String.Format("-OUT:{0}", module.GeneratedPaths[C.DynamicLibrary.Key].ToStringQuoteIfNecessary())); commandLine.Add(System.String.Format("-IMPLIB:{0}", module.GeneratedPaths[C.DynamicLibrary.ImportLibraryKey].ToStringQuoteIfNecessary())); break; } foreach (var path in settings.LibraryPaths.ToEnumerableWithoutDuplicates()) { commandLine.Add(System.String.Format("-LIBPATH:{0}", path.ToStringQuoteIfNecessary())); } foreach (var path in settings.Libraries) { commandLine.Add(path); } if (settings.DebugSymbols) { commandLine.Add("-DEBUG"); if (null != module.GeneratedPaths[C.ConsoleApplication.PDBKey]) { commandLine.Add(System.String.Format("-PDB:{0}", module.GeneratedPaths[C.ConsoleApplication.PDBKey].ToStringQuoteIfNecessary())); } } }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.StringArray commandLine) { var module = (settings as Bam.Core.Settings).Module; switch (settings.Bits) { case C.EBit.ThirtyTwo: commandLine.Add("-m32"); break; case C.EBit.SixtyFour: commandLine.Add("-m64"); break; default: throw new Bam.Core.Exception("Unknown machine bit depth, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: commandLine.Add(System.String.Format("-o {0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToString())); break; case C.ELinkerOutput.DynamicLibrary: commandLine.Add("-shared"); commandLine.Add(System.String.Format("-o {0}", module.GeneratedPaths[C.ConsoleApplication.Key].ToString())); commandLine.Add(System.String.Format("-Wl,--out-implib,{0}", module.GeneratedPaths[C.DynamicLibrary.ImportLibraryKey].ToString())); break; } foreach (var path in settings.LibraryPaths) { commandLine.Add(System.String.Format("-L{0}", path.ParseAndQuoteIfNecessary())); } foreach (var path in settings.Libraries) { commandLine.Add(path); } if (settings.DebugSymbols) { commandLine.Add("-g"); } }
FindLibraryInSDKSearchPaths( XcodeBuilder.Target target, C.ICommonLinkerSettings settings, string libname) { var meta = Bam.Core.Graph.Instance.PackageMetaData <Clang.MetaData>("Clang"); var searchPath = System.String.Format("{0}/usr/lib", meta.SDKPath); var results = SearchForLibraryPath(searchPath, libname); if (null != results) { return(CreateLinkableReferences( target, results.Item1.Replace(meta.SDKPath, string.Empty).TrimStart(new [] { '/' }), results.Item2, XcodeBuilder.FileReference.ESourceTree.SDKRoot)); } return(null); }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.Module module, VSSolutionBuilder.VSSettingsGroup vsSettingsGroup, string condition) { switch (settings.OutputType) { case C.ELinkerOutput.Executable: { var outPath = module.GeneratedPaths[C.ConsoleApplication.Key].Parse(); vsSettingsGroup.AddSetting("OutputFile", System.String.Format("$(OutDir)\\{0}", System.IO.Path.GetFileName(outPath)), condition); } break; case C.ELinkerOutput.DynamicLibrary: { var outPath = module.GeneratedPaths[C.DynamicLibrary.Key].Parse(); vsSettingsGroup.AddSetting("OutputFile", System.String.Format("$(OutDir)\\{0}", System.IO.Path.GetFileName(outPath)), condition); var importPath = module.GeneratedPaths[C.DynamicLibrary.ImportLibraryKey].ToString(); vsSettingsGroup.AddSetting("ImportLibrary", System.String.Format("$(OutDir)\\{0}", System.IO.Path.GetFileName(importPath)), condition); } break; } vsSettingsGroup.AddSetting("AdditionalLibraryDirectories", settings.LibraryPaths, condition); vsSettingsGroup.AddSetting("AdditionalDependencies", settings.Libraries, condition); if (settings.DebugSymbols) { vsSettingsGroup.AddSetting("GenerateDebugInformation", true, condition); if (null != module.GeneratedPaths[C.ConsoleApplication.PDBKey]) { vsSettingsGroup.AddSetting("ProgramDatabaseFile", module.GeneratedPaths[C.ConsoleApplication.PDBKey], condition); } } }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { switch (settings.Bits) { case C.EBit.ThirtyTwo: { configuration["VALID_ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("i386"); configuration["ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("$(ARCHS_STANDARD_32_BIT)"); } break; case C.EBit.SixtyFour: { configuration["VALID_ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("x86_64"); configuration["ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("$(ARCHS_STANDARD_64_BIT)"); } break; default: throw new Bam.Core.Exception("Unknown bit depth, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: { configuration["EXECUTABLE_PREFIX"] = new XcodeBuilder.UniqueConfigurationValue(string.Empty); var ext = module.CreateTokenizedString("$(exeext)").Parse().TrimStart(new [] { '.' }); configuration["EXECUTABLE_EXTENSION"] = new XcodeBuilder.UniqueConfigurationValue(ext); } break; case C.ELinkerOutput.DynamicLibrary: { if ((module is C.Plugin) || (module is C.Cxx.Plugin)) { var prefix = module.CreateTokenizedString("$(pluginprefix)").Parse(); configuration["EXECUTABLE_PREFIX"] = new XcodeBuilder.UniqueConfigurationValue(prefix); var ext = module.CreateTokenizedString("$(pluginext)").Parse().TrimStart(new [] { '.' }); configuration["EXECUTABLE_EXTENSION"] = new XcodeBuilder.UniqueConfigurationValue(ext); } else { var prefix = module.CreateTokenizedString("$(dynamicprefix)").Parse(); configuration["EXECUTABLE_PREFIX"] = new XcodeBuilder.UniqueConfigurationValue(prefix); var ext = module.CreateTokenizedString("$(dynamicextonly)").Parse().TrimStart(new [] { '.' }); configuration["EXECUTABLE_EXTENSION"] = new XcodeBuilder.UniqueConfigurationValue(ext); } configuration["MACH_O_TYPE"] = new XcodeBuilder.UniqueConfigurationValue("mh_dylib"); var versionString = module.CreateTokenizedString("$(MajorVersion).$(MinorVersion)#valid(.$(PatchVersion))").Parse(); configuration["DYLIB_CURRENT_VERSION"] = new XcodeBuilder.UniqueConfigurationValue(versionString); configuration["DYLIB_COMPATIBILITY_VERSION"] = new XcodeBuilder.UniqueConfigurationValue(versionString); } break; } if (settings.LibraryPaths.Count > 0) { var option = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.LibraryPaths) { var fullPath = path.Parse(); var relPath = Bam.Core.RelativePathUtilities.GetPath(fullPath, configuration.Project.SourceRoot); if (Bam.Core.RelativePathUtilities.IsPathAbsolute(relPath)) { option.Add(fullPath); } else { option.Add(System.String.Format("$(SRCROOT)/{0}", relPath)); } } configuration["LIBRARY_SEARCH_PATHS"] = option; } foreach (var path in settings.Libraries) { var workspace = Bam.Core.Graph.Instance.MetaData as XcodeBuilder.WorkspaceMeta; var encapsulating = module.GetEncapsulatingReferencedModule(); var target = workspace.EnsureTargetExists(encapsulating); var libname = path.Replace("-l", string.Empty); // need to find where this library is because Xcode requires a path to it // first check all of the library paths var buildFile = FindLibraryInLibrarySearchPaths(target, settings, libname); if (null == buildFile) { // no match, so try the current SDK path buildFile = FindLibraryInSDKSearchPaths(target, settings, libname); if (null == buildFile) { throw new Bam.Core.Exception("Unable to find library {0} on any search path or in the SDK", path); } } } if (settings.DebugSymbols) { var option = new XcodeBuilder.MultiConfigurationValue(); option.Add("-g"); configuration["OTHER_LDFLAGS"] = option; } }
Convert( this C.ICommonLinkerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { switch (settings.Bits) { case C.EBit.ThirtyTwo: { configuration["VALID_ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("i386"); configuration["ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("$(ARCHS_STANDARD_32_BIT)"); } break; case C.EBit.SixtyFour: { configuration["VALID_ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("x86_64"); configuration["ARCHS"] = new XcodeBuilder.UniqueConfigurationValue("$(ARCHS_STANDARD_64_BIT)"); } break; default: throw new Bam.Core.Exception("Unknown bit depth, {0}", settings.Bits.ToString()); } switch (settings.OutputType) { case C.ELinkerOutput.Executable: { configuration["EXECUTABLE_PREFIX"] = new XcodeBuilder.UniqueConfigurationValue(string.Empty); var ext = module.CreateTokenizedString("$(exeext)").Parse().TrimStart(new [] { '.' }); configuration["EXECUTABLE_EXTENSION"] = new XcodeBuilder.UniqueConfigurationValue(ext); } break; case C.ELinkerOutput.DynamicLibrary: { if ((module is C.Plugin) || (module is C.Cxx.Plugin)) { var prefix = module.CreateTokenizedString("$(pluginprefix)").Parse(); configuration["EXECUTABLE_PREFIX"] = new XcodeBuilder.UniqueConfigurationValue(prefix); var ext = module.CreateTokenizedString("$(pluginext)").Parse().TrimStart(new [] { '.' }); configuration["EXECUTABLE_EXTENSION"] = new XcodeBuilder.UniqueConfigurationValue(ext); } else { var prefix = module.CreateTokenizedString("$(dynamicprefix)").Parse(); configuration["EXECUTABLE_PREFIX"] = new XcodeBuilder.UniqueConfigurationValue(prefix); var ext = module.CreateTokenizedString("$(dynamicextonly)").Parse().TrimStart(new [] { '.' }); configuration["EXECUTABLE_EXTENSION"] = new XcodeBuilder.UniqueConfigurationValue(ext); } configuration["MACH_O_TYPE"] = new XcodeBuilder.UniqueConfigurationValue("mh_dylib"); var versionString = module.CreateTokenizedString("$(MajorVersion).$(MinorVersion)#valid(.$(PatchVersion))").Parse(); configuration["DYLIB_CURRENT_VERSION"] = new XcodeBuilder.UniqueConfigurationValue(versionString); configuration["DYLIB_COMPATIBILITY_VERSION"] = new XcodeBuilder.UniqueConfigurationValue(versionString); } break; } if (settings.LibraryPaths.Count > 0) { var option = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.LibraryPaths) { option.Add(path.Parse()); } configuration["LIBRARY_SEARCH_PATHS"] = option; } if (settings.DebugSymbols) { var option = new XcodeBuilder.MultiConfigurationValue(); option.Add("-g"); configuration["OTHER_LDFLAGS"] = option; } }