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);
        }
Esempio n. 2
0
        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()));
                }
            }
        }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
        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");
            }
        }
Esempio n. 5
0
        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()));
                }
            }
        }
Esempio n. 8
0
        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);
        }
Esempio n. 10
0
        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;
            }
        }
Esempio n. 12
0
        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;
            }
        }