Skip to content

Commit

Permalink
[msbuild] Use ILRepack as a dotnet tool. (#21240)
Browse files Browse the repository at this point in the history
This is one step towards removing the dependency on having Mono
installed during the build.

For some reason that also ended up requiring a few nullability issues in
the msbuild tests.
  • Loading branch information
rolfbjarne authored Sep 17, 2024
1 parent 8106ee6 commit c1953a5
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 33 deletions.
6 changes: 6 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
"commands": [
"t4"
]
},
"dotnet-ilrepack": {
"version": "1.0.0",
"commands": [
"ilrepack"
]
}
}
}
5 changes: 3 additions & 2 deletions msbuild/ILMerge.targets
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
</ItemGroup>
<ItemGroup>
<ReferenceCopyLocalDirs Include="@(ReferenceCopyLocalPaths -&gt; '%(RootDir)%(Directory)')" />
<ReferenceCopyLocalDirs Include="@(ReferencePathWithRefAssemblies -&gt; '%(RootDir)%(Directory)')" />
<ReferenceCopyLocalPaths Remove="@(MergedAssemblies)" />
<LibDir Include="@(ReferenceCopyLocalDirs -&gt; Distinct())" />
</ItemGroup>
Expand All @@ -85,9 +86,9 @@
<ILRepackArgs>$(ILRepackArgs) "/lib:$(NetstandardDirectory)"</ILRepackArgs> <!-- This is needed for ilrepack to find netstandard.dll, which is referenced by the System.Text.Json assembly -->
</PropertyGroup>
<PropertyGroup>
<SYSTEM_MONO Condition="'$(SYSTEM_MONO)' == ''">/Library/Frameworks/Mono.framework/Versions/Current/Commands/mono</SYSTEM_MONO>
<LOCAL_DOTNET_PATH Condition="'$(LOCAL_DOTNET_PATH)' == ''">$(MSBuildThisFileDirectory)../builds/downloads/dotnet/dotnet</LOCAL_DOTNET_PATH>
</PropertyGroup>
<Exec Command="$(SYSTEM_MONO) &quot;$(ILRepack)&quot; $(ILRepackArgs)" WorkingDirectory="$(MSBuildProjectDirectory)\$(OutputPath)" StandardErrorImportance="high" StandardOutputImportance="low" ConsoleToMSBuild="true" ContinueOnError="true">
<Exec Command="$(LOCAL_DOTNET_PATH) tool run ilrepack $(ILRepackArgs)" WorkingDirectory="$(MSBuildProjectDirectory)\$(OutputPath)" StandardErrorImportance="high" StandardOutputImportance="low" ConsoleToMSBuild="true" ContinueOnError="true">
<Output TaskParameter="ConsoleOutput" PropertyName="ILRepackOutput" />
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void DefaultMinimumOSVersion ()

ExecuteTask (task);

var plist = PDictionary.FromFile (task.CompiledAppManifest.ItemSpec);
var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!;
Assert.AreEqual (task.SdkVersion, plist.GetMinimumOSVersion (), "MinimumOSVersion");
}

Expand All @@ -55,7 +55,7 @@ public void MainMinimumOSVersions ()

ExecuteTask (task);

var plist = PDictionary.FromFile (task.CompiledAppManifest.ItemSpec);
var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!;
Assert.AreEqual ("14.0", plist.GetMinimumOSVersion (), "MinimumOSVersion");
}

Expand All @@ -81,7 +81,7 @@ public void MultipleMinimumOSVersions ()

ExecuteTask (task);

var plist = PDictionary.FromFile (task.CompiledAppManifest.ItemSpec);
var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!;
Assert.AreEqual ("13.0", plist.GetMinimumOSVersion (), "MinimumOSVersion");
}

Expand Down Expand Up @@ -112,7 +112,7 @@ public void SupportedOSPlatformVersion ()

ExecuteTask (task);

var plist = PDictionary.FromFile (task.CompiledAppManifest.ItemSpec);
var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!;
Assert.AreEqual ("11.0", plist.GetMinimumOSVersion (), "MinimumOSVersion");
}

Expand All @@ -123,7 +123,7 @@ public void MacCatalystVersionCheck ()
task.SupportedOSPlatformVersion = "14.2";
ExecuteTask (task);

