-
Notifications
You must be signed in to change notification settings - Fork 566
Expand file tree
/
Copy pathProcessRuntimePackLibraryDirectories.cs
More file actions
101 lines (82 loc) · 3 KB
/
ProcessRuntimePackLibraryDirectories.cs
File metadata and controls
101 lines (82 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#nullable enable
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using Microsoft.Android.Build.Tasks;
namespace Xamarin.Android.Tasks;
public class ProcessRuntimePackLibraryDirectories : AndroidTask
{
public override string TaskPrefix => "FRPLD";
static readonly HashSet<string> NativeLibraryNames = new (StringComparer.OrdinalIgnoreCase) {
"libarchive-dso-stub.so",
"libc.so",
"libdl.so",
"liblog.so",
"libm.so",
"libz.so",
};
[Required]
public ITaskItem[] ResolvedFilesToPublish { get; set; } = [];
[Output]
public ITaskItem[] RuntimePackLibraryDirectories { get; set; } = [];
[Output]
public ITaskItem[] NativeLibrariesToRemove { get; set; } = [];
public override bool RunTask ()
{
var libDirs = new List<ITaskItem> ();
var librariesToRemove = new List<ITaskItem> ();
var seenRIDs = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
foreach (ITaskItem item in ResolvedFilesToPublish) {
if (!IsInSupportedRuntimePack (item)) {
continue;
}
string? fileName = Path.GetFileName (item.ItemSpec);
if (String.IsNullOrEmpty (fileName) || !NativeLibraryNames.Contains (fileName)) {
continue;
}
string? rid = item.GetMetadata ("RuntimeIdentifier");
if (String.IsNullOrEmpty (rid)) {
Log.LogDebugMessage ($"Ignoring item '{item}' because it contains no runtime identifier metadata");
continue;
}
if (!seenRIDs.Contains (rid)) {
string? dirName = Path.GetDirectoryName (item.ItemSpec);
if (String.IsNullOrEmpty (dirName)) {
Log.LogDebugMessage ($"Item '{item}' path doesn't contain full file path");
} else {
libDirs.Add (MakeLibDirItem (item, dirName));
}
seenRIDs.Add (rid);
Log.LogDebugMessage ($"Discovered runtime pack library directory for '{rid}': {dirName}");
}
librariesToRemove.Add (item);
Log.LogDebugMessage ($"Item '{item}' will be removed from the set of native libraries to publish");
}
RuntimePackLibraryDirectories = libDirs.ToArray ();
NativeLibrariesToRemove = librariesToRemove.ToArray ();
return !Log.HasLoggedErrors;
}
ITaskItem MakeLibDirItem (ITaskItem sourceItem, string dir)
{
var ret = new TaskItem (dir);
sourceItem.CopyMetadataTo (ret);
// These make no sense for directories, remove just to be safe
ret.RemoveMetadata ("CopyLocal");
ret.RemoveMetadata ("CopyToPublishDirectory");
ret.RemoveMetadata ("DestinationSubPath");
ret.RemoveMetadata ("RelativePath");
return ret;
}
bool IsInSupportedRuntimePack (ITaskItem item)
{
string? NuGetPackageId = item.GetMetadata ("NuGetPackageId");
if (String.IsNullOrEmpty (NuGetPackageId)) {
return false;
}
return NuGetPackageId.StartsWith ("Microsoft.Android.Runtime.CoreCLR.", StringComparison.OrdinalIgnoreCase) ||
NuGetPackageId.StartsWith ("Microsoft.Android.Runtime.Mono.", StringComparison.OrdinalIgnoreCase) ||
NuGetPackageId.StartsWith ("Microsoft.Android.Runtime.NativeAOT.", StringComparison.OrdinalIgnoreCase);
}
}