Skip to content

Commit b4cbb50

Browse files
committed
Use the new Xamarin.Android toolchain
1 parent 3e5809e commit b4cbb50

File tree

15 files changed

+291
-218
lines changed

15 files changed

+291
-218
lines changed

build-tools/create-packs/SignList.xml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,12 @@
1414
<ThirdParty Include="protobuf-net.dll" />
1515
<ThirdParty Include="SgmlReaderDll.dll" />
1616
<ThirdParty Include="aapt2.exe" />
17-
<ThirdParty Include="aarch64-linux-android-as.exe" />
17+
<ThirdParty Include="llvm-mc.exe" />
18+
<ThirdParty Include="llvm-strip.exe" />
1819
<ThirdParty Include="aarch64-linux-android-ld.exe" />
19-
<ThirdParty Include="aarch64-linux-android-strip.exe" />
20-
<ThirdParty Include="arm-linux-androideabi-as.exe" />
2120
<ThirdParty Include="arm-linux-androideabi-ld.exe" />
22-
<ThirdParty Include="arm-linux-androideabi-strip.exe" />
23-
<ThirdParty Include="i686-linux-android-as.exe" />
2421
<ThirdParty Include="i686-linux-android-ld.exe" />
25-
<ThirdParty Include="i686-linux-android-strip.exe" />
26-
<ThirdParty Include="x86_64-linux-android-as.exe" />
2722
<ThirdParty Include="x86_64-linux-android-ld.exe" />
28-
<ThirdParty Include="x86_64-linux-android-strip.exe" />
2923
</ItemGroup>
3024

3125
<ItemGroup>

build-tools/installers/create-installers.targets

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -322,18 +322,22 @@
322322
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\lib64\libZipSharpNative.pdb" />
323323
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\proguard\bin\proguard.bat" />
324324
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\aapt2.exe" />
325-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-as.exe" />
326-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-ld.exe" />
327-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-strip.exe" />
328-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-as.exe" />
329-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-ld.exe" />
330-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-strip.exe" />
331-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-as.exe" />
332-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-ld.exe" />
333-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-strip.exe" />
334-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-as.exe" />
335-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-ld.exe" />
336-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-strip.exe" />
325+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\as.exe" />
326+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\ld.exe" />
327+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\llvm-mc.exe" />
328+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\llvm-strip.exe" />
329+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-as.cmd" />
330+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-ld.cmd" />
331+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-strip.cmd" />
332+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-as.cmd" />
333+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-ld.cmd" />
334+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-strip.cmd" />
335+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-as.cmd" />
336+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-ld.cmd" />
337+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-strip.cmd" />
338+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-as.cmd" />
339+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-ld.cmd" />
340+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-strip.cmd" />
337341
<_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.debug.dll" Condition=" '$(HostOS)' != 'Windows' " />
338342
<_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.release.dll" Condition=" '$(HostOS)' != 'Windows' " />
339343
<_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libMonoPosixHelper.dll" />
@@ -353,6 +357,10 @@
353357
</_MSBuildFilesUnixSignAndHarden>
354358
</ItemDefinitionGroup>
355359
<ItemGroup>
360+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\as" />
361+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\ld" />
362+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\llvm-mc" />
363+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\llvm-strip" />
356364
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-as" />
357365
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-ld" />
358366
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-strip" />

