Skip to content

Commit

Permalink
Prefer versions from android-platform-support
Browse files Browse the repository at this point in the history
Context: 51151d7

Commit 51151d7 laid out a conundrum: dotnet/android builds against
one set of versioned dependencies, but we want the "Xamarin Manifest"
to *actually* dictate the preferred package versions, as this makes
it easier to keep versions in sync with the VS installer/etc.

The problem is that commits prior to this point ignored the
`Xamarin.Installer.Common.props` described in 51151d7.

Additionally, many of the MSBuild properties are (1) "conditional" --
only setting a value if not overridden -- and (2) have the same
names as the properties within `Xamarin.Installer.Common.props`.

Square this circle by doing two things:

 1. Add `tools/workload-dependencies/WorkloadDependencies.proj`
    alongside `tools/workload-dependencies/Directory.Build.props`,
    which allows for an "isolated" environment, one in which
    *only* `Xamarin.Installer.Common.props` and
    `Xamarin.Android.Common.props` are imported.

    This allows us to cleanly ensure that
    `Xamarin.Installer.Common.props` controls things.

 2. Update `Microsoft.NET.Sdk.Android.proj` to use the
    `<MSBuild/>` task to invoke `WorkloadDependencies.proj`,
    providing all MSBuild properties required for things to work.

This should ensure that package versions are consistent.

Additionally, update `Program.cs` so that the `platform-tools`
package contains a `requestedRevision` property.
The `platform-tools` package is *unversioned*, so this is the only
way to get some semblance of versioning involved.
  • Loading branch information
jonpryor committed Dec 17, 2024
1 parent 781d8c4 commit 32bd57e
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 28 deletions.
34 changes: 12 additions & 22 deletions build-tools/create-packs/Microsoft.NET.Sdk.Android.proj
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ about the various Microsoft.Android workloads.
<Target Name="_GenerateXAWorkloadContent"
DependsOnTargets="_GetDefaultPackageVersion;_GetLicense">
<PropertyGroup>
<WorkloadDependenciesPath Condition="'$(WorkloadDependenciesPath)' == ''">$(OutputPath)workload-manifest\WorkloadDependencies.json</WorkloadDependenciesPath>
<WorkloadManifestJsonPath Condition="'$(WorkloadManifestJsonPath)' == ''">$(OutputPath)workload-manifest\WorkloadManifest.json</WorkloadManifestJsonPath>
<WorkloadManifestTargetsPath Condition="'$(WorkloadManifestTargetsPath)' == ''">$(OutputPath)workload-manifest\WorkloadManifest.targets</WorkloadManifestTargetsPath>
<WorkloadVersion Condition="'$(WorkloadVersion)' == ''">$(AndroidPackVersionLong)</WorkloadVersion>
Expand All @@ -43,31 +44,20 @@ about the various Microsoft.Android workloads.
Replacements="@NET_PREVIOUS_VERSION@=$(AndroidNetPreviousVersion)">
</ReplaceFileContents>

<PropertyGroup>
<_AndroidPlatformSupportFeed>$(MSBuildThisFileDirectory)/../../external/android-platform-support/Feeds/AndroidManifestFeed_d17.12.xml</_AndroidPlatformSupportFeed>
<_Feed Condition=" Exists($(_AndroidPlatformSupportFeed)) ">$(_AndroidPlatformSupportFeed)</_Feed>
<_Feed Condition=" '$(_Feed)' == '' ">https://aka.ms/AndroidManifestFeed/d17-12</_Feed>
<_Project>$(MSBuildThisFileDirectory)/../../tools/workload-dependencies/workload-dependencies.csproj</_Project>
<WorkloadDependenciesPath Condition="'$(WorkloadDependenciesPath)' == ''">$(OutputPath)workload-manifest\WorkloadDependencies.json</WorkloadDependenciesPath>
</PropertyGroup>
<ItemGroup>
<_WorkloadDeps Include="--project &quot;$(_Project)&quot;" />
<_WorkloadDeps Include="--" />
<_WorkloadDeps Include="&quot;--feed=$(_Feed)&quot;" />
<_WorkloadDeps Include="-o &quot;$(WorkloadDependenciesPath)&quot;" />
<_WorkloadDeps Include="--build-tools-version=$(XABuildToolsFolder)" />
<_WorkloadDeps Include="--cmdline-tools-version=$(CommandLineToolsFolder)" />
<_WorkloadDeps Include="--jdk-version=$(JavaSdkVersion)" />
<_WorkloadDeps Include="--ndk-version=$(AndroidNdkPkgRevision)" />
<_WorkloadDeps Include="--platform-version=$(AndroidLatestStableApiLevel)" />
<_WorkloadDeps
Condition=" '$(AndroidLatestUnstablePlatformId)' != '$(AndroidLatestStablePlatformId)' "
Include="--preview-platform-version=$(AndroidLatestUnstablePlatformId)"
/>
<_WorkloadDeps Include="--workload-version=$(WorkloadVersion)" />
<_WorkloadDepProp Include="AndroidLatestStablePlatformId=$(AndroidLatestStablePlatformId)" />
<_WorkloadDepProp Include="AndroidLatestUnstablePlatformId=$(AndroidLatestUnstablePlatformId)" />
<_WorkloadDepProp Include="MicrosoftAndroidSdkOutDir=$(MicrosoftAndroidSdkOutDir)" />
<_WorkloadDepProp Include="MonoOptionsVersion=$(MonoOptionsVersion)" />
<_WorkloadDepProp Include="NewtonsoftJsonPackageVersion=$(NewtonsoftJsonPackageVersion)" />
<_WorkloadDepProp Include="WorkloadDependenciesPath=$(WorkloadDependenciesPath)" />
</ItemGroup>

