diff options
author | Radek Doulik <rodo@xamarin.com> | 2015-05-28 22:30:41 +0300 |
---|---|---|
committer | Radek Doulik <rodo@xamarin.com> | 2015-06-05 14:53:56 +0300 |
commit | df5314261a10bd8b604abe6583053ce4c816281a (patch) | |
tree | 62d03c92644adf10055db1b0b682107d79de9bc3 | |
parent | 5b6de39a5034db82997b03ee58e76bfb462c7357 (diff) |
Support linker descriptor files embedded in the assemblies being linked.
[merged from monodroid by rodo]
commit 3e19b22eb24ff9faeebe1ace7461d8f91f807041
Author: Alex Rønne Petersen <alexrp@xamarin.com>
Date: Mon Jul 1 15:34:26 2013 +0200
This is in addition to those files that are already embedded in the linker assembly
itself (such as mscorlib.xml). People can use this feature to tell the linker that
certain methods/fields/types must be kept if a particular assembly is being referenced
by embedding a descriptor file in it.
-rw-r--r-- | mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs b/mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs index 08761871fd6..47864f7917e 100644 --- a/mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs +++ b/mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs @@ -26,6 +26,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +using System.Linq; using System.IO; using System.Reflection; using System.Xml.XPath; @@ -49,6 +50,15 @@ namespace Mono.Linker.Steps { Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetResolveStep (name)); } + + foreach (var rsc in Context.GetAssemblies () + .SelectMany (asm => asm.Modules) + .SelectMany (mod => mod.Resources) + .Where (res => res.ResourceType == ResourceType.Embedded) + .Where (res => IsReferenced (GetAssemblyName (res.Name))) + .Cast<EmbeddedResource> ()) { + Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetExternalResolveStep (rsc)); + } } static string GetAssemblyName (string descriptor) @@ -69,11 +79,23 @@ namespace Mono.Linker.Steps { return false; } + static ResolveFromXmlStep GetExternalResolveStep (EmbeddedResource resource) + { + return new ResolveFromXmlStep (GetExternalDescriptor (resource)); + } + static ResolveFromXmlStep GetResolveStep (string descriptor) { return new ResolveFromXmlStep (GetDescriptor (descriptor)); } + static XPathDocument GetExternalDescriptor (EmbeddedResource resource) + { + using (var sr = new StreamReader (resource.GetResourceStream ())) { + return new XPathDocument (new StringReader (sr.ReadToEnd ())); + } + } + static XPathDocument GetDescriptor (string descriptor) { using (StreamReader sr = new StreamReader (GetResource (descriptor))) { |