build-tools/xaprepare/xaprepare/Application/NDKTool.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ class NDKTool
66
{
77
public string Name { get; }
88
public string DestinationName { get; } = String.Empty;
9+
public bool Prefixed { get; }
910

10-
public NDKTool (string name, string? destinationName = null)
11+
public NDKTool (string name, string? destinationName = null, bool prefixed = false)
1112
{
1213
if (name.Trim ().Length == 0) {
1314
throw new ArgumentException (nameof (name), "must not be empty");
1415
}
16+
Prefixed = prefixed;
1517
Name = name;
1618
if (String.IsNullOrWhiteSpace (destinationName)) {
1719
return;

build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace Xamarin.Android.Prepare
1515
//
1616
partial class Configurables
1717
{
18-
const string BinutilsVersion = "2.35.2-XA.1";
18+
const string BinutilsVersion = "L_13.0.1-4.0.0";
1919

2020
const string MicrosoftOpenJDK11Version = "11.0.10";
2121
const string MicrosoftOpenJDK11Release = "9.1";
@@ -53,7 +53,7 @@ public static partial class Urls
5353

5454
public static Uri MonoArchive_BaseUri = new Uri ("https://xamjenkinsartifact.azureedge.net/mono-sdks/");
5555

56-
public static Uri BinutilsArchive = new Uri ($"https://github.com/xamarin/xamarin-android-binutils/releases/download/{BinutilsVersion}/xamarin-android-binutils-{BinutilsVersion}.7z");
56+
public static Uri BinutilsArchive = new Uri ($"https://github.com/xamarin/xamarin-android-binutils/releases/download/{BinutilsVersion}/xamarin-android-toolchain-{BinutilsVersion}.7z");
5757
}
5858

5959
public static partial class Defaults
@@ -219,9 +219,16 @@ public static partial class Defaults
219219
};
220220

221221
public static readonly List <NDKTool> NDKTools = new List<NDKTool> {
222+
// Tools prefixed with architecture triple
223+
new NDKTool (name: "as", prefixed: true),
224+
new NDKTool (name: "ld", prefixed: true),
225+
new NDKTool (name: "strip", prefixed: true),
226+
227+
// Unprefixed tools
222228
new NDKTool (name: "as"),
223229
new NDKTool (name: "ld"),
224-
new NDKTool (name: "strip"),
230+
new NDKTool (name: "llvm-mc"),
231+
new NDKTool (name: "llvm-strip"),
225232
};
226233
}
227234

build-tools/xaprepare/xaprepare/Steps/Step_InstallGNUBinutils.Unix.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ namespace Xamarin.Android.Prepare
22
{
33
partial class Step_InstallGNUBinutils
44
{
5-
const string? ExecutableExtension = null;
5+
const string[]? ExecutableExtensions = null;
66
}
77
}

build-tools/xaprepare/xaprepare/Steps/Step_InstallGNUBinutils.Windows.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ namespace Xamarin.Android.Prepare
33
partial class Step_InstallGNUBinutils
44
{
55
const string HostName = "windows";
6-
const string ExecutableExtension = ".exe";
6+
static readonly string[]? ExecutableExtensions = WindowsExtensions;
77
}
88
}