<Exec Command="dotnet run @(_WorkloadDeps, ' ')" />
<MSBuild
Projects="$(MSBuildThisFileDirectory)/../../tools/workload-dependencies/WorkloadDependencies.proj"
Properties="@(_WorkloadDepProp)"
Targets="GenerateWorkloadDependencies"
/>

<ItemGroup>
<_PackageFiles Include="$(WorkloadManifestJsonPath)" PackagePath="data" />
Expand Down
8 changes: 8 additions & 0 deletions tools/workload-dependencies/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>
<!--
This file exists so that we do NOT import top-level Configuration.props/etc.
This is so that we can cleanly import Xamarin.Installer.Common.props and
Xamarin.Android.Common.props from WorkloadDependencies.proj.
-->
</Project>
24 changes: 18 additions & 6 deletions tools/workload-dependencies/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
var BuildToolsVersion = (string?) null;
var JdkVersion = (string?) null;
var NdkVersion = (string?) null;
var PreviewPlatformVersion = (string?) null;
var PlatformToolsVersion = (string?) null;
var PlatformVersion = (string?) null;
var PreviewPlatformVersion = (string?) null;
var WorkloadVersion = (string?) null;

var options = new OptionSet {
Expand All @@ -39,6 +40,9 @@
{ "ndk-version=",
"The Android NDK {VERSION} dotnet/android is built against.",
v => NdkVersion = v },
{ "platform-tools-version=",
"The Android SDK platform-tools version dotnet/android is built against.",
v => PlatformToolsVersion = v },
{ "platform-version=",
"The stable Android SDK Platform {VERSION} dotnet/android binds.",
v => PlatformVersion = v },
Expand Down Expand Up @@ -96,7 +100,7 @@
["emulator"] = doc => CreatePackageEntries (doc, "emulator", null, optional: true),
["cmdline-tools"] = doc => CreatePackageEntries (doc, "cmdline-tools", CmdlineToolsVersion),
["ndk"] = doc => CreatePackageEntries (doc, "ndk", NdkVersion, optional: true),
["platform-tools"] = doc => CreatePackageEntries (doc, "platform-tools", null),
["platform-tools"] = doc => CreatePackageEntries (doc, "platform-tools", PlatformToolsVersion),
["platform"] = CreatePlatformPackageEntries,
["system-image"] = CreateSystemImagePackageEntries,
// ndk
Expand Down Expand Up @@ -196,11 +200,19 @@ IEnumerable<JObject> CreatePackageEntries (XDocument doc, string element, string
if (item == null) {
yield break;
}
var path = item.ReqAttr ("path");
var reqRev = item.ReqAttr ("revision");
var sdkPackage = new JObject {
new JProperty ("id", path),
};

// special-case platform-tools, which doesn't have a revision
if (!path.Contains (reqRev)) {
sdkPackage.Add (new JProperty ("requestedRevision", reqRev));
}
var entry = new JObject {
new JProperty ("desc", item.ReqAttr ("description")),
new JProperty ("sdkPackage", new JObject {
new JProperty ("id", item.ReqAttr ("path")),
}),
new JProperty ("sdkPackage", sdkPackage),
new JProperty ("optional", optional.ToString ().ToLowerInvariant ()),
};
yield return entry;
Expand Down Expand Up @@ -228,7 +240,7 @@ IEnumerable<JObject> CreatePackageEntries (XDocument doc, string element, string
IEnumerable<JObject> CreatePlatformPackageEntries (XDocument doc)
{
string? reqVersion = PlatformVersion != null
? $"platforms;android-{PlatformVersion}"
? $"platforms;{PlatformVersion}"
: null;
string? maxVersion = null;
XElement? entry = null;
Expand Down
81 changes: 81 additions & 0 deletions tools/workload-dependencies/WorkloadDependencies.proj
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<Project Sdk="Microsoft.Build.NoTargets">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

<ImportGroup Condition=" '$(MicrosoftAndroidSdkOutDir)' != '' ">
<Import
Condition="Exists('$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.props')"
Project="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.props"
/>
<Import Project="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Common.props" />
</ImportGroup>

<Target Name="_CheckDeps">
<Error
Condition=" '$(MicrosoftAndroidSdkOutDir)' == '' "
Text="MicrosoftAndroidSdkOutDir property must be set."
/>
<Error
Condition=" !HasTrailingSlash('$(MicrosoftAndroidSdkOutDir)') "
Text="MicrosoftAndroidSdkOutDir property must end with directory separator char."
/>
<Error
Condition=" !Exists('$(MicrosoftAndroidSdkOutDir)') "
Text="MicrosoftAndroidSdkOutDir property must exist."
/>
<Error
Condition=" '$(WorkloadDependenciesPath)' == '' "
Text="WorkloadDependenciesPath property must be set."
/>
<Error
Condition=" '$(AndroidLatestStablePlatformId)' == '' "
Text="AndroidLatestStablePlatformId property must be set."
/>
<Error
Condition=" '$(AndroidLatestUnstablePlatformId)' == '' "
Text="AndroidLatestUnstablePlatformId property must be set."
/>
<Error
Condition=" '$(WorkloadVersion)' == '' "
Text="WorkloadVersion property must be set."
/>
</Target>

<Target Name="GenerateWorkloadDependencies"
DependsOnTargets="_CheckDeps">

<PropertyGroup>
<_AndroidPlatformSupportFeed>$(MSBuildThisFileDirectory)/../../external/android-platform-support/Feeds/AndroidManifestFeed_d17.12.xml</_AndroidPlatformSupportFeed>
<_Feed Condition=" Exists($(_AndroidPlatformSupportFeed)) ">$(_AndroidPlatformSupportFeed)</_Feed>
<_Feed Condition=" '$(_Feed)' == '' ">https://aka.ms/AndroidManifestFeed/d17-12</_Feed>
<_Project>$(MSBuildThisFileDirectory)workload-dependencies.csproj</_Project>
<WorkloadDependenciesPath Condition=" '$(WorkloadDependenciesPath)' == '' ">$(OutputPath)workload-manifest\WorkloadDependencies.json</WorkloadDependenciesPath>
</PropertyGroup>

<ItemGroup>
<_WorkloadDeps Include="--project &quot;$(_Project)&quot;" />
<_WorkloadDeps Include="-p:MonoOptionsVersion=$(MonoOptionsVersion)" />
<_WorkloadDeps Include="-p:NewtonsoftJsonPackageVersion=$(NewtonsoftJsonPackageVersion)" />
<_WorkloadDeps Include="--" />
<_WorkloadDeps Include="&quot;--feed=$(_Feed)&quot;" />
<_WorkloadDeps Include="-o &quot;$(WorkloadDependenciesPath)&quot;" />
<_WorkloadDeps Include="--build-tools-version=$(AndroidSdkBuildToolsVersion)" />
<_WorkloadDeps Include="--cmdline-tools-version=$(AndroidCommandLineToolsVersion)" />
<_WorkloadDeps Include="--jdk-version=$(JavaSdkVersion)" />
<_WorkloadDeps Include="--ndk-version=$(AndroidNdkVersion)" />
<_WorkloadDeps Include="--platform-tools-version=$(AndroidSdkPlatformToolsVersion)" />
<_WorkloadDeps Include="--platform-version=$(AndroidSdkPlatformVersion)" />
<_WorkloadDeps
Condition=" '$(AndroidLatestUnstablePlatformId)' != '$(AndroidLatestStablePlatformId)' "
Include="--preview-platform-version=$(AndroidLatestUnstablePlatformId)"
/>
<_WorkloadDeps Include="--workload-version=$(WorkloadVersion)" />
<!-- $(AndroidSdkEmulatorVersion) is unversioned, so skip -->
</ItemGroup>

<Exec Command="dotnet run @(_WorkloadDeps, ' ')" />
</Target>

</Project>

0 comments on commit 32bd57e

Please sign in to comment.