Skip to content

Commit 1510e87

Browse files
committed
Prefer versions from android-platform-support
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.
1 parent 781d8c4 commit 1510e87

File tree

4 files changed

+120
-28
lines changed

4 files changed

+120
-28
lines changed

build-tools/create-packs/Microsoft.NET.Sdk.Android.proj

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ about the various Microsoft.Android workloads.
2626
<Target Name="_GenerateXAWorkloadContent"
2727
DependsOnTargets="_GetDefaultPackageVersion;_GetLicense">
2828
<PropertyGroup>
29+
<WorkloadDependenciesPath Condition="'$(WorkloadDependenciesPath)' == ''">$(OutputPath)workload-manifest\WorkloadDependencies.json</WorkloadDependenciesPath>
2930
<WorkloadManifestJsonPath Condition="'$(WorkloadManifestJsonPath)' == ''">$(OutputPath)workload-manifest\WorkloadManifest.json</WorkloadManifestJsonPath>
3031
<WorkloadManifestTargetsPath Condition="'$(WorkloadManifestTargetsPath)' == ''">$(OutputPath)workload-manifest\WorkloadManifest.targets</WorkloadManifestTargetsPath>
3132
<WorkloadVersion Condition="'$(WorkloadVersion)' == ''">$(AndroidPackVersionLong)</WorkloadVersion>
@@ -43,31 +44,21 @@ about the various Microsoft.Android workloads.
4344
Replacements="@NET_PREVIOUS_VERSION@=$(AndroidNetPreviousVersion)">
4445
</ReplaceFileContents>
4546

46-
<PropertyGroup>
47-
<_AndroidPlatformSupportFeed>$(MSBuildThisFileDirectory)/../../external/android-platform-support/Feeds/AndroidManifestFeed_d17.12.xml</_AndroidPlatformSupportFeed>
48-
<_Feed Condition=" Exists($(_AndroidPlatformSupportFeed)) ">$(_AndroidPlatformSupportFeed)</_Feed>
49-
<_Feed Condition=" '$(_Feed)' == '' ">https://aka.ms/AndroidManifestFeed/d17-12</_Feed>
50-
<_Project>$(MSBuildThisFileDirectory)/../../tools/workload-dependencies/workload-dependencies.csproj</_Project>
51-
<WorkloadDependenciesPath Condition="'$(WorkloadDependenciesPath)' == ''">$(OutputPath)workload-manifest\WorkloadDependencies.json</WorkloadDependenciesPath>
52-
</PropertyGroup>
5347
<ItemGroup>
54-
<_WorkloadDeps Include="--project &quot;$(_Project)&quot;" />
55-
<_WorkloadDeps Include="--" />
56-
<_WorkloadDeps Include="&quot;--feed=$(_Feed)&quot;" />
57-
<_WorkloadDeps Include="-o &quot;$(WorkloadDependenciesPath)&quot;" />
58-
<_WorkloadDeps Include="--build-tools-version=$(XABuildToolsFolder)" />
59-
<_WorkloadDeps Include="--cmdline-tools-version=$(CommandLineToolsFolder)" />
60-
<_WorkloadDeps Include="--jdk-version=$(JavaSdkVersion)" />
61-
<_WorkloadDeps Include="--ndk-version=$(AndroidNdkPkgRevision)" />
62-
<_WorkloadDeps Include="--platform-version=$(AndroidLatestStableApiLevel)" />
63-
<_WorkloadDeps
64-
Condition=" '$(AndroidLatestUnstablePlatformId)' != '$(AndroidLatestStablePlatformId)' "
65-
Include="--preview-platform-version=$(AndroidLatestUnstablePlatformId)"
66-
/>
67-
<_WorkloadDeps Include="--workload-version=$(WorkloadVersion)" />
48+
<_WorkloadDepProp Include="AndroidLatestStablePlatformId=$(AndroidLatestStablePlatformId)" />
49+
<_WorkloadDepProp Include="AndroidLatestUnstablePlatformId=$(AndroidLatestUnstablePlatformId)" />
50+
<_WorkloadDepProp Include="MicrosoftAndroidSdkOutDir=$(MicrosoftAndroidSdkOutDir)" />
51+
<_WorkloadDepProp Include="MonoOptionsVersion=$(MonoOptionsVersion)" />
52+
<_WorkloadDepProp Include="NewtonsoftJsonPackageVersion=$(NewtonsoftJsonPackageVersion)" />
53+
<_WorkloadDepProp Include="WorkloadDependenciesPath=$(WorkloadDependenciesPath)" />
54+
<_WorkloadDepProp Include="WorkloadVersion=$(WorkloadVersion)" />
6855
</ItemGroup>
6956