build-tools/xaprepare/xaprepare/Steps/Step_InstallGNUBinutils.cs

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ namespace Xamarin.Android.Prepare
77
{
88
partial class Step_InstallGNUBinutils : StepWithDownloadProgress
99
{
10-
static readonly string ProductName = $"GNU Binutils {Configurables.Defaults.BinutilsVersion}";
10+
static readonly string[]? WindowsExtensions = {".exe", ".cmd"};
11+
static readonly string ProductName = $"Xamarin.Android Toolchain {Configurables.Defaults.BinutilsVersion}";
1112

1213
public Step_InstallGNUBinutils ()
13-
: base ("Install GNU Binutils")
14+
: base ("Install Xamarin.Android Toolchain")
1415
{}
1516

1617
protected override async Task<bool> Execute (Context context)
@@ -19,7 +20,7 @@ protected override async Task<bool> Execute (Context context)
1920
string windowsDestinationDirectory = Configurables.Paths.WindowsBinutilsInstallDir;
2021

2122
bool hostHaveAll = HaveAllBinutils (hostDestinationDirectory);
22-
bool windowsHaveAll = HaveAllBinutils (windowsDestinationDirectory, ".exe");
23+
bool windowsHaveAll = HaveAllBinutils (windowsDestinationDirectory, WindowsExtensions);
2324

2425
if (hostHaveAll && windowsHaveAll) {
2526
Log.StatusLine ("All Binutils are already installed");
@@ -43,28 +44,40 @@ protected override async Task<bool> Execute (Context context)
4344
}
4445

4546
if (!hostHaveAll) {
46-
CopyToDestination (context, "Host", tempDir, hostDestinationDirectory, executableExtension: ExecutableExtension);
47+
CopyToDestination (context, "Host", tempDir, hostDestinationDirectory, executableExtensions: ExecutableExtensions);
4748
}
4849

4950
if (!windowsHaveAll) {
50-
CopyToDestination (context, "Windows", tempDir, windowsDestinationDirectory, "windows", ".exe");
51+
CopyToDestination (context, "Windows", tempDir, windowsDestinationDirectory, "windows", WindowsExtensions);
5152
}
5253

5354
return true;
5455
}
5556

56-
bool CopyToDestination (Context context, string label, string sourceDir, string destinationDir, string osName = HostName, string? executableExtension = null)
57+
bool CopyToDestination (Context context, string label, string sourceDir, string destinationDir, string osName = HostName, string[]? executableExtensions = null)
5758
{
5859
Log.StatusLine ();
5960
Log.StatusLine ($"Installing for {label}:");
6061

6162
string sourcePath = Path.Combine (sourceDir, osName);
6263
foreach (var kvp in Configurables.Defaults.AndroidToolchainPrefixes) {
6364
string prefix = kvp.Value;
65+
CopyTools (prefix);
66+
}
67+
CopyTools (String.Empty);
68+
69+
return true;
6470

71+
void CopyTools (string prefix)
72+
{
73+
bool copyPrefixed = !String.IsNullOrEmpty (prefix);
6574
foreach (NDKTool tool in Configurables.Defaults.NDKTools) {
66-
string toolName = GetToolName (prefix, tool, executableExtension);
67-
string toolSourcePath = Path.Combine (sourcePath, toolName);
75+
if (tool.Prefixed != copyPrefixed) {
76+
continue;
77+
}
78+
79+
string toolSourcePath = GetToolPath (sourcePath, prefix, tool, executableExtensions, throwOnMissing: true);
80+
string toolName = Path.GetFileName (toolSourcePath);
6881
string toolDestinationPath = Path.Combine (destinationDir, toolName);
6982
string versionMarkerPath = GetVersionMarker (toolDestinationPath);
7083

@@ -73,8 +86,6 @@ bool CopyToDestination (Context context, string label, string sourceDir, string
7386
File.WriteAllText (versionMarkerPath, DateTime.UtcNow.ToString ());
7487
}
7588
}
76-
77-
return true;
7889
}
7990

8091
async Task<bool> DownloadBinutils (Context context, string localPackagePath, Uri url)
@@ -106,16 +117,27 @@ async Task<bool> DownloadBinutils (Context context, string localPackagePath, Uri
106117
return true;
107118
}
108119

109-
bool HaveAllBinutils (string dir, string? executableExtension = null)
120+
bool HaveAllBinutils (string dir, string[]? executableExtensions = null)
110121
{
111122
Log.DebugLine ("Checking if all binutils are installed in {dir}");
112-
string extension = executableExtension ?? String.Empty;
113123
foreach (var kvp in Configurables.Defaults.AndroidToolchainPrefixes) {
114124
string prefix = kvp.Value;
125+
if (!CheckToolsExist (prefix)) {
126+
return false;
127+
}
128+
}
129+
130+
return CheckToolsExist (String.Empty);
115131

132+
bool CheckToolsExist (string prefix)
133+
{
134+
bool checkPrefixed = !String.IsNullOrEmpty (prefix);
116135
foreach (NDKTool tool in Configurables.Defaults.NDKTools) {
117-
string toolName = GetToolName (prefix, tool, executableExtension);
118-
string toolPath = Path.Combine (dir, toolName);
136+
if (tool.Prefixed != checkPrefixed) {
137+
continue;
138+
}
139+
string toolPath = GetToolPath (dir, prefix, tool, executableExtensions);
140+
string toolName = Path.GetFileName (toolPath);
119141
string versionMarkerPath = GetVersionMarker (toolPath);
120142

121143
Log.DebugLine ($"Checking {toolName}");
@@ -129,14 +151,39 @@ bool HaveAllBinutils (string dir, string? executableExtension = null)
129151
return false;
130152
}
131153
}
132-
}
133154

134-
return true;
155+
return true;
156+
}
135157
}
136158

