diff --git a/Configuration.props b/Configuration.props index fd4f45d1a38..faac18fa377 100644 --- a/Configuration.props +++ b/Configuration.props @@ -111,8 +111,37 @@ 04E7F3A72044DE4926FA038FA0E251A37BBA1E1C3FB8BEAB6F8401BFD9EB4BF3 5D9AC77FB6FF43D9DA518A337B4FCF8F9097113DF531D99CCEFE80EF7CE8250B AA1095CB14D83E483818A748A2C06FAAEB8E601561B06A356A119A1B2CA280D3 - 36.0.0 + D3E9FA1DF3345CF728586908426615A60863D2632F73F1CE14F0F1349EF000FD + 0EAD642C943FFE79701FCCCA8F5F1C69C4CE4F43DF2EEFEE553F6CCB27CBFBE8 + 12C2841F354E92A0EB2FD7BF6F0F9BF8538ABCE7BD6B060AC8349D6F6A61107C + 5673201E6F3869F418EEED3B5CB6C4BE7401502BD0AAE1B12A29D164D647A54E + 7EC965280A073311C339E571CD5DE778B9975026CFCBE79F2B1CDCB1E15317EE + 98B565CB657B012DAE6794CEFC0F66AE1EFB4690C699B78A614B4A6A3505B003 + 57024D590691B9D66977D2F66786F10971549441B33B7830D3D2B659F80B93EA + 8CF0DC4F7CE0173D13ED71066FB6861A79C73545DF71D12CA3E933430F268D50 + 026982DBA2DBD2DE4A530CF1300FFAD05F6BC7D372D9DF83D46112FE017E0C6B + + 3029489D4B2F868DC5347AA27B1E52FB48D6D28ABD51278E3FBEC2EE73201EDF + EDA85B9BFFD0926B7A01EA334A30AB41827F573CBDE8F7F97FCD8C5B38F039F6 + 58BFDF0572F06EC007A7287154CDC6B2EBFEA947D07A1E26A0F6B5E1A39E9191 + 9F2855BFE98E80728E61D45B0EA72BA22F64952C9330559FA4E2CD3698A32231 + + B5C3FDA1F4B4931C30518D342E4AD5F7464945E0CDCED3538D4FF2E12F7BF201 + 7FD1610E16A69AC2E202278E82077DE134CE404FE099D872019F69F3A340ACDD + B5C3FDA1F4B4931C30518D342E4AD5F7464945E0CDCED3538D4FF2E12F7BF201 + B5C3FDA1F4B4931C30518D342E4AD5F7464945E0CDCED3538D4FF2E12F7BF201 + + A3F91808DCE50C1717737DE90C18479ED3A78B147E06985247D138E7AB5123D0 + 68DB2690CB92E4EE5373AC9B792642C90717D8F417D83ECCEA48781171B3182A + BD97900346A70C784AC8B15C809539DDEF34ED3B5BE1DF8A9A89CF298BE93798 + + <_XAAndroidNdkRelease>28c + <_XAAndroidNdkPkgRevision>28.2.13676358 + 0D4599E8BBF1A1668A0D51A541729B2246360F350018A2081D0B302DBB594F2A + DFB20D396DF28CA02A8C708314B814A4D961DC9074F9A161932746F815AA552F + 6BEC98AC2354D8A919760889A1A41D020132E5E8CFA1B1FE51610A72C36A466B 1.18.3 A099CFA1543F55593BC2ED16A70A7C67FE54B1747BB7301F37FDFD6D91028E29 L_18.1.6-8.0.0-1 diff --git a/build-tools/automation/yaml-templates/run-dotnet-preview.yaml b/build-tools/automation/yaml-templates/run-dotnet-preview.yaml index 9253ca1dfa9..68489576ca3 100644 --- a/build-tools/automation/yaml-templates/run-dotnet-preview.yaml +++ b/build-tools/automation/yaml-templates/run-dotnet-preview.yaml @@ -10,6 +10,7 @@ parameters: continueOnError: true retryCountOnTaskFailure: 0 taskTimeoutInMinutes: 0 + env: {} steps: - powershell: | @@ -33,3 +34,5 @@ steps: continueOnError: ${{ parameters.continueOnError }} retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} timeoutInMinutes: ${{ parameters.taskTimeoutInMinutes }} + ${{ if parameters.env }}: + env: ${{ parameters.env }} diff --git a/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml b/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml index 2f1a0b73b81..78c8c8cb892 100644 --- a/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml +++ b/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml @@ -52,9 +52,15 @@ steps: - template: /build-tools/automation/yaml-templates/run-xaprepare.yaml parameters: - arguments: --s=${{ parameters.xaprepareScenario }} --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}" + arguments: --s=${{ parameters.xaprepareScenario }} xaSourcePath: ${{ parameters.xaSourcePath }} +- task: DotNetCoreCLI@2 + displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj + inputs: + projects: ${{ parameters.xaSourcePath }}/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj + arguments: -c ${{ parameters.configuration }} -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/BootstrapTasks.binlog + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml parameters: displayName: install OpenJDK and accept Android SDK licenses @@ -62,12 +68,8 @@ steps: project: ${{ parameters.xaSourcePath }}/src/androidsdk/androidsdk.csproj arguments: -c ${{ parameters.configuration }} -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/androidsdk.binlog continueOnError: false - -- task: DotNetCoreCLI@2 - displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj - inputs: - projects: ${{ parameters.xaSourcePath }}/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj - arguments: -c ${{ parameters.configuration }} -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/BootstrapTasks.binlog + env: + AndroidSdkPlatforms: ${{ parameters.androidSdkPlatforms }} # Download and install .NET nupkgs - task: DownloadPipelineArtifact@2 diff --git a/build-tools/manifest-attribute-codegen/README.md b/build-tools/manifest-attribute-codegen/README.md index 168d68a9144..e17ff3a81a9 100644 --- a/build-tools/manifest-attribute-codegen/README.md +++ b/build-tools/manifest-attribute-codegen/README.md @@ -15,11 +15,12 @@ This generally only needs to be done each time we bind a new Android API level. # How to use -Ensure all Android platform SDK levels are installed. This can be done with `xaprepare`; -run the following command from the checkout toplevel: +Ensure all Android platform SDK levels are installed. This is done via the +`androidsdk.csproj` project; run the following command from the checkout +toplevel: ```dotnetcli -dotnet run --project "build-tools/xaprepare/xaprepare/xaprepare.csproj" -- -s AndroidTestDependencies --android-sdk-platforms=all +dotnet build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all ``` Next, from this directory, run: diff --git a/build-tools/xaprepare/xaprepare/Application/AndroidToolchainComponent.cs b/build-tools/xaprepare/xaprepare/Application/AndroidToolchainComponent.cs deleted file mode 100644 index a03baee3342..00000000000 --- a/build-tools/xaprepare/xaprepare/Application/AndroidToolchainComponent.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.IO; - -namespace Xamarin.Android.Prepare -{ - class AndroidToolchainComponent : AppObject, IBuildInventoryItem - { - public string Name { get; } - public string DestDir { get; } - public Uri? RelativeUrl { get; } - public bool IsMultiVersion { get; } - public bool NoSubdirectory { get; } - public string? PkgRevision { get; } - public AndroidToolchainComponentType DependencyType { get; } - public string BuildToolName { get; } - public string BuildToolVersion { get; } - - public AndroidToolchainComponent (string name, string destDir, Uri? relativeUrl = null, bool isMultiVersion = false, bool noSubdirectory = false, string? pkgRevision = null, - AndroidToolchainComponentType dependencyType = AndroidToolchainComponentType.CoreDependency, string buildToolName = "", string buildToolVersion = "") - { - if (String.IsNullOrEmpty (name)) - throw new ArgumentException ("must not be null or empty", nameof (name)); - if (String.IsNullOrEmpty (destDir)) - throw new ArgumentException ("must not be null or empty", nameof (destDir)); - - Name = name; - DestDir = destDir; - RelativeUrl = relativeUrl; - IsMultiVersion = isMultiVersion; - NoSubdirectory = noSubdirectory; - PkgRevision = pkgRevision; - DependencyType = dependencyType; - BuildToolName = string.IsNullOrEmpty (buildToolName) ? $"android-sdk-{name}" : buildToolName; - BuildToolVersion = buildToolVersion; - } - - public void AddToInventory () - { - if (!string.IsNullOrEmpty (BuildToolName) && !string.IsNullOrEmpty (BuildToolVersion) && !Context.Instance.BuildToolsInventory.ContainsKey (BuildToolName)) { - Context.Instance.BuildToolsInventory.Add (BuildToolName, BuildToolVersion); - } - } - } - - class AndroidPlatformComponent : AndroidToolchainComponent - { - public string ApiLevel { get; } - public bool IsLatestStable { get; } - public bool IsPreview { get; } - - public AndroidPlatformComponent (string name, string apiLevel, string pkgRevision, bool isLatestStable = false, bool isPreview = false) - : base (name, Path.Combine ("platforms", $"android-{apiLevel}"), pkgRevision: pkgRevision, buildToolName: $"android-sdk-{name}", buildToolVersion: $"{apiLevel}.{pkgRevision}") - { - ApiLevel = apiLevel; - IsLatestStable = isLatestStable; - IsPreview = isPreview; - } - } - - [Flags] - enum AndroidToolchainComponentType - { - CoreDependency = 0, - BuildDependency = 1 << 0, - EmulatorDependency = 1 << 1, - All = CoreDependency | BuildDependency | EmulatorDependency, - } - -} diff --git a/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs b/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs index ec2a39f9b82..5674d987d41 100644 --- a/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs +++ b/build-tools/xaprepare/xaprepare/Application/BuildInfo.cs @@ -9,17 +9,26 @@ namespace Xamarin.Android.Prepare { partial class BuildInfo : AppObject { - static readonly char[] NDKPropertySeparator = new [] { '=' }; - public string CommitOfLastVersionChange { get; private set; } = String.Empty; - // Not available from the start, only after NDK is installed - public string NDKRevision { get; private set; } = String.Empty; - public string NDKVersionMajor { get; private set; } = String.Empty; - public string NDKVersionMinor { get; private set; } = String.Empty; - public string NDKVersionMicro { get; private set; } = String.Empty; - public string NDKVersionTag { get; private set; } = String.Empty; - public string NDKMinimumApiAvailable { get; private set; } = String.Empty; + // NDK version info is now derived directly from BuildAndroidPlatforms.AndroidNdkPkgRevision + // (single source of truth shared with src/androidsdk/androidsdk.targets via Configuration.props). + public string NDKRevision => BuildAndroidPlatforms.AndroidNdkPkgRevision; + public string NDKVersionMajor => NDKVersion.Major.ToString (); + public string NDKVersionMinor => NDKVersion.Minor.ToString (); + public string NDKVersionMicro => NDKVersion.Build.ToString (); + + Version? cachedNdkVersion; + Version NDKVersion { + get { + if (cachedNdkVersion != null) + return cachedNdkVersion; + if (!Utilities.ParseAndroidPkgRevision (BuildAndroidPlatforms.AndroidNdkPkgRevision, out Version? ver, out _) || ver == null) + throw new InvalidOperationException ($"Unable to parse NDK revision '{BuildAndroidPlatforms.AndroidNdkPkgRevision}' as a valid version string"); + cachedNdkVersion = ver; + return ver; + } + } public string VersionHash { get; private set; } = String.Empty; public string XACommitHash { get; private set; } = String.Empty; @@ -44,70 +53,6 @@ void DetermineXACommitInfo (Context context) XABranch = git.GetBranchName (); } - public bool GatherNDKInfo (Context context) - { - string ndkDir = Configurables.Paths.AndroidNdkDirectory; - string props = Path.Combine (ndkDir, "source.properties"); - if (!File.Exists (props)) { - Log.ErrorLine ("NDK properties file does not exist: ", props, tailColor: Log.DestinationColor); - return false; - } - - string[] lines = File.ReadAllLines (props); - foreach (string l in lines) { - string line = l.Trim (); - string[] parts = line.Split (NDKPropertySeparator, 2); - if (parts.Length != 2) - continue; - - if (String.Compare ("Pkg.Revision", parts [0].Trim (), StringComparison.Ordinal) != 0) - continue; - - string rev = parts [1].Trim (); - NDKRevision = rev; - - if (!Utilities.ParseAndroidPkgRevision (rev, out Version? ver, out string? tag) || ver == null) { - Log.ErrorLine ($"Unable to parse NDK revision '{rev}' as a valid version string"); - return false; - } - - NDKVersionMajor = ver.Major.ToString (); - NDKVersionMinor = ver.Minor.ToString (); - NDKVersionMicro = ver.Build.ToString (); - NDKVersionTag = tag ?? String.Empty; - break; - } - - Log.DebugLine ($"Looking for minimum API available in {ndkDir}"); - int minimumApi = Int32.MaxValue; - foreach (var kvp in Configurables.Defaults.AndroidToolchainPrefixes) { - string dirName = kvp.Value; - string platforms = Path.Combine (Configurables.Paths.AndroidToolchainSysrootLibDirectory, dirName); - Log.DebugLine ($" searching in {platforms}"); - foreach (string p in Directory.EnumerateDirectories (platforms, "*", SearchOption.TopDirectoryOnly)) { - string plibc = Path.Combine (p, "libc.so"); - if (!Utilities.FileExists (plibc)) { - continue; - } - - Log.DebugLine ($" found {p}"); - string pdir = Path.GetFileName (p); - int api; - if (!Int32.TryParse (pdir, out api)) - continue; - - if (api >= minimumApi) - continue; - - minimumApi = api; - } - } - - Log.DebugLine ($"Detected minimum NDK API level: {minimumApi}"); - NDKMinimumApiAvailable = minimumApi.ToString (); - return true; - } - async Task DetermineLastVersionChangeCommit (Context context) { Log.StatusLine ($" {context.Characters.Bullet} Commit of last version change", ConsoleColor.Gray); diff --git a/build-tools/xaprepare/xaprepare/Application/Context.cs b/build-tools/xaprepare/xaprepare/Application/Context.cs index d88afc51e21..d56517a0ffb 100644 --- a/build-tools/xaprepare/xaprepare/Application/Context.cs +++ b/build-tools/xaprepare/xaprepare/Application/Context.cs @@ -277,16 +277,6 @@ public string DebugFileExtension { } } - /// - /// Collection of programs or dependencies which should be reinstalled. - /// - public RefreshableComponent ComponentsToRefresh { get; set; } - - /// - /// Collection of Android SDK platform levels to be installed. - /// - public IEnumerable AndroidSdkPlatforms { get; set; } = Enumerable.Empty (); - /// /// Path to a local .NET SDK archive to use instead of downloading. /// diff --git a/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs b/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs index 8e40419bb0b..e80df2d8537 100644 --- a/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs +++ b/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs @@ -2,9 +2,6 @@ namespace Xamarin.Android.Prepare { static class KnownProperties { - public const string AndroidCmakeUrlPrefix = "AndroidCmakeUrlPrefix"; - public const string AndroidCmakeVersion = "AndroidCmakeVersion"; - public const string AndroidCmakeVersionPath = "AndroidCmakeVersionPath"; public const string AndroidMinimumDotNetApiLevel = "AndroidMinimumDotNetApiLevel"; public const string AndroidDefaultTargetDotnetApiLevel = "AndroidDefaultTargetDotnetApiLevel"; public const string AndroidLatestStableApiLevel = "AndroidLatestStableApiLevel"; @@ -56,6 +53,5 @@ static class KnownProperties public const string XAInstallPrefix = "XAInstallPrefix"; public const string XAPackagesDir = "XAPackagesDir"; public const string XAPlatformToolsVersion = "XAPlatformToolsVersion"; - public const string XAPlatformToolsPackagePrefix = "XAPlatformToolsPackagePrefix"; } } diff --git a/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in b/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in index cf6cee1fa49..83ce47017ab 100644 --- a/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in +++ b/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in @@ -6,9 +6,6 @@ namespace Xamarin.Android.Prepare { void InitDefaults () { - properties.Add (KnownProperties.AndroidCmakeUrlPrefix, StripQuotes ("@AndroidCmakeUrlPrefix@")); - properties.Add (KnownProperties.AndroidCmakeVersion, StripQuotes ("@AndroidCmakeVersion@")); - properties.Add (KnownProperties.AndroidCmakeVersionPath, StripQuotes (@"@AndroidCmakeVersionPath@")); properties.Add (KnownProperties.AndroidMinimumDotNetApiLevel, StripQuotes ("@AndroidMinimumDotNetApiLevel@")); properties.Add (KnownProperties.AndroidDefaultTargetDotnetApiLevel, StripQuotes ("@AndroidDefaultTargetDotnetApiLevel@")); properties.Add (KnownProperties.AndroidLatestStableApiLevel, StripQuotes ("@AndroidLatestStableApiLevel@")); @@ -60,7 +57,6 @@ namespace Xamarin.Android.Prepare properties.Add (KnownProperties.XAInstallPrefix, StripQuotes (@"@XAInstallPrefix@")); properties.Add (KnownProperties.XAPackagesDir, StripQuotes (@"@XAPackagesDir@")); properties.Add (KnownProperties.XAPlatformToolsVersion, StripQuotes ("@XAPlatformToolsVersion@")); - properties.Add (KnownProperties.XAPlatformToolsPackagePrefix, StripQuotes ("@XAPlatformToolsPackagePrefix@")); } string StripQuotes (string input) diff --git a/build-tools/xaprepare/xaprepare/Application/RefreshableComponent.cs b/build-tools/xaprepare/xaprepare/Application/RefreshableComponent.cs deleted file mode 100644 index cda3299dbe9..00000000000 --- a/build-tools/xaprepare/xaprepare/Application/RefreshableComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -namespace Xamarin.Android.Prepare -{ - [Flags] - public enum RefreshableComponent - { - None = 0, - AndroidSDK = 1, - AndroidNDK = 2, - All = AndroidSDK | AndroidNDK - } -} diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Linux.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Linux.cs index be98ee37cb6..87be9519266 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Linux.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Linux.cs @@ -11,7 +11,6 @@ partial class Defaults partial class Paths { - public const string NdkToolchainOSTag = "linux-x86_64"; } } } diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.MacOS.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.MacOS.cs index 3ea71d15b40..0503c1cb566 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.MacOS.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.MacOS.cs @@ -12,7 +12,6 @@ partial class Defaults partial class Paths { public const string MonoCrossRuntimeInstallPath = "Darwin"; - public const string NdkToolchainOSTag = "darwin-x86_64"; } } } diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Windows.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Windows.cs index e4b80c85147..7c7a025398f 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Windows.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.Windows.cs @@ -12,7 +12,6 @@ partial class Defaults partial class Paths { - public const string NdkToolchainOSTag = "windows-x86_64"; } partial class Urls diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs index a48f23b95f7..a85850935bc 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs @@ -126,27 +126,6 @@ public static partial class Defaults /// public const string HashAlgorithm = "SHA1"; - public static readonly Dictionary AndroidToolchainPrefixes = new Dictionary (StringComparer.Ordinal) { - { "armeabi-v7a", "arm-linux-androideabi" }, - { "arm64-v8a", "aarch64-linux-android" }, - { "x86", "i686-linux-android" }, - { "x86_64", "x86_64-linux-android" }, - }; - - public static readonly Dictionary AbiToRID = new (StringComparer.Ordinal) { - { "armeabi-v7a", "android-arm" }, - { "arm64-v8a", "android-arm64" }, - { "x86", "android-x86" }, - { "x86_64", "android-x64" }, - }; - - public static readonly Dictionary AbiToClangArch = new (StringComparer.Ordinal) { - { "armeabi-v7a", "arm" }, - { "arm64-v8a", "aarch64" }, - { "x86", "i686" }, - { "x86_64", "x86_64" }, - }; - /// /// ABIs that support the NativeAOT runtime. Used to determine which ABIs /// need the higher API-level CRT/sysroot files in the NativeAOT runtime pack. @@ -232,10 +211,6 @@ public static partial class Paths // Other public static string AndroidNdkDirectory => ctx.Properties.GetRequiredValue (KnownProperties.AndroidNdkDirectory); - public static string AndroidToolchainRootDirectory => GetCachedPath (ref androidToolchainRootDirectory, () => Path.Combine (AndroidNdkDirectory, "toolchains", "llvm", "prebuilt", NdkToolchainOSTag)); - public static string AndroidClangRootDirectory => GetCachedPath (ref androidClangRootDirectory, () => Path.Combine (AndroidToolchainRootDirectory, "lib", "clang")); - public static string AndroidToolchainBinDirectory => GetCachedPath (ref androidToolchainBinDirectory, () => Path.Combine (AndroidToolchainRootDirectory, "bin")); - public static string AndroidToolchainSysrootLibDirectory => GetCachedPath (ref androidToolchainSysrootLibDirectory, () => Path.Combine (AndroidToolchainRootDirectory, "sysroot", "usr", "lib")); public static string AndroidBuildToolsCacheDir => ctx.Properties.GetRequiredValue (KnownProperties.AndroidToolchainCacheDirectory); // not really configurables, merely convenience aliases for more frequently used paths that come from properties @@ -264,15 +239,6 @@ static string GetCoreClrAppRuntimePath (Context ctx, string androidTarget) ); } - static string EnsureAndroidToolchainBinDirectories () - { - if (androidToolchainBinDirectory != null) - return androidToolchainBinDirectory; - - androidToolchainBinDirectory = Path.Combine (ctx.Properties.GetRequiredValue (KnownProperties.AndroidNdkDirectory), "toolchains", "llvm", "prebuilt", NdkToolchainOSTag, "bin"); - return androidToolchainBinDirectory; - } - static string GetCachedPath (ref string? variable, Func creator) { if (!String.IsNullOrEmpty (variable)) @@ -285,10 +251,6 @@ static string GetCachedPath (ref string? variable, Func creator) static string? testBinDir; static string? buildBinDir; static string? binDir; - static string? androidToolchainRootDirectory; - static string? androidClangRootDirectory; - static string? androidToolchainBinDirectory; - static string? androidToolchainSysrootLibDirectory; static string? installMSBuildDir; static string? monoAndroidFrameworksRootDir; static string? externalJavaInteropDir; diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Linux.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Linux.cs deleted file mode 100644 index acb50f06607..00000000000 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Linux.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace Xamarin.Android.Prepare -{ - partial class AndroidToolchain - { - static readonly string osTag = "linux"; - static readonly string altOsTag = osTag; - static readonly string cltOsTag = osTag; - static readonly string pltOsTag = osTag; - } -} diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.MacOS.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.MacOS.cs deleted file mode 100644 index 53f41d1ad67..00000000000 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.MacOS.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Xamarin.Android.Prepare -{ - partial class AndroidToolchain - { - static readonly string osTag = "darwin"; - static readonly string altOsTag = "macosx"; - static readonly string cltOsTag = "mac"; - static readonly string pltOsTag = osTag; - } -} diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Windows.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Windows.cs deleted file mode 100644 index 6a4d379aa58..00000000000 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.Windows.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Xamarin.Android.Prepare -{ - partial class AndroidToolchain - { - static readonly string osTag = "windows"; - static readonly string altOsTag = osTag; - static readonly string cltOsTag = "win"; - static readonly string pltOsTag = cltOsTag; - } -} diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs deleted file mode 100644 index bb20004668c..00000000000 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; - -namespace Xamarin.Android.Prepare -{ - partial class AndroidToolchain : AppObject - { - public static readonly Uri AndroidUri = Configurables.Urls.AndroidToolchain_AndroidUri; - - public List Components { get; } - - public AndroidToolchain () - { - string AndroidNdkVersion = BuildAndroidPlatforms.AndroidNdkVersion; - string AndroidPkgRevision = BuildAndroidPlatforms.AndroidNdkPkgRevision; - string AndroidNdkDirectory = GetRequiredProperty (KnownProperties.AndroidNdkDirectory); - string AndroidCmakeUrlPrefix = Context.Instance.Properties.GetValue (KnownProperties.AndroidCmakeUrlPrefix) ?? String.Empty; - string AndroidCmakeVersion = GetRequiredProperty (KnownProperties.AndroidCmakeVersion); - string AndroidCmakeVersionPath = GetRequiredProperty (KnownProperties.AndroidCmakeVersionPath); - string CommandLineToolsVersion = GetRequiredProperty (KnownProperties.CommandLineToolsVersion); - string CommandLineToolsFolder = GetRequiredProperty (KnownProperties.CommandLineToolsFolder); - string EmulatorVersion = GetRequiredProperty (KnownProperties.EmulatorVersion); - string EmulatorPkgRevision = GetRequiredProperty (KnownProperties.EmulatorPkgRevision); - string XABuildToolsFolder = GetRequiredProperty (KnownProperties.XABuildToolsFolder); - string XABuildToolsVersion = GetRequiredProperty (KnownProperties.XABuildToolsVersion); - string XAPlatformToolsVersion = GetRequiredProperty (KnownProperties.XAPlatformToolsVersion); - string XAPlatformToolsPackagePrefix = Context.Instance.Properties [KnownProperties.XAPlatformToolsPackagePrefix] ?? String.Empty; - bool isArm64Apple = Context.Instance.OS.Flavor == "macOS" && RuntimeInformation.OSArchitecture == Architecture.Arm64; - string emulatorArch = isArm64Apple ? "aarch64" : "x64"; - string systemImageArch = isArm64Apple ? "arm64-v8a" : "x86_64"; - - // Upstream manifests with version information: - // - // https://dl-ssl.google.com/android/repository/repository2-1.xml - // https://dl-ssl.google.com/android/repository/repository2-3.xml - // * platform APIs - // * build-tools - // * command-line tools - // * sdk-tools - // * platform-tools - // - // https://dl-ssl.google.com/android/repository/addon2-1.xml - // * android_m2repository_r47 - // - // https://dl-ssl.google.com/android/repository/sys-img/android/sys-img2-1.xml - // https://dl-ssl.google.com/android/repository/sys-img/google_apis/sys-img2-1.xml - // * system images - // - // Note "isLatestStable" is a bad name, it's actually "xaprepare should install this API by default" - Components = new List { - new AndroidPlatformComponent ("android-2.3.3_r02", apiLevel: "10", pkgRevision: "2"), - new AndroidPlatformComponent ("android-15_r05", apiLevel: "15", pkgRevision: "5"), - new AndroidPlatformComponent ("android-16_r05", apiLevel: "16", pkgRevision: "5"), - new AndroidPlatformComponent ("android-17_r03", apiLevel: "17", pkgRevision: "3"), - new AndroidPlatformComponent ("android-18_r03", apiLevel: "18", pkgRevision: "3"), - new AndroidPlatformComponent ("android-19_r04", apiLevel: "19", pkgRevision: "4"), - new AndroidPlatformComponent ("android-20_r02", apiLevel: "20", pkgRevision: "2"), - new AndroidPlatformComponent ("android-21_r02", apiLevel: "21", pkgRevision: "2"), - new AndroidPlatformComponent ("android-22_r02", apiLevel: "22", pkgRevision: "2"), - new AndroidPlatformComponent ("platform-23_r03", apiLevel: "23", pkgRevision: "3"), - new AndroidPlatformComponent ("platform-24_r02", apiLevel: "24", pkgRevision: "3"), // Local package revision is actually .3 - new AndroidPlatformComponent ("platform-25_r03", apiLevel: "25", pkgRevision: "3"), - new AndroidPlatformComponent ("platform-26_r02", apiLevel: "26", pkgRevision: "2"), - new AndroidPlatformComponent ("platform-27_r03", apiLevel: "27", pkgRevision: "3"), - new AndroidPlatformComponent ("platform-28_r04", apiLevel: "28", pkgRevision: "4"), - new AndroidPlatformComponent ("platform-29_r01", apiLevel: "29", pkgRevision: "1"), - new AndroidPlatformComponent ("platform-30_r01", apiLevel: "30", pkgRevision: "1"), - new AndroidPlatformComponent ("platform-31_r01", apiLevel: "31", pkgRevision: "1"), - new AndroidPlatformComponent ("platform-32_r01", apiLevel: "32", pkgRevision: "1"), - new AndroidPlatformComponent ("platform-33-ext3_r03", apiLevel: "33", pkgRevision: "3"), - new AndroidPlatformComponent ("platform-34-ext7_r02", apiLevel: "34", pkgRevision: "2"), - new AndroidPlatformComponent ("platform-35_r02", apiLevel: "35", pkgRevision: "2"), - new AndroidPlatformComponent ("platform-36_r02", apiLevel: "36", pkgRevision: "2"), - new AndroidPlatformComponent ("platform-36.1_r01", apiLevel: "36.1", pkgRevision: "1"), - new AndroidPlatformComponent ("platform-37.0_r01", apiLevel: "37.0", pkgRevision: "1", isLatestStable: true), - - new AndroidToolchainComponent ("source-36_r01", - destDir: Path.Combine ("sources", "android-36"), - pkgRevision: "1", - dependencyType: AndroidToolchainComponentType.BuildDependency, - buildToolVersion: "36.1" - ), - new AndroidToolchainComponent ("docs-24_r01", - destDir: "docs", - pkgRevision: "1", - dependencyType: AndroidToolchainComponentType.BuildDependency, - buildToolVersion: "24.1" - ), - new AndroidToolchainComponent ("android_m2repository_r47", - destDir: Path.Combine ("extras", "android", "m2repository"), - pkgRevision: "47.0.0", - dependencyType: AndroidToolchainComponentType.BuildDependency, - buildToolVersion: "47.0.0" - ), - new AndroidToolchainComponent (isArm64Apple ? $"{systemImageArch}-29_r08" : $"{systemImageArch}-29_r08-{osTag}", - destDir: Path.Combine ("system-images", "android-29", "default", systemImageArch), - relativeUrl: new Uri ("sys-img/android/", UriKind.Relative), - pkgRevision: "8", - dependencyType: AndroidToolchainComponentType.EmulatorDependency - ), - new AndroidToolchainComponent ($"android-ndk-r{AndroidNdkVersion}-{osTag}", - destDir: AndroidNdkDirectory, - pkgRevision: AndroidPkgRevision, - buildToolName: $"android-ndk-r{AndroidNdkVersion}", - buildToolVersion: AndroidPkgRevision - ), - new AndroidToolchainComponent ($"build-tools_r{XABuildToolsVersion}_{altOsTag}", - destDir: Path.Combine ("build-tools", XABuildToolsFolder), - isMultiVersion: true, - buildToolName: "android-sdk-build-tools", - buildToolVersion: $"{XABuildToolsVersion}" - ), - new AndroidToolchainComponent ($"commandlinetools-{cltOsTag}-{CommandLineToolsVersion}", - destDir: Path.Combine ("cmdline-tools", CommandLineToolsFolder), - isMultiVersion: true, - buildToolName: "android-sdk-cmdline-tools", - buildToolVersion: $"{CommandLineToolsFolder}.{CommandLineToolsVersion}" - ), - new AndroidToolchainComponent ($"{XAPlatformToolsPackagePrefix}platform-tools_r{XAPlatformToolsVersion}-{pltOsTag}", - destDir: "platform-tools", - pkgRevision: XAPlatformToolsVersion, - buildToolName: "android-sdk-platform-tools", - buildToolVersion: XAPlatformToolsVersion - ), - new AndroidToolchainComponent ($"emulator-{osTag}_{emulatorArch}-{EmulatorVersion}", - destDir: "emulator", - pkgRevision: EmulatorPkgRevision, - dependencyType: AndroidToolchainComponentType.EmulatorDependency - ), - new AndroidToolchainComponent ($"{AndroidCmakeUrlPrefix}cmake-{AndroidCmakeVersion}-{osTag}", - destDir: Path.Combine ("cmake", AndroidCmakeVersionPath), - isMultiVersion: true, - noSubdirectory: true, - pkgRevision: AndroidCmakeVersion, - buildToolName: "android-sdk-cmake", - buildToolVersion: AndroidCmakeVersion - ), - }; - } - - static string GetRequiredProperty (string propertyName) - { - string? value = Context.Instance.Properties [propertyName]; - if (String.IsNullOrEmpty (value)) - throw new InvalidOperationException ($"Required property '{propertyName}' not defined"); - return value!; - } - } -} diff --git a/build-tools/xaprepare/xaprepare/Main.cs b/build-tools/xaprepare/xaprepare/Main.cs index 8676b92d7a2..d9157457413 100644 --- a/build-tools/xaprepare/xaprepare/Main.cs +++ b/build-tools/xaprepare/xaprepare/Main.cs @@ -27,8 +27,6 @@ sealed class ParsedOptions public string? Configuration { get; set; } public bool AutoProvision { get; set; } public bool AutoProvisionUsesSudo { get; set; } - public RefreshableComponent RefreshList { get; set; } - public IEnumerable AndroidSdkPlatforms { get; set; } = new [] { "latest" }; public string? LocalDotNetSdkArchive { get; set; } } @@ -97,11 +95,9 @@ static async Task Run (string[] args) {"ls", "List names of all known scenarios", v => parsedOptions.ListScenarios = true }, {"cf=", $"{{NAME}} of the compression format to use for some archives (e.g. the XA bundle). One of: {GetCompressionFormatNames ()}; Default: {parsedOptions.CompressionFormat}", v => parsedOptions.CompressionFormat = v?.Trim () ?? String.Empty}, {"c|configuration=", $"Build {{CONFIGURATION}}. Default: {Context.Instance.Configuration}", v => parsedOptions.Configuration = v?.Trim ()}, - {"refresh:", "[sdk,ndk] Comma separated list of components which should be reinstalled. Defaults to all supported components if no value is provided.", v => parsedOptions.RefreshList = ParseRefreshableComponents (v?.Trim () ?? String.Empty)}, "", {"auto-provision=", $"Automatically install software required by .NET for Android", v => parsedOptions.AutoProvision = ParseBoolean (v)}, {"auto-provision-uses-sudo=", $"Allow use of sudo(1) when provisioning", v => parsedOptions.AutoProvisionUsesSudo = ParseBoolean (v)}, - {"android-sdk-platforms=", "Comma separated list of Android SDK platform levels to be installed or 'latest' or 'all'. Defaults to 'latest' if no value is provided.", v => parsedOptions.AndroidSdkPlatforms = ParseAndroidSdkPlatformLevels (v?.Trim () ?? String.Empty) }, {"dotnet-sdk-archive=", "Path to a local .NET SDK archive (zip or tar.gz) to use instead of downloading from the internet.", v => parsedOptions.LocalDotNetSdkArchive = v?.Trim () }, "", {"h|help", "Show this help message", v => parsedOptions.ShowHelp = true }, @@ -132,8 +128,6 @@ static async Task Run (string[] args) Context.Instance.DebugFileExtension = parsedOptions.DebugFileExtension; Context.Instance.AutoProvision = parsedOptions.AutoProvision; Context.Instance.AutoProvisionUsesSudo = parsedOptions.AutoProvisionUsesSudo; - Context.Instance.ComponentsToRefresh = parsedOptions.RefreshList; - Context.Instance.AndroidSdkPlatforms = parsedOptions.AndroidSdkPlatforms; Context.Instance.LocalDotNetSdkArchive = parsedOptions.LocalDotNetSdkArchive; if (!String.IsNullOrEmpty (parsedOptions.Configuration)) @@ -297,48 +291,5 @@ static bool ParseBoolean (string? value) throw new InvalidOperationException ($"Unknown boolean value: {value}"); } - static RefreshableComponent ParseRefreshableComponents (string refreshList) - { - if (String.IsNullOrEmpty (refreshList)) - return RefreshableComponent.All; - - if (refreshList.IndexOf (',') == -1) - return ParseSingleComponent (refreshList); - - var allParsedComponents = RefreshableComponent.None; - var refreshListArray = refreshList.Split (','); - foreach (var c in refreshListArray) { - RefreshableComponent parsed = ParseSingleComponent (c); - if (parsed != RefreshableComponent.None) - allParsedComponents |= parsed; - } - - return allParsedComponents; - - - RefreshableComponent ParseSingleComponent (string component) { - if (String.Compare ("sdk", component, StringComparison.OrdinalIgnoreCase) == 0) - return RefreshableComponent.AndroidSDK; - - if (String.Compare ("ndk", component, StringComparison.OrdinalIgnoreCase) == 0) - return RefreshableComponent.AndroidNDK; - - return RefreshableComponent.None; - } - } - - static IEnumerable ParseAndroidSdkPlatformLevels (string list) - { - // If the user specified "all" we return 'all' to indicate that all platforms should be installed. - if (string.Compare ("all", list, StringComparison.OrdinalIgnoreCase) == 0) - return new string [] { "all" }; - - // If the user did not specify anything, we return "latest" to indicate that only the latest platform should be installed. - if (string.IsNullOrEmpty (list) || string.Compare ("latest", list, StringComparison.OrdinalIgnoreCase) == 0) - return new string [] { "latest" }; - - // The user specified a list of platform levels to install, so we should respect that. - return list.Split (',').Select (item => item.Trim ()); - } } } diff --git a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_AndroidTestDependencies.cs b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_AndroidTestDependencies.cs index d3f58521063..ca0c311f2d2 100644 --- a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_AndroidTestDependencies.cs +++ b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_AndroidTestDependencies.cs @@ -5,8 +5,6 @@ namespace Xamarin.Android.Prepare [Scenario (isDefault: false)] partial class Scenario_AndroidTestDependencies : ScenarioNoStandardEndSteps { - protected virtual AndroidToolchainComponentType AndroidSdkNdkType => AndroidToolchainComponentType.CoreDependency; - public Scenario_AndroidTestDependencies () : base ("AndroidTestDependencies", "Install Android SDK and .NET preview test dependencies.") {} @@ -18,7 +16,6 @@ protected Scenario_AndroidTestDependencies (string name, string description) protected override void AddSteps (Context context) { Steps.Add (new Step_InstallDotNetPreview ()); - Steps.Add (new Step_Android_SDK_NDK (AndroidSdkNdkType)); // disable installation of missing programs... context.SetCondition (KnownConditions.AllowProgramInstallation, false); diff --git a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_EmulatorTestDependencies.cs b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_EmulatorTestDependencies.cs index 5370f0c6364..9aeababa4a6 100644 --- a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_EmulatorTestDependencies.cs +++ b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_EmulatorTestDependencies.cs @@ -5,8 +5,6 @@ namespace Xamarin.Android.Prepare [Scenario (isDefault: false)] partial class Scenario_EmulatorTestDependencies : Scenario_AndroidTestDependencies { - protected override AndroidToolchainComponentType AndroidSdkNdkType => AndroidToolchainComponentType.CoreDependency | AndroidToolchainComponentType.EmulatorDependency; - public Scenario_EmulatorTestDependencies () : base ("EmulatorTestDependencies", "Install Android SDK (with emulator) and .NET preview test dependencies.") {} diff --git a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.cs b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.cs index b2b701f82db..560994a1505 100644 --- a/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.cs +++ b/build-tools/xaprepare/xaprepare/Scenarios/Scenario_Standard.cs @@ -19,7 +19,6 @@ protected override void AddSteps (Context context) throw new ArgumentNullException (nameof (context)); Steps.Add (new Step_InstallDotNetPreview ()); - Steps.Add (new Step_Android_SDK_NDK ()); Steps.Add (new Step_GenerateFiles (atBuildStart: true)); Steps.Add (new Step_PrepareProps ()); Steps.Add (new Step_GenerateCGManifest ()); diff --git a/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs b/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs deleted file mode 100644 index 629269adff9..00000000000 --- a/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs +++ /dev/null @@ -1,448 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Xml.Linq; -using Kajabity.Tools.Java; - -namespace Xamarin.Android.Prepare -{ - class Step_Android_SDK_NDK : StepWithDownloadProgress - { -#nullable disable - sealed class AndroidPackage - { - public AndroidToolchainComponent Component; - public string PackageName; - public Uri Url; - public string LocalPackagePath; - public string DestinationDir; - } -#nullable enable - - static readonly string[] CRTFiles = { - "crtbegin_so.o", - "crtend_so.o", - "libc.so", - "libdl.so", - "liblog.so", - "libm.so", - "libz.so", - }; - - static readonly string[] CPPAbiFiles = { - "libc++_static.a", - "libc++abi.a", - }; - - static readonly string[] ClangArchFiles = { - "libunwind.a", - }; - - bool RefreshSdk = false; - bool RefreshNdk = false; - AndroidToolchainComponentType DependencyTypeToInstall = AndroidToolchainComponentType.All; - - public Step_Android_SDK_NDK (AndroidToolchainComponentType dependencyTypeToInstall = AndroidToolchainComponentType.All) - : base ("Preparing Android SDK and NDK") - { - DependencyTypeToInstall = dependencyTypeToInstall; - } - - protected override async Task Execute (Context context) - { - string sdkRoot = context.Properties.GetRequiredValue (KnownProperties.AndroidSdkDirectory); - string ndkRoot = context.Properties.GetRequiredValue (KnownProperties.AndroidNdkDirectory); - string packageCacheDir = context.Properties.GetRequiredValue (KnownProperties.AndroidToolchainCacheDirectory); - - RefreshSdk = context.ComponentsToRefresh.HasFlag (RefreshableComponent.AndroidSDK); - RefreshNdk = context.ComponentsToRefresh.HasFlag (RefreshableComponent.AndroidNDK); - - Log.StatusLine ("Android SDK location: ", sdkRoot, tailColor: Log.DestinationColor); - Log.StatusLine ("Android NDK location: ", ndkRoot, tailColor: Log.DestinationColor); - Log.DebugLine ($"Toolchain cache directory: {packageCacheDir}"); - - var toolchain = new AndroidToolchain (); - var toInstall = new List (); - - toolchain.Components.ForEach (c => Check (context, packageCacheDir, sdkRoot, c, toInstall, 4)); - if (toInstall.Count == 0) { - WritePackageXmls (sdkRoot); - return GatherNDKInfo (context); - } - - Log.MessageLine (); - toInstall.ForEach (p => Log.DebugLine ($"Missing Android component: {p.Component.Name}")); - - string tempDir = Path.Combine (context.Properties.GetRequiredValue (KnownProperties.AndroidToolchainDirectory), "temp"); - Log.DebugLine ($"Toolchain temporary directory: {tempDir}"); - - if (Directory.Exists (tempDir)) { - Log.DebugLine ("Temporary directory exists, cleaning it up"); - Utilities.DeleteDirectorySilent (tempDir); - } - Directory.CreateDirectory (tempDir); - - Log.MessageLine ("Installing missing components"); - var toDownload = new List (); - toInstall.ForEach (c => CheckPackageStatus (context, packageCacheDir, c, toDownload)); - - if (toDownload.Count > 0) { - ulong totalDownloadSize = 0; - foreach (AndroidPackage pkg in toDownload) { - Log.DebugLine ($"Android component '{pkg.Component.Name}' will be downloaded from {pkg.Url}"); - (bool success, ulong size) = await Utilities.GetDownloadSize (pkg.Url); - if (!success) - continue; - totalDownloadSize += size; - } - - toDownload.ForEach (p => Log.StatusLine ($" {context.Characters.Link} {p.Url}", ConsoleColor.White)); - - DownloadStatus downloadStatus = Utilities.SetupDownloadStatus (context, totalDownloadSize, context.InteractiveSession); - await Task.WhenAll (toDownload.Select (p => Download (context, p.Url, p.LocalPackagePath, p.Component.Name, p.PackageName, downloadStatus))); - } - - foreach (AndroidPackage p in toInstall) { - await Unpack (context, tempDir, p); - } - - WritePackageXmls (sdkRoot); - - return GatherNDKInfo (context); - } - - bool GatherNDKInfo (Context context) - { - if (!CopyRedistributableFiles (context)) { - return false; - } - - // Always install the NDK, as NativeAOT-based tests require it - return context.BuildInfo.GatherNDKInfo (context); - } - - bool CopyRedistributableFiles (Context context) - { - string androidVersionPath = Path.Combine (Configurables.Paths.AndroidToolchainRootDirectory, "AndroidVersion.txt"); - if (!File.Exists (androidVersionPath)) { - throw new InvalidOperationException ($"Android version file '{androidVersionPath}' not found"); - } - - string[]? lines = File.ReadAllLines (androidVersionPath); - if (lines == null || lines.Length < 1) { - throw new InvalidOperationException ($"Unknown format of Android version file '{androidVersionPath}'"); - } - - // First line is (should be) the LLVM version, we need just the main release number - string[] llvmVersion = lines[0].Split ('.'); - if (llvmVersion.Length < 3) { - throw new InvalidOperationException ($"Unknown LLVM version format for '{lines[0]}'"); - } - - string clangLibPath = Path.Combine ( - Configurables.Paths.AndroidClangRootDirectory, - llvmVersion[0], - "lib", - "linux" - ); - - foreach (var kvp in Configurables.Defaults.AndroidToolchainPrefixes) { - string abi = kvp.Key; - string abiDir = Path.Combine (Configurables.Paths.AndroidToolchainSysrootLibDirectory, kvp.Value); - string crtFilesPath = Path.Combine (abiDir, BuildAndroidPlatforms.NdkMinimumAPI); - string clangArch = Configurables.Defaults.AbiToClangArch[abi]; - - foreach (string file in CRTFiles) { - CopyFile (abi, crtFilesPath, file); - } - - foreach (string file in CPPAbiFiles) { - CopyFile (abi, abiDir, file); - } - - CopyFile (abi, clangLibPath, $"libclang_rt.builtins-{clangArch}-android.a"); - - // Yay, consistency - if (String.Compare (clangArch, "i686", StringComparison.Ordinal) == 0) { - clangArch = "i386"; - } - string clangArchLibPath = Path.Combine (clangLibPath, clangArch); - - foreach (string file in ClangArchFiles) { - CopyFile (abi, clangArchLibPath, file); - } - } - - return true; - - void CopyFile (string abi, string sourceDir, string fileName) - { - Log.StatusLine ($" {context.Characters.Bullet} Copying NDK redistributable: ", $"{fileName} ({abi})", tailColor: ConsoleColor.White); - string rid = Configurables.Defaults.AbiToRID [abi]; - string outputDir = Path.Combine ( - context.Properties.GetRequiredValue (KnownProperties.NativeRuntimeOutputRootDir), - context.Properties.GetRequiredValue (KnownProperties.RuntimeRedistDirName), - rid - ); - - string sourceFile = Path.Combine (sourceDir, fileName); - Utilities.CopyFileToDir (sourceFile, outputDir); - } - } - - void CheckPackageStatus (Context context, string packageCacheDir, AndroidPackage pkg, List toDownload) - { - Log.StatusLine ($" {context.Characters.Bullet} Installing ", pkg.Component.Name, tailColor: ConsoleColor.White); - - if (File.Exists (pkg.LocalPackagePath)) { - if ((RefreshSdk && !IsNdk (pkg.Component)) || (RefreshNdk && IsNdk (pkg.Component))) { - LogStatus ("Reinstall requested, deleting cache", 4, ConsoleColor.Magenta); - Utilities.DeleteFile (pkg.LocalPackagePath); - toDownload.Add (pkg); - } else { - Log.DebugLine ($"Component '{pkg.Component.Name}' package exists: {pkg.LocalPackagePath}"); - LogStatus ("already downloaded", 4, Log.InfoColor); - } - } else { - Log.DebugLine ($"Component '{pkg.Component.Name}' package not downloaded yet: {pkg.LocalPackagePath}"); - LogStatus ("not downloaded yet", 4, ConsoleColor.Magenta); - toDownload.Add (pkg); - } - } - - async Task Unpack (Context context, string tempDirRoot, AndroidPackage pkg) - { - Log.StatusLine (PadStatus ($"unpacking {pkg.PackageName} to ", 4), pkg.DestinationDir, tailColor: Log.DestinationColor); - - string sevenZip = context.Tools.SevenZipPath; - Log.DebugLine ($"7z binary path: {sevenZip}"); - - string tempDir = Path.Combine (tempDirRoot, Path.GetRandomFileName ()); - - if (!await Utilities.Unpack (pkg.LocalPackagePath, tempDir)) { - Utilities.DeleteFileSilent (pkg.LocalPackagePath); - throw new InvalidOperationException ($"Failed to unpack {pkg.LocalPackagePath}"); - } - - // Clean up zip after extraction if running on a hosted azure pipelines agent. - if (context.IsRunningOnHostedAzureAgent) - Utilities.DeleteFileSilent (pkg.LocalPackagePath); - - if (pkg.Component.NoSubdirectory) { - Utilities.MoveDirectoryContentsRecursively (tempDir, pkg.DestinationDir); - return; - } - - // There should be just a single subdirectory - List subdirs = Directory.EnumerateDirectories (tempDir).ToList (); - if (subdirs.Count > 1) - throw new InvalidOperationException ($"Unexpected contents layout of Android component '{pkg.Component.Name}' - expected a single subdirectory, instead found {subdirs.Count}"); - - Utilities.MoveDirectoryContentsRecursively (subdirs [0], pkg.DestinationDir); - } - - Uri GetPackageUrl (AndroidToolchainComponent component, string packageName) - { - Uri packageUrl; - - if (component.RelativeUrl != null) - packageUrl = new Uri (AndroidToolchain.AndroidUri, component.RelativeUrl); - else - packageUrl = AndroidToolchain.AndroidUri; - - return new Uri (packageUrl, packageName); - } - - string GetDestinationDir (AndroidToolchainComponent component, string sdkRoot) - { - string path = component.DestDir; - if (!Path.IsPathRooted (path)) - return Path.Combine (sdkRoot, path); - return path; - } - - void Check (Context context, string packageCacheDir, string sdkRoot, AndroidToolchainComponent component, List toInstall, int padLeft) - { - Log.StatusLine ($" {context.Characters.Bullet} Checking ", component.Name, tailColor: ConsoleColor.White); - - if (!DependencyTypeToInstall.HasFlag (component.DependencyType)) { - LogStatus ($"skipping, did not match dependency type: {Enum.GetName(typeof(AndroidToolchainComponentType), DependencyTypeToInstall)}", padLeft, Log.InfoColor); - return; - } - - component.AddToInventory (); - - const string statusMissing = "missing"; - const string statusOutdated = "outdated"; - const string statusInstalled = "installed"; - - string path = GetDestinationDir (component, sdkRoot); - - Log.DebugLine ($"Checking if {component.Name} exists in {path}"); - bool missing; - if (IsInstalled (component, path, out missing)) { - LogStatus (statusInstalled, padLeft, Log.InfoColor); - return; - } - - // If only specific Android SDK platforms were requested, ignore ones that were not requested - if (component is AndroidPlatformComponent apc && !ShouldInstall (apc, context)) { - LogStatus ($"skipping, not requested", padLeft, Log.InfoColor); - return; - } - - if (missing) - LogStatus (statusMissing, padLeft, ConsoleColor.Magenta); - else - LogStatus (statusOutdated, padLeft, ConsoleColor.DarkYellow); - - string packageName = $"{component.Name}.zip"; - var pkg = new AndroidPackage { - Component = component, - PackageName = packageName, - Url = GetPackageUrl (component, packageName), - LocalPackagePath = Path.Combine (packageCacheDir, packageName), - DestinationDir = GetDestinationDir (component, sdkRoot), - }; - - toInstall.Add (pkg); - } - - bool ShouldInstall (AndroidPlatformComponent component, Context context) - { - var platforms = context.AndroidSdkPlatforms; - - // If no specific platforms were requested, install everything - if (!platforms.Any () || platforms.Contains ("all")) - return true; - - // If "latest" was requested, install the highest available stable version and any preview versions - if (platforms.Contains ("latest") && (component.IsLatestStable || component.IsPreview)) - return true; - - // Check if this is a user-requested platform - return context.AndroidSdkPlatforms.Contains (component.ApiLevel); - } - - bool IsInstalled (AndroidToolchainComponent component, string path, out bool missing) - { - missing = true; - if (!Directory.Exists (path)) { - Log.DebugLine ($"Component '{component.Name}' directory does not exist: {path}"); - return false; - } - - // This is just a cursory check, we might want to check versions - string propsFile = Path.Combine (path, "source.properties"); - if (!File.Exists (propsFile)) { - Log.DebugLine ($"Component '{component.Name}' properties file does not exist: {propsFile}"); - return false; - } - - missing = false; - if ((RefreshSdk && !IsNdk (component)) || (RefreshNdk && IsNdk (component))) { - Log.DebugLine ($"A reinstall has been requested for component '{component.Name}'"); - return false; - } - - if (String.IsNullOrEmpty (component.PkgRevision)) { - Log.DebugLine ($"Component '{component.Name}' does not specify required Pkg.Revision, assuming it's valid"); - return true; - } - - Log.DebugLine ($"Component '{component.Name}' requires Pkg.Revision to be '{component.PkgRevision}', verifying"); - var props = new JavaProperties (); - try { - using (var fs = File.OpenRead (propsFile)) { - props.Load (fs); - } - } catch (Exception ex) { - Log.DebugLine ($"Failed to read '{component.Name}' source.properties. Assuming invalid version, component will be reinstalled."); - Log.DebugLine (ex.ToString ()); - return false; - } - - string pkgRevision = props.GetProperty ("Pkg.Revision", String.Empty); - if (String.IsNullOrEmpty (pkgRevision)) { - Log.DebugLine ($"Component '{component.Name}' does not have Pkg.Revision in its source.properties file, it will be reinstalled."); - return false; - } - - if (!Utilities.ParseAndroidPkgRevision (pkgRevision, out Version? pkgVer, out string? pkgTag) || pkgVer == null) { - Log.DebugLine ($"Failed to parse a valid version from Pkg.Revision ({pkgRevision}) for component '{component.Name}'. Component will be reinstalled."); - return false; - } - - if (!Utilities.ParseAndroidPkgRevision (component.PkgRevision, out Version? expectedPkgVer, out string? expectedTag) || expectedPkgVer == null) - throw new InvalidOperationException ($"Invalid expected package version for component '{component.Name}': {component.PkgRevision}"); - - bool equal = (pkgVer == expectedPkgVer) && (pkgTag == expectedTag); - if (!equal) - Log.DebugLine ($"Installed version of '{component.Name}' ({pkgRevision}) is different than the required one ({component.PkgRevision})"); - - return equal; - } - - bool IsNdk (AndroidToolchainComponent component) - { - return component.Name.StartsWith ("android-ndk", StringComparison.OrdinalIgnoreCase); - } - - static readonly XNamespace AndroidRepositoryCommon = "http://schemas.android.com/repository/android/common/01"; - static readonly XNamespace AndroidRepositoryGeneric = "http://schemas.android.com/repository/android/generic/01"; - - void WritePackageXmls (string sdkRoot) - { - string[] packageXmlDirs = new[]{ - Path.Combine (sdkRoot, "emulator"), - }; - foreach (var path in packageXmlDirs) { - var properties = ReadSourceProperties (path); - if (properties == null) - continue; - string packageXml = Path.Combine (path, "package.xml"); - Log.DebugLine ($"Writing '{packageXml}'"); - var doc = new XDocument( - new XElement (AndroidRepositoryCommon + "repository", - new XAttribute (XNamespace.Xmlns + "ns2", AndroidRepositoryCommon.NamespaceName), - new XAttribute (XNamespace.Xmlns + "ns3", AndroidRepositoryGeneric.NamespaceName), - new XElement ("localPackage", - new XAttribute ("path", properties ["Pkg.Path"]), - new XAttribute ("obsolete", "false"), - new XElement ("revision", GetRevision (properties ["Pkg.Revision"])), - new XElement ("display-name", properties ["Pkg.Desc"])))); - doc.Save (packageXml, SaveOptions.None); - } - } - - Dictionary? ReadSourceProperties (string dir) - { - var path = Path.Combine (dir, "source.properties"); - if (!File.Exists (path)) - return null; - var dict = new Dictionary (); - foreach (var line in File.ReadLines (path)) { - if (line.Length == 0) - continue; - var entry = line.Split (new[]{'='}, 2, StringSplitOptions.None); - if (entry.Length != 2) - continue; - dict.Add (entry [0], entry [1]); - } - return dict; - } - - IEnumerable GetRevision (string revision) - { - var parts = revision.Split ('.'); - if (parts.Length > 0) - yield return new XElement ("major", parts [0]); - if (parts.Length > 1) - yield return new XElement ("minor", parts [1]); - if (parts.Length > 2) - yield return new XElement ("micro", parts [2]); - } - } -} diff --git a/build-tools/xaprepare/xaprepare/xaprepare.targets b/build-tools/xaprepare/xaprepare/xaprepare.targets index 98a2eca9ee2..50f9c290493 100644 --- a/build-tools/xaprepare/xaprepare/xaprepare.targets +++ b/build-tools/xaprepare/xaprepare/xaprepare.targets @@ -42,9 +42,6 @@ - - - @@ -94,7 +91,6 @@ - <_AndroidSdkLocation Condition="'$(_AndroidSdkLocation)'==''">$(AndroidSdkDirectory) <_MultiDexAarInAndroidSdk>extras\android\m2repository\com\android\support\multidex\1.0.1\multidex-1.0.1.aar - <_SupportLicense Condition="Exists('$(_AndroidSdkLocation)\extras\android\m2repository\NOTICE.txt')">$(_AndroidSdkLocation)\extras\android\m2repository\NOTICE.txt - <_SupportLicense Condition="Exists('$(_AndroidSdkLocation)\extras\android\m2repository\m2repository\NOTICE.txt')">$(_AndroidSdkLocation)\extras\android\m2repository\m2repository\NOTICE.txt + + + <_SupportLicense Condition="Exists('$(_AndroidSdkLocation)\extras\android\m2repository\NOTICE.txt')">$(_AndroidSdkLocation)\extras\android\m2repository\NOTICE.txt + <_SupportLicense Condition="'$(_SupportLicense)' == '' and Exists('$(_AndroidSdkLocation)\extras\android\m2repository\m2repository\NOTICE.txt')">$(_AndroidSdkLocation)\extras\android\m2repository\m2repository\NOTICE.txt + + + + + obj\$(Configuration)\ + <_AndroidRepositoryUrl>https://dl.google.com/android/repository/ <_SdkManagerDir>$(AndroidSdkFullPath)\cmdline-tools\$(CommandLineToolsFolder)\bin <_SdkManagerPath Condition=" '$(HostOS)' == 'Windows' ">$(_SdkManagerDir)\sdkmanager.bat <_SdkManagerPath Condition=" '$(HostOS)' != 'Windows' ">$(_SdkManagerDir)\sdkmanager <_LicensesAcceptedFile>$(AndroidSdkFullPath)\licenses\.licenses-accepted + + + <_HostArch>$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture) + <_IsArm64Apple Condition=" '$(HostOS)' == 'Darwin' and '$(_HostArch)' == 'Arm64' ">true + <_EmulatorArch Condition=" '$(_IsArm64Apple)' == 'true' ">aarch64 + <_EmulatorArch Condition=" '$(_EmulatorArch)' == '' ">x64 + <_SystemImageArch Condition=" '$(_IsArm64Apple)' == 'true' ">arm64-v8a + <_SystemImageArch Condition=" '$(_SystemImageArch)' == '' ">x86_64 + + + latest + <_InstallAllPlatforms Condition=" '$(AndroidSdkPlatforms.ToLower())' == 'all' ">true + <_InstallLatestPlatformOnly Condition=" '$(AndroidSdkPlatforms.ToLower())' == 'latest' ">true + <_RequestedApiLevels>;$(AndroidSdkPlatforms.Replace(',', ';')); + + + <_NdkToolchainOSTag Condition=" '$(HostOS)' == 'Linux' ">linux-x86_64 + <_NdkToolchainOSTag Condition=" '$(HostOS)' == 'Darwin' ">darwin-x86_64 + <_NdkToolchainOSTag Condition=" '$(HostOS)' == 'Windows' ">windows-x86_64 + <_NdkHostTag Condition=" '$(HostOS)' == 'Linux' ">linux + <_NdkHostTag Condition=" '$(HostOS)' == 'Darwin' ">darwin + <_NdkHostTag Condition=" '$(HostOS)' == 'Windows' ">windows + <_NdkHostHash Condition=" '$(HostOS)' == 'Linux' ">$(XAAndroidNdkHashLinux) + <_NdkHostHash Condition=" '$(HostOS)' == 'Darwin' ">$(XAAndroidNdkHashMacOS) + <_NdkHostHash Condition=" '$(HostOS)' == 'Windows' ">$(XAAndroidNdkHashWindows) + + + + + <_PlatformPackage Include="android-2.3.3_r02"> 10 54BDB0F1CA06BA5747061DDEEA20F431AF72C448334FD4D3D7F84EA2CCD29FEA + <_PlatformPackage Include="android-15_r05"> 15 5BC1F93AAE86B4336FFC4CAE9EB8EC41A9A8FD677582DD86A9629798F019BED9 + <_PlatformPackage Include="android-16_r05"> 16 FD7F269A423D1F1D079EABF9F918CEAB49108702A1C6BB2589D57C23393503D3 + <_PlatformPackage Include="android-17_r03"> 17 B66E73FB2639F8C916FDE4369AA29012A5C531E156DBB205FE3788FE998FBBE8 + <_PlatformPackage Include="android-18_r03"> 18 166AE9CF299747A5FAA8F04168F0EE47CD7466A975D8B44ACAAA62A43E767568 + <_PlatformPackage Include="android-19_r04"> 19 5EFC3A3A682C1D49128DADDB6716C433EDF16E63349F32959B6207524AC04039 + <_PlatformPackage Include="android-20_r02"> 20 EF08C453E16AB6E656CF5D9413EF61CB8C650607D33B24EE4CE08DAFDFE965A7 + <_PlatformPackage Include="android-21_r02"> 21 A76CD7AD3080AC6CE9F037CB935B399A1BAD396C0605D4FF42F693695F1DCEFE + <_PlatformPackage Include="android-22_r02"> 22 45EB581BBE53C9256F34C26B2CEA919543C0079140897AC721CF88C0B9F6789E + <_PlatformPackage Include="platform-23_r03"> 23 4B4BCDDEAD3319708275C54C76294707BFAA953D767E34F1A5B599F3EDD0076C + <_PlatformPackage Include="platform-24_r02"> 24 F268F5945C6ECE7EA95C1C252067280854D2A20DA924E22AE4720287DF8BDBC9 + <_PlatformPackage Include="platform-25_r03"> 25 9B742D34590FE73FB7229E34835ECFFB1846CA389D9F924F0B2A37DE525DC6B8 + <_PlatformPackage Include="platform-26_r02"> 26 2AAFA7D19C5E9C4B643EE6ADE3D85EF89DC2F79E8383EFDB9BAF7FDDAD74B52A + <_PlatformPackage Include="platform-27_r03"> 27 020C4C090BC82CE87EBAAE5D1A922E21B39A1D03C78FFA43F0C3E42FC7D28169 + <_PlatformPackage Include="platform-28_r04"> 28 967F8CA99B71D337AA9C7781F9D65DD8110BF5C4746F44304047BF71B20D0DED + <_PlatformPackage Include="platform-29_r01"> 29 2C9E961858E03900FFA0801A4F6234AA7223363B629FD8E1BE60DA9AA09D86BD + <_PlatformPackage Include="platform-30_r01"> 30 337B1B0E202A02F90DA2E719305F157FCCDA215C760F5B8F7121ACEDCA44942B + <_PlatformPackage Include="platform-31_r01"> 31 1D69FE1D7F9788D82FF3A374FAF4F6CCC9D1D372AA84A86B5BCFB517523B0B3F + <_PlatformPackage Include="platform-32_r01"> 32 01D8DA1C900E70FCF5DA39767D5444E39928935B1A5927055CE749FC348CA7AE + <_PlatformPackage Include="platform-33-ext3_r03"> 33 B32B10F787867987F03AE8E101D217E053A9065B7136379FB353B388379AED1D + <_PlatformPackage Include="platform-34-ext7_r02"> 34 5323311CC3E4AD614F0B8053C72B651726F3422448CEDD39E48F00737CDA8AD0 + <_PlatformPackage Include="platform-35_r02"> 35 0988CACAD01B38A18A47BAC14A0695F246BC76C1B06C0EEB8EB0DC825AB0C8E0 + <_PlatformPackage Include="platform-36_r02"> 36 37607369A28C5B640B3A7998868D45898EBCB777565A0E85F9ACF36F29631D2E + <_PlatformPackage Include="platform-36.1_r01"> 36.1 265E9AA7D8DB6ABE7AD1696085D5D62784B341084C625DE46DB530970B1E806D + <_PlatformPackage Include="platform-37.0_r01"> 37.0 true 19BDCF42DE0CB0E9500A27DA6833FC30CDD49A7EC690AA5CABAA0EF893AF9EBE + + + + + + <_AndroidSdkPackage Include="commandlinetools-mac-$(CommandLineToolsVersion).zip" Condition=" '$(HostOS)' == 'Darwin' "> + $(XACmdlineToolsHashMacOS) + $(AndroidSdkFullPath)\cmdline-tools\$(CommandLineToolsFolder) + + <_AndroidSdkPackage Include="commandlinetools-linux-$(CommandLineToolsVersion).zip" Condition=" '$(HostOS)' == 'Linux' "> + $(XACmdlineToolsHashLinux) + $(AndroidSdkFullPath)\cmdline-tools\$(CommandLineToolsFolder) + + <_AndroidSdkPackage Include="commandlinetools-win-$(CommandLineToolsVersion).zip" Condition=" '$(HostOS)' == 'Windows' "> + $(XACmdlineToolsHashWindows) + $(AndroidSdkFullPath)\cmdline-tools\$(CommandLineToolsFolder) + + + + <_AndroidSdkPackage Include="platform-tools_r$(XAPlatformToolsVersion)-darwin.zip" Condition=" '$(HostOS)' == 'Darwin' "> + $(XAPlatformToolsHashMacOS) + $(AndroidSdkFullPath)\platform-tools + + <_AndroidSdkPackage Include="platform-tools_r$(XAPlatformToolsVersion)-linux.zip" Condition=" '$(HostOS)' == 'Linux' "> + $(XAPlatformToolsHashLinux) + $(AndroidSdkFullPath)\platform-tools + + <_AndroidSdkPackage Include="platform-tools_r$(XAPlatformToolsVersion)-win.zip" Condition=" '$(HostOS)' == 'Windows' "> + $(XAPlatformToolsHashWindows) + $(AndroidSdkFullPath)\platform-tools + + + + <_AndroidSdkPackage Include="build-tools_r$(XABuildToolsVersion)_macosx.zip" Condition=" '$(HostOS)' == 'Darwin' "> + $(XABuildToolsHashMacOS) + $(AndroidSdkFullPath)\build-tools\$(XABuildToolsFolder) + + <_AndroidSdkPackage Include="build-tools_r$(XABuildToolsVersion)_linux.zip" Condition=" '$(HostOS)' == 'Linux' "> + $(XABuildToolsHashLinux) + $(AndroidSdkFullPath)\build-tools\$(XABuildToolsFolder) + + <_AndroidSdkPackage Include="build-tools_r$(XABuildToolsVersion)_windows.zip" Condition=" '$(HostOS)' == 'Windows' "> + $(XABuildToolsHashWindows) + $(AndroidSdkFullPath)\build-tools\$(XABuildToolsFolder) + + + + <_AndroidSdkPackage Include="cmake-$(AndroidCmakeVersion)-darwin.zip" Condition=" '$(HostOS)' == 'Darwin' "> + $(XACmakeHashMacOS) + $(AndroidSdkFullPath)\cmake\$(AndroidCmakeVersionPath) + 0 + + <_AndroidSdkPackage Include="cmake-$(AndroidCmakeVersion)-linux.zip" Condition=" '$(HostOS)' == 'Linux' "> + $(XACmakeHashLinux) + $(AndroidSdkFullPath)\cmake\$(AndroidCmakeVersionPath) + 0 + + <_AndroidSdkPackage Include="cmake-$(AndroidCmakeVersion)-windows.zip" Condition=" '$(HostOS)' == 'Windows' "> + $(XACmakeHashWindows) + $(AndroidSdkFullPath)\cmake\$(AndroidCmakeVersionPath) + 0 + + + + <_AndroidSdkPackage Include="emulator-darwin_x64-$(EmulatorVersion).zip" Condition=" '$(HostOS)' == 'Darwin' and '$(_IsArm64Apple)' != 'true' "> + $(XAEmulatorHashMacOSx64) + $(AndroidSdkFullPath)\emulator + true + emulator + Android Emulator + $(EmulatorPkgRevision) + + <_AndroidSdkPackage Include="emulator-darwin_aarch64-$(EmulatorVersion).zip" Condition=" '$(_IsArm64Apple)' == 'true' "> + $(XAEmulatorHashMacOSArm64) + $(AndroidSdkFullPath)\emulator + true + emulator + Android Emulator + $(EmulatorPkgRevision) + + <_AndroidSdkPackage Include="emulator-linux_x64-$(EmulatorVersion).zip" Condition=" '$(HostOS)' == 'Linux' "> + $(XAEmulatorHashLinux) + $(AndroidSdkFullPath)\emulator + true + emulator + Android Emulator + $(EmulatorPkgRevision) + + <_AndroidSdkPackage Include="emulator-windows_x64-$(EmulatorVersion).zip" Condition=" '$(HostOS)' == 'Windows' "> + $(XAEmulatorHashWindows) + $(AndroidSdkFullPath)\emulator + true + emulator + Android Emulator + $(EmulatorPkgRevision) + + + + <_AndroidSdkPackage Include="x86_64-29_r08-darwin.zip" Condition=" '$(HostOS)' == 'Darwin' and '$(_IsArm64Apple)' != 'true' "> + sys-img/android/x86_64-29_r08-darwin.zip + $(XASystemImageHashMacOSx64) + $(AndroidSdkFullPath)\system-images\android-29\default\x86_64 + + <_AndroidSdkPackage Include="arm64-v8a-29_r08.zip" Condition=" '$(_IsArm64Apple)' == 'true' "> + sys-img/android/arm64-v8a-29_r08.zip + $(XASystemImageHashMacOSArm64) + $(AndroidSdkFullPath)\system-images\android-29\default\arm64-v8a + + <_AndroidSdkPackage Include="x86_64-29_r08-linux.zip" Condition=" '$(HostOS)' == 'Linux' "> + sys-img/android/x86_64-29_r08-linux.zip + $(XASystemImageHashLinux) + $(AndroidSdkFullPath)\system-images\android-29\default\x86_64 + + <_AndroidSdkPackage Include="x86_64-29_r08-windows.zip" Condition=" '$(HostOS)' == 'Windows' "> + sys-img/android/x86_64-29_r08-windows.zip + $(XASystemImageHashWindows) + $(AndroidSdkFullPath)\system-images\android-29\default\x86_64 + + + + <_AndroidSdkPackage Include="android_m2repository_r47.zip"> + $(XAAndroidM2RepositoryHash) + $(AndroidSdkFullPath)\extras\android\m2repository + + <_AndroidSdkPackage Include="docs-24_r01.zip"> + $(XAAndroidDocsHash) + $(AndroidSdkFullPath)\docs + + <_AndroidSdkPackage Include="source-36_r01.zip"> + $(XAAndroidSourcesHash) + $(AndroidSdkFullPath)\sources\android-36 + + + + <_AndroidSdkPackage Include="android-ndk-r$(_XAAndroidNdkRelease)-$(_NdkHostTag).zip"> + $(_NdkHostHash) + $(AndroidNdkDirectory) + + + + + + + + <_AndroidSdkPackage Include="@(_PlatformPackage->'%(Identity).zip')" + Condition=" '$(_InstallAllPlatforms)' == 'true' or + ('$(_InstallLatestPlatformOnly)' == 'true' and '%(_PlatformPackage.IsLatestStable)' == 'true') or + $(_RequestedApiLevels.Contains(';%(_PlatformPackage.ApiLevel);')) "> + %(_PlatformPackage.Hash) + $(AndroidSdkFullPath)\platforms\android-%(_PlatformPackage.ApiLevel) + + + + + + + + + + + + + + + + + + + <_StripComponents>%(_AndroidSdkPackage.StripComponents) + <_StripComponents Condition=" '$(_StripComponents)' == '' ">1 + <_ZipPath>$([System.IO.Path]::Combine('$(AndroidToolchainCacheDirectory)', '%(_AndroidSdkPackage.Identity)')) + <_StagingDir>%(_AndroidSdkPackage.Destination).staging + <_FindMinDepth Condition=" '$(_StripComponents)' == '1' ">2 + <_FindMinDepth Condition=" '$(_StripComponents)' == '0' ">1 + <_NoSubdirectory Condition=" '$(_StripComponents)' == '1' ">false + <_NoSubdirectory Condition=" '$(_StripComponents)' == '0' ">true + + + + + + + + + + + + + + + + + <_PkgXmlItem Include="@(_AndroidSdkPackage)" + Condition=" '%(_AndroidSdkPackage.GeneratePackageXml)' == 'true' " /> + + + + + + + + + <_NdkAbi Include="armeabi-v7a"> + arm-linux-androideabi + arm + arm + android-arm + + <_NdkAbi Include="arm64-v8a"> + aarch64-linux-android + aarch64 + aarch64 + android-arm64 + + <_NdkAbi Include="x86"> + i686-linux-android + i686 + i386 + android-x86 + + <_NdkAbi Include="x86_64"> + x86_64-linux-android + x86_64 + x86_64 + android-x64 + + <_NdkCrtFile Include="crtbegin_so.o;crtend_so.o;libc.so;libdl.so;liblog.so;libm.so;libz.so" /> + <_NdkCppAbiFile Include="libc++_static.a;libc++abi.a" /> + + + + + <_NdkToolchainRoot>$(AndroidNdkDirectory)\toolchains\llvm\prebuilt\$(_NdkToolchainOSTag) + <_NdkSysrootLib>$(_NdkToolchainRoot)\sysroot\usr\lib + + <_NdkVersionFileContent>$([System.IO.File]::ReadAllText('$(_NdkToolchainRoot)\AndroidVersion.txt')) + <_NdkLlvmMajor>$(_NdkVersionFileContent.Substring(0, $(_NdkVersionFileContent.IndexOf('.')))) + <_NdkClangLibLinux>$(_NdkToolchainRoot)\lib\clang\$(_NdkLlvmMajor)\lib\linux + + <_AbiPrefixDir>$(_NdkSysrootLib)\%(_NdkAbi.ToolchainPrefix) + <_AbiOutputDir>$(NativeRuntimeOutputRootDir)$(_RuntimeRedistDirName)\%(_NdkAbi.Rid) + <_AbiClangArch>%(_NdkAbi.ClangArch) + <_AbiUnwindArchDir>%(_NdkAbi.UnwindArchDir) + + + <_NdkRedist Include="@(_NdkCrtFile -> '$(_AbiPrefixDir)\$(AndroidMinimumDotNetApiLevel)\%(Identity)')" /> + <_NdkRedist Include="@(_NdkCppAbiFile -> '$(_AbiPrefixDir)\%(Identity)')" /> + <_NdkRedist Include="$(_NdkClangLibLinux)\libclang_rt.builtins-$(_AbiClangArch)-android.a" /> + <_NdkRedist Include="$(_NdkClangLibLinux)\$(_AbiUnwindArchDir)\libunwind.a" /> + + + + + <_NdkRedist Remove="@(_NdkRedist)" /> + + + - + + diff --git a/src/androidsdk/package.xml.in b/src/androidsdk/package.xml.in new file mode 100644 index 00000000000..63a072e35b9 --- /dev/null +++ b/src/androidsdk/package.xml.in @@ -0,0 +1,11 @@ + + + + + @PKG_REVISION_MAJOR@ + @PKG_REVISION_MINOR@ + @PKG_REVISION_MICRO@ + + @PKG_DESC@ + +