Convert( this C.ICommonAssemblerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { configuration["GCC_GENERATE_DEBUGGING_SYMBOLS"] = new XcodeBuilder.UniqueConfigurationValue(settings.DebugSymbols ? "YES" : "NO"); if (settings.IncludePaths.Count > 0) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.IncludePaths) { var fullPath = path.Parse(); var relPath = Bam.Core.RelativePathUtilities.GetPath(fullPath, configuration.Project.SourceRoot); if (Bam.Core.RelativePathUtilities.IsPathAbsolute(relPath)) { paths.Add(fullPath); } else { paths.Add(System.String.Format("$(SRCROOT)/{0}", relPath)); } } configuration["USER_HEADER_SEARCH_PATHS"] = paths; } if (settings.PreprocessorDefines.Count > 0) { var defines = new XcodeBuilder.MultiConfigurationValue(); foreach (var define in settings.PreprocessorDefines) { if (System.String.IsNullOrEmpty(define.Value)) { defines.Add(define.Key); } else { var value = define.Value; if (value.Contains("\"")) { // note the number of back slashes here // required to get \\\" for each " in the original value value = value.Replace("\"", "\\\\\\\""); } defines.Add(System.String.Format("{0}={1}", define.Key, value)); } } configuration["GCC_PREPROCESSOR_DEFINITIONS"] = defines; } configuration["GCC_TREAT_WARNINGS_AS_ERRORS"] = new XcodeBuilder.UniqueConfigurationValue(settings.WarningsAsErrors ? "YES" : "NO"); }
Convert( this C.IAdditionalSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { var extraSettings = new XcodeBuilder.MultiConfigurationValue(); foreach (var extra in settings.AdditionalSettings) { // any extra arguments separated by spaces splits them onto separate lines in the project file var split = extra.Split(' '); foreach (var s in split) { extraSettings.Add(s); } } if (settings is Clang.CxxCompilerSettings) { configuration["OTHER_CPLUSPLUSFLAGS"] = extraSettings; } else { configuration["OTHER_CFLAGS"] = extraSettings; } }
Convert( this ClangCommon.ICommonCompilerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.AllWarnings.HasValue) { var warnings = new XcodeBuilder.MultiConfigurationValue(); if (settings.AllWarnings.Value) { warnings.Add("-Wall"); } else { warnings.Add("-Wno-all"); } configuration["WARNING_CFLAGS"] = warnings; } if (settings.ExtraWarnings.HasValue) { var warnings = new XcodeBuilder.MultiConfigurationValue(); if (settings.ExtraWarnings.Value) { warnings.Add("-Wextra"); } else { warnings.Add("-Wno-extra"); } configuration["WARNING_CFLAGS"] = warnings; } if (settings.Pedantic.HasValue) { configuration["GCC_WARN_PEDANTIC"] = new XcodeBuilder.UniqueConfigurationValue(settings.Pedantic.Value ? "YES" : "NO"); } if (settings.Visibility.HasValue) { configuration["GCC_SYMBOLS_PRIVATE_EXTERN"] = new XcodeBuilder.UniqueConfigurationValue((settings.Visibility.Value == EVisibility.Default) ? "NO" : "YES"); } if (settings.StrictAliasing.HasValue) { configuration["GCC_STRICT_ALIASING"] = new XcodeBuilder.UniqueConfigurationValue(settings.StrictAliasing.Value ? "YES" : "NO"); } }
Convert( this C.IAdditionalSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { var extraSettings = new XcodeBuilder.MultiConfigurationValue(); foreach (var extra in settings.AdditionalSettings) { extraSettings.Add(extra); } configuration["OTHER_LDFLAGS"] = extraSettings; }
Convert( this C.ICommonLinkerSettingsOSX settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.Frameworks.Count > 0) { var target = module.MetaData as XcodeBuilder.Target; var project = target.Project; foreach (var framework in settings.Frameworks.ToEnumerableWithoutDuplicates()) { var frameworkFileRefPath = framework; var isAbsolute = System.IO.Path.IsPathRooted(frameworkFileRefPath.ToString()); if (!isAbsolute) { // TODO: change to a positional token // assume it's a system framework frameworkFileRefPath = Bam.Core.TokenizedString.Create("/System/Library/Frameworks/$(0).framework", null, new Bam.Core.TokenizedStringArray(framework)); if (!frameworkFileRefPath.IsParsed) { frameworkFileRefPath.Parse(); } } var buildFile = target.EnsureFrameworksBuildFileExists( frameworkFileRefPath, XcodeBuilder.FileReference.EFileType.WrapperFramework); project.MainGroup.AddChild(buildFile.FileRef); } } if (settings.FrameworkSearchPaths.Count > 0) { var option = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.FrameworkSearchPaths.ToEnumerableWithoutDuplicates()) { option.Add(path.ToString()); } configuration["FRAMEWORK_SEARCH_PATHS"] = option; } if (null != settings.InstallName) { if (module is C.IDynamicLibrary) { configuration["LD_DYLIB_INSTALL_NAME"] = new XcodeBuilder.UniqueConfigurationValue(settings.InstallName.ToString()); } } // settings.MinimumVersionSupported is dealt with in XcodeBuilder as there is not a difference // between compiler and linker setting in the project }
Convert( this ICommonLinkerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.RPath.Count > 0) { var option = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.RPath) { option.Add(path.Parse()); } configuration["LD_RUNPATH_SEARCH_PATHS"] = option; } }
Convert( this C.ICommonLinkerSettingsOSX settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.Frameworks.Count > 0) { var target = module.MetaData as XcodeBuilder.Target; var project = target.Project; foreach (var framework in settings.Frameworks) { var frameworkFileRefPath = framework; var isAbsolute = System.IO.Path.IsPathRooted(frameworkFileRefPath.Parse()); if (!isAbsolute) { // TODO: change to a positional token // assume it's a system framework frameworkFileRefPath = Bam.Core.TokenizedString.Create("/System/Library/Frameworks/$(0).framework", null, new Bam.Core.TokenizedStringArray(framework)); } var buildFile = target.EnsureFrameworksBuildFileExists( frameworkFileRefPath, XcodeBuilder.FileReference.EFileType.WrapperFramework); project.MainGroup.AddChild(buildFile.FileRef); } } if (settings.FrameworkSearchPaths.Count > 0) { var option = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.FrameworkSearchPaths) { option.Add(path.Parse()); } configuration["FRAMEWORK_SEARCH_PATHS"] = option; } if (null != settings.InstallName) { if (module is C.IDynamicLibrary) { configuration["LD_DYLIB_INSTALL_NAME"] = new XcodeBuilder.UniqueConfigurationValue(settings.InstallName.Parse()); } } // settings.MinimumVersionSupported is dealt with in XcodeBuilder as there is not a difference // between compiler and linker setting in the project }
Convert( this C.ICommonCompilerSettingsOSX settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (null != settings.FrameworkSearchPaths) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.FrameworkSearchPaths) { paths.Add(path.ToString()); } configuration["FRAMEWORK_SEARCH_PATHS"] = paths; } // settings.MinimumVersionSupported is dealt with in XcodeBuilder as there is not a difference // between compiler and linker setting in the project }
Convert( this C.IAdditionalSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { var extraSettings = new XcodeBuilder.MultiConfigurationValue(); foreach (var extra in settings.AdditionalSettings) { extraSettings.Add(extra); } if (settings is Clang.CxxCompilerSettings) { configuration["OTHER_CPLUSPLUSFLAGS"] = extraSettings; } else { configuration["OTHER_CFLAGS"] = extraSettings; } }
Convert( this ClangCommon.ICommonCompilerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.AllWarnings.HasValue) { if (settings.AllWarnings.Value) { var warnings = new XcodeBuilder.MultiConfigurationValue(); warnings.Add("-Wall"); configuration["WARNING_CFLAGS"] = warnings; } } if (settings.ExtraWarnings.HasValue) { if (settings.ExtraWarnings.Value) { var warnings = new XcodeBuilder.MultiConfigurationValue(); warnings.Add("-Wextra"); configuration["WARNING_CFLAGS"] = warnings; } } if (settings.Pedantic.HasValue) { configuration["GCC_WARN_PEDANTIC"] = new XcodeBuilder.UniqueConfigurationValue(settings.Pedantic.Value ? "YES" : "NO"); } if (settings.Visibility.HasValue) { configuration["GCC_SYMBOLS_PRIVATE_EXTERN"] = new XcodeBuilder.UniqueConfigurationValue((settings.Visibility.Value == EVisibility.Default) ? "NO" : "YES"); } if (settings.StrictAliasing.HasValue) { configuration["GCC_STRICT_ALIASING"] = new XcodeBuilder.UniqueConfigurationValue(settings.StrictAliasing.Value ? "YES" : "NO"); } }
IArchivingPolicy.Archive( StaticLibrary sender, Bam.Core.ExecutionContext context, Bam.Core.TokenizedString libraryPath, System.Collections.ObjectModel.ReadOnlyCollection <Bam.Core.Module> objectFiles, System.Collections.ObjectModel.ReadOnlyCollection <Bam.Core.Module> headers) { if (0 == objectFiles.Count) { return; } var workspace = Bam.Core.Graph.Instance.MetaData as XcodeBuilder.WorkspaceMeta; var target = workspace.EnsureTargetExists(sender); target.EnsureOutputFileReferenceExists( sender.CreateTokenizedString("@filename($(0))", libraryPath), XcodeBuilder.FileReference.EFileType.Archive, XcodeBuilder.Target.EProductType.StaticLibrary); var configuration = target.GetConfiguration(sender); if (sender.Macros["OutputName"].Equals(sender.Macros["modulename"])) { configuration.SetProductName(Bam.Core.TokenizedString.CreateVerbatim("${TARGET_NAME}")); } else { configuration.SetProductName(sender.Macros["OutputName"]); } foreach (var header in headers) { target.EnsureHeaderFileExists((header as HeaderFile).InputPath); } var excludedSource = new XcodeBuilder.MultiConfigurationValue(); var realObjectFiles = objectFiles.Where(item => !(item is AssembledObjectFile)); // C,C++,ObjC,ObjC++ if (realObjectFiles.Any()) { var xcodeConvertParameterTypes = new Bam.Core.TypeArray { typeof(Bam.Core.Module), typeof(XcodeBuilder.Configuration) }; var sharedSettings = C.SettingsBase.SharedSettings( realObjectFiles, typeof(ClangCommon.XcodeCompilerImplementation), typeof(XcodeProjectProcessor.IConvertToProject), xcodeConvertParameterTypes); (sharedSettings as XcodeProjectProcessor.IConvertToProject).Convert(sender, configuration); foreach (var objFile in realObjectFiles) { if (!(objFile as C.ObjectFileBase).PerformCompilation) { var fullPath = (objFile as C.ObjectFileBase).InputPath.Parse(); var filename = System.IO.Path.GetFileName(fullPath); excludedSource.Add(filename); } var buildFile = objFile.MetaData as XcodeBuilder.BuildFile; var deltaSettings = (objFile.Settings as C.SettingsBase).CreateDeltaSettings(sharedSettings, objFile); if (null != deltaSettings) { var commandLine = new Bam.Core.StringArray(); (deltaSettings as CommandLineProcessor.IConvertToCommandLine).Convert(commandLine); if (commandLine.Count > 0) { // Cannot set per-file-per-configuration settings, so blend them together if (null == buildFile.Settings) { buildFile.Settings = commandLine; } else { buildFile.Settings.AddRangeUnique(commandLine); } } } configuration.BuildFiles.Add(buildFile); } // now deal with other object file types var assembledObjectFiles = objectFiles.Where(item => item is AssembledObjectFile); foreach (var asmObj in assembledObjectFiles) { var buildFile = asmObj.MetaData as XcodeBuilder.BuildFile; configuration.BuildFiles.Add(buildFile); } } else { (objectFiles[0].Settings as XcodeProjectProcessor.IConvertToProject).Convert(sender, configuration); foreach (var objFile in objectFiles) { if (!(objFile as C.ObjectFileBase).PerformCompilation) { var fullPath = (objFile as C.ObjectFileBase).InputPath.Parse(); var filename = System.IO.Path.GetFileName(fullPath); excludedSource.Add(filename); } var buildFile = objFile.MetaData as XcodeBuilder.BuildFile; configuration.BuildFiles.Add(buildFile); } } configuration["EXCLUDED_SOURCE_FILE_NAMES"] = excludedSource; // convert librarian settings to the Xcode project if (sender.Settings is XcodeProjectProcessor.IConvertToProject) { (sender.Settings as XcodeProjectProcessor.IConvertToProject).Convert(sender, configuration); } // order only dependents foreach (var required in sender.Requirements) { if (null == required.MetaData) { continue; } if (required is HeaderLibrary) { // the target for a HeaderLibrary has no FileReference output, and thus cannot be an order only dependency continue; } var requiredTarget = required.MetaData as XcodeBuilder.Target; if (null != requiredTarget) { target.Requires(requiredTarget); } } // any non-C module targets should be order-only dependencies // note: this is unlikely to happen, as StaticLibraries don't have hard 'dependencies' // because there is no fixed 'link' action at the end foreach (var dependent in sender.Dependents) { if (null == dependent.MetaData) { continue; } if (dependent is C.CModule) { continue; } var dependentTarget = dependent.MetaData as XcodeBuilder.Target; if (null != dependentTarget) { target.Requires(dependentTarget); } } // however, there may be forwarded libraries, and these are useful order only dependents foreach (var dependent in (sender as IForwardedLibraries).ForwardedLibraries) { if (null == dependent.MetaData) { continue; } var dependentTarget = dependent.MetaData as XcodeBuilder.Target; if (null != dependentTarget) { target.Requires(dependentTarget); } } }
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.ICommonCompilerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.Bits.HasValue) { switch (settings.Bits.Value) { 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.Value); } } if (settings.DebugSymbols.HasValue) { configuration["GCC_GENERATE_DEBUGGING_SYMBOLS"] = new XcodeBuilder.UniqueConfigurationValue(settings.DebugSymbols.Value ? "YES" : "NO"); } if (settings.DisableWarnings.Count > 0) { var warnings = new XcodeBuilder.MultiConfigurationValue(); foreach (var warning in settings.DisableWarnings) { warnings.Add(System.String.Format("-Wno-{0}", warning)); } configuration["WARNING_CFLAGS"] = warnings; } if (settings.IncludePaths.Count > 0) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.IncludePaths.ToEnumerableWithoutDuplicates()) { var fullPath = path.ToString(); var relPath = Bam.Core.RelativePathUtilities.GetPath(fullPath, configuration.Project.SourceRoot); // spaces need to be double escaped if (Bam.Core.RelativePathUtilities.IsPathAbsolute(relPath)) { if (fullPath.Contains(" ")) { fullPath = fullPath.Replace(" ", "\\\\ "); } paths.Add(fullPath); } else { if (relPath.Contains(" ")) { relPath = relPath.Replace(" ", "\\\\ "); } paths.Add(System.String.Format("$(SRCROOT)/{0}", relPath)); } } configuration["USER_HEADER_SEARCH_PATHS"] = paths; } if (settings.Optimization.HasValue) { switch (settings.Optimization.Value) { case C.EOptimization.Off: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("0"); break; case C.EOptimization.Size: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("s"); break; case C.EOptimization.Speed: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("2"); break; case C.EOptimization.Custom: // do nothing - defer to compiler specific optimizations break; default: throw new Bam.Core.Exception("Unsupported optimization, {0}", settings.Optimization.Value); } } if (settings.OmitFramePointer.HasValue) { var arg = settings.OmitFramePointer.Value ? "-fomit-frame-pointer" : "-fno-omit-frame-pointer"; configuration["OTHER_CFLAGS"] = new XcodeBuilder.MultiConfigurationValue(arg); } if (settings.PreprocessorDefines.Count > 0) { var defines = new XcodeBuilder.MultiConfigurationValue(); foreach (var define in settings.PreprocessorDefines) { if (null == define.Value) { defines.Add(define.Key); } else { var defineValue = define.Value.ToString(); if (defineValue.Contains(" ")) { defineValue = defineValue.Replace(" ", "\\\\ "); } if (defineValue.Contains("\"")) { // note the number of back slashes here // required to get \\\" for each " in the original value defineValue = defineValue.Replace("\"", "\\\\\\\""); } defines.Add(System.String.Format("{0}={1}", define.Key, defineValue)); } } configuration["GCC_PREPROCESSOR_DEFINITIONS"] = defines; } if (settings.PreprocessorUndefines.Count > 0) { var undefines = new XcodeBuilder.MultiConfigurationValue(); foreach (var undefine in settings.PreprocessorUndefines) { undefines.Add(System.String.Format("-U{0}", undefine)); } configuration["OTHER_CFLAGS"] = undefines; } if (settings.SystemIncludePaths.Count > 0) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.SystemIncludePaths.ToEnumerableWithoutDuplicates()) { var full_path = path.ToString(); if (full_path.Contains(" ")) { full_path = full_path.Replace(" ", "\\\\ "); } paths.Add(full_path); } configuration["HEADER_SEARCH_PATHS"] = paths; } if (settings.TargetLanguage.HasValue) { switch (settings.TargetLanguage.Value) { case C.ETargetLanguage.Default: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("automatic"); break; case C.ETargetLanguage.C: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.c.c"); break; case C.ETargetLanguage.Cxx: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.cpp.cpp"); break; case C.ETargetLanguage.ObjectiveC: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.c.objc"); break; case C.ETargetLanguage.ObjectiveCxx: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.cpp.objcpp"); break; default: throw new Bam.Core.Exception("Unsupported target language, {0}", settings.TargetLanguage.Value); } } if (settings.WarningsAsErrors.HasValue) { configuration["GCC_TREAT_WARNINGS_AS_ERRORS"] = new XcodeBuilder.UniqueConfigurationValue(settings.WarningsAsErrors.Value ? "YES" : "NO"); } if (settings.OutputType.HasValue) { // TODO: anything? } if (settings.NamedHeaders.Count > 0) { var namedHeaders = new XcodeBuilder.MultiConfigurationValue(); foreach (var header in settings.NamedHeaders) { // have to split this into two, or Xcode does not recognise it namedHeaders.Add("-include"); namedHeaders.Add(header); } configuration["OTHER_CFLAGS"] = namedHeaders; } }
ILinkingPolicy.Link( ConsoleApplication sender, Bam.Core.ExecutionContext context, Bam.Core.TokenizedString executablePath, System.Collections.ObjectModel.ReadOnlyCollection <Bam.Core.Module> objectFiles, System.Collections.ObjectModel.ReadOnlyCollection <Bam.Core.Module> headers, System.Collections.ObjectModel.ReadOnlyCollection <Bam.Core.Module> libraries) { if (0 == objectFiles.Count) { return; } var workspace = Bam.Core.Graph.Instance.MetaData as XcodeBuilder.WorkspaceMeta; var target = workspace.EnsureTargetExists(sender); var exeFilename = sender.CreateTokenizedString("@filename($(0))", executablePath); exeFilename.Parse(); target.EnsureOutputFileReferenceExists( exeFilename, (sender is IDynamicLibrary) ? XcodeBuilder.FileReference.EFileType.DynamicLibrary : XcodeBuilder.FileReference.EFileType.Executable, (sender is IDynamicLibrary) ? XcodeBuilder.Target.EProductType.DynamicLibrary : XcodeBuilder.Target.EProductType.Executable); var configuration = target.GetConfiguration(sender); if (sender is IDynamicLibrary && !((sender is Plugin) || (sender is C.Cxx.Plugin))) { var productName = sender.Macros["OutputName"].ToString().Equals(sender.Macros["modulename"].ToString()) ? sender.CreateTokenizedString("${TARGET_NAME}.$(MajorVersion)") : sender.CreateTokenizedString("$(OutputName).$(MajorVersion)"); lock (productName) { if (!productName.IsParsed) { productName.Parse(); } } configuration.SetProductName(productName); } else { if (sender.Macros["OutputName"].ToString().Equals(sender.Macros["modulename"].ToString())) { configuration.SetProductName(Bam.Core.TokenizedString.CreateVerbatim("${TARGET_NAME}")); } else { configuration.SetProductName(sender.Macros["OutputName"]); } } foreach (var header in headers) { target.EnsureHeaderFileExists((header as HeaderFile).InputPath); } var excludedSource = new XcodeBuilder.MultiConfigurationValue(); var realObjectFiles = objectFiles.Where(item => !((item is WinResource) || (item is AssembledObjectFile))); if (realObjectFiles.Any()) { var xcodeConvertParameterTypes = new Bam.Core.TypeArray { typeof(Bam.Core.Module), typeof(XcodeBuilder.Configuration) }; var sharedSettings = C.SettingsBase.SharedSettings( realObjectFiles, typeof(ClangCommon.XcodeCompilerImplementation), typeof(XcodeProjectProcessor.IConvertToProject), xcodeConvertParameterTypes); XcodeSharedSettings.Tweak(sharedSettings); (sharedSettings as XcodeProjectProcessor.IConvertToProject).Convert(sender, configuration); foreach (var objFile in realObjectFiles) { var asObjFileBase = objFile as C.ObjectFileBase; if (!asObjFileBase.PerformCompilation) { var fullPath = asObjFileBase.InputPath.ToString(); var filename = System.IO.Path.GetFileName(fullPath); excludedSource.Add(filename); } var buildFile = objFile.MetaData as XcodeBuilder.BuildFile; var deltaSettings = (objFile.Settings as C.SettingsBase).CreateDeltaSettings(sharedSettings, objFile); if (null != deltaSettings) { var commandLine = new Bam.Core.StringArray(); (deltaSettings as CommandLineProcessor.IConvertToCommandLine).Convert(commandLine); if (commandLine.Count > 0) { // Cannot set per-file-per-configuration settings, so blend them together if (null == buildFile.Settings) { buildFile.Settings = commandLine; } else { buildFile.Settings.AddRangeUnique(commandLine); } } } configuration.BuildFiles.Add(buildFile); } // now deal with other object file types var assembledObjectFiles = objectFiles.Where(item => item is AssembledObjectFile); foreach (var asmObj in assembledObjectFiles) { var buildFile = asmObj.MetaData as XcodeBuilder.BuildFile; configuration.BuildFiles.Add(buildFile); } } else { (objectFiles[0].Settings as XcodeProjectProcessor.IConvertToProject).Convert(sender, configuration); foreach (var objFile in objectFiles) { var asObjFileBase = objFile as C.ObjectFileBase; if (!asObjFileBase.PerformCompilation) { var fullPath = asObjFileBase.InputPath.ToString(); var filename = System.IO.Path.GetFileName(fullPath); excludedSource.Add(filename); } var buildFile = objFile.MetaData as XcodeBuilder.BuildFile; configuration.BuildFiles.Add(buildFile); } } configuration["EXCLUDED_SOURCE_FILE_NAMES"] = excludedSource; // add library search paths prior to converting linker settings var linker = sender.Settings as C.ICommonLinkerSettings; foreach (var library in libraries) { if (library is C.StaticLibrary) { var libDir = library.CreateTokenizedString("@dir($(0))", library.GeneratedPaths[C.StaticLibrary.Key]); lock (libDir) { if (!libDir.IsParsed) { libDir.Parse(); } } linker.LibraryPaths.Add(libDir); } else if (library is C.IDynamicLibrary) { var libDir = library.CreateTokenizedString("@dir($(0))", library.GeneratedPaths[C.DynamicLibrary.Key]); lock (libDir) { if (!libDir.IsParsed) { libDir.Parse(); } } linker.LibraryPaths.Add(libDir); } else if (library is C.CSDKModule) { // SDK modules are collections of libraries, not one in particular // thus do nothing as they are undefined at this point, and may yet be pulled in automatically } else if (library is C.HeaderLibrary) { // no library } else if (library is OSXFramework) { // frameworks are dealt with elsewhere } else { throw new Bam.Core.Exception("Don't know how to handle this module type, {0}", library.ToString()); } } foreach (var library in libraries) { var libAsCModule = library as C.CModule; if (null == libAsCModule) { throw new Bam.Core.Exception("Don't know how to handle library module of type '{0}'", library.GetType().ToString()); } if (libAsCModule.IsPrebuilt) { if (library is OSXFramework) { // frameworks are dealt with elsewhere } else if (library is C.StaticLibrary) { (sender.Tool as C.LinkerTool).ProcessLibraryDependency(sender as CModule, libAsCModule); } else { throw new Bam.Core.Exception("Don't know how to handle this prebuilt module dependency, '{0}'", library.GetType().ToString()); } } else { if (library is C.StaticLibrary) { target.DependsOn(library.MetaData as XcodeBuilder.Target); } else if (library is C.IDynamicLibrary) { target.DependsOn(library.MetaData as XcodeBuilder.Target); } else if (library is C.CSDKModule) { // do nothing, just an area for external } else if (library is C.HeaderLibrary) { // no library } else if (library is OSXFramework) { // frameworks are dealt with elsewhere } else { throw new Bam.Core.Exception("Don't know how to handle this module type"); } } } // convert link settings to the Xcode project (sender.Settings as XcodeProjectProcessor.IConvertToProject).Convert(sender, configuration); var required_targets = new System.Collections.Generic.HashSet <XcodeBuilder.Target>(); // order only dependencies - recurse into each, so that all layers // of order only dependencies are included var queue = new System.Collections.Generic.Queue <Bam.Core.Module>(sender.Requirements); while (queue.Count > 0) { var required = queue.Dequeue(); foreach (var additional in required.Requirements) { queue.Enqueue(additional); } if (null == required.MetaData) { continue; } if (required is HeaderLibrary) { // the target for a HeaderLibrary has no FileReference output, and thus cannot be an order only dependency continue; } var requiredTarget = required.MetaData as XcodeBuilder.Target; if (null != requiredTarget) { required_targets.Add(requiredTarget); } } // any non-C module projects should be order-only dependencies foreach (var dependent in sender.Dependents) { if (null == dependent.MetaData) { continue; } if (dependent is C.CModule) { continue; } var dependentTarget = dependent.MetaData as XcodeBuilder.Target; if (null != dependentTarget) { required_targets.Add(dependentTarget); } } foreach (var reqTarget in required_targets) { target.Requires(reqTarget); } }
public static void Convert( this ClangCommon.ICommonCompilerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.AllWarnings.HasValue) { var warnings = new XcodeBuilder.MultiConfigurationValue(); if (settings.AllWarnings.Value) { warnings.Add("-Wall"); } else { warnings.Add("-Wno-all"); } configuration["WARNING_CFLAGS"] = warnings; } if (settings.ExtraWarnings.HasValue) { var warnings = new XcodeBuilder.MultiConfigurationValue(); if (settings.ExtraWarnings.Value) { warnings.Add("-Wextra"); } else { warnings.Add("-Wno-extra"); } configuration["WARNING_CFLAGS"] = warnings; } if (settings.Pedantic.HasValue) { configuration["GCC_WARN_PEDANTIC"] = new XcodeBuilder.UniqueConfigurationValue(settings.Pedantic.Value ? "YES" : "NO"); } if (settings.Visibility.HasValue) { configuration["GCC_SYMBOLS_PRIVATE_EXTERN"] = new XcodeBuilder.UniqueConfigurationValue((settings.Visibility.Value == EVisibility.Default) ? "NO" : "YES"); } if (settings.StrictAliasing.HasValue) { configuration["GCC_STRICT_ALIASING"] = new XcodeBuilder.UniqueConfigurationValue(settings.StrictAliasing.Value ? "YES" : "NO"); } if (settings.Optimization.HasValue) { var common_optimization = (settings as C.ICommonCompilerSettings).Optimization; if (common_optimization.HasValue && common_optimization.Value != C.EOptimization.Custom) { throw new Bam.Core.Exception("Compiler specific optimizations can only be set when the common optimization is C.EOptimization.Custom"); } switch (settings.Optimization.Value) { case EOptimization.O1: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("1"); break; case EOptimization.O3: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("3"); break; case EOptimization.Ofast: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("fast"); break; default: throw new Bam.Core.Exception("Unsupported Clang specific optimization, {0}", settings.Optimization.Value); } } }
Convert( this C.ICommonCompilerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { if (settings.Bits.HasValue) { switch (settings.Bits.Value) { 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.Value); } } if (settings.DebugSymbols.HasValue) { configuration["GCC_GENERATE_DEBUGGING_SYMBOLS"] = new XcodeBuilder.UniqueConfigurationValue(settings.DebugSymbols.Value ? "YES" : "NO"); } if (settings.DisableWarnings.Count > 0) { var warnings = new XcodeBuilder.MultiConfigurationValue(); foreach (var warning in settings.DisableWarnings) { warnings.Add(System.String.Format("-Wno-{0}", warning)); } configuration["WARNING_CFLAGS"] = warnings; } if (settings.IncludePaths.Count > 0) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.IncludePaths) { paths.Add(path.ToString()); } configuration["USER_HEADER_SEARCH_PATHS"] = paths; } if (settings.OmitFramePointer.HasValue) { var arg = settings.OmitFramePointer.Value ? "-fomit-frame-pointer" : "-fno-omit-frame-pointer"; configuration["OTHER_CFLAGS"] = new XcodeBuilder.MultiConfigurationValue(arg); } if (settings.Optimization.HasValue) { switch (settings.Optimization.Value) { case C.EOptimization.Off: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("0"); break; case C.EOptimization.Size: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("s"); break; case C.EOptimization.Speed: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("1"); break; case C.EOptimization.Full: configuration["GCC_OPTIMIZATION_LEVEL"] = new XcodeBuilder.UniqueConfigurationValue("3"); break; default: throw new Bam.Core.Exception("Unsupported optimization, {0}", settings.Optimization.Value); } } if (settings.PreprocessorDefines.Count > 0) { var defines = new XcodeBuilder.MultiConfigurationValue(); foreach (var define in settings.PreprocessorDefines) { if (System.String.IsNullOrEmpty(define.Value)) { defines.Add(define.Key); } else { var value = define.Value; if (value.Contains("\"")) { // note the number of back slashes here // required to get \\\" for each " in the original value value = value.Replace("\"", "\\\\\\\""); } defines.Add(System.String.Format("{0}={1}", define.Key, value)); } } configuration["GCC_PREPROCESSOR_DEFINITIONS"] = defines; } if (settings.PreprocessorUndefines.Count > 0) { var undefines = new XcodeBuilder.MultiConfigurationValue(); foreach (var undefine in settings.PreprocessorUndefines) { undefines.Add(System.String.Format("-U{0}", undefine)); } configuration["OTHER_CFLAGS"] = undefines; } if (settings.SystemIncludePaths.Count > 0) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.SystemIncludePaths) { paths.Add(path.ToString()); } configuration["HEADER_SEARCH_PATHS"] = paths; } if (settings.TargetLanguage.HasValue) { switch (settings.TargetLanguage.Value) { case C.ETargetLanguage.Default: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("automatic"); break; case C.ETargetLanguage.C: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.c.c"); break; case C.ETargetLanguage.Cxx: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.cpp.cpp"); break; case C.ETargetLanguage.ObjectiveC: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.c.objc"); break; case C.ETargetLanguage.ObjectiveCxx: configuration["GCC_INPUT_FILETYPE"] = new XcodeBuilder.UniqueConfigurationValue("sourcecode.cpp.objcpp"); break; default: throw new Bam.Core.Exception("Unsupported target language, {0}", settings.TargetLanguage.Value); } } if (settings.WarningsAsErrors.HasValue) { configuration["GCC_TREAT_WARNINGS_AS_ERRORS"] = new XcodeBuilder.UniqueConfigurationValue(settings.WarningsAsErrors.Value ? "YES" : "NO"); } if (settings.OutputType.HasValue) { // TODO: anything? } }
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; } }
Convert( this C.ICommonAssemblerSettings settings, Bam.Core.Module module, XcodeBuilder.Configuration configuration) { switch (settings.Bits.Value) { 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.Value); } configuration["GCC_GENERATE_DEBUGGING_SYMBOLS"] = new XcodeBuilder.UniqueConfigurationValue(settings.DebugSymbols ? "YES" : "NO"); if (settings.IncludePaths.Count > 0) { var paths = new XcodeBuilder.MultiConfigurationValue(); foreach (var path in settings.IncludePaths.ToEnumerableWithoutDuplicates()) { path.Parse(); var fullPath = path.ToString(); var relPath = Bam.Core.RelativePathUtilities.GetPath(fullPath, configuration.Project.SourceRoot); if (Bam.Core.RelativePathUtilities.IsPathAbsolute(relPath)) { paths.Add(fullPath); } else { paths.Add(System.String.Format("$(SRCROOT)/{0}", relPath)); } } configuration["USER_HEADER_SEARCH_PATHS"] = paths; } if (settings.PreprocessorDefines.Count > 0) { var defines = new XcodeBuilder.MultiConfigurationValue(); foreach (var define in settings.PreprocessorDefines) { if (null == define.Value) { defines.Add(define.Key); } else { var defineValue = define.Value.ToString(); if (defineValue.Contains("\"")) { // note the number of back slashes here // required to get \\\" for each " in the original value defineValue = defineValue.Replace("\"", "\\\\\\\""); } defineValue = Bam.Core.IOWrapper.EncloseSpaceContainingPathWithDoubleQuotes(defineValue); defines.Add(System.String.Format("{0}={1}", define.Key, defineValue)); } } configuration["GCC_PREPROCESSOR_DEFINITIONS"] = defines; } configuration["GCC_TREAT_WARNINGS_AS_ERRORS"] = new XcodeBuilder.UniqueConfigurationValue(settings.WarningsAsErrors ? "YES" : "NO"); }
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; } }