137-
string GetToolName (string prefix, NDKTool tool, string? executableExtension = null)
159+
string GetToolPath (string sourcePath, string prefix, NDKTool tool, string[]? executableExtensions = null, bool throwOnMissing = false)
138160
{
139-
return $"{prefix}-{(String.IsNullOrEmpty (tool.DestinationName) ? tool.Name : tool.DestinationName)}{executableExtension}";
161+
string baseName = $"{(String.IsNullOrEmpty (tool.DestinationName) ? tool.Name : tool.DestinationName)}";
162+
163+
if (!String.IsNullOrEmpty (prefix)) {
164+
baseName = $"{prefix}-{baseName}";
165+
}
166+
167+
if (executableExtensions == null || executableExtensions.Length == 0) {
168+
return Path.Combine (sourcePath, baseName);
169+
}
170+
171+
foreach (string executableExtension in executableExtensions) {
172+
string binary = Path.Combine (sourcePath, $"{baseName}{executableExtension}");
173+
Console.WriteLine ($"Checking: {binary}");
174+
if (!Utilities.FileExists (binary)) {
175+
continue;
176+
}
177+
178+
return binary;
179+
}
180+
181+
if (throwOnMissing) {
182+
string extensions = String.Join (",", executableExtensions);
183+
throw new InvalidOperationException ($"Failed to find binary file '{baseName}{{{extensions}}}'");
184+
}
185+
186+
return baseName;
140187
}
141188

142189
string GetVersionMarker (string toolPath)

src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public override bool RunTask ()
5858
return !Log.HasLoggedErrors;
5959
}
6060

61-
protected override string ToolName => OS.IsWindows ? $"{triple}-strip.exe" : $"{triple}-strip";
61+
protected override string ToolName => GetToolName ($"{triple}-strip");
6262

6363
protected override string GenerateFullPathToTool () => Path.Combine (ToolPath, ToolName);
6464

@@ -80,5 +80,16 @@ string GetNdkTripleFromAbi (string abi)
8080
_ => throw new InvalidOperationException ($"Unknown ABI: {abi}"),
8181
};
8282
}
83+
84+
// We need this because `GenerateFullPathToTool()` is ignored when `ToolPath` is set (https://docs.microsoft.com/en-us/dotnet/api/microsoft.build.utilities.tooltask.generatefullpathtotool?view=msbuild-17-netcore)
85+
// Some tools we use with llvm-based toolchain have .cmd wrappers instead of .exe, so we need to determine the actual name from filesystem.
86+
string GetToolName (string toolName)
87+
{
88+
if (OS.IsWindows) {
89+
return Path.GetFileName (MonoAndroidHelper.GetExecutablePath (ToolPath, toolName));
90+
}
91+
92+
return toolName;
93+
}
8394
}
8495
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,11 @@ public void CheckAssemblyCounts (bool isRelease, bool aot)
143143
}
144144
}
145145

146+
// DotNet fails, see https://github.com/xamarin/xamarin-android/issues/6685
147+
// Enable the commented out signature (and AOT) once the above is fixed
146148
[Test]
147149
[Category ("SmokeTests")]
150+
// public void SmokeTestBuildWithSpecialCharacters ([Values (false, true)] bool forms, [Values (false, true)] bool aot)
148151
public void SmokeTestBuildWithSpecialCharacters ([Values (false, true)] bool forms)
149152
{
150153
var testName = "テスト";
@@ -155,9 +158,8 @@ public void SmokeTestBuildWithSpecialCharacters ([Values (false, true)] bool for
155158
new XamarinAndroidApplicationProject ();
156159
proj.ProjectName = testName;
157160
proj.IsRelease = true;
158-
// TODO: AOT fails https://github.com/xamarin/xamarin-android/issues/6685
159-
// .NET 6 uses AOT by default for Release
160-
proj.AotAssemblies = false;
161+
proj.AotAssemblies = false; /* = true; once AOT is fixed */
162+
161163
if (forms) {
162164
proj.PackageReferences.Clear ();
163165
proj.PackageReferences.Add (KnownPackages.XamarinForms_4_7_0_1142);

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ protected bool BuildInternal (string projectOrSolution, string target, string []
305305
}
306306
args.Append ($" @\"{responseFile}\"");
307307
using (var sw = new StreamWriter (responseFile, append: false, encoding: Encoding.UTF8)) {
308+
sw.WriteLine ("/p:_DisableParallelAot=true");
308309
sw.WriteLine ($" /p:BuildingInsideVisualStudio={BuildingInsideVisualStudio}");
309310
if (BuildingInsideVisualStudio) {
310311
sw.WriteLine (" /p:BuildingOutOfProcess=true");

0 commit comments

Comments
 (0)