var plist = PDictionary.FromFile (task.CompiledAppManifest.ItemSpec);
var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!;
Assert.AreEqual ("11.0", plist.GetMinimumSystemVersion (), "MinimumOSVersion");
}

Expand All @@ -150,7 +150,7 @@ public void XcodeVariables (ApplePlatform platform, bool isSimulator, string exp
task.SdkIsSimulator = isSimulator;
ExecuteTask (task);

var plist = PDictionary.FromFile (task.CompiledAppManifest.ItemSpec);
var plist = PDictionary.FromFile (task.CompiledAppManifest!.ItemSpec)!;
var variables = new string [] {
"DTCompiler",
"DTPlatformBuild",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@

namespace Xamarin.MacDev.Tasks {
class CustomCompileEntitlements : CompileEntitlements {
protected override MobileProvision? GetMobileProvision (MobileProvisionPlatform platform, string uuid)
protected override MobileProvision GetMobileProvision (MobileProvisionPlatform platform, string uuid)
{
if (File.Exists (ProvisioningProfile))
return MobileProvision.LoadFromFile (ProvisioningProfile);

return null;
return null!;
}
}

Expand Down Expand Up @@ -61,10 +61,10 @@ public void ValidateEntitlement ()
{
var task = CreateEntitlementsTask (out var compiledEntitlements, out var archivedEntitlements);
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
Assert.IsTrue (compiled.Get<PBoolean> (EntitlementKeys.GetTaskAllow).Value, "#1");
Assert.AreEqual ("32UV7A8CDE.com.xamarin.MySingleView", compiled.Get<PString> ("application-identifier").Value, "#2");
Assert.AreEqual ("Z8CSQKJE7R", compiled.Get<PString> ("com.apple.developer.team-identifier").Value, "#3");
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsTrue (compiled.Get<PBoolean> (EntitlementKeys.GetTaskAllow)?.Value, "#1");
Assert.AreEqual ("32UV7A8CDE.com.xamarin.MySingleView", compiled.Get<PString> ("application-identifier")?.Value, "#2");
Assert.AreEqual ("Z8CSQKJE7R", compiled.Get<PString> ("com.apple.developer.team-identifier")?.Value, "#3");
Assert.AreEqual ("applinks:*.xamarin.com", compiled.GetAssociatedDomains ().ToStringArray ().First (), "#4");
Assert.AreEqual ("Z8CSQKJE7R.*", compiled.GetPassBookIdentifiers ().ToStringArray ().First (), "#5");
Assert.AreEqual ("Z8CSQKJE7R.com.xamarin.MySingleView", compiled.GetUbiquityKeyValueStore (), "#6");
Expand Down Expand Up @@ -113,7 +113,7 @@ public void CustomEntitlemements_String (string value)
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.AreEqual (value ?? string.Empty, compiled.GetString ("com.xamarin.custom.entitlement")?.Value, "#1");
}

Expand All @@ -131,7 +131,7 @@ public void CustomEntitlemements_StringArray ()
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
var array = compiled.GetArray ("com.xamarin.custom.entitlement");
Assert.NotNull (array, "array");
Assert.AreEqual (new string [] { "A", "B", "C" }, array.ToStringArray (), "array contents");
Expand All @@ -154,7 +154,7 @@ public void CustomEntitlemements_StringArray_CustomSeparator (string separator)
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
var array = compiled.GetArray ("com.xamarin.custom.entitlement");
Assert.NotNull (array, "array");
Assert.AreEqual (new string [] { "A;B;C", "D", "E" }, array.ToStringArray (), "array contents");
Expand All @@ -166,7 +166,7 @@ public void AllowJit_Default ()
var task = CreateEntitlementsTask (out var compiledEntitlements);
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsFalse (compiled.ContainsKey (EntitlementKeys.AllowExecutionOfJitCode), "#1");
}

Expand All @@ -180,9 +180,9 @@ public void AllowJit_True ()
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsTrue (compiled.ContainsKey (EntitlementKeys.AllowExecutionOfJitCode), "#1");
Assert.IsTrue (compiled.Get<PBoolean> (EntitlementKeys.AllowExecutionOfJitCode).Value, "#2");
Assert.IsTrue (compiled.Get<PBoolean> (EntitlementKeys.AllowExecutionOfJitCode)?.Value, "#2");
}

[Test]
Expand All @@ -195,9 +195,9 @@ public void AllowJit_False ()
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsTrue (compiled.ContainsKey (EntitlementKeys.AllowExecutionOfJitCode), "#1");
Assert.IsFalse (compiled.Get<PBoolean> (EntitlementKeys.AllowExecutionOfJitCode).Value, "#2");
Assert.IsFalse (compiled.Get<PBoolean> (EntitlementKeys.AllowExecutionOfJitCode)?.Value, "#2");

Assert.That (archivedEntitlements, Does.Not.Exist, "No archived entitlements");
}
Expand All @@ -212,7 +212,7 @@ public void AllowJit_None ()
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=maccatalyst";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsFalse (compiled.ContainsKey (EntitlementKeys.AllowExecutionOfJitCode), "#1");
}