70-
<Exec Command="dotnet run @(_WorkloadDeps, ' ')" />
57+
<MSBuild
58+
Projects="$(MSBuildThisFileDirectory)/../../tools/workload-dependencies/WorkloadDependencies.proj"
59+
Properties="@(_WorkloadDepProp)"
60+
Targets="GenerateWorkloadDependencies"
61+
/>
7162

7263
<ItemGroup>
7364
<_PackageFiles Include="$(WorkloadManifestJsonPath)" PackagePath="data" />
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project>
2+
<!--
3+
This file exists so that we do NOT import top-level Configuration.props/etc.
4+
5+
This is so that we can cleanly import Xamarin.Installer.Common.props and
6+
Xamarin.Android.Common.props from WorkloadDependencies.proj.
7+
-->
8+
</Project>

tools/workload-dependencies/Program.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
var BuildToolsVersion = (string?) null;
1616
var JdkVersion = (string?) null;
1717
var NdkVersion = (string?) null;
18-
var PreviewPlatformVersion = (string?) null;
18+
var PlatformToolsVersion = (string?) null;
1919
var PlatformVersion = (string?) null;
20+
var PreviewPlatformVersion = (string?) null;
2021
var WorkloadVersion = (string?) null;
2122

2223
var options = new OptionSet {
@@ -39,6 +40,9 @@
3940
{ "ndk-version=",
4041
"The Android NDK {VERSION} dotnet/android is built against.",
4142
v => NdkVersion = v },
43+
{ "platform-tools-version=",
44+
"The Android SDK platform-tools version dotnet/android is built against.",
45+
v => PlatformToolsVersion = v },
4246
{ "platform-version=",
4347
"The stable Android SDK Platform {VERSION} dotnet/android binds.",
4448
v => PlatformVersion = v },
@@ -96,7 +100,7 @@
96100
["emulator"] = doc => CreatePackageEntries (doc, "emulator", null, optional: true),
97101
["cmdline-tools"] = doc => CreatePackageEntries (doc, "cmdline-tools", CmdlineToolsVersion),
98102
["ndk"] = doc => CreatePackageEntries (doc, "ndk", NdkVersion, optional: true),
99-
["platform-tools"] = doc => CreatePackageEntries (doc, "platform-tools", null),
103+
["platform-tools"] = doc => CreatePackageEntries (doc, "platform-tools", PlatformToolsVersion),
100104
["platform"] = CreatePlatformPackageEntries,
101105
["system-image"] = CreateSystemImagePackageEntries,
102106
// ndk
@@ -196,11 +200,19 @@ IEnumerable<JObject> CreatePackageEntries (XDocument doc, string element, string
196200
if (item == null) {
197201
yield break;
198202
}
203+
var path = item.ReqAttr ("path");
204+
var reqRev = item.ReqAttr ("revision");
205+
var sdkPackage = new JObject {
206+
new JProperty ("id", path),
207+
};
208+
209+
// special-case platform-tools, which doesn't have a revision
210+
if (!path.Contains (reqRev)) {
211+
sdkPackage.Add (new JProperty ("requestedRevision", reqRev));
212+
}
199213
var entry = new JObject {
200214
new JProperty ("desc", item.ReqAttr ("description")),
201-
new JProperty ("sdkPackage", new JObject {
202-
new JProperty ("id", item.ReqAttr ("path")),
203-
}),
215+
new JProperty ("sdkPackage", sdkPackage),
204216
new JProperty ("optional", optional.ToString ().ToLowerInvariant ()),
205217
};
206218
yield return entry;
@@ -228,7 +240,7 @@ IEnumerable<JObject> CreatePackageEntries (XDocument doc, string element, string
228240
IEnumerable<JObject> CreatePlatformPackageEntries (XDocument doc)
229241
{
230242
string? reqVersion = PlatformVersion != null
231-
? $"platforms;android-{PlatformVersion}"
243+
? $"platforms;{PlatformVersion}"
232244
: null;
233245
string? maxVersion = null;
234246
XElement? entry = null;
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<Project Sdk="Microsoft.Build.NoTargets">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ImportGroup Condition=" '$(MicrosoftAndroidSdkOutDir)' != '' ">
8+
<Import
9+
Condition="Exists('$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.props')"
10+
Project="$(MicrosoftAndroidSdkOutDir)Xamarin.Installer.Common.props"
11+
/>
12+
<Import Project="$(MicrosoftAndroidSdkOutDir)Xamarin.Android.Common.props" />
13+
</ImportGroup>
14+
15+
<Target Name="_CheckDeps">
16+
<Error
17+
Condition=" '$(MicrosoftAndroidSdkOutDir)' == '' "
18+
Text="MicrosoftAndroidSdkOutDir property must be set."
19+
/>
20+
<Error
21+
Condition=" !HasTrailingSlash('$(MicrosoftAndroidSdkOutDir)') "
22+
Text="MicrosoftAndroidSdkOutDir property must end with directory separator char."
23+
/>
24+
<Error
25+
Condition=" !Exists('$(MicrosoftAndroidSdkOutDir)') "
26+
Text="MicrosoftAndroidSdkOutDir property must exist."
27+
/>
28+
<Error
29+
Condition=" '$(WorkloadDependenciesPath)' == '' "
30+
Text="WorkloadDependenciesPath property must be set."
31+
/>
32+
<Error
33+
Condition=" '$(AndroidLatestStablePlatformId)' == '' "
34+
Text="AndroidLatestStablePlatformId property must be set."
35+
/>
36+
<Error
37+
Condition=" '$(AndroidLatestUnstablePlatformId)' == '' "
38+
Text="AndroidLatestUnstablePlatformId property must be set."
39+
/>
40+
<Error
41+
Condition=" '$(WorkloadVersion)' == '' "
42+
Text="WorkloadVersion property must be set."
43+
/>
44+
</Target>
45+
46+
<Target Name="GenerateWorkloadDependencies"
47+
DependsOnTargets="_CheckDeps">
48+
49+
<PropertyGroup>
50+
<_AndroidPlatformSupportFeed>$(MSBuildThisFileDirectory)/../../external/android-platform-support/Feeds/AndroidManifestFeed_d17.12.xml</_AndroidPlatformSupportFeed>
51+
<_Feed Condition=" Exists($(_AndroidPlatformSupportFeed)) ">$(_AndroidPlatformSupportFeed)</_Feed>
52+
<_Feed Condition=" '$(_Feed)' == '' ">https://aka.ms/AndroidManifestFeed/d17-12</_Feed>
53+
<_Project>$(MSBuildThisFileDirectory)workload-dependencies.csproj</_Project>
54+
<WorkloadDependenciesPath Condition=" '$(WorkloadDependenciesPath)' == '' ">$(OutputPath)workload-manifest\WorkloadDependencies.json</WorkloadDependenciesPath>
55+
</PropertyGroup>
56+
57+
<ItemGroup>
58+
<_WorkloadDeps Include="--project &quot;$(_Project)&quot;" />
59+
<_WorkloadDeps Include="-p:MonoOptionsVersion=$(MonoOptionsVersion)" />
60+
<_WorkloadDeps Include="-p:NewtonsoftJsonPackageVersion=$(NewtonsoftJsonPackageVersion)" />
61+
<_WorkloadDeps Include="--" />
62+
<_WorkloadDeps Include="&quot;--feed=$(_Feed)&quot;" />
63+
<_WorkloadDeps Include="-o &quot;$(WorkloadDependenciesPath)&quot;" />
64+
<_WorkloadDeps Include="--build-tools-version=$(AndroidSdkBuildToolsVersion)" />
65+
<_WorkloadDeps Include="--cmdline-tools-version=$(AndroidCommandLineToolsVersion)" />
66+
<_WorkloadDeps Include="--jdk-version=$(JavaSdkVersion)" />
67+
<_WorkloadDeps Include="--ndk-version=$(AndroidNdkVersion)" />
68+
<_WorkloadDeps Include="--platform-tools-version=$(AndroidSdkPlatformToolsVersion)" />
69+
<_WorkloadDeps Include="--platform-version=$(AndroidSdkPlatformVersion)" />
70+
<_WorkloadDeps
71+
Condition=" '$(AndroidLatestUnstablePlatformId)' != '$(AndroidLatestStablePlatformId)' "
72+
Include="--preview-platform-version=$(AndroidLatestUnstablePlatformId)"
73+
/>
74+
<_WorkloadDeps Include="--workload-version=$(WorkloadVersion)" />
75+
<!-- $(AndroidSdkEmulatorVersion) is unversioned, so skip -->
76+
</ItemGroup>
77+
78+
<Exec Command="dotnet run @(_WorkloadDeps, ' ')" />
79+
</Target>
80+
81+
</Project>

0 commit comments

Comments
 (0)