Expand All @@ -226,14 +226,14 @@ public void AppIdentifierPrefix ()
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=ios";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsFalse (compiled.ContainsKey (EntitlementKeys.AllowExecutionOfJitCode), "#1");
var kag = ((PString) compiled ["keychain-access-group"]).Value;
var kag = ((PString?) compiled ["keychain-access-group"])?.Value;
Assert.That (kag, Is.EqualTo ("32UV7A8CDE.org.xamarin"), "value 1");

var archived = PDictionary.FromFile (archivedEntitlements);
var archived = PDictionary.FromFile (archivedEntitlements)!;
Assert.IsTrue (archived.ContainsKey ("keychain-access-group"), "archived");
var archivedKag = ((PString) archived ["keychain-access-group"]).Value;
var archivedKag = ((PString?) archived ["keychain-access-group"])?.Value;
Assert.That (archivedKag, Is.EqualTo ("32UV7A8CDE.org.xamarin"), "archived value 1");
}

Expand All @@ -247,14 +247,14 @@ public void TeamIdentifierPrefix ()
task.TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0,Profile=ios";
task.CustomEntitlements = customEntitlements;
ExecuteTask (task);
var compiled = PDictionary.FromFile (compiledEntitlements);
var compiled = PDictionary.FromFile (compiledEntitlements)!;
Assert.IsFalse (compiled.ContainsKey (EntitlementKeys.AllowExecutionOfJitCode), "#1");
var kag = ((PString) compiled ["keychain-access-group"]).Value;
var kag = ((PString?) compiled ["keychain-access-group"])?.Value;
Assert.That (kag, Is.EqualTo ("Z8CSQKJE7R.org.xamarin"), "value 1");

var archived = PDictionary.FromFile (archivedEntitlements);
var archived = PDictionary.FromFile (archivedEntitlements)!;
Assert.IsTrue (archived.ContainsKey ("keychain-access-group"), "archived");
var archivedKag = ((PString) archived ["keychain-access-group"]).Value;
var archivedKag = ((PString?) archived ["keychain-access-group"])?.Value;
Assert.That (archivedKag, Is.EqualTo ("Z8CSQKJE7R.org.xamarin"), "archived value 1");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a
// in Xcode 12.1+ watchOS does not have an i386 architecture anymore
// on Xcode 12.2+ you get arm64 for all (iOS, tvOS and watchOS) simulators
var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-xcode12.2.plist");
var plist = PDictionary.FromFile (path);
var plist = PDictionary.FromFile (path)!;
var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath);
Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result");
Assert.That (frameworkPath, Is.EqualTo (expected), "frameworkPath");
Expand All @@ -52,7 +52,7 @@ public void Xcode12_x (string targetFrameworkMoniker, bool isSimulator, string a
public void PreXcode12 (string targetFrameworkMoniker, bool isSimulator, string architecture, string expected)
{
var path = Path.Combine (Path.GetDirectoryName (GetType ().Assembly.Location), "Resources", "xcf-prexcode12.plist");
var plist = PDictionary.FromFile (path);
var plist = PDictionary.FromFile (path)!;
var result = ResolveNativeReferences.TryResolveXCFramework (log, plist, "N/A", targetFrameworkMoniker, isSimulator, architecture, out var frameworkPath);
Assert.AreEqual (result, !string.IsNullOrEmpty (expected), "result");
Assert.That (frameworkPath, Is.EqualTo (expected), "frameworkPath");
Expand Down

12 comments on commit c1953a5

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

Please sign in to comment.